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 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 sync --audit
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 --audit
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
- // Forward-compatible fields — recognized by the skill/agent for Zero Mode discovery context,
118
- // but not yet read by the generator or validator. Safe to add now; they will be wired in a future release.
119
- "northStar": "Ship a self-hosted CLI tool for website capture and AI-readable design analysis.",
120
- "targetUser": "Frontend developers, full-stack developers, and AI coding agents.",
121
- "problemStatement": "Developers lack a unified tool to capture screenshots, crawl pages, extract assets, and export structured context.",
122
- "v1Outcome": "A stable CLI that captures full-page screenshots, crawls internal links, exports metadata, and produces an AI-readable report.",
123
- "antiGoals": [
124
- "Do not bypass authentication",
125
- "Do not target private systems without authorization"
126
- ],
127
- "risks": [
128
- "Browser automation instability",
129
- "Scope creep into generic scraping"
130
- ],
131
- "exitCriteria": [
132
- "CLI works against a public test site",
133
- "Screenshots and metadata are exported deterministically",
134
- "README documents safe and authorized usage"
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 --audit
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roadmapsmith",
3
- "version": "0.9.13",
3
+ "version": "0.9.14",
4
4
  "description": "Evidence-backed ROADMAP.md generator and sync tool for AI coding agents.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -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)}`;