Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
5dea84a
#1. Removed all implementation files from previous attempts for a cle…
redcatbear Apr 23, 2026
97cc7da
#1. MVP system_requirements complete.
redcatbear Apr 23, 2026
beaad2f
#1: Skeleton with context, scope, quality requirements and solution s…
redcatbear Apr 23, 2026
bf0dbc8
#1: Building blocks done.
redcatbear Apr 23, 2026
00a886f
Merge branch 'main' of https://github.com/itsallcode/openfasttrace-in…
redcatbear Apr 24, 2026
d030172
Merge branch 'main' of https://github.com/itsallcode/openfasttrace-in…
redcatbear Apr 24, 2026
a62dd2b
Merge branch 'main' of https://github.com/itsallcode/openfasttrace-in…
redcatbear Apr 27, 2026
887979d
Merge branch 'main' of https://github.com/itsallcode/openfasttrace-in…
redcatbear Apr 27, 2026
5115b1a
#17: Added skill for handling changesets.
redcatbear Apr 28, 2026
3887af6
#17: Fixed list numbering in quality requirements.
redcatbear Apr 28, 2026
710e566
#17: `testGivenInvalidCoverageTagsWhenParsingThenItReturnsNull` is no…
redcatbear Apr 28, 2026
e6e06ab
#17: Regression #17 fixed.
redcatbear Apr 28, 2026
ff52d01
#17: Removed redundant Sonar project key
redcatbear Apr 28, 2026
330d7f7
#17: Added lessons learned to change set.
redcatbear Apr 28, 2026
bd66871
#17: Added release letter.
redcatbear Apr 28, 2026
c2c448e
#17: Added changeset plan for #19.
redcatbear Apr 28, 2026
4e8ac8d
#17: Added user requirements.
redcatbear Apr 28, 2026
7ab6d05
#17: Updated design.
redcatbear Apr 28, 2026
b9f7e4c
#17: Fixed coverage tag.
redcatbear Apr 28, 2026
82c1cef
#17: Added trace path configuration.
redcatbear Apr 28, 2026
44ee833
#17: Validated trace inputs.
redcatbear Apr 28, 2026
44736dc
#17: Added stable content descriptor.
redcatbear Apr 28, 2026
7d0e7fd
#51: Added Marketplace metadata.
redcatbear Jun 10, 2026
7d053ce
#51: Added a screenshot of the plugin to the readme.
redcatbear Jun 10, 2026
fe08d66
Added a screenshot of the plugin to the readme.
redcatbear Jun 10, 2026
017579b
Merge branch 'bug/17_regression-zero-items-picked-up-by-the-trace-in-…
redcatbear Jun 10, 2026
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
22 changes: 2 additions & 20 deletions .agents/skills/oft-spec-driven-development/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ When the user gives you a new issue link, derive the work plan from:
4. the quality requirements document
5. the current code and tests

Do not jump straight to code. First, determine whether the issue changes:
Do not jump straight to code. First determine whether the issue changes:

- user-visible behavior
- traced requirements or scenarios
Expand Down Expand Up @@ -95,7 +95,6 @@ Use that mapping to decide what must change:
- If architecture or technical behavior changes, update or add `dsn` items and relevant arc42 design sections.
- If a lower layer adds no new information, prefer OFT forwarding instead of redundant new items.
- Ensure each runtime design item covers only one scenario unless forwarding is the better fit.
- When you semantically change an existing requirement, increase the requirement revision number.

### 4. Treat Quality Requirements As Non-Negotiable

Expand Down Expand Up @@ -158,14 +157,10 @@ Out of scope:

## Task List

- [ ] Create and checkout a new Git branch `<issue-type>/<issue-number>-<issue-title-lower-kebab-case>`

### Requirements And Design

- [ ] <system requirements update>
- [ ] Stop and ask user for a review of the system requirements
- [ ] <requirements update>
- [ ] <design update>
- [ ] Stop and ask user for a review of the design

### Implementation

