Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ You need a JetBrains IDE based on the IntelliJ Platform (for example, IntelliJ I
### Development Dependencies
To build and test from source, use the project’s configured Gradle wrapper and a compatible JDK.

## Icon Assets

The plugin logo asset `src/main/resources/META-INF/pluginIcon.svg` and the run-configuration icon asset `src/main/resources/icons/openfasttrace.svg` are derived from the OpenFastTrace logo artwork in this repository and use the same Apache 2.0 license as the project.

## Development
To understand product intent and implementation scope, start with:
* [System Requirements](doc/system_requirements.md)
Expand Down
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ tasks {
options.encoding = "UTF-8"
}

// [bld->dsn~packaged-plugin-logo-assets~1]
named<Zip>("buildPlugin") {
archiveBaseName.set("OpenFastTrace")
}
Expand Down
3 changes: 3 additions & 0 deletions doc/changes/changes_0.8.0.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ This gives you a faster trace review workflow:

The global `Tools | OpenFastTrace | Trace Project` action and new or previously unconfigured run configurations use the Test Runner UI. Run configurations can still opt into the existing plain text output when you want the raw OpenFastTrace report.

The plugin distribution also contains JetBrains-compliant OpenFastTrace icon assets so the plugin can be identified in JetBrains plugin surfaces, and OpenFastTrace run configurations now use a dedicated OpenFastTrace icon instead of the generic execute icon.

## Features

#40: Integrate OFT Trace into Test Runner UI
#52: Add JetBrains Marketplace plugin icon assets

## Documentation

Expand Down
146 changes: 146 additions & 0 deletions doc/changesets/52-add-jetbrains-marketplace-plugin-icon-assets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
# GH-52 Add JetBrains Marketplace plugin icon assets

## Goal

Add JetBrains-compliant OpenFastTrace plugin icon assets and use a scaled
OpenFastTrace icon for IDE run configurations, so users can recognize the
plugin in JetBrains Plugin Manager, JetBrains Marketplace, and the run/debug
configuration UI.

## Scope

In scope:

* Validate or rework the existing `src/main/resources/META-INF/pluginIcon.svg`
so it satisfies JetBrains plugin logo expectations for SVG format, 40x40
display, transparent padding, recognizability, and light-background use.
* Add `src/main/resources/META-INF/pluginIcon_dark.svg` only if the default icon
is not sufficiently visible on dark backgrounds.
* Add a scaled OpenFastTrace icon resource for the `OpenFastTrace` run
configuration type and replace the current generic execute icon. Remove the
two white pointy brackets on the left side of the SVG before scaling to make
the image fit better to the small size.
* Document icon source, derivation, and usage rights when the assets derive from
existing OpenFastTrace branding.
* Prove that `buildPlugin` packages the icon assets under `META-INF` in the
plugin distribution.

Out of scope:

* Rebranding OpenFastTrace.
* Creating unrelated UI icons.
* Changing OpenFastTrace tracing behavior, run-configuration execution
behavior, filters, or result views.
* Publishing the plugin to JetBrains Marketplace.
* Adding a JetBrains Marketplace badge or Marketplace link before the plugin has
a stable public Marketplace page.

## Design References

* [System Requirements](../system_requirements.md)
* [Deployment View](../design/deployment_view.md)
* [Building Block View](../design/building_block_view.md)
* [Runtime View](../design/runtime_view.md)
* [Quality Requirements](../design/quality_requirements.md)
* [GH-37 Introduce Run Configurations](37-introduce-run-configurations.md)
* [JetBrains Plugin Logo Documentation](https://plugins.jetbrains.com/docs/intellij/plugin-icon-file.html)

## Strategy

Treat this as a user-visible presentation and packaging change, not a tracing
behavior change. Add requirements and scenarios for plugin identity assets and
the OpenFastTrace run-configuration icon before changing resources or Java code.

The current `main` branch already contains
`src/main/resources/META-INF/pluginIcon.svg`, although GH-52 originally
describes that file as missing. The implementation should therefore validate and
revise the existing asset as needed instead of adding a duplicate. Follow the
JetBrains naming convention for the plugin logo files in `META-INF`, and use a
plugin-owned SVG loaded through IntelliJ icon infrastructure for the smaller
run-configuration icon.

## Task List

- [x] Create and checkout a new Git branch `feat/52-add-jetbrains-marketplace-plugin-icon-assets`

### Requirements And Design

- [x] Update `doc/system_requirements.md` with user-visible requirement and
scenario coverage for JetBrains plugin logo assets in plugin management
surfaces and for the OpenFastTrace run-configuration icon
- [x] Stop and ask user for a review of the system requirements
- [x] Update `doc/design/deployment_view.md` with the packaged plugin-logo
resource location, the default/dark icon decision, and the expectation
that the files end up in the plugin main JAR under `META-INF`
- [x] Update `doc/design/building_block_view.md` so the trace-configuration or
plugin-presentation building block owns the run-configuration icon
resource
- [x] Update `doc/design/runtime_view.md` with a focused design item for the
run-configuration type loading the plugin-owned icon resource
- [x] Keep runtime design coverage to one scenario per `dsn` item, or use OFT
forwarding where a layer adds no new information
- [x] Stop and ask user for a review of the design

### Implementation

- [x] Validate the existing `src/main/resources/META-INF/pluginIcon.svg` against
the JetBrains SVG, 40x40 sizing, transparent padding, visual-weight, and
light/dark visibility expectations
- [x] Rework or replace `pluginIcon.svg` if validation shows it is not
recognizable at 40x40 and 80x80 display sizes or lacks appropriate
transparent padding
- [x] Add `src/main/resources/META-INF/pluginIcon_dark.svg` only if the default
icon does not remain visible on dark backgrounds
- [x] Add a small IDE icon resource, for example
`src/main/resources/icons/openfasttrace.svg`, derived from the approved
plugin logo and optimized for run-configuration display
- [x] Add an icon holder class that loads the run-configuration icon through the
IntelliJ icon API
- [x] Replace `AllIcons.Actions.Execute` in
`OftRunConfigurationType` with the OpenFastTrace icon
- [x] Add or update OFT build and implementation coverage tags for the new design items
- [x] Avoid adding third-party runtime or build dependencies

### Verification

- [x] Add automated resource tests that load `META-INF/pluginIcon.svg` and,
when present, `META-INF/pluginIcon_dark.svg` from the plugin classpath and
assert that the SVG metadata matches the required 40x40 logo size
- [x] Add an automated run-configuration test proving the `OpenFastTrace`
configuration type supplies the plugin-owned icon instead of the generic
execute icon
- [x] Visually verify the plugin logo at 40x40 and 80x80 on light and dark
backgrounds
- [x] Run `./gradlew test`
- [x] Run `./gradlew traceRequirements`
- [x] Run `./gradlew check buildPlugin`
- [x] Inspect the built plugin distribution and its plugin main JAR to confirm
`META-INF/pluginIcon.svg`, optional `META-INF/pluginIcon_dark.svg`, and
the run-configuration icon resource are packaged
- [x] Run `./gradlew verifyPlugin`
- [x] Keep path coverage at or above the documented 80 percent threshold
- [x] Keep the OpenFastTrace trace clean for `feat`, `req`, `scn`, `dsn`,
`impl`, `utest`, `itest`, and build artifact types in scope
- [x] Keep the dependency policy unchanged
- [ ] Keep the SonarQube Cloud quality gate green after CI analysis

### Update User Documentation

- [x] Document the icon source, derivation, and usage rights in `README.md` or a
dedicated repository documentation section
- [x] Refresh user-guide or demo screenshots only if they visibly show the old
generic run-configuration icon and would otherwise become misleading

## Version and Changelog Update

- [x] Check if the current version mentioned in the build scripts and code
parameters is the same as the latest GitHub release. As of 2026-06-09,
`gradle.properties` contains `0.8.0` and the latest GitHub release is
`0.7.0`.
- [x] Keep the project version at `0.8.0` if that version is still unreleased
when GH-52 is implemented; otherwise raise the version to `0.9.0` because
this is a feature-level presentation enhancement
- [x] Write the changelog entry for the version that receives GH-52
- [x] Update the release date to the actual release date
- [x] Ensure that the issue list contains `#52: Add JetBrains Marketplace plugin
icon assets`
13 changes: 12 additions & 1 deletion doc/design/building_block_view.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,15 +217,26 @@ Covers:

Needs: impl

### Plugin Distribution Resources
`dsn~packaged-plugin-logo-assets~1`

The plugin distribution resources include JetBrains plugin logo SVG assets in the plugin main JAR under `META-INF`. The default logo resource is `META-INF/pluginIcon.svg`; if the default logo is not sufficiently visible on dark backgrounds, the distribution also includes `META-INF/pluginIcon_dark.svg`. The logo assets use a 40x40 SVG size, keep transparent padding around the visible OpenFastTrace branding, and remain recognizable at JetBrains Plugin Manager and Marketplace display sizes.

Covers:
- `scn~show-plugin-logo-in-jetbrains-plugin-surfaces~1`

Needs: bld, itest

### Trace Configuration Integration
`dsn~trace-configuration-integration~1`

The plugin provides a trace-configuration component that stores OpenFastTrace trace-scope settings per IntelliJ project and through dedicated run configurations. It exposes those settings through project configuration UI and the run configuration editor, resolves the selected-resource options and filters into a normalized OpenFastTrace input set and filter criteria, stores the run-configuration result-view selection, and treats the IntelliJ Test Runner UI as the result-view default when no selection is stored.
The plugin provides a trace-configuration component that stores OpenFastTrace trace-scope settings per IntelliJ project and through dedicated run configurations. It exposes those settings through project configuration UI and the run configuration editor, resolves the selected-resource options and filters into a normalized OpenFastTrace input set and filter criteria, stores the run-configuration result-view selection, treats the IntelliJ Test Runner UI as the result-view default when no selection is stored, and owns the plugin resource used as the OpenFastTrace run-configuration icon.

Covers:
- `scn~test-runner-as-default-run-configuration-result-view~1`
- `scn~select-plain-text-trace-result-view~1`
- `scn~select-test-runner-trace-result-view~1`
- `scn~show-openfasttrace-icon-for-run-configurations~1`

Needs: impl, itest

Expand Down
4 changes: 4 additions & 0 deletions doc/design/deployment_view.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,7 @@ Plugin --> Project : reads specification documents\nand coverage tag files
The deployment model stays intentionally simple. All plugin logic runs locally in the host IDE, uses the IDE-provided caches and state stores, and works on files inside the active project.

Network access is not part of the normal processing path. In the MVP, network access is only used when the user opens the OpenFastTrace user guide from GitHub.

## Packaged Plugin Resources

The plugin distribution includes JetBrains plugin logo SVG assets in the plugin main JAR under `META-INF`. The default logo resource is `META-INF/pluginIcon.svg`; if the default logo is not sufficiently visible on dark backgrounds, the distribution also includes `META-INF/pluginIcon_dark.svg`.
12 changes: 12 additions & 0 deletions doc/design/runtime_view.md
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,18 @@ Covers:

Needs: impl, itest

### OpenFastTrace Run Configuration Icon
`dsn~openfasttrace-run-configuration-icon~1`

**Given** the IDE renders the `OpenFastTrace` run configuration type in the run/debug UI
**When** the IntelliJ Run Configuration API requests the configuration type icon
**Then** the plugin returns an OpenFastTrace-specific icon loaded from a plugin-owned SVG resource instead of the generic execute icon.

Covers:
- `scn~show-openfasttrace-icon-for-run-configurations~1`

Needs: impl, itest

### Filter Trace by Artifact Types and Tags
`dsn~filter-trace-by-artifact-types-and-tags~1`

Expand Down
53 changes: 53 additions & 0 deletions doc/system_requirements.md
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,35 @@ Covers:

Needs: scn

### Plugin Distribution

The following requirements refine how the plugin distribution appears in JetBrains plugin management surfaces.

### Plugin Logo for JetBrains Plugin Surfaces
`req~plugin-logo-for-jetbrains-plugin-surfaces~1`

The plugin distribution includes JetBrains-compliant OpenFastTrace plugin logo assets that IntelliJ Platform IDEs and JetBrains Marketplace can display for the plugin. Users can recognize the plugin in plugin-management surfaces.

Rationale:

JetBrains plugin surfaces use packaged plugin logo resources to distinguish plugins in lists and detail views. Providing suitable OpenFastTrace logo assets improves recognition without changing plugin behavior.

Needs: scn

### Run Configuration Presentation

The following requirements refine how OpenFastTrace run configurations appear in the IDE run/debug UI.

### OpenFastTrace Run Configuration Icon
`req~openfasttrace-run-configuration-icon~1`

The plugin shows an OpenFastTrace-specific icon for the `OpenFastTrace` run configuration type. Users can distinguish OpenFastTrace trace configurations from generic run actions in the run/debug UI.

Covers:
- `feat~oft-run-configurations~1`

Needs: scn

### Show Trace Source Files as Test Runner Suites
`req~show-trace-source-files-as-test-runner-suites~1`

Expand Down Expand Up @@ -1397,6 +1426,30 @@ Covers:

Needs: dsn

### Show Plugin Logo in JetBrains Plugin Surfaces
`scn~show-plugin-logo-in-jetbrains-plugin-surfaces~1`

**Given** a user installs the OpenFastTrace plugin distribution in an IntelliJ Platform IDE
**When** the IDE displays the plugin in `Settings | Plugins`, or JetBrains Marketplace displays the plugin after publication
**Then** the surface can load an OpenFastTrace plugin logo from packaged `META-INF` SVG assets that are designed for JetBrains plugin-logo sizes and light/dark backgrounds

Covers:
- `req~plugin-logo-for-jetbrains-plugin-surfaces~1`

Needs: dsn

### Show OpenFastTrace Icon for Run Configurations
`scn~show-openfasttrace-icon-for-run-configurations~1`

**Given** an IntelliJ project is open
**When** a user creates or views an `OpenFastTrace` run configuration in the run/debug UI
**Then** the IDE shows an OpenFastTrace-specific icon for that configuration type instead of the generic execute icon

Covers:
- `req~openfasttrace-run-configuration-icon~1`

Needs: dsn

### Show Trace Source Files as Test Runner Suites
`scn~show-trace-source-files-as-test-runner-suites~1`

Expand Down
Binary file modified doc/user_guide/images/run-configurations.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.itsallcode.openfasttrace.intellijplugin;

import com.intellij.openapi.util.IconLoader;

import javax.swing.Icon;

/**
* Shared constants for OpenFastTrace plugin icon resources.
*/
public final class OftIcons {
public static final String PLUGIN_ICON_RESOURCE_PATH = "META-INF/pluginIcon.svg";
public static final String PLUGIN_DARK_ICON_RESOURCE_PATH = "META-INF/pluginIcon_dark.svg";
public static final String RUN_CONFIGURATION_ICON_RESOURCE_PATH = "icons/openfasttrace.svg";

// [impl->dsn~openfasttrace-run-configuration-icon~1]
public static final Icon OPEN_FAST_TRACE = IconLoader.getIcon(
"/" + RUN_CONFIGURATION_ICON_RESOURCE_PATH,
OftIcons.class
);

private OftIcons() {
// Utility class.
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package org.itsallcode.openfasttrace.intellijplugin.trace.runconfig;

import com.intellij.execution.configurations.ConfigurationTypeBase;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.util.NotNullLazyValue;
import org.itsallcode.openfasttrace.intellijplugin.OftIcons;

// [impl->dsn~openfasttrace-run-configuration~1]
public final class OftRunConfigurationType extends ConfigurationTypeBase {
public static final String ID = "OpenFastTraceRunConfiguration";

public OftRunConfigurationType() {
super(ID, "OpenFastTrace", "OpenFastTrace run configuration",
NotNullLazyValue.createValue(() -> AllIcons.Actions.Execute));
NotNullLazyValue.createValue(() -> OftIcons.OPEN_FAST_TRACE));
addFactory(new OftRunConfigurationFactory(this));
}
}
Loading
Loading