roadmapsmith 0.9.28 → 0.9.30
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.
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/README.md +100 -314
- package/bin/cli.js +49 -15
- package/package.json +2 -2
- package/skills/roadmap-status/SKILL.md +7 -6
- package/skills/roadmap-sync/SKILL.md +1 -1
- package/skills/roadmap-update/SKILL.md +4 -4
- package/skills.json +13 -13
- package/src/config.js +7 -2
- package/src/host.js +96 -27
- package/src/io.js +2 -0
- package/src/parser/index.js +50 -0
- package/src/slash.js +126 -44
- package/src/sync/index.js +48 -4
- package/src/validator/index.js +614 -26
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "roadmapsmith",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.9.30",
|
|
4
|
+
"description": "Evidence-backed ROADMAP.md workflows for AI coding agents, with canonical RoadmapSmith status and maintain surfaces plus advanced sync/generate tools and legacy compatibility aliases.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "PapiScholz"
|
|
7
7
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "roadmapsmith",
|
|
3
|
-
"version": "0.9.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.9.30",
|
|
4
|
+
"description": "Evidence-backed ROADMAP.md workflows for AI coding agents, with canonical RoadmapSmith status and maintain surfaces plus advanced sync/generate tools and legacy compatibility aliases.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "PapiScholz"
|
|
7
7
|
},
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"interface": {
|
|
36
36
|
"displayName": "RoadmapSmith",
|
|
37
37
|
"shortDescription": "Evidence-backed roadmap workflows for AI coding agents",
|
|
38
|
-
"longDescription": "Install RoadmapSmith in Codex to expose the shared skills bundle for zero-mode onboarding, existing-repo maintenance, roadmap discovery,
|
|
38
|
+
"longDescription": "Install RoadmapSmith in Codex to expose the shared skills bundle for zero-mode onboarding, existing-repo maintenance, roadmap discovery, evidence-backed validation, and compatibility-aware host readiness while keeping the CLI and Claude bundle surfaces aligned.",
|
|
39
39
|
"developerName": "PapiScholz",
|
|
40
40
|
"category": "Developer Tools",
|
|
41
41
|
"capabilities": [
|
package/README.md
CHANGED
|
@@ -1,378 +1,164 @@
|
|
|
1
|
-
|
|
2
|
-
<img src="https://raw.githubusercontent.com/PapiScholz/roadmapsmith/main/assets/roadmapsmith-logo.png" alt="RoadmapSmith logo" width="180">
|
|
3
|
-
</p>
|
|
1
|
+
# RoadmapSmith CLI Contract
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
This package owns the RoadmapSmith CLI, validator, sync engine, host setup files, and the shared command-surface contract consumed by the root bundle docs, `skills.json`, and both plugin manifests.
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
## Public Contract
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
### Canonical
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
- `roadmapsmith setup`
|
|
10
|
+
- `roadmapsmith zero`
|
|
11
|
+
- `roadmapsmith maintain`
|
|
12
|
+
- `roadmapsmith status [--json]`
|
|
13
|
+
- `roadmapsmith validate [--json] [--strict]`
|
|
14
|
+
- `roadmapsmith update [--task <stable-id> --evidence "<single-line evidence>"]`
|
|
12
15
|
|
|
13
|
-
|
|
14
|
-
npm install -g roadmapsmith
|
|
15
|
-
roadmapsmith setup
|
|
16
|
-
roadmapsmith zero
|
|
17
|
-
roadmapsmith maintain
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Slash entrypoints are also supported from the CLI and launcher, for example: `roadmapsmith /roadmap`, `roadmapsmith /roadmap-zero`, `roadmapsmith /roadmap-maintain`, `roadmapsmith /roadmap-update`, and the deprecated legacy router form `roadmapsmith /roadmap-sync validate`.
|
|
21
|
-
The generated VS Code task layer now resolves Node automatically where possible; if it cannot, RoadmapSmith prints a readable runtime diagnostic instead of a dead task.
|
|
22
|
-
`RoadmapSmith: Status` now treats "ready" as runnable task UX, not merely generated files.
|
|
23
|
-
|
|
24
|
-
### Agent Skill
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
npx skills add PapiScholz/roadmapsmith --skill '*' -a claude-code
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
This is the recommended Claude Code install path for native GUI slash commands such as `/roadmap`, `/roadmap-zero`, `/roadmap-maintain`, `/roadmap-status`, `/roadmap-init`, `/roadmap-generate`, `/roadmap-validate`, `/roadmap-update`, `/roadmap-audit`, and `/roadmap-setup`.
|
|
31
|
-
`roadmap-sync` is deprecated compatibility only; install the full bundle for new workflows and use `/roadmap-maintain` or `/roadmap-update`.
|
|
32
|
-
The skill bundle does not install the CLI and it does not create visible VS Code actions by itself.
|
|
33
|
-
The published `roadmapsmith` package/plugin surface now also ships the shared bundle files for both hosts (`skills.json`, `skills/*`, `.codex-plugin/plugin.json`, `.claude-plugin/plugin.json`) for downstream host installers, but consuming the CLI alone still does not auto-register native Codex or Claude GUI commands.
|
|
16
|
+
### Advanced
|
|
34
17
|
|
|
35
|
-
|
|
18
|
+
- `roadmapsmith init`
|
|
19
|
+
- `roadmapsmith generate`
|
|
20
|
+
- `roadmapsmith generate --full-regen`
|
|
21
|
+
- `roadmapsmith sync`
|
|
22
|
+
- `roadmapsmith sync --audit`
|
|
23
|
+
- `roadmapsmith sync` as the advanced alias for `roadmapsmith update`
|
|
36
24
|
|
|
37
|
-
|
|
25
|
+
### Compatibility only
|
|
38
26
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
npm install roadmapsmith@latest
|
|
27
|
+
- `roadmapsmith doctor`
|
|
28
|
+
- `roadmapsmith regenerate`
|
|
29
|
+
- `roadmapsmith /road <action>`
|
|
30
|
+
- `roadmapsmith /roadmap-sync <action>`
|
|
31
|
+
- deprecated direct aliases such as `/maintain` or `/status`
|
|
45
32
|
|
|
46
|
-
|
|
47
|
-
npx roadmapsmith@latest validate --json
|
|
48
|
-
```
|
|
33
|
+
`status` is the public readiness command. `doctor` remains a compatibility alias to the same payload.
|
|
49
34
|
|
|
50
|
-
|
|
35
|
+
`update` is the public checklist-refresh and verified single-task completion family. `sync` remains executable as the advanced alias for the refresh path.
|
|
51
36
|
|
|
52
|
-
|
|
53
|
-
npx skills add PapiScholz/roadmapsmith --skill '*' -a claude-code
|
|
54
|
-
```
|
|
37
|
+
`generate --full-regen` is the only public destructive rebuild path. `regenerate` remains executable but prints a deprecation warning.
|
|
55
38
|
|
|
56
|
-
|
|
57
|
-
After updating the CLI, rerun `roadmapsmith setup` in repositories where you want the latest VS Code tasks, task wrappers, launcher behavior, or Claude hook template. Published npm/plugin artifacts now include the Codex and Claude bundle files for downstream host loaders, but native UX still depends on the host loading the correct surface.
|
|
58
|
-
|
|
59
|
-
Fixes are available through `@latest` after the automated release path completes on `main`. In this repo, a successful push to `main` now opens or refreshes an automated `release/vX.Y.Z` PR, that PR squashes back into `main` as the bot release commit `chore(release): vX.Y.Z`, and the follow-up `main` run publishes the new patch version. Before that completes, install from a local checkout or a packed tarball for testing.
|
|
60
|
-
|
|
61
|
-
## Operating Modes
|
|
39
|
+
## Modes
|
|
62
40
|
|
|
63
41
|
### Zero Mode
|
|
64
42
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
Run `roadmapsmith setup` first if you want visible VS Code tasks. `roadmapsmith zero` is the one-command entrypoint: it runs the terminal interview, creates governance files when needed, and generates the first roadmap.
|
|
68
|
-
|
|
69
|
-
```bash
|
|
70
|
-
roadmapsmith setup
|
|
71
|
-
roadmapsmith zero
|
|
72
|
-
```
|
|
43
|
+
Use for empty or low-context repositories. `roadmapsmith zero` runs the terminal interview, updates config, and generates the first roadmap.
|
|
73
44
|
|
|
74
45
|
### Sync/Audit Mode
|
|
75
46
|
|
|
76
|
-
|
|
47
|
+
Use for repositories that already contain code, tests, docs, TODOs, or an existing roadmap. `roadmapsmith maintain` is the preserve-first one-command flow.
|
|
77
48
|
|
|
78
|
-
|
|
79
|
-
roadmapsmith setup
|
|
80
|
-
roadmapsmith maintain
|
|
81
|
-
```
|
|
49
|
+
## Verification Model
|
|
82
50
|
|
|
83
|
-
|
|
51
|
+
RoadmapSmith separates candidate discovery from completion.
|
|
84
52
|
|
|
85
|
-
|
|
53
|
+
Candidate discovery may use:
|
|
86
54
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
55
|
+
- explicit path hints
|
|
56
|
+
- symbol matches
|
|
57
|
+
- code-token overlap
|
|
58
|
+
- task-path overlap
|
|
59
|
+
- test references
|
|
92
60
|
|
|
93
|
-
|
|
61
|
+
Unchecked implementation tasks complete only from:
|
|
94
62
|
|
|
95
|
-
|
|
63
|
+
- valid explicit `Evidence:`
|
|
64
|
+
- `Verify: kind=contains`
|
|
65
|
+
- `Verify: kind=property`
|
|
66
|
+
- `Verify: kind=endpoints`
|
|
67
|
+
- `Verify: kind=behavior` plus fresh configured test-report proof
|
|
96
68
|
|
|
97
|
-
|
|
98
|
-
|---|---|
|
|
99
|
-
| Claude Code | Supported through the full RoadmapSmith skill bundle for native GUI slash commands, plus `roadmapsmith setup` for visible VS Code tasks and the optional repo-local Claude hook. |
|
|
100
|
-
| Codex / Codex CLI | Supported through the native Codex plugin surface (`.codex-plugin/plugin.json` + repo marketplace) and the visible VS Code task workflow after `roadmapsmith setup`. |
|
|
101
|
-
| CI | Use disposable checkouts if you run `sync --audit`, because it still mutates the roadmap today. |
|
|
102
|
-
| Other hosts | Use the skill plus manual CLI commands. |
|
|
69
|
+
Behavioral tasks without explicit proof remain warnings. When the engine can generate exactly one task-specific verification recipe, sync can render it as `Verification recipe:`. If the recipe is global, duplicated, off-domain, or otherwise non-specific, it is suppressed.
|
|
103
70
|
|
|
104
|
-
|
|
71
|
+
Generated outputs such as `dist-electron/`, `dist/`, `build/`, `out/`, `.next/`, and `coverage/` are excluded from heuristic evidence discovery.
|
|
105
72
|
|
|
106
|
-
|
|
107
|
-
& "C:\Program Files\nodejs\node.exe" "$env:APPDATA\npm\node_modules\roadmapsmith\bin\cli.js" <command>
|
|
108
|
-
```
|
|
73
|
+
Auxiliary tooling paths such as `scripts/` and `tools/` are excluded from heuristic scoring unless the task explicitly references them.
|
|
109
74
|
|
|
110
|
-
|
|
75
|
+
## Strict Validation
|
|
111
76
|
|
|
112
|
-
|
|
77
|
+
`roadmapsmith validate --strict` is the independent audit path.
|
|
113
78
|
|
|
114
|
-
|
|
115
|
-
roadmapsmith /roadmap
|
|
116
|
-
roadmapsmith /roadmap-zero
|
|
117
|
-
roadmapsmith /roadmap-maintain
|
|
118
|
-
roadmapsmith /roadmap-update
|
|
119
|
-
roadmapsmith /roadmap-sync validate
|
|
120
|
-
roadmapsmith setup [--project-root <path>] [--config <path>] [--editor vscode] [--hosts <codex,claude>] [--dry-run]
|
|
121
|
-
roadmapsmith zero [--project-root <path>] [--config <path>]
|
|
122
|
-
roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen]
|
|
123
|
-
roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]
|
|
124
|
-
roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit] [--full-regen]
|
|
125
|
-
roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit]
|
|
126
|
-
roadmapsmith update --task <stable-id> --evidence <text> [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run]
|
|
127
|
-
roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--task <id|text>] [--json]
|
|
128
|
-
roadmapsmith status [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json]
|
|
129
|
-
roadmapsmith doctor [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json] # compatibility alias
|
|
130
|
-
```
|
|
79
|
+
In strict mode:
|
|
131
80
|
|
|
132
|
-
|
|
81
|
+
- candidate discovery still narrows where to look
|
|
82
|
+
- PASS may come only from explicit `Evidence:` or passing typed `Verify:`
|
|
83
|
+
- file existence, domain overlap, token proximity, and test-file presence alone never produce PASS
|
|
84
|
+
- preserved checked-state behavior is disabled
|
|
133
85
|
|
|
134
|
-
|
|
86
|
+
Recommended audit sequence:
|
|
135
87
|
|
|
136
88
|
```bash
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
Then reload the session:
|
|
141
|
-
|
|
142
|
-
1. Run `/reload-skills`
|
|
143
|
-
2. If RoadmapSmith was installed through a Claude plugin, also run `/reload-plugins`
|
|
144
|
-
3. Confirm the slash menu shows `/roadmap`, `/roadmap-zero`, `/roadmap-maintain`, `/roadmap-status`, `/roadmap-init`, `/roadmap-generate`, `/roadmap-validate`, `/roadmap-update`, `/roadmap-audit`, and `/roadmap-setup`
|
|
145
|
-
|
|
146
|
-
Native Claude GUI slash commands come from the installed skill bundle. CLI slash routing such as `roadmapsmith /roadmap` is a separate surface and does not populate the Claude GUI menu by itself. The packed npm artifact now mirrors that bundle on disk so published plugin/distribution flows can expose the same slash set without depending on a source checkout.
|
|
147
|
-
|
|
148
|
-
## Codex native plugin install
|
|
149
|
-
|
|
150
|
-
RoadmapSmith now exposes a native Codex plugin manifest at `.codex-plugin/plugin.json` and a repo-local marketplace at `.agents/plugins/marketplace.json`.
|
|
151
|
-
|
|
152
|
-
From the repository root:
|
|
153
|
-
|
|
154
|
-
```bash
|
|
155
|
-
codex plugin marketplace add .
|
|
89
|
+
roadmapsmith maintain
|
|
90
|
+
roadmapsmith validate --strict --json
|
|
156
91
|
```
|
|
157
92
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
Codex native plugin support means install/enable discovery inside Codex. It is separate from Claude-specific `/reload-skills` behavior, and the VS Code task layer remains the fallback/manual workflow when you are not using the plugin directory.
|
|
93
|
+
`sync --audit` remains an advanced mutating summary, not an independent audit engine.
|
|
161
94
|
|
|
162
|
-
|
|
95
|
+
## Slash And Host Surfaces
|
|
163
96
|
|
|
164
|
-
|
|
165
|
-
- `claudeCli`
|
|
166
|
-
- `codexGui`
|
|
167
|
-
- `codexCli`
|
|
97
|
+
Canonical native slash surfaces:
|
|
168
98
|
|
|
169
|
-
|
|
99
|
+
- `/roadmap`
|
|
100
|
+
- `/roadmap-zero`
|
|
101
|
+
- `/roadmap-maintain`
|
|
102
|
+
- `/roadmap-status`
|
|
103
|
+
- `/roadmap-validate`
|
|
104
|
+
- `/roadmap-update`
|
|
105
|
+
- `/roadmap-setup`
|
|
170
106
|
|
|
171
|
-
|
|
107
|
+
Advanced native slash surfaces:
|
|
172
108
|
|
|
173
|
-
-
|
|
174
|
-
-
|
|
109
|
+
- `/roadmap-init`
|
|
110
|
+
- `/roadmap-generate`
|
|
111
|
+
- `/roadmap-audit`
|
|
175
112
|
|
|
176
|
-
|
|
113
|
+
Compatibility-only slash surfaces:
|
|
177
114
|
|
|
178
|
-
|
|
115
|
+
- `/roadmap-sync <action>`
|
|
116
|
+
- `/road <action>`
|
|
117
|
+
- deprecated direct aliases
|
|
179
118
|
|
|
180
|
-
-
|
|
181
|
-
- Uses stable task IDs: `<!-- rs:task=<slug> -->`.
|
|
182
|
-
- Sync marks `[x]` only when validation passes.
|
|
183
|
-
- `sync --audit` currently runs sync and then prints a mismatch summary; it is not yet a dedicated read-only audit mode.
|
|
184
|
-
- Validation evidence gate:
|
|
185
|
-
- code OR test OR artifact evidence required.
|
|
186
|
-
- test evidence required for code tasks when test frameworks are detected.
|
|
187
|
-
- Validation failures in sync write warning lines:
|
|
188
|
-
- `- ⚠️ attempted but validation failed: <reason>` when there is concrete attempt evidence
|
|
189
|
-
- `- ⚠️ no implementation evidence found yet: <reason>` when there is not
|
|
190
|
-
- Preserves unmanaged markdown content by updating only the managed roadmap block.
|
|
191
|
-
- `validate` emits structured diagnostics in human and JSON output (`FAIL:NOT_IMPLEMENTED`, `FAIL:NO_TEST`, `FAIL:MISSING_REFERENCE`, and `WARN:STALE_EVIDENCE`).
|
|
192
|
-
- `update --task <id> --evidence <text>` writes only when the evidence validates at high confidence; otherwise the roadmap is unchanged.
|
|
119
|
+
Native-bundle readiness is computed from canonical surfaces only. Missing advanced labels or duplicate legacy `/roadmap-sync` installs are warnings, not canonical-health failures.
|
|
193
120
|
|
|
194
|
-
##
|
|
121
|
+
## Host Setup
|
|
195
122
|
|
|
196
|
-
|
|
197
|
-
- Agent rules file: `./AGENTS.md` (falls back to `./CLAUDE.md` when present)
|
|
198
|
-
- Config file: `./roadmap-skill.config.json`
|
|
123
|
+
`roadmapsmith setup` generates:
|
|
199
124
|
|
|
200
|
-
|
|
125
|
+
- `.vscode/tasks.json`
|
|
126
|
+
- `.vscode/roadmapsmith-launcher.js`
|
|
127
|
+
- `.vscode/roadmapsmith-task.cmd`
|
|
128
|
+
- `.vscode/roadmapsmith-task.sh`
|
|
129
|
+
- optional Claude hook wiring
|
|
201
130
|
|
|
202
|
-
|
|
203
|
-
2. `config.roadmapFile` in `roadmap-skill.config.json`
|
|
204
|
-
3. Existing `./ROADMAP.md`
|
|
205
|
-
4. Existing `./roadmap.md` (legacy fallback)
|
|
206
|
-
5. `./ROADMAP.md` when neither file exists
|
|
131
|
+
The internal hook filename remains `.claude/hooks/roadmap-sync.js`. It is a legacy internal filename, not a public command surface.
|
|
207
132
|
|
|
208
133
|
## Config
|
|
209
134
|
|
|
210
|
-
|
|
135
|
+
Typical config file:
|
|
211
136
|
|
|
212
137
|
```json
|
|
213
138
|
{
|
|
214
139
|
"roadmapFile": "./ROADMAP.md",
|
|
215
140
|
"agentsFile": "./AGENTS.md",
|
|
216
|
-
"
|
|
217
|
-
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"positioning": "What makes this different from alternatives.",
|
|
221
|
-
"primaryUser": "Frontend developers, full-stack developers, and AI coding agents.",
|
|
222
|
-
"targetOutcome": "A stable CLI that captures full-page screenshots, crawls internal links, exports metadata, and produces an AI-readable report.",
|
|
223
|
-
"antiGoals": [
|
|
224
|
-
"Do not bypass authentication",
|
|
225
|
-
"Do not target private systems without authorization"
|
|
226
|
-
],
|
|
227
|
-
"risks": [
|
|
228
|
-
"Browser automation instability",
|
|
229
|
-
"Scope creep into generic scraping"
|
|
230
|
-
],
|
|
231
|
-
"successCriteria": [
|
|
232
|
-
"CLI works against a public test site",
|
|
233
|
-
"Screenshots and metadata are exported deterministically",
|
|
234
|
-
"README documents safe and authorized usage"
|
|
235
|
-
]
|
|
236
|
-
},
|
|
237
|
-
|
|
238
|
-
"taskMatchers": [
|
|
239
|
-
{
|
|
240
|
-
"pattern": "src/payments/",
|
|
241
|
-
"task": "Complete payment flow hardening",
|
|
242
|
-
"phase": "P0",
|
|
243
|
-
"priority": "P0"
|
|
244
|
-
}
|
|
245
|
-
],
|
|
246
|
-
"validators": [
|
|
247
|
-
{
|
|
248
|
-
"type": "file-exists",
|
|
249
|
-
"when": "migration",
|
|
250
|
-
"path": "db/migrations"
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
"type": "grant-evidence",
|
|
254
|
-
"whenId": "^p0-electron-builder-windows$",
|
|
255
|
-
"evidence": ["test"],
|
|
256
|
-
"testFiles": ["test/electron-builder.test.js"]
|
|
257
|
-
}
|
|
258
|
-
],
|
|
259
|
-
"customSections": [
|
|
260
|
-
{
|
|
261
|
-
"title": "Compliance",
|
|
262
|
-
"items": [
|
|
263
|
-
"- [ ] Complete SOC2 evidence packet <!-- rs:task=compliance-soc2-evidence -->"
|
|
264
|
-
]
|
|
265
|
-
}
|
|
266
|
-
],
|
|
267
|
-
"plugins": [
|
|
268
|
-
"./plugins/roadmap.plugin.js"
|
|
269
|
-
],
|
|
270
|
-
"milestones": [
|
|
271
|
-
{ "version": "v0.1", "goal": "Foundation" },
|
|
272
|
-
{ "version": "v0.2", "goal": "Reliability" },
|
|
273
|
-
{ "version": "v0.3", "goal": "Release candidate" },
|
|
274
|
-
{ "version": "v1.0", "goal": "General availability" }
|
|
275
|
-
],
|
|
276
|
-
"phaseTemplates": {
|
|
277
|
-
"P0": ["Stabilize critical path"],
|
|
278
|
-
"P1": ["Expand reliability"],
|
|
279
|
-
"P2": ["Finalize release hardening"]
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
Task markers can include `rs:no-test` to disable the test-evidence requirement for one task:
|
|
285
|
-
|
|
286
|
-
```markdown
|
|
287
|
-
- [ ] Add Windows autostart script <!-- rs:task=p0-windows-autostart rs:no-test -->
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
Validator rules are backward compatible:
|
|
291
|
-
|
|
292
|
-
- `when` matches task text.
|
|
293
|
-
- `whenId` matches the stable `rs:task` ID.
|
|
294
|
-
- `grant-evidence` can grant `code`, `test`, or `artifact` evidence without `overrideResult`.
|
|
295
|
-
- `overrideResult: true` is only needed when a rule should replace automatic failures.
|
|
296
|
-
- Tests that read a referenced file with `fs.readFileSync`, `fs.readFile`, `readFileSync`, or `readFile` can count as test evidence for tasks that explicitly mention that file.
|
|
297
|
-
|
|
298
|
-
## Plugin API
|
|
299
|
-
|
|
300
|
-
Plugin module path(s) are loaded from `config.plugins` in deterministic order.
|
|
301
|
-
|
|
302
|
-
```js
|
|
303
|
-
module.exports = {
|
|
304
|
-
registerTaskDetectors(ctx) {
|
|
305
|
-
return [
|
|
306
|
-
{ text: 'Implement billing retries', phase: 'P1', priority: 'P1' }
|
|
307
|
-
];
|
|
308
|
-
},
|
|
309
|
-
registerSectionGenerators(ctx) {
|
|
310
|
-
return [
|
|
311
|
-
{
|
|
312
|
-
title: 'Platform Notes',
|
|
313
|
-
items: ['- [ ] Verify deployment rollback path <!-- rs:task=verify-deployment-rollback-path -->']
|
|
314
|
-
}
|
|
315
|
-
];
|
|
316
|
-
},
|
|
317
|
-
registerValidators(ctx) {
|
|
318
|
-
return [
|
|
141
|
+
"validation": {
|
|
142
|
+
"minimumConfidence": "low",
|
|
143
|
+
"recipeCommand": "npm test -- {testFile}",
|
|
144
|
+
"testReports": [
|
|
319
145
|
{
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
pattern: 'retry',
|
|
323
|
-
message: 'billing retry symbol not found'
|
|
146
|
+
"path": "test-results.json",
|
|
147
|
+
"format": "vitest-json"
|
|
324
148
|
}
|
|
325
|
-
]
|
|
149
|
+
]
|
|
326
150
|
}
|
|
327
|
-
}
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
## Example Usage
|
|
331
|
-
|
|
332
|
-
```bash
|
|
333
|
-
roadmapsmith zero
|
|
334
|
-
roadmapsmith maintain
|
|
335
|
-
roadmapsmith validate --json
|
|
336
|
-
roadmapsmith sync --dry-run
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
## Dry Run and Audit
|
|
340
|
-
|
|
341
|
-
- `--dry-run`: shows file diff preview without writing.
|
|
342
|
-
- `--audit`: currently runs sync and then reports roadmap/code mismatches:
|
|
343
|
-
- checked without evidence
|
|
344
|
-
- ready but unchecked
|
|
345
|
-
|
|
346
|
-
## Development
|
|
347
|
-
|
|
348
|
-
```bash
|
|
349
|
-
npm test
|
|
350
|
-
npm run validate:qa-regression
|
|
351
|
-
npm run validate:functional-smoke
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
If `npm test` fails in your shell with "`node` is not recognized", treat that as a local PATH/runtime issue first and rerun the suite with an explicit Node executable.
|
|
355
|
-
|
|
356
|
-
## Publishing
|
|
357
|
-
|
|
358
|
-
```bash
|
|
359
|
-
npm run validate:qa-regression
|
|
360
|
-
npm run validate:functional-smoke
|
|
361
|
-
npm test
|
|
151
|
+
}
|
|
362
152
|
```
|
|
363
153
|
|
|
364
|
-
|
|
154
|
+
Key validation fields:
|
|
365
155
|
|
|
366
|
-
-
|
|
367
|
-
-
|
|
368
|
-
-
|
|
369
|
-
- On repos where GitHub blocks `GITHUB_TOKEN` from creating or merging PRs, provide a dedicated secret such as `RELEASE_BOT_TOKEN` so the protected-branch release PR flow can complete.
|
|
370
|
-
- Before any push, run the dual validation gate with separate owners: `QA/Regression` uses `npm run validate:qa-regression` and `Functional/Smoke` uses `npm run validate:functional-smoke`.
|
|
371
|
-
- The release gate now includes packed-artifact verification for `skills.json`, `skills/*`, `.codex-plugin/plugin.json`, `.claude-plugin/plugin.json`, and the referenced Codex assets so the published surface matches the GitHub-source bundle for both hosts.
|
|
372
|
-
- Before merging to `main`, verify the UX/release gate in `docs/release-ux-gate.md` and keep `CHANGELOG.md` ready for CI-managed version section generation.
|
|
156
|
+
- `minimumConfidence`: output filter for validate/sync
|
|
157
|
+
- `recipeCommand`: optional command suffix for generated verification recipes
|
|
158
|
+
- `testReports`: configured behavioral proof sources
|
|
373
159
|
|
|
374
|
-
##
|
|
160
|
+
## Related Docs
|
|
375
161
|
|
|
376
|
-
-
|
|
377
|
-
-
|
|
378
|
-
-
|
|
162
|
+
- [../docs/command-surfaces.md](../docs/command-surfaces.md)
|
|
163
|
+
- [../docs/troubleshooting-host-setup.md](../docs/troubleshooting-host-setup.md)
|
|
164
|
+
- [../docs/use-cases/sync-audit-mode.md](../docs/use-cases/sync-audit-mode.md)
|
package/bin/cli.js
CHANGED
|
@@ -19,21 +19,27 @@ const { buildZeroModeConfigPatch, buildZeroModeDefaults, collectZeroModeAnswers,
|
|
|
19
19
|
function printHelp() {
|
|
20
20
|
console.log([
|
|
21
21
|
'Usage:',
|
|
22
|
+
' Canonical commands:',
|
|
22
23
|
' roadmapsmith zero [--project-root <path>] [--config <path>]',
|
|
23
24
|
' roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen]',
|
|
24
|
-
' roadmapsmith
|
|
25
|
-
' roadmapsmith
|
|
26
|
-
' roadmapsmith
|
|
27
|
-
' roadmapsmith /road <action> # deprecated compatibility alias',
|
|
28
|
-
' roadmapsmith /roadmap-sync <action> # deprecated legacy compatibility root',
|
|
29
|
-
' roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]',
|
|
25
|
+
' roadmapsmith status [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json]',
|
|
26
|
+
' roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--task <id|text>] [--json] [--strict]',
|
|
27
|
+
' roadmapsmith update [--task <stable-id> --evidence <text>] [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run]',
|
|
30
28
|
' roadmapsmith setup [--project-root <path>] [--config <path>] [--editor vscode] [--hosts <codex,claude>] [--dry-run]',
|
|
29
|
+
'',
|
|
30
|
+
' Advanced commands:',
|
|
31
|
+
' roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]',
|
|
31
32
|
' roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit] [--full-regen]',
|
|
32
33
|
' roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit]',
|
|
33
|
-
' roadmapsmith
|
|
34
|
-
' roadmapsmith
|
|
35
|
-
' roadmapsmith status
|
|
36
|
-
'
|
|
34
|
+
' roadmapsmith /roadmap',
|
|
35
|
+
' roadmapsmith /roadmap <action>',
|
|
36
|
+
' roadmapsmith /roadmap-zero | /roadmap-maintain | /roadmap-status | /roadmap-validate | /roadmap-update | /roadmap-setup | /roadmap-init | /roadmap-generate | /roadmap-audit',
|
|
37
|
+
'',
|
|
38
|
+
' Compatibility notes:',
|
|
39
|
+
' roadmapsmith doctor [--json] # compatibility alias for status',
|
|
40
|
+
' roadmapsmith regenerate # deprecated alias for generate --full-regen',
|
|
41
|
+
' roadmapsmith /road <action> # deprecated compatibility alias',
|
|
42
|
+
' roadmapsmith /roadmap-sync <action> # deprecated legacy compatibility root'
|
|
37
43
|
].join('\n'));
|
|
38
44
|
}
|
|
39
45
|
|
|
@@ -48,7 +54,9 @@ function formatResultLine(task, result) {
|
|
|
48
54
|
const diagnostics = Array.isArray(result.diagnostics) ? result.diagnostics : [];
|
|
49
55
|
const primaryError = diagnostics.find((item) => item.severity === 'error');
|
|
50
56
|
const warnings = diagnostics.filter((item) => item.severity === 'warning');
|
|
51
|
-
const status = primaryError
|
|
57
|
+
const status = primaryError
|
|
58
|
+
? `FAIL:${primaryError.code}`
|
|
59
|
+
: (result.passed ? 'PASS' : (warnings[0] ? `WARN:${warnings[0].code}` : 'FAIL'));
|
|
52
60
|
const parts = [...result.reasons];
|
|
53
61
|
warnings.forEach((item) => parts.push(`WARN:${item.code} ${item.message}`));
|
|
54
62
|
const reason = parts.length > 0 ? ` :: ${parts.join('; ')}` : '';
|
|
@@ -79,6 +87,23 @@ function printAudit(audit) {
|
|
|
79
87
|
}
|
|
80
88
|
}
|
|
81
89
|
|
|
90
|
+
function printReadinessSummary(summary) {
|
|
91
|
+
if (!summary || typeof summary !== 'object') {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
console.log('\nStructured readiness summary:');
|
|
96
|
+
console.log(`- Workspace readiness: ${summary.workspaceReady ? 'ready' : 'needs setup'}`);
|
|
97
|
+
console.log(`- Codex readiness: ${summary.codexReady ? 'ready' : 'needs setup'}`);
|
|
98
|
+
console.log(`- Claude readiness: ${summary.claudeReady ? 'ready' : 'needs setup'}`);
|
|
99
|
+
console.log(`- Canonical native surfaces: ${summary.canonicalSurfaceReady ? 'ready' : 'needs attention'}`);
|
|
100
|
+
if (Array.isArray(summary.advancedSurfaceWarnings) && summary.advancedSurfaceWarnings.length > 0) {
|
|
101
|
+
summary.advancedSurfaceWarnings.forEach((warning) => {
|
|
102
|
+
console.log(`- Advanced warning: ${warning}`);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
82
107
|
function formatSurfaceLabel(surfaceKey) {
|
|
83
108
|
return surfaceKey
|
|
84
109
|
.replace(/([A-Z])/g, ' $1')
|
|
@@ -305,13 +330,18 @@ function printHumanStatus(payload) {
|
|
|
305
330
|
if (!payload.vscode.tasks.ready && payload.vscode.tasks.missingLabels.length > 0) {
|
|
306
331
|
console.log(`Missing VS Code tasks: ${payload.vscode.tasks.missingLabels.join(', ')}`);
|
|
307
332
|
}
|
|
333
|
+
if (Array.isArray(payload.vscode.tasks.missingAdvancedLabels) && payload.vscode.tasks.missingAdvancedLabels.length > 0) {
|
|
334
|
+
console.log(`Missing advanced VS Code tasks: ${payload.vscode.tasks.missingAdvancedLabels.join(', ')}`);
|
|
335
|
+
}
|
|
308
336
|
if (!payload.vscode.wrappers.ready) {
|
|
309
337
|
console.log(`Missing task wrapper files: ${payload.vscode.wrappers.missingPaths.join(', ')}`);
|
|
310
338
|
}
|
|
311
339
|
console.log(`Codex readiness: ${payload.hosts.codex.ready ? 'ready' : 'needs setup'} (${payload.hosts.codex.message})`);
|
|
312
340
|
console.log(`Claude readiness: ${payload.hosts.claude.ready ? 'ready' : 'needs setup'} (${payload.hosts.claude.message})`);
|
|
341
|
+
printReadinessSummary(payload.summary);
|
|
313
342
|
printNativeSurfaceStatus(payload.surfaces);
|
|
314
|
-
console.log('\nRecommended entrypoints: roadmapsmith zero (empty repo), roadmapsmith maintain (existing repo).');
|
|
343
|
+
console.log('\nRecommended entrypoints: roadmapsmith zero (empty repo), roadmapsmith maintain (existing repo), roadmapsmith update (canonical checklist refresh/task completion).');
|
|
344
|
+
console.log('Compatibility note: roadmapsmith doctor mirrors this payload for existing automation.');
|
|
315
345
|
if (!payload.cli.ready) {
|
|
316
346
|
console.log('\nInstalling the skill alone does not expose the CLI in VS Code. Install the CLI and rerun roadmapsmith setup.');
|
|
317
347
|
}
|
|
@@ -420,8 +450,6 @@ async function run() {
|
|
|
420
450
|
if (slashAction.id === 'audit') {
|
|
421
451
|
flags.audit = true;
|
|
422
452
|
effectiveCommand = 'sync';
|
|
423
|
-
} else if (slashAction.id === 'sync' && String(command).trim().toLowerCase() === '/roadmap-update') {
|
|
424
|
-
effectiveCommand = 'update';
|
|
425
453
|
} else {
|
|
426
454
|
effectiveCommand = slashAction.id;
|
|
427
455
|
}
|
|
@@ -456,6 +484,7 @@ async function run() {
|
|
|
456
484
|
if (effectiveCommand === 'regenerate') {
|
|
457
485
|
const projectRoot = path.resolve(String(flags['project-root'] || process.cwd()));
|
|
458
486
|
const config = loadConfig({ projectRoot, configPath: flags.config });
|
|
487
|
+
process.stderr.write('The regenerate command is deprecated. Use generate --full-regen for the public destructive rebuild path.\n');
|
|
459
488
|
runRegenerateCommand(projectRoot, config, flags);
|
|
460
489
|
return;
|
|
461
490
|
}
|
|
@@ -508,7 +537,9 @@ async function run() {
|
|
|
508
537
|
|
|
509
538
|
const parsedRoadmap = parseRoadmap(content);
|
|
510
539
|
const tasks = maybeFilterTasks(parsedRoadmap.tasks, flags.task);
|
|
511
|
-
const validationContext = buildValidationContext(projectRoot, config, loadPlugins(projectRoot, config.plugins)
|
|
540
|
+
const validationContext = buildValidationContext(projectRoot, config, loadPlugins(projectRoot, config.plugins), {
|
|
541
|
+
strictValidation: isEnabled(flags.strict)
|
|
542
|
+
});
|
|
512
543
|
const results = validateTasks(tasks, validationContext, config, validationContext.plugins);
|
|
513
544
|
|
|
514
545
|
const minRank = CONFIDENCE_RANK[config.validation && config.validation.minimumConfidence] ?? 0;
|
|
@@ -604,6 +635,9 @@ async function run() {
|
|
|
604
635
|
logError(`[fail] VS Code tasks incomplete: missing ${hostStatus.vscode.tasks.missingLabels.join(', ') || 'managed labels'}`);
|
|
605
636
|
ok = false;
|
|
606
637
|
}
|
|
638
|
+
if (Array.isArray(hostStatus.vscode.tasks.missingAdvancedLabels) && hostStatus.vscode.tasks.missingAdvancedLabels.length > 0) {
|
|
639
|
+
log(`[warn] Advanced VS Code tasks missing: ${hostStatus.vscode.tasks.missingAdvancedLabels.join(', ')}`);
|
|
640
|
+
}
|
|
607
641
|
|
|
608
642
|
if (hostStatus.runtime.ready) {
|
|
609
643
|
log(`[ok] Node runtime: ${hostStatus.runtime.kind}${hostStatus.runtime.path ? ` (${hostStatus.runtime.path})` : ''}`);
|