Expand All @@ -176,19 +171,6 @@ Out of scope:
- [ ] <tests derived from quality requirements>
- [ ] Keep the OpenFastTrace trace clean
- [ ] Keep required build and plugin verification tasks green

### Update user documentation

- [ ] Update the end user documentation in README.md

## Version and Changelog Update

- [ ] Check if the current version mentioned in the build scripts and code parameters is the same as the latest GitHub release.
- [ ] Decide if and which part of the version needs to be incremented. Use semantic versioning rules (breaking change updates major, feature updates minor, documentation, fixes and refactoring update fix number)
- [ ] Raise the version to <semantic-version> (this is a <type-of-release> release)
- [ ] Write the changelog entry for <semantic-version>
- [ ] Update release date to today
- [ ] Ensure that issue list contains the GitHub issue number and title
```

Keep verification items concrete. Do not leave them as generic "run tests" placeholders when the quality requirements demand more specific checks.
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ jobs:
distribution: temurin
java-version: 21

- name: Install Pandoc
run: |
sudo apt-get update
sudo apt-get install --yes pandoc

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v6
with:
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ jobs:
distribution: temurin
java-version: 21

- name: Install Pandoc
run: |
sudo apt-get update
sudo apt-get install --yes pandoc

- name: Set up Gradle
uses: gradle/actions/setup-gradle@v6
with:
Expand Down
43 changes: 3 additions & 40 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,8 @@ SonarCloud status:
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=org.itsallcode.openfasttrace%3Aopenfasttrace-intellij-plugin&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=org.itsallcode.openfasttrace%3Aopenfasttrace-intellij-plugin)

**User Guides**
* [OpenFastTrace IntelliJ Plugin User Guide](doc/user_guide.md)
* [OpenFastTrace User Guide](https://github.com/itsallcode/openfasttrace/blob/main/doc/user_guide.md)
* [OpenFastTrace in IDE Help Action](src/main/java/org/itsallcode/openfasttrace/intellijplugin/help/OpenFastTraceUserGuide.java)
* [OpenFastTrace IntelliJ Plugin Demo](doc/demo/plugin-demo.md)

**News and Discussions**
* [Changelog](doc/changes/changelog.md)
Expand All @@ -45,23 +43,16 @@ SonarCloud status:
## Using the Plugin
Use an IntelliJ Platform IDE and install/build this plugin to get OFT support while editing project files.

For installation and workflow instructions, see the [OpenFastTrace IntelliJ Plugin User Guide](doc/user_guide.md).

The plugin currently focuses on:
* syntax highlighting for OFT items in supported files
* navigation support (`Go To Declaration`, symbol search, and related navigation paths)
* completion for existing specification item IDs while editing `Covers:` entries in supported specification documents and coverage-tag targets in files supported by the OpenFastTrace Tag Importer
* bundled OFT live templates for common specification items, including a scenario template
* project-wide or selected-resource OFT tracing from `Tools | OpenFastTrace | Trace Project` or through custom OpenFastTrace run configurations
* project-wide or selected-resource OFT tracing from `Tools | OpenFastTrace | Trace Project`
* clickable specification item IDs directly from the trace output window, including generated IDs created from coverage tags
* IntelliJ Test Runner UI output for OpenFastTrace traces by default, grouped by source file, specification item, and trace link
* quick access to the OpenFastTrace user guide from the IDE help menu

For expected behavior and scope details, see:
* [User Guide](doc/user_guide.md)
* [System Requirements](doc/system_requirements.md)
* [Runtime View](doc/design/runtime_view.md)
* [Plugin Demo Script](doc/demo/plugin-demo.md)

## Getting the Project
Clone this repository and build the plugin with Gradle:
Expand All @@ -76,19 +67,9 @@ For manual IDE testing, launch a sandbox IDE with the plugin:
./gradlew manualTestIde
```

## Trace Settings

