@slope-dev/slope 1.63.0 → 1.64.0
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/dist/cli/commands/claim.d.ts.map +1 -1
- package/dist/cli/commands/claim.js +57 -1
- package/dist/cli/commands/claim.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +43 -14
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +3 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/now.d.ts.map +1 -1
- package/dist/cli/commands/now.js +5 -2
- package/dist/cli/commands/now.js.map +1 -1
- package/dist/cli/commands/pr.d.ts +10 -3
- package/dist/cli/commands/pr.d.ts.map +1 -1
- package/dist/cli/commands/pr.js +45 -5
- package/dist/cli/commands/pr.js.map +1 -1
- package/dist/cli/commands/retro.d.ts.map +1 -1
- package/dist/cli/commands/retro.js +31 -4
- package/dist/cli/commands/retro.js.map +1 -1
- package/dist/cli/commands/review.d.ts +13 -1
- package/dist/cli/commands/review.d.ts.map +1 -1
- package/dist/cli/commands/review.js +99 -8
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/roadmap.d.ts.map +1 -1
- package/dist/cli/commands/roadmap.js +69 -22
- package/dist/cli/commands/roadmap.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +81 -15
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +24 -6
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/standup.d.ts.map +1 -1
- package/dist/cli/commands/standup.js +68 -0
- package/dist/cli/commands/standup.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +25 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/transcript.d.ts.map +1 -1
- package/dist/cli/commands/transcript.js +15 -4
- package/dist/cli/commands/transcript.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +34 -4
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/guards/claim-area.d.ts +27 -0
- package/dist/cli/guards/claim-area.d.ts.map +1 -0
- package/dist/cli/guards/claim-area.js +44 -0
- package/dist/cli/guards/claim-area.js.map +1 -0
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +41 -14
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/docs.d.ts.map +1 -1
- package/dist/cli/guards/docs.js +7 -0
- package/dist/cli/guards/docs.js.map +1 -1
- package/dist/cli/guards/phase-boundary.d.ts.map +1 -1
- package/dist/cli/guards/phase-boundary.js +34 -1
- package/dist/cli/guards/phase-boundary.js.map +1 -1
- package/dist/cli/guards/plan-analysis.d.ts +2 -2
- package/dist/cli/guards/plan-analysis.d.ts.map +1 -1
- package/dist/cli/guards/plan-analysis.js +16 -2
- package/dist/cli/guards/plan-analysis.js.map +1 -1
- package/dist/cli/guards/pr-review.d.ts +0 -8
- package/dist/cli/guards/pr-review.d.ts.map +1 -1
- package/dist/cli/guards/pr-review.js +31 -0
- package/dist/cli/guards/pr-review.js.map +1 -1
- package/dist/cli/guards/scope-drift.d.ts.map +1 -1
- package/dist/cli/guards/scope-drift.js +2 -4
- package/dist/cli/guards/scope-drift.js.map +1 -1
- package/dist/cli/guards/shell-write.d.ts +23 -0
- package/dist/cli/guards/shell-write.d.ts.map +1 -0
- package/dist/cli/guards/shell-write.js +81 -0
- package/dist/cli/guards/shell-write.js.map +1 -0
- package/dist/cli/guards/sprint-completion.js +11 -5
- package/dist/cli/guards/sprint-completion.js.map +1 -1
- package/dist/cli/guards/workflow-step-gate.d.ts.map +1 -1
- package/dist/cli/guards/workflow-step-gate.js +28 -3
- package/dist/cli/guards/workflow-step-gate.js.map +1 -1
- package/dist/cli/guards/worktree-check.d.ts.map +1 -1
- package/dist/cli/guards/worktree-check.js +86 -52
- package/dist/cli/guards/worktree-check.js.map +1 -1
- package/dist/cli/index.js +2 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop/workflow-adapter.d.ts.map +1 -1
- package/dist/cli/loop/workflow-adapter.js +3 -0
- package/dist/cli/loop/workflow-adapter.js.map +1 -1
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +2 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/roadmap-source-store.d.ts +16 -1
- package/dist/cli/roadmap-source-store.d.ts.map +1 -1
- package/dist/cli/roadmap-source-store.js +173 -22
- package/dist/cli/roadmap-source-store.js.map +1 -1
- package/dist/cli/session-scope.d.ts +35 -0
- package/dist/cli/session-scope.d.ts.map +1 -0
- package/dist/cli/session-scope.js +79 -0
- package/dist/cli/session-scope.js.map +1 -0
- package/dist/cli/session-state.d.ts.map +1 -1
- package/dist/cli/session-state.js +5 -2
- package/dist/cli/session-state.js.map +1 -1
- package/dist/cli/sprint-rollover.d.ts +17 -2
- package/dist/cli/sprint-rollover.d.ts.map +1 -1
- package/dist/cli/sprint-rollover.js +163 -40
- package/dist/cli/sprint-rollover.js.map +1 -1
- package/dist/cli/sprint-state.d.ts +18 -0
- package/dist/cli/sprint-state.d.ts.map +1 -1
- package/dist/cli/sprint-state.js +26 -0
- package/dist/cli/sprint-state.js.map +1 -1
- package/dist/cli/template-generator.d.ts.map +1 -1
- package/dist/cli/template-generator.js +1 -0
- package/dist/cli/template-generator.js.map +1 -1
- package/dist/cli/workflow-resync.d.ts +5 -2
- package/dist/cli/workflow-resync.d.ts.map +1 -1
- package/dist/cli/workflow-resync.js +28 -0
- package/dist/cli/workflow-resync.js.map +1 -1
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/formatter.js +4 -4
- package/dist/core/formatter.js.map +1 -1
- package/dist/core/guard.d.ts +1 -1
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js +9 -0
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +7 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/roadmap-source-patch.d.ts +26 -0
- package/dist/core/roadmap-source-patch.d.ts.map +1 -0
- package/dist/core/roadmap-source-patch.js +172 -0
- package/dist/core/roadmap-source-patch.js.map +1 -0
- package/dist/core/roadmap-sources.d.ts +44 -0
- package/dist/core/roadmap-sources.d.ts.map +1 -1
- package/dist/core/roadmap-sources.js +235 -37
- package/dist/core/roadmap-sources.js.map +1 -1
- package/dist/core/roadmap.d.ts +37 -0
- package/dist/core/roadmap.d.ts.map +1 -1
- package/dist/core/roadmap.js +57 -4
- package/dist/core/roadmap.js.map +1 -1
- package/dist/core/sprint-id.d.ts +29 -0
- package/dist/core/sprint-id.d.ts.map +1 -0
- package/dist/core/sprint-id.js +86 -0
- package/dist/core/sprint-id.js.map +1 -0
- package/dist/core/standup.d.ts +18 -0
- package/dist/core/standup.d.ts.map +1 -1
- package/dist/core/standup.js +23 -1
- package/dist/core/standup.js.map +1 -1
- package/package.json +4 -2
- package/templates/claude-code/commands/wrap-session.md +36 -0
- package/templates/codex/plugins/slope/.codex-plugin/plugin.json +1 -1
- package/templates/pi/skills/wrap-session.md +41 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surgical text-level patching for modular roadmap YAML sources.
|
|
3
|
+
*
|
|
4
|
+
* Roadmap reconciliation must not reserialize an authored bundle: a one-field
|
|
5
|
+
* status change that rewrites quoting, indentation, and line wrapping obscures
|
|
6
|
+
* review and inflates diffs (#615, #617). These helpers patch only the lines
|
|
7
|
+
* that belong to the targeted sprint entry and leave every other byte of the
|
|
8
|
+
* source untouched. Callers verify the result semantically before writing.
|
|
9
|
+
*/
|
|
10
|
+
export interface RoadmapSourceSprintTextPatch {
|
|
11
|
+
/** New status value for the sprint entry, e.g. "complete". */
|
|
12
|
+
status: string;
|
|
13
|
+
/** Scorecards map key to upsert (the stored sprint id as a string). */
|
|
14
|
+
scorecardKey?: string;
|
|
15
|
+
/** Repo-relative scorecard path recorded under the key. */
|
|
16
|
+
scorecardPath?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Patch a sprint's status (and optionally its scorecards entry) in raw YAML
|
|
20
|
+
* source text without reformatting anything else. Returns null when the
|
|
21
|
+
* document's shape prevents a confidently surgical edit (flow-style entries,
|
|
22
|
+
* mixed line endings, a missing or duplicated block-style `- id:` line) so the
|
|
23
|
+
* caller can fall back to a full rewrite explicitly.
|
|
24
|
+
*/
|
|
25
|
+
export declare function patchRoadmapSourceSprintText(source: string, sprintId: number, patch: RoadmapSourceSprintTextPatch): string | null;
|
|
26
|
+
//# sourceMappingURL=roadmap-source-patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-source-patch.d.ts","sourceRoot":"","sources":["../../src/core/roadmap-source-patch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,4BAA4B;IAC3C,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,4BAA4B,GAClC,MAAM,GAAG,IAAI,CAiBf"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surgical text-level patching for modular roadmap YAML sources.
|
|
3
|
+
*
|
|
4
|
+
* Roadmap reconciliation must not reserialize an authored bundle: a one-field
|
|
5
|
+
* status change that rewrites quoting, indentation, and line wrapping obscures
|
|
6
|
+
* review and inflates diffs (#615, #617). These helpers patch only the lines
|
|
7
|
+
* that belong to the targeted sprint entry and leave every other byte of the
|
|
8
|
+
* source untouched. Callers verify the result semantically before writing.
|
|
9
|
+
*/
|
|
10
|
+
const ENTRY_ID_PATTERN = /^(\s*)- id:\s*([0-9][0-9.]*)\s*(#.*)?$/;
|
|
11
|
+
/**
|
|
12
|
+
* Patch a sprint's status (and optionally its scorecards entry) in raw YAML
|
|
13
|
+
* source text without reformatting anything else. Returns null when the
|
|
14
|
+
* document's shape prevents a confidently surgical edit (flow-style entries,
|
|
15
|
+
* mixed line endings, a missing or duplicated block-style `- id:` line) so the
|
|
16
|
+
* caller can fall back to a full rewrite explicitly.
|
|
17
|
+
*/
|
|
18
|
+
export function patchRoadmapSourceSprintText(source, sprintId, patch) {
|
|
19
|
+
const eol = source.includes('\r\n') ? '\r\n' : '\n';
|
|
20
|
+
const lines = source.split(/\r?\n/);
|
|
21
|
+
// A lossless round-trip is required before we can claim the edit is
|
|
22
|
+
// surgical; mixed line endings would be silently normalized otherwise.
|
|
23
|
+
if (lines.join(eol) !== source)
|
|
24
|
+
return null;
|
|
25
|
+
const section = findTopLevelSection(lines, 'sprints');
|
|
26
|
+
if (!section)
|
|
27
|
+
return null;
|
|
28
|
+
const location = locateSprintEntry(lines, section, sprintId);
|
|
29
|
+
if (!location)
|
|
30
|
+
return null;
|
|
31
|
+
patchStatusLine(lines, location, patch.status);
|
|
32
|
+
if (patch.scorecardKey && patch.scorecardPath) {
|
|
33
|
+
if (!upsertScorecardEntry(lines, patch.scorecardKey, patch.scorecardPath))
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return lines.join(eol);
|
|
37
|
+
}
|
|
38
|
+
function findTopLevelSection(lines, key) {
|
|
39
|
+
const start = lines.findIndex(line => new RegExp(`^${key}:\\s*(#.*)?$`).test(line));
|
|
40
|
+
if (start < 0)
|
|
41
|
+
return null;
|
|
42
|
+
let end = lines.length;
|
|
43
|
+
for (let index = start + 1; index < lines.length; index++) {
|
|
44
|
+
if (/^\S/.test(lines[index])) {
|
|
45
|
+
end = index;
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { start, end };
|
|
50
|
+
}
|
|
51
|
+
function locateSprintEntry(lines, section, sprintId) {
|
|
52
|
+
let entryIndent = null;
|
|
53
|
+
const matches = [];
|
|
54
|
+
for (let index = section.start + 1; index < section.end; index++) {
|
|
55
|
+
const listItem = /^(\s+)- /.exec(lines[index]);
|
|
56
|
+
if (!listItem)
|
|
57
|
+
continue;
|
|
58
|
+
entryIndent ??= listItem[1];
|
|
59
|
+
if (listItem[1] !== entryIndent)
|
|
60
|
+
continue;
|
|
61
|
+
const idMatch = ENTRY_ID_PATTERN.exec(lines[index]);
|
|
62
|
+
if (idMatch && idMatch[1] === entryIndent && Number(idMatch[2]) === sprintId) {
|
|
63
|
+
matches.push(index);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (entryIndent == null || matches.length !== 1)
|
|
67
|
+
return null;
|
|
68
|
+
const entryLine = matches[0];
|
|
69
|
+
let blockEnd = section.end;
|
|
70
|
+
for (let index = entryLine + 1; index < section.end; index++) {
|
|
71
|
+
const line = lines[index];
|
|
72
|
+
if (line.startsWith(`${entryIndent}- `)) {
|
|
73
|
+
blockEnd = index;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
if (line.trim() !== '' && !line.startsWith(entryIndent)) {
|
|
77
|
+
blockEnd = index;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
let propertyIndent = `${entryIndent} `;
|
|
82
|
+
for (let index = entryLine + 1; index < blockEnd; index++) {
|
|
83
|
+
const property = /^(\s+)[A-Za-z_][\w-]*:/.exec(lines[index]);
|
|
84
|
+
if (property && property[1].length > entryIndent.length) {
|
|
85
|
+
propertyIndent = property[1];
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { entryLine, blockEnd, propertyIndent };
|
|
90
|
+
}
|
|
91
|
+
/** Split the text after a mapping key into leading whitespace, scalar value,
|
|
92
|
+
* and trailing comment (a `#` at the start or preceded by whitespace),
|
|
93
|
+
* without regex backtracking. */
|
|
94
|
+
function splitValueAndComment(rest) {
|
|
95
|
+
let commentStart = -1;
|
|
96
|
+
for (let index = 0; index < rest.length; index++) {
|
|
97
|
+
if (rest[index] === '#' && (index === 0 || rest[index - 1] === ' ' || rest[index - 1] === '\t')) {
|
|
98
|
+
commentStart = index;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const head = commentStart < 0 ? rest : rest.slice(0, commentStart);
|
|
103
|
+
let comment = commentStart < 0 ? '' : rest.slice(commentStart);
|
|
104
|
+
let separatorEnd = 0;
|
|
105
|
+
while (separatorEnd < head.length && (head[separatorEnd] === ' ' || head[separatorEnd] === '\t'))
|
|
106
|
+
separatorEnd += 1;
|
|
107
|
+
const separator = head.slice(0, separatorEnd);
|
|
108
|
+
let valueEnd = head.length;
|
|
109
|
+
while (valueEnd > separatorEnd && (head[valueEnd - 1] === ' ' || head[valueEnd - 1] === '\t'))
|
|
110
|
+
valueEnd -= 1;
|
|
111
|
+
if (comment)
|
|
112
|
+
comment = `${head.slice(valueEnd)}${comment}`;
|
|
113
|
+
return { separator, value: head.slice(separatorEnd, valueEnd), comment };
|
|
114
|
+
}
|
|
115
|
+
function escapeRegExp(text) {
|
|
116
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
117
|
+
}
|
|
118
|
+
function patchStatusLine(lines, location, status) {
|
|
119
|
+
const prefix = `${location.propertyIndent}status:`;
|
|
120
|
+
for (let index = location.entryLine + 1; index < location.blockEnd; index++) {
|
|
121
|
+
if (!lines[index].startsWith(prefix))
|
|
122
|
+
continue;
|
|
123
|
+
const { separator, comment } = splitValueAndComment(lines[index].slice(prefix.length));
|
|
124
|
+
// Guarantee separators so empty values (`status:`) and comment-only
|
|
125
|
+
// values (`status: # note`) cannot glue into an invalid scalar.
|
|
126
|
+
const commentSeparator = comment && !/^[ \t]/.test(comment) ? ' ' : '';
|
|
127
|
+
lines[index] = `${prefix}${separator || ' '}${status}${commentSeparator}${comment}`;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
lines.splice(location.entryLine + 1, 0, `${location.propertyIndent}status: ${status}`);
|
|
131
|
+
}
|
|
132
|
+
/** Returns false when a scorecards section exists in a shape (flow style)
|
|
133
|
+
* that cannot be edited surgically, so the caller can fall back explicitly. */
|
|
134
|
+
function upsertScorecardEntry(lines, key, path) {
|
|
135
|
+
const section = findTopLevelSection(lines, 'scorecards');
|
|
136
|
+
if (!section) {
|
|
137
|
+
// A `scorecards:` line that carries inline content (flow-style map) is a
|
|
138
|
+
// real section this patcher cannot edit; appending a second key would
|
|
139
|
+
// corrupt the document.
|
|
140
|
+
if (lines.some(line => /^scorecards:/.test(line)))
|
|
141
|
+
return false;
|
|
142
|
+
let insertAt = lines.length;
|
|
143
|
+
while (insertAt > 0 && lines[insertAt - 1].trim() === '')
|
|
144
|
+
insertAt -= 1;
|
|
145
|
+
lines.splice(insertAt, 0, 'scorecards:', ` "${key}": ${path}`);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
const escapedKey = escapeRegExp(key);
|
|
149
|
+
const keyPattern = new RegExp(`^([ \\t]+)(['"]?)${escapedKey}\\2:`);
|
|
150
|
+
let entryIndent = ' ';
|
|
151
|
+
let lastEntry = section.start;
|
|
152
|
+
for (let index = section.start + 1; index < section.end; index++) {
|
|
153
|
+
const entry = /^([ \t]+)(['"]?)([0-9][0-9.]*)\2:/.exec(lines[index]);
|
|
154
|
+
if (!entry)
|
|
155
|
+
continue;
|
|
156
|
+
entryIndent = entry[1];
|
|
157
|
+
lastEntry = index;
|
|
158
|
+
const keyMatch = keyPattern.exec(lines[index]);
|
|
159
|
+
if (keyMatch) {
|
|
160
|
+
// Leave the line untouched when the value already matches, and keep any
|
|
161
|
+
// trailing comment when it does not.
|
|
162
|
+
const { value, comment } = splitValueAndComment(lines[index].slice(keyMatch[0].length));
|
|
163
|
+
if (value !== path) {
|
|
164
|
+
lines[index] = `${keyMatch[1]}${keyMatch[2]}${key}${keyMatch[2]}: ${path}${comment ? ` ${comment.trimStart()}` : ''}`;
|
|
165
|
+
}
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
lines.splice(lastEntry + 1, 0, `${entryIndent}"${key}": ${path}`);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=roadmap-source-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roadmap-source-patch.js","sourceRoot":"","sources":["../../src/core/roadmap-source-patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,6 +37,13 @@ export interface RoadmapSourceValidationResult {
|
|
|
37
37
|
}
|
|
38
38
|
export declare class RoadmapSourceError extends Error {
|
|
39
39
|
readonly sourcePath?: string | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* True when the failure is a refusal to discard authored content that exists
|
|
42
|
+
* only in the generated projection. Callers must treat this as fatal rather
|
|
43
|
+
* than downgrading it to a warning — reporting success while planning work is
|
|
44
|
+
* destroyed is the whole defect (GH #637).
|
|
45
|
+
*/
|
|
46
|
+
projectionContentLoss?: boolean;
|
|
40
47
|
constructor(message: string, sourcePath?: string | undefined);
|
|
41
48
|
}
|
|
42
49
|
export declare function normalizeDiagnosticPath(path: string): string;
|
|
@@ -47,6 +54,43 @@ export declare function sourceProjectToRoadmap(project: RoadmapSourceProject): P
|
|
|
47
54
|
/** Compile ordered authoring bundles into the existing roadmap compatibility shape. */
|
|
48
55
|
export declare function compileRoadmapSources(project: RoadmapSourceProject, sources: LoadedRoadmapSource[]): RoadmapDefinition;
|
|
49
56
|
export declare function serializeRoadmapProjection(roadmap: RoadmapDefinition): string;
|
|
57
|
+
/**
|
|
58
|
+
* Key of the generated-file marker written into the compiled projection.
|
|
59
|
+
*
|
|
60
|
+
* The marker exists only in the bytes on disk. `serializeRoadmapProjection`
|
|
61
|
+
* stays canonical and marker-free, because projection bytes are compared in four
|
|
62
|
+
* places — compile write, closeout reconciliation, archive planning, and the
|
|
63
|
+
* migration planner/applier `expected_projection_sha256` pair. Stamping the
|
|
64
|
+
* marker into those canonical bytes broke migration receipt binding (seven
|
|
65
|
+
* tests), so it is applied at the write boundary and stripped again on read
|
|
66
|
+
* (GH #644, deferred from #637).
|
|
67
|
+
*/
|
|
68
|
+
export declare const ROADMAP_PROJECTION_MARKER_KEY = "_generated";
|
|
69
|
+
/** Add the generated-file marker to projection bytes about to be written. */
|
|
70
|
+
export declare function withRoadmapProjectionMarker(projection: string, sourcePath: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Remove the generated-file marker so on-disk bytes can be compared against
|
|
73
|
+
* canonical projection bytes. Returns the input unchanged when no marker exists,
|
|
74
|
+
* so projections written before this change still compare correctly.
|
|
75
|
+
*/
|
|
76
|
+
export declare function stripRoadmapProjectionMarker(projection: string): string;
|
|
77
|
+
export interface RoadmapProjectionDivergence {
|
|
78
|
+
/** Sprint ids present in the on-disk projection but produced by no source. */
|
|
79
|
+
sprints: string[];
|
|
80
|
+
/** Phase names present in the on-disk projection but produced by no source. */
|
|
81
|
+
phases: string[];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Find content that exists only in the checked-out projection.
|
|
85
|
+
*
|
|
86
|
+
* A projection that merely lags its sources contains nothing the sources do not
|
|
87
|
+
* produce, so it is safe to overwrite. Content present *only* on disk is
|
|
88
|
+
* authored planning work that a blind rewrite would destroy — which is exactly
|
|
89
|
+
* how a phase, six sprints and 26 tickets were lost on a success exit (GH #637).
|
|
90
|
+
*
|
|
91
|
+
* Returns null when nothing would be lost.
|
|
92
|
+
*/
|
|
93
|
+
export declare function findRoadmapProjectionDivergence(existing: string, compiled: RoadmapDefinition): RoadmapProjectionDivergence | null;
|
|
50
94
|
/** Validate source federation invariants before any compatibility write. */
|
|
51
95
|
export declare function validateRoadmapSourceFederation(project: RoadmapSourceProject, sources: LoadedRoadmapSource[]): RoadmapSourceValidationResult;
|
|
52
96
|
//# sourceMappingURL=roadmap-sources.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roadmap-sources.d.ts","sourceRoot":"","sources":["../../src/core/roadmap-sources.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roadmap-sources.d.ts","sourceRoot":"","sources":["../../src/core/roadmap-sources.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEnF,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,GAAG,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,4BAA4B,EAAE,CAAC;IACvC,QAAQ,EAAE,4BAA4B,EAAE,CAAC;IACzC,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAWzC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM;IAV9B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;gBAG9B,OAAO,EAAE,MAAM,EACN,UAAU,CAAC,EAAE,MAAM,YAAA;CAK/B;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAgB,GAAG,MAAM,CAWtF;AAmDD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,UAAU,SAA8B,GACvC,oBAAoB,CAgDtB;AA2CD,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,qBAAqB,CA6LvB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,aAAa,CAAC,CAKrH;AAqBD,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,mBAAmB,EAAE,GAC7B,iBAAiB,CA4BnB;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAE7E;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,eAAe,CAAC;AAE1D,6EAA6E;AAC7E,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAkB1F;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAevE;AAED,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,2BAA2B,GAAG,IAAI,CAuCpC;AAMD,4EAA4E;AAC5E,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,mBAAmB,EAAE,GAC7B,6BAA6B,CAqK/B"}
|