@rsaglobaltech/specgate 0.21.0 โ†’ 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +81 -96
  3. package/dist/packages/core/src/domain/BriefCards.js +320 -0
  4. package/dist/packages/core/src/domain/BriefCards.js.map +1 -0
  5. package/dist/packages/core/src/domain/DraftChecklist.js +5 -1
  6. package/dist/packages/core/src/domain/DraftChecklist.js.map +1 -1
  7. package/dist/packages/core/src/domain/QuotedText.js +5 -0
  8. package/dist/packages/core/src/domain/QuotedText.js.map +1 -1
  9. package/dist/packages/core/src/domain/TicketText.js +337 -0
  10. package/dist/packages/core/src/domain/TicketText.js.map +1 -0
  11. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js +7 -3
  12. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js.map +1 -1
  13. package/dist/packages/core/src/infrastructure/IdsAcrossBranches.js +48 -0
  14. package/dist/packages/core/src/infrastructure/IdsAcrossBranches.js.map +1 -0
  15. package/dist/packages/mcp-spec-driven/src/native-tools.js +1 -1
  16. package/dist/packages/mcp-spec-driven/src/native-tools.js.map +1 -1
  17. package/dist/scripts/agents/commands.js +8 -6
  18. package/dist/scripts/agents/commands.js.map +1 -1
  19. package/dist/scripts/agents/contract-file.js +44 -0
  20. package/dist/scripts/agents/contract-file.js.map +1 -1
  21. package/dist/scripts/alm/cli.js +16 -4
  22. package/dist/scripts/alm/cli.js.map +1 -1
  23. package/dist/scripts/alm/port.js +1 -1
  24. package/dist/scripts/alm/port.js.map +1 -1
  25. package/dist/scripts/alm/providers/http-client.js +46 -3
  26. package/dist/scripts/alm/providers/http-client.js.map +1 -1
  27. package/dist/scripts/alm/providers/jira.js +108 -32
  28. package/dist/scripts/alm/providers/jira.js.map +1 -1
  29. package/dist/scripts/cli/commands/alm/PrCommand.js +198 -0
  30. package/dist/scripts/cli/commands/alm/PrCommand.js.map +1 -0
  31. package/dist/scripts/cli/commands/change/ChangeCommand.js +32 -6
  32. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  33. package/dist/scripts/cli/commands/change/TicketCommand.js +657 -0
  34. package/dist/scripts/cli/commands/change/TicketCommand.js.map +1 -0
  35. package/dist/scripts/cli/commands/harness/RunCommand.js +4 -2
  36. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  37. package/dist/scripts/cli/commands/project/AdoptCommand.js +58 -0
  38. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
  39. package/dist/scripts/cli/commands/project/UpdateCommand.js +4 -0
  40. package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -1
  41. package/dist/scripts/cli/commands/quality/CheckCommand.js +12 -0
  42. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
  43. package/dist/scripts/cli/commands/spec/DraftCommand.js +240 -27
  44. package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
  45. package/dist/scripts/cli/commands/spec/ExploreCommand.js +13 -13
  46. package/dist/scripts/cli/commands/spec/ExploreCommand.js.map +1 -1
  47. package/dist/scripts/cli/commands/spec/StatusCommand.js +18 -6
  48. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  49. package/dist/scripts/docs/journey-storyboard.js +67 -44
  50. package/dist/scripts/docs/journey-storyboard.js.map +1 -1
  51. package/dist/scripts/docs/nav.js +156 -139
  52. package/dist/scripts/docs/nav.js.map +1 -1
  53. package/dist/scripts/docs/record-journey.js +139 -49
  54. package/dist/scripts/docs/record-journey.js.map +1 -1
  55. package/dist/scripts/docs/terminal-storyboard.js +15 -11
  56. package/dist/scripts/docs/terminal-storyboard.js.map +1 -1
  57. package/dist/scripts/draft/brief-check.js +34 -0
  58. package/dist/scripts/draft/brief-check.js.map +1 -0
  59. package/dist/scripts/draft/brief-setup.js +182 -17
  60. package/dist/scripts/draft/brief-setup.js.map +1 -1
  61. package/dist/scripts/draft/drafting-guide.js +43 -1
  62. package/dist/scripts/draft/drafting-guide.js.map +1 -1
  63. package/dist/scripts/draft/ticket-guide.js +129 -0
  64. package/dist/scripts/draft/ticket-guide.js.map +1 -0
  65. package/dist/scripts/lib/surface.js +2 -0
  66. package/dist/scripts/lib/surface.js.map +1 -1
  67. package/dist/scripts/lib/ticket-keys.js +140 -0
  68. package/dist/scripts/lib/ticket-keys.js.map +1 -0
  69. package/dist/scripts/propose.js +8 -2
  70. package/dist/scripts/propose.js.map +1 -1
  71. package/dist/scripts/vcs/github-pr.js +88 -0
  72. package/dist/scripts/vcs/github-pr.js.map +1 -0
  73. package/package.json +1 -1
  74. package/templates/base/AGENTS.md.tpl +6 -5