After the sandbox IDE opens a project, configure trace scope under `Settings | Tools | OpenFastTrace`. By default, `Trace Project` scans the whole opened project. If you switch to selected-resource tracing, the plugin includes IntelliJ source roots, IntelliJ test roots, and one default additional project-relative path entry, `doc/`, until you change it. Additional files or directories are entered one per line.

## Run Configurations

You can create and run a dedicated `OpenFastTrace` run configuration from the IDE's run/debug toolbar. The plugin traces the configured inputs in the background and shows the result in IntelliJ's Test Runner UI by default. The result tree groups source files, specification items, and trace links with pass/fail status and navigation back to source.

Run configurations can select plain text output instead. In that mode, the plugin shows the text report in an IDE output tab with ANSI colors preserved. You can click specification item IDs in the report to jump to their declarations, including source-side items generated from coverage tags.

## Live-Templates Bundled With the Plugin

The plugin also bundles an `OpenFastTrace` live-template group under `Settings | Editor | Live Templates`. Use abbreviations such as `feat`, `req`, `dsn`, and `scn` in a supported editing context, then press `Tab` to insert an OFT item skeleton. The `scn` template inserts a scenario stub with placeholders for `Given`, `When`, `Then`, and the covered requirement. While the caret is still in a template's covered-item field, use basic completion to select an existing specification item ID from the project index.
Run an OFT trace from `Tools | OpenFastTrace | Trace Project` or use the default shortcut `Ctrl+Alt+Shift+O`. The plugin traces the configured inputs in the background and shows the plain text result in an IDE output tab with ANSI colors preserved. You can click specification item IDs in the report to jump to their declarations, including source-side items generated from coverage tags.

