roadmapsmith 0.9.16 → 0.9.23

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.
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "roadmapsmith",
3
+ "version": "0.9.23",
4
+ "description": "One-command evidence-backed ROADMAP.md generator and sync tool for AI coding agents, with shared RoadmapSmith plugin skills for Codex and Claude.",
5
+ "author": {
6
+ "name": "PapiScholz"
7
+ },
8
+ "homepage": "https://github.com/PapiScholz/roadmapsmith#readme",
9
+ "repository": "https://github.com/PapiScholz/roadmapsmith",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "roadmap",
13
+ "planning",
14
+ "agent",
15
+ "cli",
16
+ "validation",
17
+ "sync",
18
+ "task-tracking",
19
+ "evidence-based",
20
+ "deterministic",
21
+ "monorepo",
22
+ "claude-code",
23
+ "ai-agent",
24
+ "project-management",
25
+ "coding-agents",
26
+ "agent-skills",
27
+ "roadmap-generator",
28
+ "roadmap-sync",
29
+ "task-validation",
30
+ "developer-tools",
31
+ "markdown",
32
+ "agent-workflow"
33
+ ]
34
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "roadmapsmith",
3
+ "version": "0.9.23",
4
+ "description": "One-command evidence-backed ROADMAP.md generator and sync tool for AI coding agents, with shared RoadmapSmith plugin skills for Codex and Claude.",
5
+ "author": {
6
+ "name": "PapiScholz"
7
+ },
8
+ "homepage": "https://github.com/PapiScholz/roadmapsmith#readme",
9
+ "repository": "https://github.com/PapiScholz/roadmapsmith",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "roadmap",
13
+ "planning",
14
+ "agent",
15
+ "cli",
16
+ "validation",
17
+ "sync",
18
+ "task-tracking",
19
+ "evidence-based",
20
+ "deterministic",
21
+ "monorepo",
22
+ "claude-code",
23
+ "ai-agent",
24
+ "project-management",
25
+ "coding-agents",
26
+ "agent-skills",
27
+ "roadmap-generator",
28
+ "roadmap-sync",
29
+ "task-validation",
30
+ "developer-tools",
31
+ "markdown",
32
+ "agent-workflow"
33
+ ],
34
+ "skills": "./skills/",
35
+ "interface": {
36
+ "displayName": "RoadmapSmith",
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, and evidence-backed validation while keeping the CLI and Claude bundle surfaces aligned.",
39
+ "developerName": "PapiScholz",
40
+ "category": "Developer Tools",
41
+ "capabilities": [
42
+ "Interactive",
43
+ "Read",
44
+ "Write"
45
+ ],
46
+ "websiteURL": "https://github.com/PapiScholz/roadmapsmith#readme",
47
+ "defaultPrompt": [
48
+ "Help me bootstrap or maintain this repository roadmap with RoadmapSmith."
49
+ ],
50
+ "brandColor": "#2B6CB0",
51
+ "composerIcon": "./assets/palette.png",
52
+ "logo": "./assets/roadmapsmith-logo.png",
53
+ "screenshots": []
54
+ }
55
+ }
package/README.md CHANGED
@@ -17,7 +17,7 @@ roadmapsmith zero
17
17
  roadmapsmith maintain
18
18
  ```
19
19
 
20
- Slash entrypoints are also supported from the CLI and launcher, for example: `roadmapsmith /road`, `roadmapsmith /zero`, `roadmapsmith /maintain`, and `roadmapsmith /roadmap-sync maintain`.
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
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
22
  `RoadmapSmith: Status` now treats "ready" as runnable task UX, not merely generated files.
23
23
 
@@ -27,9 +27,10 @@ The generated VS Code task layer now resolves Node automatically where possible;
27
27
  npx skills add PapiScholz/roadmapsmith --skill '*' -a claude-code
28
28
  ```
29
29
 
30
- This is the recommended Claude Code install path for native GUI slash commands such as `/road`, `/zero`, `/maintain`, `/status`, `/init`, `/generate`, `/validate`, `/sync`, `/audit`, `/setup`, and the legacy `/roadmap-sync`.
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
31
  If you install only `--skill roadmap-sync`, Claude GUI will expose only `/roadmap-sync`.
32
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.
33
34
 
34
35
  ## Updating
35
36
 