package/CHANGELOG.md CHANGED
@@ -8,6 +8,122 @@ The release process is in [`docs/release-process.md`](docs/release-process.md).
8
8
 
9
9
  ## [Unreleased]
10
10
 
11
+ ## [0.22.1] โ€” 2026-10-20
12
+
13
+ Documentation a newcomer can follow, and the CLI's words brought in line with it.
14
+
15
+ ### Changed
16
+
17
+ - **The documentation, rewritten** after an audit of every page against the
18
+ CLI and the first real end-to-end run on Jira Cloud and GitHub. Three
19
+ sources of work (a change, a brief, a Jira ticket) into one lifecycle of
20
+ four verbs; the recorded journeys run `propose`, `apply` and `archive`;
21
+ archive comes before the pull request everywhere. New pages: *From a Jira
22
+ ticket* for a team lead setting it up, and *An existing codebase, with work
23
+ in Jira* (Maven profiles, a parent POM, Bitbucket and Jenkins).
24
+ - **The `/specgate:draft` agent command runs `propose --from-brief`**, and the
25
+ MCP write guard names `specgate propose <id>`.
26
+
27
+ ### Fixed
28
+
29
+ - `propose --help` lists `--no-push`; `alm --help` no longer says a ticket has
30
+ no acceptance criterion.
31
+ - `alm pr` asks for the least token it needs: Pull requests, read and write.
32
+ - `alm pr` is covered by an E2E journey and is not exposed as an MCP tool.
33
+
34
+ ## [0.22.0] โ€” 2026-10-20
35
+
36
+ A brief shaped like what it becomes, checked before any agent drafts from it
37
+ (ADR-0038); and a Jira ticket as source text, as a brief is (ADR-0039). Tried
38
+ end to end on a real Jira Cloud board and GitHub: two stories went from the
39
+ ticket to Done, the board moved by its own automation.
40
+
41
+ ### Fixed
42
+
43
+ - **New ids are free on every branch** (REQ-152). Two changes opened on two
44
+ branches both reserved REQ-002: reserving ids now reads every local and
45
+ remote-tracking branch. A change also reserves its scenario ids,
46
+ `scn_range` in `change.yaml` (REQ-157).
47
+ - **A monorepo's stack is read from its apps** (REQ-153). With npm workspaces,
48
+ `AGENTS.md` said "Stack: Node.js" for a Spring API in `apps/api`.
49
+ - **`specgate update` updates the `AGENTS.md` contract** (REQ-155), keeping its
50
+ facts and project rules, also when the project has no other agent files.
51
+ - **The harness's commits name the ticket** (REQ-156): `KAN-14 REQ-002: โ€ฆ`.
52
+ - **`--agent` on an open change hands the agent its findings.** A second run
53
+ read a finished draft and changed nothing.
54
+ - **Credentials never travel over plain http**: `base_url` and `pr.base_url`
55
+ must be https (localhost excepted).
56
+
57
+ - **`specgate alm pull` works against Jira Cloud again.** Atlassian removed
58
+ `/rest/api/3/search` (HTTP 410); search now pages `/rest/api/3/search/jql`
59
+ by `nextPageToken`, up to 1000 issues.
60
+ - **Tokens created with scopes.** `cloud_id: auto` sends every Jira request
61
+ through `api.atlassian.com/ex/jira/<cloud id>`, the only door such a token
62
+ opens. Sent to the site, such a token is answered as anonymous โ€” HTTP 200 and
63
+ no issues โ€” which used to read as "No open issues"; it is now a 401 whose fix
64
+ names `cloud_id: auto`.
65
+
66
+ ### Changed
67
+
68
+ - **A draft is not opened over a broken brief.** `propose --from-brief
69
+ <module>` refuses with `brief_not_ready` while the brief has an error: an
70
+ empty body, an empty module section, a module without its section once the
71
+ brief uses sections, or rules without examples. A brief with no module
72
+ sections โ€” a pasted email โ€” drafts as before.
73
+ - **`--new-brief` writes cards.** Why, a glossary, a `## Module:` section with
74
+ Rules, Examples and Questions, and notes, in place of the six sections.
75
+
76
+ ### Added
77
+
78
+ - **From a Jira ticket** ([ADR-0039](docs/specs/adr/0039-the-ticket-as-source-text.md),
79
+ change `ticket-source`, [the page](docs/from-a-ticket.md)).
80
+ - `specgate propose --from-ticket <KEY | issue.json> --check`: the ticket's
81
+ intent, source, acceptance criteria and open questions (English, German or
82
+ Spanish headings, ADF or plain text, or `acceptance_field`), and a
83
+ Definition of Ready, T1โ€“T9, each with a fix an analyst applies in Jira.
84
+ - `specgate propose --from-ticket <KEY>`: the change `<key>-<slug>` with
85
+ `ticket.md` as its source โ€” the D-checklist runs against the ticket, and an
86
+ edited copy is `ticket_copy_edited` โ€” the capability from `epics:`, and the
87
+ branch `feature/<KEY>-<slug>` (`bugfix/` for a bug). `--agent` drafts it,
88
+ confined, never writing the copy.
89
+ - `ticket_changed` when the ticket moved since the change was opened;
90
+ `ticket_key_missing` from `check` for a commit on the ticket's branch that
91
+ does not name it.
92
+ - `specgate alm pr <change>`: one pull request per ticket on GitHub, titled
93
+ with the key, its body the requirements and the gate, the archived change
94
+ included (REQ-159). Never merges; keeps what reviewers wrote.
95
+ - The ticket's branch is pushed as soon as it is created (REQ-148), so a
96
+ Jira automation moves the ticket when work starts.
97
+ - `AGENTS.md` names the ticket path (REQ-154); in a project connected to
98
+ Jira, `status` suggests `propose --from-ticket` (REQ-158).
99
+ - **Brief cards** ([ADR-0038](docs/specs/adr/0038-brief-cards.md), change `brief-cards`).
100
+ - `specgate propose --from-brief --check`: rules B1โ€“B11 on the brief, each
101
+ with its fix. Errors (B1โ€“B4) stop a draft; warnings (B5โ€“B11) name vague
102
+ words, promises without a number, technology in a rule, modules too big,
103
+ actors never mentioned, non-goals in a rule, and conditions placed last
104
+ (EARS).
105
+ - `non_goals: [...]` in the front matter.
106
+ - `DRAFTING.md` quotes the module's section and lists its values and
107
+ questions: a rule becomes a requirement, an example a scenario, a question
108
+ a `questions.md` row.
109
+ - `propose --from-brief --agent` proposes the module sections from pasted
110
+ notes, once the fields are complete; a lost line puts the brief back
111
+ (`draft_brief_text_lost`).
112
+ - `propose --help` says when no brief is needed.
113
+ - **"Write the brief" in eight steps**, with a glossary, the EARS patterns and
114
+ the whole Lingo example, its outputs recorded.
115
+
116
+ ### Fixed
117
+
118
+ - **Front matter shapes are reported as shapes.** `actors: [Admin]` was "There
119
+ is no `actors:` list" and `surfaces: web` passed silently; both are now
120
+ `brief_wrong_shape` with the line to write.
121
+ - **D6 no longer reads HTML comments as the brief.** A template's hint such as
122
+ "e.g. 48 hours" made 48 look stated.
123
+ - **`explore` prints a project snapshot**, no longer called a brief.
124
+ - **The guides use `propose --from-brief`** where they still said `draft`, and
125
+ forja's guide follows propose โ†’ apply โ†’ archive.
126
+
11
127
  ## [0.21.0] โ€” 2026-10-20