## Installation
### Runtime Dependencies
Expand All @@ -97,10 +78,6 @@ 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 All @@ -113,21 +90,7 @@ To run the automated checks for the trace action and the project trace itself:
./gradlew check verifyPlugin
```

To check for newer dependency, Gradle plugin, and Gradle wrapper versions:

```sh
./gradlew --no-configuration-cache --no-parallel dependencyUpdates -Drevision=release
```

After intentionally changing dependency or Gradle plugin versions, refresh the
committed Gradle lock file:

```sh
./gradlew --write-locks dependencies
```

Example OFT files for manual testing are available under `examples/` in this project.
For a guided live demonstration, use the script in [doc/demo/plugin-demo.md](doc/demo/plugin-demo.md) with the isolated example project in [doc/demo/example](doc/demo/example).
Example OFT files for manual testing are available under `examples\` in this project.

## License
This project is licensed under the [Apache 2.0 license](LICENSE).
87 changes: 40 additions & 47 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,32 +1,23 @@
import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.gradle.api.tasks.bundling.Zip
import org.gradle.jvm.toolchain.JavaLanguageVersion
import org.gradle.testing.jacoco.plugins.JacocoTaskExtension
import org.jetbrains.intellij.platform.gradle.TestFrameworkType

fun isNonStableVersion(version: String): Boolean {
val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.uppercase().contains(it) }
val stableVersion = "^[0-9,.v-]+(-r)?$".toRegex().matches(version)
return !stableKeyword && !stableVersion
}

// [bld->dsn~plugin-build-uses-intellij-platform-gradle-plugin~1]
plugins {
id("java")
id("jacoco")
id("com.github.ben-manes.versions") version "0.54.0"
id("com.diffplug.spotless") version "8.6.0"
id("org.itsallcode.openfasttrace") version "3.1.2"
id("org.jetbrains.intellij.platform") version "2.16.0"
id("org.sonarqube") version "7.3.1.8318"
id("com.diffplug.spotless") version "8.4.0"
id("org.itsallcode.openfasttrace") version "3.1.1"
id("org.jetbrains.intellij.platform") version "2.15.0"
id("org.sonarqube") version "7.2.3.7755"
id("org.sonatype.gradle.plugins.scan") version "3.1.5"
}

val pluginVersion = providers.gradleProperty("version")

group = "org.itsallcode.openfasttrace"
version = pluginVersion.get()
group = providers.gradleProperty("group").get()
version = providers.gradleProperty("version").get()

java {
toolchain {
Expand All @@ -38,11 +29,6 @@ jacoco {
toolVersion = "0.8.13"
}

// [bld->dsn~gradle-dependency-maintenance-uses-locks-and-versions-plugin~1]
dependencyLocking {
lockAllConfigurations()
}

sonar {
properties {
property("sonar.organization", "itsallcode")
Expand All @@ -54,14 +40,31 @@ sonar {
}
}

val ossIndexUsername = providers.gradleProperty("ossIndexUsername")
.orElse(providers.environmentVariable("OSSINDEX_USERNAME"))
.orNull
val ossIndexToken = providers.gradleProperty("ossIndexToken")
.orElse(providers.environmentVariable("OSSINDEX_TOKEN"))
.orNull

ossIndexAudit {
ossIndexUsername?.let { username = it }
ossIndexToken?.let { password = it }
isUseCache = true
isPrintBanner = false
isColorEnabled = false
isFailOnDetection = true
}

requirementTracing {
failBuild = true
inputDirectories = files("doc", "src/main/java", "src/test/java")
tags {
tag {
paths = fileTree("./").include("build.gradle.kts") as FileCollection?
tagArtifactType = "bld"
paths = files("build.gradle.kts")
coveredItemArtifactType = "dsn"
tagArtifactType = "bld"
coveredItemNamePrefix = ""
}
}
}
Expand All @@ -74,41 +77,40 @@ repositories {
}

dependencies {
implementation("org.itsallcode.openfasttrace:openfasttrace:4.5.0")
implementation("org.itsallcode.openfasttrace:openfasttrace:${providers.gradleProperty("openfasttraceVersion").get()}")

intellijPlatform {
intellijIdea("2026.1.3")
intellijIdea(providers.gradleProperty("platformVersion"))
bundledPlugin("com.intellij.java")
testFramework(TestFrameworkType.Platform)
pluginVerifier()
zipSigner()
}

testImplementation(platform("org.junit:junit-bom:6.1.0"))
testImplementation("junit:junit:4.13.2")
testImplementation(platform("org.junit:junit-bom:${providers.gradleProperty("junitBomVersion").get()}"))
testImplementation("junit:junit:${providers.gradleProperty("junit4Version").get()}")
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.junit.platform:junit-platform-launcher")
testImplementation("org.hamcrest:hamcrest:3.0")
testImplementation("org.opentest4j:opentest4j:1.3.0")
testImplementation("org.hamcrest:hamcrest:${providers.gradleProperty("hamcrestVersion").get()}")
testImplementation("org.opentest4j:opentest4j:${providers.gradleProperty("opentest4jVersion").get()}")
testRuntimeOnly("org.junit.vintage:junit-vintage-engine")
}

intellijPlatform {
buildSearchableOptions = false

pluginConfiguration {
id = "org.itsallcode.openfasttrace-intellij-plugin"
name = "OpenFastTrace"
version = pluginVersion
id = providers.gradleProperty("pluginId")
name = providers.gradleProperty("pluginName")
version = providers.gradleProperty("version")

vendor {
name = "Itsallcode.org"
email = "opensource@itsallcode.org"
url = "https://itsallcode.org/"
name = providers.gradleProperty("pluginVendor")
email = providers.gradleProperty("pluginVendorEmail")
url = providers.gradleProperty("pluginVendorUrl")
}

ideaVersion {
sinceBuild = "261"
sinceBuild = providers.gradleProperty("platformSinceBuild")
}
}

Expand Down Expand Up @@ -138,17 +140,8 @@ tasks {
options.encoding = "UTF-8"
}

// [bld->dsn~packaged-plugin-logo-assets~1]
named<Zip>("buildPlugin") {
archiveBaseName.set("OpenFastTrace")
}

withType<DependencyUpdatesTask>().configureEach {
revision = "release"
gradleReleaseChannel = "current"
rejectVersionIf {
isNonStableVersion(candidate.version) && !isNonStableVersion(currentVersion)
}
archiveBaseName.set(providers.gradleProperty("pluginName"))
}

test {
Expand Down
8 changes: 0 additions & 8 deletions doc/changes/changelog.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
# Changelog

* [0.8.0](changes_0.8.0.md)
* [0.7.0](changes_0.7.0.md)
* [0.6.0](changes_0.6.0.md)
* [0.5.2](changes_0.5.2.md)
* [0.5.1](changes_0.5.1.md)
* [0.5.0](changes_0.5.0.md)
* [0.4.0](changes_0.4.0.md)
* [0.3.0](changes_0.3.0.md)
* [0.2.1](changes_0.2.1.md)
* [0.2.0](changes_0.2.0.md)
* [0.1.0](changes_0.1.0.md)
2 changes: 0 additions & 2 deletions doc/changes/changes_0.2.1.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# OpenFastTrace IntelliJ Plugin 0.2.1, released 2026-04-28

Code name: Fix for importer detection

## Summary

This bugfix release restores correct OpenFastTrace importer discovery when a trace is run from inside the IntelliJ plugin runtime.
Expand Down
15 changes: 15 additions & 0 deletions doc/changes/changes_0.8.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# OpenFastTrace IntelliJ Plugin 0.8.1, released 2026-06-10

Version 0.8.1 improves the metadata shown by JetBrains plugin surfaces. Before installing or updating the plugin, users can now see a clearer overview of what OpenFastTrace support does in the IDE and read the current release notes from the maintained project changelog.

The plugin description now focuses on the everyday OpenFastTrace workflows in JetBrains IDEs: authoring requirements in project files, tracing requirement chains down to implementation and tests, and debugging broken chains from the IDE.

The packaged plugin descriptor also carries the project website, `itsallcode.org` vendor metadata, compatibility baseline, and change notes rendered from the active release notes.

## Bundled OpenFastTrace

OpenFastTrace 4.5.0

## Documentation

* #51: Complete Marketplace-facing plugin metadata
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ The likely fault line is the OpenFastTrace library's use of `ServiceLoader` for

### Requirements And Design

- [x] Confirm that GH-17 is fully covered by the existing `feat~run-oft-trace~2`, `req~trace-open-project-from-project-root~1`, `req~show-trace-output-in-ide-output-window~2`, and related trace scenarios, so no user-facing requirement changes are needed
- [x] Confirm that GH-17 is fully covered by the existing `feat~run-oft-trace~1`, `req~trace-open-project-from-project-root~1`, `req~show-trace-output-in-ide-output-window~1`, and related trace scenarios, so no user-facing requirement changes are needed
- [x] Update the design documentation to record the OFT importer/reporter discovery constraint in the plugin runtime, including that trace execution must use the plugin class loader for `ServiceLoader`-based OFT extension lookup
- [x] Link the design clarification to the existing trace-execution design items instead of introducing redundant new runtime requirements

Expand Down
8 changes: 4 additions & 4 deletions doc/changesets/19-configure-trace-path.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,11 @@ That settings model should stay separate from the raw OFT service so the configu
- [x] Add trace execution tests that prove OFT receives only the configured whitelist inputs in selected-resource mode
- [x] Keep existing whole-project trace tests green and cover backward-compatible default behavior for projects without explicit settings
- [x] Keep the OpenFastTrace trace clean for the requirement and design artifacts in scope
- [x] Keep path coverage at or above the documented threshold
- [ ] Keep path coverage at or above the documented threshold
- [x] Keep dependency policy unchanged and avoid adding new third-party libraries unless a design decision is approved first
- [x] Keep required Gradle test, trace, packaging, and plugin verification tasks green
- [x] Keep SonarQube Cloud quality-gate checks green
- [x] Keep OSS Index audit results clean
- [ ] Keep required Gradle test, trace, packaging, and plugin verification tasks green
- [ ] Keep SonarQube Cloud quality-gate checks green
- [ ] Keep OSS Index audit results clean

### Update user documentation

Expand Down
Loading