@@ -53,9 +54,9 @@ npx skills add PapiScholz/roadmapsmith --skill '*' -a claude-code
53
54
  ```
54
55
 
55
56
  After updating the Claude skill bundle, run `/reload-skills` and, if applicable, `/reload-plugins`.
56
- 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.
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.
57
58
 
58
- Fixes are available through `@latest` only after a new npm package version has been published. Before publication, install from a local checkout or a packed tarball for testing.
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.
59
60
 
60
61
  ## Operating Modes
61
62
 
@@ -96,7 +97,7 @@ Use the lower-level commands only when you want manual control over generation,
96
97
  | Host | Current support |
97
98
  |---|---|
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. |
99
- | Codex / Codex CLI | Supported through a visible VS Code task workflow and slash-capable launcher UX after `roadmapsmith setup`. Codex chat itself remains unchanged unless the host exposes native slash registration. |
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`. |
100
101
  | CI | Use disposable checkouts if you run `sync --audit`, because it still mutates the roadmap today. |
101
102
  | Other hosts | Use the skill plus manual CLI commands. |
102
103
 
@@ -107,15 +108,16 @@ If Node is installed outside PATH, set `ROADMAPSMITH_NODE` to a working `node` e
107
108
  ## Commands
108
109
 
109
110
  ```bash
110
- roadmapsmith /road
111
- roadmapsmith /zero
112
- roadmapsmith /maintain
113
- roadmapsmith /roadmap-sync maintain
111
+ roadmapsmith /roadmap
112
+ roadmapsmith /roadmap-zero
113
+ roadmapsmith /roadmap-maintain
114
+ roadmapsmith /roadmap-update
115
+ roadmapsmith /roadmap-sync validate
114
116
  roadmapsmith setup [--project-root <path>] [--config <path>] [--editor vscode] [--hosts <codex,claude>] [--dry-run]
115
117
  roadmapsmith zero [--project-root <path>] [--config <path>]
116
- roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>]
118
+ roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen]
117
119
  roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]
118
- roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit]
120
+ roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit] [--full-regen]
119
121
  roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit]
120
122
  roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--task <id|text>] [--json]
121
123
  roadmapsmith doctor [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json]
@@ -133,9 +135,39 @@ Then reload the session:
133
135
 
134
136
  1. Run `/reload-skills`
135
137
  2. If RoadmapSmith was installed through a Claude plugin, also run `/reload-plugins`
136
- 3. Confirm the slash menu shows `/road`, `/zero`, `/maintain`, `/status`, `/init`, `/generate`, `/validate`, `/sync`, `/audit`, `/setup`, and `/roadmap-sync`
138
+ 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`
137
139
 
138
- Native Claude GUI slash commands come from the installed skill bundle. CLI slash routing such as `roadmapsmith /road` is a separate surface and does not populate the Claude GUI menu by itself.
140
+ 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.
141
+
142
+ ## Codex native plugin install
143
+
144
+ RoadmapSmith now exposes a native Codex plugin manifest at `.codex-plugin/plugin.json` and a repo-local marketplace at `.agents/plugins/marketplace.json`.
145
+
146
+ From the repository root:
147
+
148
+ ```bash
149
+ codex plugin marketplace add .
150
+ ```
151
+
152
+ Then restart Codex, open the plugin directory, install `roadmapsmith` from the `RoadmapSmith Local Plugins` marketplace, and confirm the plugin resolves the shared `./skills/` bundle.
153
+
154
+ 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.
155
+
156
+ `roadmapsmith doctor --json` now reports native slash surfaces separately from the VS Code task layer:
157
+
158
+ - `claudeGui`
159
+ - `claudeCli`
160
+ - `codexGui`
161
+ - `codexCli`
162
+
163
+ Each surface includes the detected source, expected slash commands, missing commands, and duplicate registrations such as a second `/roadmap-sync` coming from a legacy user skill install.
164
+
165
+ If Codex shows `Roadmap Sync` twice, the usual cause is a collision between:
166
+
167
+ - `~/.agents/skills/roadmap-sync`
168
+ - the installed `roadmapsmith` Codex plugin
169
+
170
+ The repo does not remove user-global skills automatically. Use the `doctor` output to confirm the duplicate and then disable or remove the legacy skill if you want a single `/roadmap-sync` entry.
139
171
 