12
128
 
13
129
  The daily loop becomes four verbs over the same gate (ADR-0035), the gate stops
package/README.md CHANGED
@@ -12,126 +12,111 @@
12
12
 
13
13
  </div>
14
14
 
15
- > Stop coding before requirements are operationally clear. Every requirement
16
- > maps to a scenario, a domain artefact, an implementation and a test โ€” and the
17
- > gate fails when one is missing.
15
+ Specgate keeps what your product must do in the repository, as numbered
16
+ requirements with Gherkin scenarios, next to the code and the tests that prove
17
+ them. A test that mentions a requirement's id (`REQ-007`) is the link, and the
18
+ traceability matrix is generated from those mentions. The gate, `specgate check`,
19
+ fails a pull request when a delivered requirement has no scenario or no test
20
+ that names it, or when your test suite fails.
18
21
 
19
- ---
22
+ ## โšก Install
20
23
 
21
- ## โšก Start
24
+ You need **Node.js 22 or later**.
22
25
 
23
26
  ```bash
24
- npm i -g @rsaglobaltech/specgate # or prefix every command with npx @rsaglobaltech/specgate@latest
25
-
26
- cd your-repo # or an empty directory
27
- specgate init # adopts the code that is there, touching none of it;
28
- # scaffolds a new project where there is none
29
- specgate ci init # the gate as a CI job โ€” GitHub, GitLab, Azure or Jenkins,
30
- # detected from the repository
31
- specgate check # the gate, locally
27
+ npm install --save-dev @rsaglobaltech/specgate # in a project with a package.json
28
+ npx specgate --help
32
29
  ```
