roadmapsmith 0.9.30 → 0.9.32
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 +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/bin/cli.js +4 -3
- package/package.json +1 -1
- package/skills/roadmap-maintain/SKILL.md +1 -0
- package/skills.json +11 -11
- package/src/reasons.js +28 -0
- package/src/sync/index.js +9 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "roadmapsmith",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.32",
|
|
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.
|
|
3
|
+
"version": "0.9.32",
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.9.32",
|
|
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.
|
|
31
|
+
"version": "0.9.32"
|
|
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.
|
|
37
|
+
"version": "0.9.32"
|
|
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.
|
|
43
|
+
"version": "0.9.32"
|
|
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.
|
|
49
|
+
"version": "0.9.32"
|
|
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.
|
|
55
|
+
"version": "0.9.32"
|
|
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.
|
|
61
|
+
"version": "0.9.32"
|
|
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.
|
|
67
|
+
"version": "0.9.32"
|
|
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.
|
|
73
|
+
"version": "0.9.32"
|
|
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.
|
|
79
|
+
"version": "0.9.32"
|
|
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.
|
|
85
|
+
"version": "0.9.32"
|
|
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.
|
|
91
|
+
"version": "0.9.32"
|
|
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
|
-
|
|
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 {
|