roadmapsmith 0.9.30 → 0.9.31

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roadmapsmith",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roadmapsmith",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
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"
package/bin/cli.js CHANGED
@@ -21,7 +21,7 @@ function printHelp() {
21
21
  'Usage:',
22
22
  ' Canonical commands:',
23
23
  ' roadmapsmith zero [--project-root <path>] [--config <path>]',
24
- ' roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen]',
24
+ ' roadmapsmith maintain [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--full-regen] [--refresh-annotations]',
25
25
  ' roadmapsmith status [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--json]',
26
26
  ' roadmapsmith validate [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--task <id|text>] [--json] [--strict]',
27
27
  ' roadmapsmith update [--task <stable-id> --evidence <text>] [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run]',
@@ -30,7 +30,7 @@ function printHelp() {
30
30
  ' Advanced commands:',
31
31
  ' roadmapsmith init [--roadmap-file <path>] [--agents-file <path>] [--dry-run]',
32
32
  ' roadmapsmith generate [--project-root <path>] [--config <path>] [--roadmap-file <path>] [--dry-run] [--audit] [--full-regen]',
33
- ' roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit]',
33
+ ' roadmapsmith sync [--roadmap-file <path>] [--project-root <path>] [--config <path>] [--dry-run] [--audit] [--refresh-annotations]',
34
34
  ' roadmapsmith /roadmap',
35
35
  ' roadmapsmith /roadmap <action>',
36
36
  ' roadmapsmith /roadmap-zero | /roadmap-maintain | /roadmap-status | /roadmap-validate | /roadmap-update | /roadmap-setup | /roadmap-init | /roadmap-generate | /roadmap-audit',
@@ -226,7 +226,8 @@ function runSyncCommand(projectRoot, config, flags, options = {}) {
226
226
  const validationContext = buildValidationContext(projectRoot, config, loadPlugins(projectRoot, config.plugins));
227
227
  const results = validateTasks(syncTasks, validationContext, config, validationContext.plugins);
228
228
  applyMinimumConfidence(results, config.validation?.minimumConfidence);
229
- const next = applySync(content, syncTasks, results);
229
+ const forceRefresh = isEnabled(flags['refresh-annotations']);
230
+ const next = applySync(content, syncTasks, results, { forceRefresh });
230
231
  const dryRun = isEnabled(flags['dry-run']);
231
232
  const writeResult = writeText(roadmapFile, next, { dryRun });
232
233
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "roadmapsmith",
3
- "version": "0.9.30",
3
+ "version": "0.9.31",
4
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
  "main": "src/index.js",
6
6
  "bin": {
@@ -17,3 +17,4 @@ Use this command when the repository already has code, tests, docs, or an existi
17
17
  4. Mention that maintain runs preserve-first generate, sync, and audit in one invocation.
18
18
  5. After a successful maintain cycle, do not propose generate, sync, or audit separately unless the user needs manual control or inspection.
19
19
  6. 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.
20
+ 7. When the user wants stale or outdated warning annotations to be recomputed from scratch (including annotations that were written by a prior maintain run or an external agent), use `roadmapsmith maintain --refresh-annotations`. This forces all existing warning text to be replaced with the current deterministic result rather than preserved. It is distinct from `--full-regen` (which rebuilds the managed block structure) — `--refresh-annotations` only affects warning annotations on still-failing tasks.
package/skills.json CHANGED
@@ -28,67 +28,67 @@
28
28
  "name": "roadmap",
29
29
  "path": "skills/roadmap",
30
30
  "description": "Native slash palette for RoadmapSmith commands and recommended entrypoints across supported hosts.",
31
- "version": "0.9.30"
31
+ "version": "0.9.31"
32
32
  },
33
33
  {
34
34
  "name": "roadmap-zero",
35
35
  "path": "skills/roadmap-zero",
36
36
  "description": "Native slash entrypoint for the one-command Zero Mode CLI workflow.",
37
- "version": "0.9.30"
37
+ "version": "0.9.31"
38
38
  },
39
39
  {
40
40
  "name": "roadmap-maintain",
41
41
  "path": "skills/roadmap-maintain",
42
42
  "description": "Native slash entrypoint for the preserve-first generate + sync + audit flow.",
43
- "version": "0.9.30"
43
+ "version": "0.9.31"
44
44
  },
45
45
  {
46
46
  "name": "roadmap-status",
47
47
  "path": "skills/roadmap-status",
48
48
  "description": "Native slash readiness check grounded in roadmapsmith status JSON.",
49
- "version": "0.9.30"
49
+ "version": "0.9.31"
50
50
  },
51
51
  {
52
52
  "name": "roadmap-init",
53
53
  "path": "skills/roadmap-init",
54
54
  "description": "Native slash entrypoint for creating ROADMAP.md and AGENTS.md.",
55
- "version": "0.9.30"
55
+ "version": "0.9.31"
56
56
  },
57
57
  {
58
58
  "name": "roadmap-generate",
59
59
  "path": "skills/roadmap-generate",
60
60
  "description": "Native slash entrypoint for managed roadmap updates that require --full-regen before destructive replacement.",
61
- "version": "0.9.30"
61
+ "version": "0.9.31"
62
62
  },
63
63
  {
64
64
  "name": "roadmap-validate",
65
65
  "path": "skills/roadmap-validate",
66
66
  "description": "Native slash entrypoint for evidence-backed roadmap validation.",
67
- "version": "0.9.30"
67
+ "version": "0.9.31"
68
68
  },
69
69
  {
70
70
  "name": "roadmap-update",
71
71
  "path": "skills/roadmap-update",
72
72
  "description": "Native slash entrypoint for evidence-backed sync and verified single-task completion.",
73
- "version": "0.9.30"
73
+ "version": "0.9.31"
74
74
  },
75
75
  {
76
76
  "name": "roadmap-sync",
77
77
  "path": "skills/roadmap-sync",
78
78
  "description": "DEPRECATED legacy compatibility root; use roadmap-maintain or roadmap-update.",
79
- "version": "0.9.30"
79
+ "version": "0.9.31"
80
80
  },
81
81
  {
82
82
  "name": "roadmap-audit",
83
83
  "path": "skills/roadmap-audit",
84
84
  "description": "Native slash entrypoint for the advanced sync-plus-audit mutating summary workflow.",
85
- "version": "0.9.30"
85
+ "version": "0.9.31"
86
86
  },
87
87
  {
88
88
  "name": "roadmap-setup",
89
89
  "path": "skills/roadmap-setup",
90
90
  "description": "Native slash entrypoint for generating RoadmapSmith host integration files.",
91
- "version": "0.9.30"
91
+ "version": "0.9.31"
92
92
  }
93
93
  ]
94
94
  }
package/src/reasons.js ADDED
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ // Low-specificity reason strings produced by the deterministic validator for
4
+ // policy-level failures. These messages carry no file- or symbol-specific
5
+ // information and should not overwrite more informative existing annotations
6
+ // that a prior run or a human/agent authored.
7
+ const LOW_SPECIFICITY_REASONS = new Set([
8
+ 'validation failed',
9
+ 'implementation task requires deterministic Verify metadata or explicit Evidence to be marked complete',
10
+ 'implementation task requires Evidence line or high-confidence evidence (code + test) to be marked complete',
11
+ ]);
12
+
13
+ /**
14
+ * Returns true when `reason` is a low-specificity policy message — one that carries
15
+ * no file- or symbol-specific diagnostic value and should not be used to overwrite
16
+ * a more informative existing annotation.
17
+ *
18
+ * Input should be a normalized reason string (⚠️ prefix and warning prefixes already
19
+ * stripped, as produced by normalizeWarningReason in src/sync/index.js).
20
+ *
21
+ * @param {string} reason
22
+ * @returns {boolean}
23
+ */
24
+ function isLowSpecificityReason(reason) {
25
+ return LOW_SPECIFICITY_REASONS.has(String(reason || '').trim());
26
+ }
27
+
28
+ module.exports = { LOW_SPECIFICITY_REASONS, isLowSpecificityReason };
package/src/sync/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  const { parseRoadmap } = require('../parser');
4
4
  const { ensureTrailingNewline } = require('../utils');
5
+ const { isLowSpecificityReason } = require('../reasons');
5
6
 
6
7
  const ATTEMPTED_WARNING_REASON_PREFIX = 'attempted but validation failed:';
7
8
  const NO_EVIDENCE_WARNING_REASON_PREFIX = 'no implementation evidence found yet:';
@@ -106,10 +107,14 @@ function normalizeWarningReasons(reasons) {
106
107
  return normalized;
107
108
  }
108
109
 
109
- function shouldPreserveExistingWarning(existingReason, newReason) {
110
+ function shouldPreserveExistingWarning(existingReason, newReason, options) {
111
+ if (options && options.forceRefresh) return false;
110
112
  const cleanExisting = normalizeWarningReason(existingReason);
111
113
  const cleanNew = normalizeWarningReason(newReason) || 'validation failed';
112
- return cleanNew === 'validation failed' && cleanExisting && cleanExisting !== cleanNew;
114
+ // Preserve when the freshly computed reason is a low-specificity policy message (no
115
+ // file- or symbol-specific information) and the existing annotation carries more
116
+ // diagnostic value (is not itself a low-specificity message).
117
+ return isLowSpecificityReason(cleanNew) && Boolean(cleanExisting) && !isLowSpecificityReason(cleanExisting);
113
118
  }
114
119
 
115
120
  function formatVerificationRecipe(indent, recipe) {
@@ -129,7 +134,7 @@ function findVerificationRecipeIndex(lines, taskLineIndex) {
129
134
  return null;
130
135
  }
131
136
 
132
- function applySync(content, parsedTasks, results) {
137
+ function applySync(content, parsedTasks, results, options) {
133
138
  const parsed = parseRoadmap(content);
134
139
  const lines = [...parsed.lines];
135
140
  const tasks = parsedTasks || parsed.tasks;
@@ -187,7 +192,7 @@ function applySync(content, parsedTasks, results) {
187
192
  } else if (warningIndex != null && warningIndex >= 0 && warningIndex < lines.length) {
188
193
  const existingReason = normalizeWarningReason(lines[warningIndex]);
189
194
  const newReason = reason || 'validation failed';
190
- if (!shouldPreserveExistingWarning(existingReason, newReason)) {
195
+ if (!shouldPreserveExistingWarning(existingReason, newReason, options)) {
191
196
  lines[warningIndex] = warningText;
192
197
  }
193
198
  } else {