33
30
 
34
- Requires **Node.js โ‰ฅ 22** โ€” or none with Docker: `docker run --rm -v "$PWD:/workspace" ghcr.io/rsaglobaltech/specgate check`.
35
- The package is scoped, the binary is not ([ADR-0024](docs/specs/adr/0024-the-tool-is-renamed-the-format-is-not.md)).
31
+ Without installing it (an empty folder, a Java or Python project), prefix each
32
+ command with `npx @rsaglobaltech/specgate@latest` instead of `npx specgate`.
33
+ With Docker and no Node.js: `docker run --rm -v "$PWD:/workspace" ghcr.io/rsaglobaltech/specgate check`.
36
34
 
37
- โ†’ [Getting started](docs/getting-started.md) ยท [Your team's first pull request](docs/first-pr.md) ยท [Quickstart for joiners](docs/quickstart.md)
35
+ Then run `init` once:
38
36
 
39
- ## ๐Ÿ” The daily loop โ€” four verbs
37
+ - **In a repository that has code** (`package.json`, `pom.xml`, `go.mod`, โ€ฆ),
38
+ `specgate init` adopts it in place: it adds `spec.md`, `features/` and
39
+ `docs/specs/`, and changes no source file.
40
+ - **In an empty folder**, `npx @rsaglobaltech/specgate@latest init` scaffolds a
41
+ new specification project. A wizard asks for the project's name, type, stack
42
+ and test toolchain, then creates it in a new sub-folder named after the
43
+ project, for example `./my-spec-driven-app/`. `--yes` takes every default
44
+ without asking. It writes the specification files, not application code.
45
+
46
+ Step by step, with every output shown: [Getting started](docs/getting-started.md).
47
+
48
+ ## ๐Ÿ” The lifecycle โ€” four verbs
40
49
 
41
50
  ```bash
42
- specgate propose add-pdf-invoices # a change: proposal, tasks, a delta to write, REQ ids reserved
43
- # write REQ-007 and its scenario in the delta, a test that mentions REQ-007, the code
44
- specgate apply # the next requirement through the gate: Implemented when green
45
- specgate status # what is open, and the next command to run
51
+ specgate propose add-pdf-invoices # open a change: a proposal, a delta to write, REQ ids reserved
52
+ # write REQ-007 and its scenario in the delta, a test that mentions REQ-007, then the code
53
+ specgate apply REQ-007 # refused until a test names it and the gate passes; then Implemented
54
+ specgate status # what is left, and the next command to run
46
55
  specgate archive add-pdf-invoices # once every requirement in it is Implemented
47
56
  ```
48
57
 
49
- `specgate check` is the same gate for CI ([ADR-0035](docs/specs/adr/0035-four-verbs-one-lifecycle.md)).
50
- **A change is archived when its code is done**: while it is open its
51
- requirements already count โ€” `status` lists them, `apply` and `check` judge the
52
- project as it will be after archive โ€” and `archive` refuses one still pending.
53
- `apply` refuses a requirement no test names and writes nothing while the gate
54
- fails. **Mentioning `REQ-NNN` in a test is the link**; the matrix is generated.
55
- From a plan: `specgate propose --from-brief`. Old names (`draft`, `done`โ€ฆ) keep
56
- working; everything else is in `specgate --help --all`.
58
+ `specgate check` runs the same gate before a pull request and in CI;
59
+ `specgate ci init` writes the CI job for GitHub, GitLab, Azure or Jenkins.
60
+ You archive a change on its branch, before the pull request, so the spec and
61
+ the code reach review together.
57
62
 
58
- ## ๐Ÿชœ Adopt one level at a time
63
+ ## ๐Ÿ“ฅ Where work comes from
59
64
 
60
- Each level is useful on its own and never requires the ones above it.
65
+ Every piece of work enters the same lifecycle. Pick the entry that matches what
66
+ you have:
61
67
 
62
- | Level | You get | Commands | Cost |
63
- | ------ | ------------------------------------------------ | ---------------------------- | ------- |
64
- | **L1** | Traceable specs in your repo | `init`, `propose`, `apply`, `archive` | ~1 hour |
65
- | **L2** | A PR gate enforcing spec and test coverage | `check`, `ci init` | ~1 hour |
66
- | **L3** | Versioned, reusable domain requirements | `specops add / sync / diff` | ~1 day |
67
- | **L4** | Agent-driven delivery, one requirement at a time | `agents init`, `harness run` | ~1 week |
68
+ | You have | Run | Guide |
69
+ | --- | --- | --- |
70
+ | One behaviour to add or change | `specgate propose <change-id>` | [Propose one change](docs/start/existing-2-specify.md) |
71
+ | A client brief, or a plan for a new product | `specgate propose --from-brief` | [From a client brief](docs/from-a-brief.md) |
72
+ | A Jira story with acceptance criteria | `specgate propose --from-ticket <KEY>` | [From a Jira ticket](docs/from-a-ticket.md) |
68
73
 
69
74
  ## ๐Ÿ› ๏ธ What it does
70
75
 
71
- **A gate that does not lie.** `specgate check` fails when a delivered
72
- requirement has no scenario, template steps, no test that mentions it, or
73
- points at a file that is gone. A Draft owes nothing yet: green on day one,
74
- stricter with every delivery. Given a test command, it runs your suite too.
75
- โ†’ [Writing specs](docs/writing-specs.md) ยท [Validating](docs/validating.md) ยท [Command reference](docs/commands.md)
76
-
77
- **Reviews that read intent.** The reviewer reads the requirement, its
78
- scenario and the test that names it โ€” the gate has already proved the
79
- mechanical part. A change is a reviewable delta: only what moves, never a
80
- copy. It is archived โ€” merged into the spec tree, with its feature files โ€”
81
- only once every requirement in it passed the gate, in the same pull request.
82
- โ†’ [Your team's first pull request](docs/first-pr.md) ยท [Reviewing changes](docs/reviewing-changes.md)
83
-
84
- **From a brief, or from OpenSpec.** Save your plan as `docs/brief.md`, run
85
- `specgate propose --from-brief`: module by module, it briefs your agent and holds
86
- the draft to eleven rules โ€” scenarios per actor and surface, sourced laws, every
87
- value in the brief or listed as an assumption, open questions that block, ids each
88
- actor can reach. Teams on OpenSpec keep it: `specgate verify` fails while
89
- a change claims a scenario no test names.
90
- โ†’ [A new project, step by step](docs/new-project.md) ยท [From a client brief](docs/from-a-brief.md) ยท [Already on OpenSpec](docs/openspec.md)
91
-
92
- **Your agent works the same loop.** `specgate agents init` gives Claude Code, Cursor,
93
- Copilot, Windsurf, Aider, Gemini, Cline, Codex or Antigravity the loop as slash commands
94
- (`/specgate:propose`, `/specgate:apply`, โ€ฆ) from one definition. Every daily command speaks
95
- JSON with stable codes and a `fix` on each. MCP ships in the package: `specgate mcp install --client claude`.
96
- โ†’ [Agents](docs/agents.md) ยท [The agent contract](docs/specs/agent-contract.md) ยท [Automation and MCP](docs/automation.md)
97
-
98
- **Domain knowledge as a dependency.** A pack is a versioned, schema-validated
99
- domain model. Install it, pin it, upgrade it deliberately โ€” and review the
100
- upgrade as intent with `specops diff --as-change`, not as a file diff.
101
- โ†’ [Domain packs: 7 proven in the pilots, 11 starter examples](docs/domain-packs.md) ยท [Supply chain](docs/supply-chain.md)
102
-
103
- **Unattended delivery.** `specgate harness run` drives plan โ†’ agent โ†’ verify โ†’
104
- apply for every pending requirement, each in its own git worktree; it merges only
105
- with `--chain`, only what passed the gate. The agent is any shell command with
106
- `{prompt_file}`; `specgate studio` shows it at work, at `/live`. `specgate alm sync`
107
- keeps Jira, Azure Boards or GitHub Issues in step.
108
- โ†’ [The harness](docs/harness.md) ยท [Jira, Azure Boards and GitHub Issues](docs/alm.md)
109
-
110
- **Tested as you install it.** Every release runs an end-to-end suite over every
111
- command, against the packed tarball, on Linux, macOS and Windows; releases
112
- since 0.14 come from building real products with it, from brief to running app.
76
+ - **A gate that does not lie.** `check` fails when a delivered requirement has
77
+ no scenario, no test that names it, or points at a missing file. A `Draft`
78
+ owes nothing yet, so the gate is green on day one.
79
+ โ†’ [Validating](docs/validating.md)
80
+ - **Reviews that read intent.** A change is a delta: only what moves. The
81
+ reviewer reads the requirement, its scenario and its test.
82
+ โ†’ [Your team's first pull request](docs/first-pr.md)
83
+ - **Drafts held to their source.** A draft from a brief or a ticket is checked
84
+ against that text: every value it uses must come from the source or be listed
85
+ as an assumption. โ†’ [From a client brief](docs/from-a-brief.md)
86
+ - **Your agent works the same loop.** `specgate agents init` installs the loop
87
+ as slash commands for Claude Code, Cursor, Copilot and other agent tools; an
88
+ MCP server ships in the package. โ†’ [Agent tools](docs/agents.md)
89
+ - **Unattended delivery.** `specgate harness run` hands each pending requirement
90
+ to your coding agent in its own git worktree and keeps only what passes the
91
+ gate. โ†’ [The harness](docs/harness.md)
92
+ - **Domain knowledge as a dependency.** Versioned domain packs install
93
+ requirements a team has already proved. โ†’ [Domain packs](docs/domain-packs.md)
94
+ - **Already on OpenSpec?** `specgate verify` checks what OpenSpec calls done
95
+ against your tests. โ†’ [Already on OpenSpec](docs/openspec.md)
113
96
 
114
97
  ## ๐Ÿ†š How it compares
115
98
 
116
- | Capability | **this** | [OpenSpec](https://github.com/Fission-AI/OpenSpec) | [spec-kit](https://github.com/github/spec-kit) | [Cursor rules](https://docs.cursor.com/context/rules-for-ai) | README only |
117
- | -------------------------------------- | :--------------------: | :------------------------------------------------: | :--------------------------------------------: | :----------------------------------------------------------: | :---------: |
118
- | Change lifecycle | โœ… | โœ… | โŒ | โŒ | โŒ |
119
- | Versioned domain packs | โœ… | โŒ | โš ๏ธ | โŒ | โŒ |
120
- | Traceability matrix + CI gate | โœ… | โŒ | โš ๏ธ | โŒ | โŒ |
121
- | Agent JSON contract | โœ… | โœ… | โŒ | โŒ | โŒ |
122
- | Draft checklist from a brief | โœ… | โŒ | โš ๏ธ | โŒ | โŒ |
123
- | Proves OpenSpec's "done" against tests | โœ… `verify` | โŒ | โŒ | โŒ | โŒ |
124
- | Vendor-neutral | โœ… | โœ… | โœ… | โŒ | โœ… |
125
- | Commands to learn before the first PR | โœ… 6 (31 more, opt-in) | โœ… | โœ… | โœ… | โœ… |
99
+ Specgate does each of the things below. What the closest alternatives cover:
100
+
101
+ | Capability | [OpenSpec](https://github.com/Fission-AI/OpenSpec) | [spec-kit](https://github.com/github/spec-kit) | [Cursor rules](https://docs.cursor.com/context/rules-for-ai) |
102
+ | ----------------------------- | :------------------------------------------------: | :--------------------------------------------: | :----------------------------------------------------------: |
103
+ | Change lifecycle | โœ… | โŒ | โŒ |
104
+ | Traceability matrix + CI gate | โŒ | โš ๏ธ | โŒ |
105
+ | Draft checked against a brief | โŒ | โš ๏ธ | โŒ |
106
+ | Work from Jira tickets | โŒ | โŒ | โŒ |
107
+ | Versioned domain packs | โŒ | โš ๏ธ | โŒ |
108
+ | Vendor-neutral | โœ… | โœ… | โŒ |
126
109
 
127
- OpenSpec is the closest tool: if you want the change loop without packs or an enforced matrix, it fits better.
128
- โ†’ [Full matrix, trade-offs and migration paths](docs/comparisons.md)
110
+ OpenSpec is the closest tool: if you want the change loop without an enforced
111
+ gate, it fits better. โ†’ [Full comparison](docs/comparisons.md)
129
112
 
130
113
  ## ๐Ÿ“š Documentation
131
114
 
132
- - [Getting started](docs/getting-started.md) ยท [Your team's first pull request](docs/first-pr.md) ยท [Command reference](docs/commands.md)
133
- - [How-to guides](docs/how-to.md) ยท [Tutorial](docs/tutorial.md) ยท [Supply chain](docs/supply-chain.md) ยท [Architecture](docs/specs/architecture.md)
134
- - [Case study](docs/case-studies/case-1.md) ยท [ADRs](docs/specs/adr/README.md) ยท [Docs site](https://rsaglobaltech.github.io/specgate/) ยท [Spec coverage report](https://rsaglobaltech.github.io/specgate/report.html)
115
+ - [Getting started](docs/getting-started.md) โ€” install, pick your path, the four verbs
116
+ - [From a Jira ticket](docs/from-a-ticket.md) ยท [From a client brief](docs/from-a-brief.md)
117
+ - [Concepts](docs/concepts.md) โ€” the ideas and vocabulary behind every command
118
+ - [Commands](docs/commands.md) โ€” every command and flag
119
+ - [FAQ](docs/faq.md) ยท [Troubleshooting](docs/troubleshooting.md) ยท [Docs site](https://rsaglobaltech.github.io/specgate/)
135
120
 
136
121
  ## ๐Ÿงฐ Companion tools
137
122
 
@@ -140,8 +125,8 @@ OpenSpec is the closest tool: if you want the change loop without packs or an en
140
125
 
141
126
  ## ๐Ÿค Contributing
142
127
 
143
- PRs welcome โ€” see [CONTRIBUTING.md](CONTRIBUTING.md) (good first: templates, validator rules,
144
- domain packs) ยท [MAINTAINERS.md](MAINTAINERS.md) ยท [SECURITY.md](SECURITY.md) for private reports.
128
+ PRs welcome โ€” see [CONTRIBUTING.md](CONTRIBUTING.md) ยท [MAINTAINERS.md](MAINTAINERS.md) ยท
129
+ [SECURITY.md](SECURITY.md) for private reports.
145
130
 
146
131
  ## ๐Ÿ“„ License
147
132