140
172
  ## Behavior
141
173
 
@@ -306,6 +338,8 @@ roadmapsmith sync --dry-run
306
338
 
307
339
  ```bash
308
340
  npm test
341
+ npm run validate:qa-regression
342
+ npm run validate:functional-smoke
309
343
  ```
310
344
 
311
345
  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.
@@ -313,17 +347,20 @@ If `npm test` fails in your shell with "`node` is not recognized", treat that as
313
347
  ## Publishing
314
348
 
315
349
  ```bash
350
+ npm run validate:qa-regression
351
+ npm run validate:functional-smoke
316
352
  npm test
317
- npm version patch # or minor / major
318
- npm publish --access public
319
- git push origin main --follow-tags
320
353
  ```
321
354
 
322
355
  Repository-specific release note:
323
356
 
324
357
  - The canonical release automation lives in `.github/workflows/ci.yml`.
325
- - This repository publishes from GitHub Actions on `main`; local `npm publish` is a maintainer workflow, not the default repo release path.
326
- - Before publishing, verify the UX/release gate in `docs/release-ux-gate.md` and update `CHANGELOG.md` with the user-visible behavior changes.
358
+ - Every successful push to `main` now bumps `PATCH` through an automated `release/vX.Y.Z` PR, writes the version back with the squashed bot commit `chore(release): vX.Y.Z`, and then the follow-up `main` run publishes npm plus the GitHub Release.
359
+ - Repair reruns on the bot release commit do not bump again; they only publish/create any missing artifacts left behind by a partial failure.
360
+ - 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.
361
+ - 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`.
362
+ - 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.
363
+ - 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.
327
364
 
328
365
  ## Versioning Strategy
329
366
 
Binary file
Binary file
package/bin/cli.js CHANGED
@@ -11,7 +11,7 @@ const { buildSetupFiles, applySetupFiles, inspectHostSetup, parseHosts, assertSu
11
11
  const { getSlashAction, renderSlashPalette, resolveSlashInvocation } = require('../src/slash');
12
12
  const { renderRoadmapTemplate, renderAgentsTemplate } = require('../src/templates');
13
13
  const { generateRoadmapDocument } = require('../src/generator');
14
- const { parseRoadmap } = require('../src/parser');
14
+ const { parseRoadmap, tasksInManagedBlock } = require('../src/parser');
15
15
  const { buildValidationContext, validateTasks, auditValidation, CONFIDENCE_RANK, applyMinimumConfidence } = require('../src/validator');
16
16
  const { applySync } = require('../src/sync');
17
17
  const { buildZeroModeConfigPatch, buildZeroModeDefaults, collectZeroModeAnswers, isInteractiveTerminal } = require('../src/zero');
@@ -20,14 +20,15 @@ function printHelp() {
20
20
  console.log([
21
21
  'Usage:',
22
22
  ' roadmapsmith zero [--project-root <path>] [--config <path>]',
23
- ' roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>]',
24
- ' roadmapsmith /road',
25
- ' roadmapsmith /road <action>',
26
- ' roadmapsmith /roadmap-sync <action>',
27
- ' roadmapsmith /zero | /maintain | /status | /init | /generate | /validate | /sync | /audit | /setup',
23
+ ' roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen]',
24
+ ' roadmapsmith /roadmap',
25
+ ' roadmapsmith /roadmap <action>',
26
+ ' roadmapsmith /roadmap-zero | /roadmap-maintain | /roadmap-status | /roadmap-init | /roadmap-generate | /roadmap-validate | /roadmap-update | /roadmap-audit | /roadmap-setup',
27
+ ' roadmapsmith /road <action> # deprecated compatibility alias',
28
+ ' roadmapsmith /roadmap-sync <action> # deprecated legacy compatibility root',
28
29
  ' roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]',
29
30
  ' roadmapsmith setup [--project-root <path>] [--config <path>] [--editor vscode] [--hosts <codex,claude>] [--dry-run]',
30
- ' roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit]',
31
+ ' roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit] [--full-regen]',
31
32
  ' roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit]',
32
33
  ' roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--task <id|text>] [--json]',
33
34
  ' roadmapsmith doctor [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json]'
@@ -55,14 +56,6 @@ function maybeFilterTasks(tasks, filterValue) {
55
56
  });
56
57
  }
57
58
 
58
- function tasksInManagedBlock(parsedRoadmap) {
59
- if (!parsedRoadmap.managedRange) {
60
- return parsedRoadmap.tasks;
61
- }
62
- const { start, end } = parsedRoadmap.managedRange;
63
- return parsedRoadmap.tasks.filter((task) => task.lineIndex > start && task.lineIndex < end);
64
- }
65
-
66
59
  function printAudit(audit) {
67
60
  console.log(`Audit summary: ${audit.checkedWithoutEvidence.length} checked-without-evidence, ${audit.readyButUnchecked.length} ready-but-unchecked.`);
68
61
  if (audit.checkedWithoutEvidence.length > 0) {
@@ -79,6 +72,35 @@ function printAudit(audit) {
79
72
  }
80
73
  }
81
74
 
75
+ function formatSurfaceLabel(surfaceKey) {
76
+ return surfaceKey
77
+ .replace(/([A-Z])/g, ' $1')
78
+ .replace(/^./, (character) => character.toUpperCase());
79
+ }
80
+
81
+ function printNativeSurfaceStatus(surfaces) {
82
+ if (!surfaces || typeof surfaces !== 'object') {
83
+ return;
84
+ }
85
+
86
+ console.log('\nNative slash surfaces:');
87
+ for (const [surfaceKey, surface] of Object.entries(surfaces)) {
88
+ const label = formatSurfaceLabel(surfaceKey);
89
+ console.log(`- ${label}: ${surface.ready ? 'ready' : 'needs attention'} (${surface.message})`);
90
+ console.log(` Source: ${surface.source}`);
91
+ console.log(` Verification: ${surface.verification}`);
92
+ if (Array.isArray(surface.missingCommands) && surface.missingCommands.length > 0) {
93
+ console.log(` Missing commands: ${surface.missingCommands.join(', ')}`);
94
+ }
95
+ if (Array.isArray(surface.duplicates) && surface.duplicates.length > 0) {
96
+ const duplicateSummary = surface.duplicates
97
+ .map((duplicate) => `${duplicate.command}${duplicate.reason ? ` (${duplicate.reason})` : ''}`)
98
+ .join(', ');
99
+ console.log(` Duplicates: ${duplicateSummary}`);
100
+ }
101
+ }
102
+ }
103
+
82
104
  function formatSetupVerb(result, dryRun) {
83
105
  if (dryRun) {
84
106
  return result.before == null ? 'Would create' : 'Would update';
@@ -128,7 +150,9 @@ function runGenerateCommand(projectRoot, config, flags, options = {}) {
128
150
  roadmapPath: roadmapFile,
129
151
  existingContent,
130
152
  config,
131
- plugins
153
+ plugins,
154
+ preserveManagedBlock: options.preserveManagedBlock === true,
155
+ forceFullRegenerate: options.forceFullRegenerate === true || isEnabled(flags['full-regen'])
132
156
  });
133
157
 
134
158
  const writeResult = writeText(roadmapFile, document, { dryRun });
@@ -151,6 +175,13 @@ function runGenerateCommand(projectRoot, config, flags, options = {}) {
151
175
  }
152
176
  }
153
177
 
178
+ function runRegenerateCommand(projectRoot, config, flags, options = {}) {
179
+ runGenerateCommand(projectRoot, config, flags, {
180
+ ...options,
181
+ forceFullRegenerate: true
182
+ });
183
+ }
184
+
154
185
  function runSyncCommand(projectRoot, config, flags, options = {}) {
155
186
  const roadmapFile = resolveRoadmapFile(projectRoot, config, flags['roadmap-file']);
156
187
  const content = readTextIfExists(roadmapFile);
@@ -201,6 +232,7 @@ function printHumanStatus(payload) {
201
232
  }
202
233
  console.log(`Codex readiness: ${payload.hosts.codex.ready ? 'ready' : 'needs setup'} (${payload.hosts.codex.message})`);
203
234
  console.log(`Claude readiness: ${payload.hosts.claude.ready ? 'ready' : 'needs setup'} (${payload.hosts.claude.message})`);
235
+ printNativeSurfaceStatus(payload.surfaces);
204
236
  console.log('\nRecommended entrypoints: roadmapsmith zero (empty repo), roadmapsmith maintain (existing repo).');
205
237
  if (!payload.cli.ready) {
206
238
  console.log('\nInstalling the skill alone does not expose the CLI in VS Code. Install the CLI and rerun roadmapsmith setup.');
@@ -258,7 +290,11 @@ async function runZeroCommand(projectRoot, flags) {
258
290
 
259
291
  function runMaintainCommand(projectRoot, flags) {
260
292
  const config = loadConfig({ projectRoot, configPath: flags.config });
261
- runGenerateCommand(projectRoot, config, flags);
293
+ const fullRegen = isEnabled(flags['full-regen']);
294
+ runGenerateCommand(projectRoot, config, flags, {
295
+ preserveManagedBlock: !fullRegen,
296
+ forceFullRegenerate: fullRegen
297
+ });
262
298
  runSyncCommand(projectRoot, config, { ...flags, audit: true }, { audit: true });
263
299
  }
264
300
 
@@ -292,6 +328,10 @@ async function run() {
292
328
  return;
293
329
  }
294
330
 
331
+ if (slashInvocation.deprecated && slashInvocation.deprecationMessage) {
332
+ process.stderr.write(`${slashInvocation.deprecationMessage}\n`);
333
+ }
334
+
295
335
  if (slashAction.id === 'status') {
296
336
  const projectRoot = path.resolve(String(flags['project-root'] || process.cwd()));
297
337
  const config = loadConfig({ projectRoot, configPath: flags.config });
@@ -333,6 +373,13 @@ async function run() {
333
373
  return;
334
374
  }
335
375
 
376
+ if (effectiveCommand === 'regenerate') {
377
+ const projectRoot = path.resolve(String(flags['project-root'] || process.cwd()));
378
+ const config = loadConfig({ projectRoot, configPath: flags.config });
379
+ runRegenerateCommand(projectRoot, config, flags);
380
+ return;
381
+ }
382
+
336
383
  if (effectiveCommand === 'setup') {
337
384
  const projectRoot = path.resolve(String(flags['project-root'] || process.cwd()));
338
385
  loadConfig({ projectRoot, configPath: flags.config });
@@ -484,6 +531,17 @@ async function run() {
484
531
  logError(`[fail] Claude hook incomplete: ${hostStatus.hosts.claude.message}`);
485
532
  ok = false;
486
533
  }
534
+
535
+ if (hostStatus.surfaces) {
536
+ Object.entries(hostStatus.surfaces).forEach(([surfaceKey, surface]) => {
537
+ const prefix = surface.ready ? '[ok]' : '[warn]';
538
+ log(`${prefix} ${formatSurfaceLabel(surfaceKey)}: ${surface.message}`);
539
+ if (Array.isArray(surface.duplicates) && surface.duplicates.length > 0) {
540
+ const duplicateSummary = surface.duplicates.map((duplicate) => duplicate.command).join(', ');
541
+ log(`[warn] ${formatSurfaceLabel(surfaceKey)} duplicates: ${duplicateSummary}`);
542
+ }
543
+ });
544
+ }
487
545
  }
488
546
 
489
547
  if (jsonMode) {
package/package.json CHANGED
@@ -1,14 +1,25 @@
1
1
  {
2
2
  "name": "roadmapsmith",
3
- "version": "0.9.16",
4
- "description": "One-command evidence-backed ROADMAP.md generator and sync tool for AI coding agents.",
3
+ "version": "0.9.23",
4
+ "description": "One-command evidence-backed ROADMAP.md generator and sync tool for AI coding agents, with shared RoadmapSmith plugin skills for Codex and Claude.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
7
7
  "roadmapsmith": "bin/cli.js"
8
8
  },
9
9
  "type": "commonjs",
10
10
  "scripts": {
11
- "test": "node --test test/*.test.js"
11
+ "test": "node scripts/run-tests.js",
12
+ "validate:qa-regression": "node scripts/pre-push-gate.js qa-regression",
13
+ "validate:functional-smoke": "node scripts/pre-push-gate.js functional-smoke",
14
+ "validate:pre-push": "node scripts/pre-push-gate.js all",
15
+ "release:auto": "node scripts/auto-release.js",
16
+ "release:version": "node scripts/release-version.js --write",
17
+ "release:changelog": "node scripts/generate-changelog.js",
18
+ "sync-bundle-metadata": "node scripts/sync-bundle-metadata.js --write",
19
+ "check-bundle-metadata": "node scripts/sync-bundle-metadata.js",
20
+ "verify-pack-surface": "node scripts/verify-pack-surface.js",
21
+ "prepack": "node scripts/sync-bundle-metadata.js && node scripts/stage-claude-bundle.js",
22
+ "postpack": "node scripts/clean-staged-claude-bundle.js"
12
23
  },
13
24
  "keywords": [
14
25
  "roadmap",
@@ -51,6 +62,11 @@
51
62
  "bin",
52
63
  "src",
53
64
  "templates",
54
- "README.md"
65
+ "README.md",
66
+ "skills",
67
+ "skills.json",
68
+ ".claude-plugin",
69
+ ".codex-plugin",
70
+ "assets"
55
71
  ]
56
72
  }
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: roadmap
3
+ description: Show the RoadmapSmith native slash palette without side effects.
4
+ ---
5
+
6
+ # RoadmapSmith Palette
7
+
8
+ Use this command as the native discovery entrypoint for the shared RoadmapSmith slash bundle.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Treat `/roadmap` as a no-side-effects palette. Do not run mutating commands from this skill.
13
+ 2. When working inside the RoadmapSmith repository itself and `roadmap-skill/bin/cli.js` exists, prefer the local engine:
14
+ - `node roadmap-skill/bin/cli.js /roadmap`
15
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js /roadmap` if `node` is not in PATH
16
+ 3. Otherwise, if the `roadmapsmith` CLI is available, you may run `roadmapsmith /roadmap` from the project root and use that output directly.
17
+ 4. If the CLI is missing, provide the palette manually and explain the install path:
18
+ - `npm install -g roadmapsmith`
19
+ - `npx skills add PapiScholz/roadmapsmith --skill '*' -a claude-code`
20
+ - run `/reload-skills`
21
+ - if RoadmapSmith was installed as a Claude plugin, also run `/reload-plugins`
22
+ 5. Explain the preferred native host entrypoints:
23
+ - `/roadmap-zero`
24
+ - `/roadmap-maintain`
25
+ - `/roadmap-status`
26
+ - `/roadmap-init`, `/roadmap-generate`, `/roadmap-validate`, `/roadmap-update`, `/roadmap-audit`, and `/roadmap-setup`
27
+ 6. Mention that `/roadmap-sync <action>` remains a deprecated legacy CLI compatibility root, and `/road` plus `/road <action>` remain deprecated CLI compatibility aliases.
28
+
29
+ ## Output contract
30
+
31
+ - Show what each command does in one sentence.
32
+ - Include namespaced slash examples plus CLI equivalents.
33
+ - Do not modify files or generate a roadmap from this command alone.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: roadmap-audit
3
+ description: Run the sync-plus-audit workflow through the RoadmapSmith CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Audit
7
+
8
+ Use this command when the user wants the post-sync mismatch summary after applying evidence-backed checklist updates.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js sync --audit --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js sync --audit --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith sync --audit --project-root .`.
16
+ 3. Explain that this is the current sync-plus-audit flow, not a standalone read-only audit engine.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: roadmap-generate
3
+ description: Run the preserve-first roadmap update flow through the RoadmapSmith CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Generate
7
+
8
+ Use this command when the user wants the managed roadmap block updated from repository evidence without replacing substantive existing domain content.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js generate --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js generate --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith generate --project-root .`.
16
+ 3. Explain that `generate` is preserve-first when a substantive managed block already exists.
17
+ 4. When the user explicitly wants the destructive path, use `roadmapsmith generate --project-root . --full-regen`.
18
+ 5. Summarize what stayed preserved, whether generation refused, and what new additions, if any, were inserted.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: roadmap-init
3
+ description: Create ROADMAP.md and AGENTS.md through the RoadmapSmith CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Init
7
+
8
+ Use this command when the governance files are missing and the user wants them created without running the full Zero Mode interview.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js init --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js init --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith init`.
16
+ 3. Treat this command as CLI-backed and summarize whether files were created or skipped.
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: roadmap-maintain
3
+ description: Run the preserve-first existing-repository maintenance workflow through the RoadmapSmith CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Maintain
7
+
8
+ Use this command when the repository already has code, tests, docs, or an existing roadmap and the user wants the default maintenance flow.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js maintain --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js maintain --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith maintain --project-root .`.
16
+ 3. Treat this command as CLI-backed. Do not silently replace it with manual reasoning when the CLI is unavailable.
17
+ 4. Mention that maintain runs preserve-first generate, sync, and audit in one invocation.
18
+ 5. Mention that `roadmapsmith maintain --full-regen` or `roadmapsmith generate --full-regen` is the explicit destructive rebuild path when the user truly wants a full managed-block replacement.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: roadmap-setup
3
+ description: Generate RoadmapSmith host integration files through the CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Setup
7
+
8
+ Use this command when the user wants RoadmapSmith host integration files generated or refreshed for the current repository.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js setup --project-root . --hosts codex,claude`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js setup --project-root . --hosts codex,claude` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith setup --project-root . --hosts codex,claude`.
16
+ 3. Explain that setup affects the repository host layer: VS Code tasks, launcher/wrappers, and the optional repo-local Claude hook.
17
+ 4. Do not claim that setup alone creates native host slash commands; those come from the installed bundle/plugin.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: roadmap-status
3
+ description: Inspect RoadmapSmith readiness through doctor JSON and summarize the result.
4
+ ---
5
+
6
+ # RoadmapSmith Status
7
+
8
+ Use this command to inspect whether the shared bundle, native host surfaces, CLI, roadmap files, VS Code task UX, runtime, and Claude hook are ready.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js doctor --json --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js doctor --json --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith doctor --json --project-root .`.
16
+ 3. Parse and summarize the JSON output in plain language.
17
+ 4. Explicitly call out missing commands or duplicate `/roadmap-sync` registration when doctor reports them.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: roadmap-sync
3
+ description: Legacy namespaced root and policy guidance for RoadmapSmith slash workflows.
4
+ ---
5
+
6
+ # RoadmapSmith Legacy Root
7
+
8
+ Use this skill when the host exposes or the user invokes `/roadmap-sync`, or when the agent needs the RoadmapSmith operating rules for roadmap maintenance.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Treat bare `/roadmap-sync` as legacy palette/help, and treat `/roadmap-sync <action>` as the deprecated compatibility root.
13
+ 2. Prefer the namespaced native commands for new guidance:
14
+ - `/roadmap` for discovery
15
+ - `/roadmap-zero`
16
+ - `/roadmap-maintain`
17
+ - `/roadmap-status`
18
+ - `/roadmap-init`, `/roadmap-generate`, `/roadmap-validate`, `/roadmap-update`, `/roadmap-audit`, and `/roadmap-setup`
19
+ 3. When the user explicitly invokes `/roadmap-sync <action>`, route to the matching CLI-backed action without changing semantics and mention the migration path to `/roadmap <action>` or the direct `/roadmap-*` command.
20
+ 4. Preserve the operating rules for evidence-backed roadmap maintenance and checklist synchronization.
@@ -0,0 +1,7 @@
1
+ {
2
+ "interface": {
3
+ "display_name": "Roadmap Sync",
4
+ "short_description": "Legacy root plus policy for evidence-backed ROADMAP.md slash workflows.",
5
+ "default_prompt": "Prefer /roadmap for discovery, /roadmap-maintain for existing repos, and /roadmap-update for direct sync."
6
+ }
7
+ }
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: roadmap-update
3
+ description: Apply evidence-backed checklist sync through the RoadmapSmith CLI.
4
+ ---
5
+
6
+ # RoadmapSmith Update
7
+
8
+ Use this command when the user wants the direct sync surface without routing through the legacy `/roadmap-sync <action>` root.
9
+
10
+ ## Required behavior
11
+
12
+ 1. Prefer the local engine inside this repository:
13
+ - `node roadmap-skill/bin/cli.js sync --project-root .`
14
+ - on this Windows machine, prefer `C:\Program Files\nodejs\node.exe roadmap-skill/bin/cli.js sync --project-root .` if `node` is not in PATH
15
+ 2. Otherwise prefer `roadmapsmith sync --project-root .`.
16
+ 3. Explain that `/roadmap-update` is the visible namespaced sync command, while `/roadmap-sync <action>` remains legacy compatibility.
17
+ 4. Keep the evidence-backed sync semantics unchanged: sync updates checklist state from repository evidence; it is not a full regeneration path.