roadmapsmith 0.9.13 → 0.9.14
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/README.md +36 -24
- package/package.json +1 -1
- package/src/renderer/professional.js +44 -5
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ npm install -g roadmapsmith@latest
|
|
|
34
34
|
npm install roadmapsmith@latest
|
|
35
35
|
|
|
36
36
|
# One-off execution without installing
|
|
37
|
-
npx roadmapsmith@latest
|
|
37
|
+
npx roadmapsmith@latest validate --json
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
The `roadmap-sync` agent skill is separate from the CLI. Re-running the skills install updates the agent instructions, but it does not update the `roadmapsmith` npm binary:
|
|
@@ -65,9 +65,19 @@ Repository-backed roadmap generation, validation, and synchronization. Use when
|
|
|
65
65
|
```bash
|
|
66
66
|
roadmapsmith generate --project-root .
|
|
67
67
|
roadmapsmith validate --json
|
|
68
|
-
roadmapsmith sync
|
|
68
|
+
roadmapsmith sync
|
|
69
|
+
roadmapsmith sync --dry-run
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
## Host Support Today
|
|
73
|
+
|
|
74
|
+
| Host | Current support |
|
|
75
|
+
|---|---|
|
|
76
|
+
| Claude Code | Manual hook setup is documented and supported. |
|
|
77
|
+
| Codex / Codex CLI | Manual CLI workflow only; no documented auto-hook equivalent yet. |
|
|
78
|
+
| CI | Use disposable checkouts if you run `sync --audit`, because it still mutates the roadmap today. |
|
|
79
|
+
| Other hosts | Use the skill plus manual CLI commands. |
|
|
80
|
+
|
|
71
81
|
---
|
|
72
82
|
|
|
73
83
|
## Commands
|
|
@@ -84,6 +94,7 @@ roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config
|
|
|
84
94
|
- Generates deterministic `ROADMAP.md` with fixed section order.
|
|
85
95
|
- Uses stable task IDs: `<!-- rs:task=<slug> -->`.
|
|
86
96
|
- Sync marks `[x]` only when validation passes.
|
|
97
|
+
- `sync --audit` currently runs sync and then prints a mismatch summary; it is not yet a dedicated read-only audit mode.
|
|
87
98
|
- Validation evidence gate:
|
|
88
99
|
- code OR test OR artifact evidence required.
|
|
89
100
|
- test evidence required for code tasks when test frameworks are detected.
|
|
@@ -113,26 +124,27 @@ Create `roadmap-skill.config.json`:
|
|
|
113
124
|
{
|
|
114
125
|
"roadmapFile": "./ROADMAP.md",
|
|
115
126
|
"agentsFile": "./AGENTS.md",
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
127
|
+
"roadmapProfile": "professional",
|
|
128
|
+
"product": {
|
|
129
|
+
"name": "My Project",
|
|
130
|
+
"northStar": "Ship a self-hosted CLI tool for website capture and AI-readable design analysis.",
|
|
131
|
+
"positioning": "What makes this different from alternatives.",
|
|
132
|
+
"primaryUser": "Frontend developers, full-stack developers, and AI coding agents.",
|
|
133
|
+
"targetOutcome": "A stable CLI that captures full-page screenshots, crawls internal links, exports metadata, and produces an AI-readable report.",
|
|
134
|
+
"antiGoals": [
|
|
135
|
+
"Do not bypass authentication",
|
|
136
|
+
"Do not target private systems without authorization"
|
|
137
|
+
],
|
|
138
|
+
"risks": [
|
|
139
|
+
"Browser automation instability",
|
|
140
|
+
"Scope creep into generic scraping"
|
|
141
|
+
],
|
|
142
|
+
"successCriteria": [
|
|
143
|
+
"CLI works against a public test site",
|
|
144
|
+
"Screenshots and metadata are exported deterministically",
|
|
145
|
+
"README documents safe and authorized usage"
|
|
146
|
+
]
|
|
147
|
+
},
|
|
136
148
|
|
|
137
149
|
"taskMatchers": [
|
|
138
150
|
{
|
|
@@ -232,14 +244,14 @@ module.exports = {
|
|
|
232
244
|
roadmapsmith init
|
|
233
245
|
roadmapsmith generate --project-root .
|
|
234
246
|
roadmapsmith validate --json
|
|
235
|
-
roadmapsmith sync
|
|
247
|
+
roadmapsmith sync
|
|
236
248
|
roadmapsmith sync --dry-run
|
|
237
249
|
```
|
|
238
250
|
|
|
239
251
|
## Dry Run and Audit
|
|
240
252
|
|
|
241
253
|
- `--dry-run`: shows file diff preview without writing.
|
|
242
|
-
- `--audit`: reports roadmap/code mismatches:
|
|
254
|
+
- `--audit`: currently runs sync and then reports roadmap/code mismatches:
|
|
243
255
|
- checked without evidence
|
|
244
256
|
- ready but unchecked
|
|
245
257
|
|
package/package.json
CHANGED
|
@@ -238,10 +238,25 @@ const MODULE_METADATA = {
|
|
|
238
238
|
{ text: 'Tune similarity threshold to reduce false-positive merges', priority: 'P0', id: 'prof-mat-match-tune-similarity-threshold' }
|
|
239
239
|
]
|
|
240
240
|
},
|
|
241
|
+
sync: {
|
|
242
|
+
state: 'Applies validation outcomes to ROADMAP.md and can append warning lines for failed attempts.',
|
|
243
|
+
tasks: [
|
|
244
|
+
{ text: 'Define explicit contract for sync, sync --audit, and future promote-only flows', priority: 'P0', id: 'prof-mat-sync-define-command-contract' },
|
|
245
|
+
{ text: 'Separate mutating sync behavior from future read-only audit mode', priority: 'P0', id: 'prof-mat-sync-separate-mutation-from-read-only-audit' },
|
|
246
|
+
{ text: 'Expose weak-evidence, documentation-only, and structural-mismatch findings in audit output', priority: 'P1', id: 'prof-mat-sync-expose-rich-audit-findings' },
|
|
247
|
+
{ text: 'Claude PostToolUse hook must invoke the CLI without relying on bare "node" in PATH', priority: 'P0', id: 'prof-mat-sync-claude-hook-avoid-bare-node-path' },
|
|
248
|
+
{ text: 'Claude PostToolUse hook must fail visibly when sync execution fails', priority: 'P0', id: 'prof-mat-sync-claude-hook-fail-visibly-on-sync-error' },
|
|
249
|
+
{ text: 'Claude PostToolUse hook must keep lock-file cleanup on both success and failure', priority: 'P1', id: 'prof-mat-sync-claude-hook-cleanup-lockfile-on-both-paths' },
|
|
250
|
+
{ text: 'Differentiate write-time hook sync from commit-time pre-commit sync in the command contract', priority: 'P1', id: 'prof-mat-sync-differentiate-write-time-and-pre-commit-sync' }
|
|
251
|
+
]
|
|
252
|
+
},
|
|
241
253
|
config: {
|
|
242
254
|
state: 'Supports roadmapProfile, product block, milestones, phaseTemplates, plugins.',
|
|
243
255
|
tasks: [
|
|
244
|
-
{ text: 'Add JSON schema validation for roadmap-skill.config.json', priority: 'P1', id: 'prof-mat-config-json-schema-validation' }
|
|
256
|
+
{ text: 'Add JSON schema validation for roadmap-skill.config.json', priority: 'P1', id: 'prof-mat-config-json-schema-validation' },
|
|
257
|
+
{ text: 'Add init --professional or init --with-config bootstrap flow', priority: 'P0', id: 'prof-mat-config-add-init-with-config-bootstrap-flow' },
|
|
258
|
+
{ text: 'Honor versioned roadmap config instead of regenerating from defaults', priority: 'P1', id: 'prof-mat-config-honor-versioned-config-before-defaults' },
|
|
259
|
+
{ text: 'Define manual-to-managed migration flow and drift warnings between skill and CLI guidance', priority: 'P1', id: 'prof-mat-config-define-manual-to-managed-migration-and-drift-warnings' }
|
|
245
260
|
]
|
|
246
261
|
},
|
|
247
262
|
io: {
|
|
@@ -298,7 +313,12 @@ function renderSection7OutputContract(model, lines) {
|
|
|
298
313
|
lines.push('');
|
|
299
314
|
const formatItems = [
|
|
300
315
|
{ text: 'Define stable public output format (stdout, files, exit codes)', priority: 'P0' },
|
|
301
|
-
{ text: 'Version output format alongside package version', priority: 'P1' }
|
|
316
|
+
{ text: 'Version output format alongside package version', priority: 'P1' },
|
|
317
|
+
{ text: 'Define explicit contract for sync, sync --audit, and future promote-only flows', priority: 'P0' },
|
|
318
|
+
{ text: 'Document current gap: sync --audit is not yet a dedicated read-only audit command', priority: 'P1' },
|
|
319
|
+
{ text: 'Add machine-readable audit output (JSON)', priority: 'P1' },
|
|
320
|
+
{ text: 'Add audit summary-only output mode', priority: 'P1' },
|
|
321
|
+
{ text: 'Define explicit exit-code semantics for sync and audit commands', priority: 'P0' }
|
|
302
322
|
];
|
|
303
323
|
for (const item of formatItems) {
|
|
304
324
|
const id = `prof-out-${slugify(item.text)}`;
|
|
@@ -310,7 +330,9 @@ function renderSection7OutputContract(model, lines) {
|
|
|
310
330
|
lines.push('');
|
|
311
331
|
const breakingItems = [
|
|
312
332
|
{ text: 'Document breaking vs. non-breaking output changes', priority: 'P1' },
|
|
313
|
-
{ text: 'Add output schema validation to CI', priority: 'P1' }
|
|
333
|
+
{ text: 'Add output schema validation to CI', priority: 'P1' },
|
|
334
|
+
{ text: 'Separate mutating sync behavior from future read-only audit mode', priority: 'P0' },
|
|
335
|
+
{ text: 'Expose weak-evidence, documentation-only, and structural-mismatch findings in audit output', priority: 'P1' }
|
|
314
336
|
];
|
|
315
337
|
for (const item of breakingItems) {
|
|
316
338
|
const id = `prof-out-${slugify(item.text)}`;
|
|
@@ -329,7 +351,13 @@ function renderSection8Testing(model, lines) {
|
|
|
329
351
|
{ text: 'Unit test coverage for all core modules', priority: 'P0' },
|
|
330
352
|
{ text: 'Integration tests covering the full generate → sync → validate pipeline', priority: 'P0' },
|
|
331
353
|
{ text: 'Regression fixtures for compact and professional profile output', priority: 'P1' },
|
|
332
|
-
{ text: 'Edge case coverage: empty repo, no config, large monorepo scan', priority: 'P1' }
|
|
354
|
+
{ text: 'Edge case coverage: empty repo, no config, large monorepo scan', priority: 'P1' },
|
|
355
|
+
{ text: 'Add direct tests for .claude/hooks/roadmap-sync.js payload parsing', priority: 'P1' },
|
|
356
|
+
{ text: 'Add direct tests for ROADMAP.md self-edit skip behavior', priority: 'P1' },
|
|
357
|
+
{ text: 'Add direct tests for lock-file reentry guard', priority: 'P1' },
|
|
358
|
+
{ text: 'Add direct tests for sync failure surfacing when the child process cannot be spawned', priority: 'P0' },
|
|
359
|
+
{ text: 'Add regression coverage for environments where node is not available on PATH', priority: 'P0' },
|
|
360
|
+
{ text: 'Add integration coverage for pre-commit sync using the absolute Node path', priority: 'P1' }
|
|
333
361
|
];
|
|
334
362
|
for (const item of coverageItems) {
|
|
335
363
|
const id = `prof-test-${slugify(item.text)}`;
|
|
@@ -389,7 +417,18 @@ function renderSection10Documentation(model, lines) {
|
|
|
389
417
|
const coreItems = [
|
|
390
418
|
{ text: 'README.md covers install, commands, and profile selection', priority: 'P0' },
|
|
391
419
|
{ text: 'SKILL.md reflects current feature set and guardrails', priority: 'P0' },
|
|
392
|
-
{ text: 'CHANGELOG.md maintained for each release', priority: 'P1' }
|
|
420
|
+
{ text: 'CHANGELOG.md maintained for each release', priority: 'P1' },
|
|
421
|
+
{ text: 'README.md documents current sync --audit semantics without claiming read-only behavior', priority: 'P0' },
|
|
422
|
+
{ text: 'README.md includes host matrix for Claude Code, Codex/Codex CLI, CI, and manual workflows', priority: 'P1' },
|
|
423
|
+
{ text: 'Document distinction between supported Claude hooks and manual workflows on other hosts', priority: 'P1' },
|
|
424
|
+
{ text: 'Document Codex/Codex CLI manual fallback workflow', priority: 'P1' },
|
|
425
|
+
{ text: 'Document Windows shell caveats: roadmapsmith.cmd, npm.cmd, and PowerShell policy differences', priority: 'P1' },
|
|
426
|
+
{ text: 'Skill instructions require extending existing phases before adding new ones', priority: 'P1' },
|
|
427
|
+
{ text: 'Document that Claude write-time autoupdate currently depends on Node resolution in the hook environment', priority: 'P1' },
|
|
428
|
+
{ text: 'Document the difference between the Claude PostToolUse hook and the git pre-commit hook', priority: 'P1' },
|
|
429
|
+
{ text: 'Document current autoupdate reliability boundaries: write-time hook is best-effort, pre-commit is stricter', priority: 'P1' },
|
|
430
|
+
{ text: 'Document troubleshooting for hook failure when node is missing from PATH', priority: 'P1' },
|
|
431
|
+
{ text: 'Document that Codex/Codex CLI remains manual and does not share the Claude repo-local hook path', priority: 'P1' }
|
|
393
432
|
];
|
|
394
433
|
for (const item of coreItems) {
|
|
395
434
|
const id = `prof-doc-${slugify(item.text)}`;
|