@warpgogol/forge 5.3.4 → 6.0.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/CHANGELOG.md +8 -0
- package/bin/cli.ts +7 -2
- package/dist/bin/cli.js +7 -2
- package/dist/bin/cli.js.map +1 -1
- package/dist/os/adr/adr.module.d.ts.map +1 -1
- package/dist/os/adr/adr.module.js +2 -0
- package/dist/os/adr/adr.module.js.map +1 -1
- package/dist/os/audit/audit.module.d.ts.map +1 -1
- package/dist/os/audit/audit.module.js +2 -0
- package/dist/os/audit/audit.module.js.map +1 -1
- package/dist/os/compass/compass.module.d.ts.map +1 -1
- package/dist/os/compass/compass.module.js +47 -15
- package/dist/os/compass/compass.module.js.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.d.ts +2 -0
- package/dist/os/compass/handlers/compass-audit-handler.d.ts.map +1 -1
- package/dist/os/compass/handlers/compass-audit-handler.js +39 -9
- package/dist/os/compass/handlers/compass-audit-handler.js.map +1 -1
- package/dist/os/compass/handlers/compass-docs-validate.d.ts +13 -0
- package/dist/os/compass/handlers/compass-docs-validate.d.ts.map +1 -0
- package/dist/os/compass/handlers/compass-docs-validate.js +326 -0
- package/dist/os/compass/handlers/compass-docs-validate.js.map +1 -0
- package/dist/os/compass/handlers/summary-record.d.ts +11 -2
- package/dist/os/compass/handlers/summary-record.d.ts.map +1 -1
- package/dist/os/compass/handlers/summary-record.js +93 -5
- package/dist/os/compass/handlers/summary-record.js.map +1 -1
- package/dist/os/core/core.module.d.ts.map +1 -1
- package/dist/os/core/core.module.js +124 -73
- package/dist/os/core/core.module.js.map +1 -1
- package/dist/os/exploration/exploration.module.d.ts.map +1 -1
- package/dist/os/exploration/exploration.module.js +3 -0
- package/dist/os/exploration/exploration.module.js.map +1 -1
- package/dist/os/naming/naming.module.d.ts.map +1 -1
- package/dist/os/naming/naming.module.js +9 -2
- package/dist/os/naming/naming.module.js.map +1 -1
- package/dist/os/notes/notes.module.d.ts.map +1 -1
- package/dist/os/notes/notes.module.js +17 -6
- package/dist/os/notes/notes.module.js.map +1 -1
- package/dist/os/plan/plan.module.d.ts.map +1 -1
- package/dist/os/plan/plan.module.js +2 -0
- package/dist/os/plan/plan.module.js.map +1 -1
- package/dist/os/plugin/plugin.module.d.ts.map +1 -1
- package/dist/os/plugin/plugin.module.js +9 -2
- package/dist/os/plugin/plugin.module.js.map +1 -1
- package/dist/os/program/program.module.d.ts.map +1 -1
- package/dist/os/program/program.module.js +19 -4
- package/dist/os/program/program.module.js.map +1 -1
- package/dist/os/queue/handlers/queue-validate.d.ts.map +1 -1
- package/dist/os/queue/handlers/queue-validate.js +154 -7
- package/dist/os/queue/handlers/queue-validate.js.map +1 -1
- package/dist/os/queue/manifest.d.ts +17 -1
- package/dist/os/queue/manifest.d.ts.map +1 -1
- package/dist/os/queue/manifest.js +127 -6
- package/dist/os/queue/manifest.js.map +1 -1
- package/dist/os/queue/queue.module.d.ts.map +1 -1
- package/dist/os/queue/queue.module.js +32 -4
- package/dist/os/queue/queue.module.js.map +1 -1
- package/dist/os/queue/types.d.ts +100 -1
- package/dist/os/queue/types.d.ts.map +1 -1
- package/dist/os/queue/types.js +44 -0
- package/dist/os/queue/types.js.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.d.ts.map +1 -1
- package/dist/os/rfc/handlers/implement-stamp.js +28 -5
- package/dist/os/rfc/handlers/implement-stamp.js.map +1 -1
- package/dist/os/rfc/rfc.module.d.ts.map +1 -1
- package/dist/os/rfc/rfc.module.js +27 -3
- package/dist/os/rfc/rfc.module.js.map +1 -1
- package/dist/os/rfc/types.d.ts +11 -0
- package/dist/os/rfc/types.d.ts.map +1 -1
- package/dist/os/rfc/types.js +1 -0
- package/dist/os/rfc/types.js.map +1 -1
- package/dist/os/rfc/verification-evidence.d.ts +21 -0
- package/dist/os/rfc/verification-evidence.d.ts.map +1 -1
- package/dist/os/rfc/verification-evidence.js +140 -23
- package/dist/os/rfc/verification-evidence.js.map +1 -1
- package/dist/os/rfc/verification-refresh.d.ts.map +1 -1
- package/dist/os/rfc/verification-refresh.js +72 -37
- package/dist/os/rfc/verification-refresh.js.map +1 -1
- package/dist/os/session/handlers/save.d.ts.map +1 -1
- package/dist/os/session/handlers/save.js +46 -5
- package/dist/os/session/handlers/save.js.map +1 -1
- package/dist/os/session/session.module.d.ts.map +1 -1
- package/dist/os/session/session.module.js +5 -0
- package/dist/os/session/session.module.js.map +1 -1
- package/dist/os/spec/live-spec-merge.d.ts.map +1 -1
- package/dist/os/spec/live-spec-merge.js +55 -134
- package/dist/os/spec/live-spec-merge.js.map +1 -1
- package/dist/os/spec/live-spec-rebuild.d.ts +32 -0
- package/dist/os/spec/live-spec-rebuild.d.ts.map +1 -0
- package/dist/os/spec/live-spec-rebuild.js +272 -0
- package/dist/os/spec/live-spec-rebuild.js.map +1 -0
- package/dist/os/spec/live-spec-shared.d.ts +62 -0
- package/dist/os/spec/live-spec-shared.d.ts.map +1 -0
- package/dist/os/spec/live-spec-shared.js +315 -0
- package/dist/os/spec/live-spec-shared.js.map +1 -0
- package/dist/os/spec/live-spec-types.d.ts +17 -1
- package/dist/os/spec/live-spec-types.d.ts.map +1 -1
- package/dist/os/spec/live-spec-types.js +3 -0
- package/dist/os/spec/live-spec-types.js.map +1 -1
- package/dist/os/spec/live-spec-validate.d.ts.map +1 -1
- package/dist/os/spec/live-spec-validate.js +105 -2
- package/dist/os/spec/live-spec-validate.js.map +1 -1
- package/dist/os/spec/spec-materialize.d.ts +2 -0
- package/dist/os/spec/spec-materialize.d.ts.map +1 -1
- package/dist/os/spec/spec-materialize.js +45 -5
- package/dist/os/spec/spec-materialize.js.map +1 -1
- package/dist/os/spec/spec-schema.d.ts +19 -0
- package/dist/os/spec/spec-schema.d.ts.map +1 -1
- package/dist/os/spec/spec-schema.js +30 -0
- package/dist/os/spec/spec-schema.js.map +1 -1
- package/dist/os/spec/spec-status.d.ts +4 -0
- package/dist/os/spec/spec-status.d.ts.map +1 -1
- package/dist/os/spec/spec-status.js +19 -1
- package/dist/os/spec/spec-status.js.map +1 -1
- package/dist/os/spec/spec-validate.d.ts.map +1 -1
- package/dist/os/spec/spec-validate.js +55 -8
- package/dist/os/spec/spec-validate.js.map +1 -1
- package/dist/os/spec/spec.module.d.ts.map +1 -1
- package/dist/os/spec/spec.module.js +84 -8
- package/dist/os/spec/spec.module.js.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.d.ts.map +1 -1
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js +10 -4
- package/dist/os/werkstatt/handlers/werkstatt-operation-validate.js.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.d.ts.map +1 -1
- package/dist/os/werkstatt/werkstatt.module.js +13 -4
- package/dist/os/werkstatt/werkstatt.module.js.map +1 -1
- package/dist/os/workflow/workflow.module.d.ts.map +1 -1
- package/dist/os/workflow/workflow.module.js +13 -5
- package/dist/os/workflow/workflow.module.js.map +1 -1
- package/dist/src/cli-flags.d.ts.map +1 -1
- package/dist/src/cli-flags.js +25 -5
- package/dist/src/cli-flags.js.map +1 -1
- package/dist/src/config/forge-config.d.ts +3 -0
- package/dist/src/config/forge-config.d.ts.map +1 -1
- package/dist/src/config/forge-config.js +2 -0
- package/dist/src/config/forge-config.js.map +1 -1
- package/dist/src/onboarding/init.d.ts.map +1 -1
- package/dist/src/onboarding/init.js +8 -3
- package/dist/src/onboarding/init.js.map +1 -1
- package/dist/src/pipeline-status.d.ts +14 -1
- package/dist/src/pipeline-status.d.ts.map +1 -1
- package/dist/src/pipeline-status.js +28 -8
- package/dist/src/pipeline-status.js.map +1 -1
- package/dist/src/types.d.ts +7 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/generated-marker.d.ts +8 -0
- package/dist/src/utils/generated-marker.d.ts.map +1 -1
- package/dist/src/utils/generated-marker.js +25 -0
- package/dist/src/utils/generated-marker.js.map +1 -1
- package/os/adr/adr.module.ts +2 -0
- package/os/audit/audit.module.ts +2 -0
- package/os/compass/compass.module.ts +49 -15
- package/os/compass/handlers/compass-audit-handler.ts +50 -9
- package/os/compass/handlers/compass-docs-validate.ts +359 -0
- package/os/compass/handlers/summary-record.ts +104 -5
- package/os/compass/handlers/tests/compass-audit-record.test.ts +2 -1
- package/os/compass/handlers/tests/compass-audit-validate.test.ts +92 -3
- package/os/compass/handlers/tests/compass-docs-validate.test.ts +203 -0
- package/os/compass/handlers/tests/compass-ledger-scope.test.ts +2 -1
- package/os/compass/handlers/tests/summary-record.test.ts +127 -0
- package/os/core/core.module.ts +147 -75
- package/os/core/docs-archive.test.ts +136 -0
- package/os/exploration/exploration.module.ts +3 -0
- package/os/naming/naming.module.ts +9 -2
- package/os/notes/notes.module.ts +17 -6
- package/os/plan/plan-0000-template.md +150 -0
- package/os/plan/plan.module.ts +2 -0
- package/os/plugin/plugin.module.ts +9 -2
- package/os/program/program.module.ts +19 -4
- package/os/queue/decision-ledger.test.ts +163 -0
- package/os/queue/handlers/queue-validate.ts +190 -8
- package/os/queue/manifest.ts +201 -7
- package/os/queue/queue-validate.test.ts +303 -0
- package/os/queue/queue.module.ts +32 -4
- package/os/queue/types.ts +56 -1
- package/os/rfc/handlers/implement-stamp.ts +35 -5
- package/os/rfc/rfc.module.ts +29 -3
- package/os/rfc/types.ts +17 -1
- package/os/rfc/verification-emit.test.ts +305 -0
- package/os/rfc/verification-evidence.ts +155 -24
- package/os/rfc/verification-refresh.test.ts +222 -1
- package/os/rfc/verification-refresh.ts +80 -38
- package/os/session/handlers/save.ts +41 -5
- package/os/session/session.module.ts +5 -0
- package/os/spec/live-spec-idempotency.pbt.test.ts +222 -0
- package/os/spec/live-spec-list-show-validate.test.ts +10 -6
- package/os/spec/live-spec-merge.test.ts +187 -7
- package/os/spec/live-spec-merge.ts +71 -155
- package/os/spec/live-spec-rebuild.test.ts +317 -0
- package/os/spec/live-spec-rebuild.ts +356 -0
- package/os/spec/live-spec-shared.ts +378 -0
- package/os/spec/live-spec-types.ts +21 -1
- package/os/spec/live-spec-validate.test.ts +317 -0
- package/os/spec/live-spec-validate.ts +106 -2
- package/os/spec/spec-materialize.test.ts +192 -0
- package/os/spec/spec-materialize.ts +48 -4
- package/os/spec/spec-schema.ts +49 -0
- package/os/spec/spec-status.ts +24 -0
- package/os/spec/spec-validate.test.ts +66 -0
- package/os/spec/spec-validate.ts +62 -8
- package/os/spec/spec.module.ts +85 -8
- package/os/werkstatt/handlers/werkstatt-operation-validate.ts +10 -4
- package/os/werkstatt/werkstatt.module.ts +13 -4
- package/os/workflow/workflow.module.ts +13 -5
- package/package.json +1 -1
- package/skills/_shared/fo-pipeline-conventions.md +126 -1
- package/skills/fo/fo-doc-audit/SKILL.md +4 -4
- package/skills/fo/fo-explore/SKILL.md +2 -1
- package/skills/fo/fo-fix/SKILL.md +11 -3
- package/skills/fo/fo-handoff/SKILL.md +4 -6
- package/skills/fo/fo-idea-create-rfc/SKILL.md +2 -1
- package/skills/fo/fo-idea-enhance/SKILL.md +23 -4
- package/skills/fo/fo-idea-i-just-want-to-see-the-result/SKILL.md +86 -22
- package/skills/fo/fo-idea-implement/SKILL.md +53 -10
- package/skills/fo/fo-idea-plan/SKILL.md +28 -6
- package/skills/fo/fo-review/SKILL.md +69 -8
- package/skills/fo/fo-session-retro/SKILL.md +3 -2
- package/skills/fo/fo-step-commit/SKILL.md +2 -0
- package/skills/shared/grilling/SKILL.md +12 -0
- package/skills/shared/writing-great-skills/GLOSSARY.md +2 -0
- package/skills/shared/writing-great-skills/SKILL.md +2 -1
- package/src/cli-flags.ts +23 -5
- package/src/config/forge-config.ts +4 -0
- package/src/onboarding/init.ts +8 -3
- package/src/pipeline-status.ts +32 -8
- package/src/tests/cli-flags.test.ts +20 -0
- package/src/tests/cli-output.test.ts +13 -7
- package/src/tests/fixtures/agents-generate-business-before.txt +7 -7
- package/src/tests/implement-stamp.test.ts +38 -0
- package/src/tests/session-handlers.test.ts +33 -0
- package/src/types.ts +13 -1
- package/src/utils/generated-marker.ts +28 -0
- package/skills/fo/fo-idea-implement/ADR-FLOW.md +0 -179
- package/skills/fo/fo-review/AXES.md +0 -70
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-spec-shared.d.ts","sourceRoot":"","sources":["../../../os/spec/live-spec-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Shared pure helpers for living feature specs — heading parsing, RFC-namespaced
|
|
4
|
+
section mechanics, spec (de)serialization, domain derivation, and the docs.archive
|
|
5
|
+
this-run merge-target selection (RFC-0711, RFC-0957, RFC-1230).</purpose>
|
|
6
|
+
<non-goals>
|
|
7
|
+
<item>Do not implement command handlers — spec.live.merge/validate/rebuild handlers live in their own files.</item>
|
|
8
|
+
<item>Do not touch the filesystem — these helpers are pure; IO stays in handlers.</item>
|
|
9
|
+
</non-goals>
|
|
10
|
+
<CHANGE_SUMMARY>
|
|
11
|
+
<item>RFC-1230: extracted shared helpers from live-spec-merge.ts; added removeNamespacedSections, seedSpecPrefix, and collectLiveMergeTargets for the idempotent-merge + rebuild design.</item>
|
|
12
|
+
<item>RFC-1230: review findings — scoped droppedSections to namespaced headings, warn on unreadable spec, fail-fast merge on corrupt frontmatter, CHANGE_SUMMARY dedupe</item>
|
|
13
|
+
<item>RFC-1232: fence-aware heading mechanics — private fencedLineIndexes (CommonMark-subset ``` / ~~~ map) consumed by parseHeadings, extractDesignSection, namespaceHeadings, removeNamespacedSections, and applyDeltasToSpecBody (regex lookaheads replaced with line-slice boundaries).</item>
|
|
14
|
+
<item>RFC-1235: extracted docs.archive merge-outcome accounting — classifyLiveMergeOutcome, liveMergeFailureEntry, formatLiveMergeFailure, buildLiveMergeBlock — so exit-nonzero merges record to failed[] instead of merged[].</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import YAML from "yaml";
|
|
19
|
+
import { listRfcFiles } from "../rfc/frontmatter-io.js";
|
|
20
|
+
export const LIVE_SPECS_DIR = "docs/specs/live";
|
|
21
|
+
// RFC-1232: CommonMark-subset fence map — line indexes inside fenced code
|
|
22
|
+
// blocks. A run of ` or ~ of length >=3 with <=3 leading spaces opens a fence;
|
|
23
|
+
// the same-or-longer run of the same character closes it. Opener and closer
|
|
24
|
+
// lines count as interior. An unterminated fence makes the rest of the input
|
|
25
|
+
// interior (CommonMark behavior). Indented code blocks are out of scope.
|
|
26
|
+
const FENCE_OPEN_REGEX = /^ {0,3}(`{3,}|~{3,})/;
|
|
27
|
+
// CommonMark: a closing fence carries no info string — only trailing
|
|
28
|
+
// whitespace. A same-char run followed by text is interior content, so the
|
|
29
|
+
// map over-masks rather than exposing a would-be heading (safe direction).
|
|
30
|
+
// CRLF note: `[ \t]*$` deliberately excludes \r, so a CRLF closer never
|
|
31
|
+
// matches and the tail stays interior — over-masking is the safe direction
|
|
32
|
+
// and repo content is LF-normalized.
|
|
33
|
+
const FENCE_CLOSE_REGEX = /^ {0,3}(`{3,}|~{3,})[ \t]*$/;
|
|
34
|
+
function fencedLineIndexes(lines) {
|
|
35
|
+
const inside = new Set();
|
|
36
|
+
let fenceChar = null;
|
|
37
|
+
let fenceLength = 0;
|
|
38
|
+
for (let i = 0; i < lines.length; i++) {
|
|
39
|
+
const match = lines[i].match(FENCE_OPEN_REGEX);
|
|
40
|
+
if (fenceChar === null) {
|
|
41
|
+
if (match) {
|
|
42
|
+
fenceChar = match[1][0];
|
|
43
|
+
fenceLength = match[1].length;
|
|
44
|
+
inside.add(i);
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
inside.add(i);
|
|
49
|
+
const closeMatch = lines[i].match(FENCE_CLOSE_REGEX);
|
|
50
|
+
if (closeMatch && closeMatch[1][0] === fenceChar && closeMatch[1].length >= fenceLength) {
|
|
51
|
+
fenceChar = null;
|
|
52
|
+
fenceLength = 0;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return inside;
|
|
56
|
+
}
|
|
57
|
+
export function extractDesignSection(rfcBody) {
|
|
58
|
+
const lines = rfcBody.split("\n");
|
|
59
|
+
const fenced = fencedLineIndexes(lines);
|
|
60
|
+
let startLine = -1;
|
|
61
|
+
for (let i = 0; i < lines.length; i++) {
|
|
62
|
+
if (!fenced.has(i) && /^##\s+Design\s*$/.test(lines[i])) {
|
|
63
|
+
startLine = i;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (startLine === -1)
|
|
68
|
+
return "";
|
|
69
|
+
let endLine = lines.length;
|
|
70
|
+
for (let i = startLine + 1; i < lines.length; i++) {
|
|
71
|
+
if (!fenced.has(i) && /^##\s/.test(lines[i])) {
|
|
72
|
+
endLine = i;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return lines.slice(startLine + 1, endLine).join("\n").trim();
|
|
77
|
+
}
|
|
78
|
+
export function parseHeadings(content) {
|
|
79
|
+
const lines = content.split("\n");
|
|
80
|
+
const fenced = fencedLineIndexes(lines);
|
|
81
|
+
const headings = [];
|
|
82
|
+
let currentHeading = null;
|
|
83
|
+
let currentBody = [];
|
|
84
|
+
for (let i = 0; i < lines.length; i++) {
|
|
85
|
+
const line = lines[i];
|
|
86
|
+
const headingMatch = fenced.has(i) ? null : line.match(/^(#{3,})\s+(.+)$/);
|
|
87
|
+
if (headingMatch) {
|
|
88
|
+
if (currentHeading) {
|
|
89
|
+
currentHeading.body = currentBody.join("\n").trim();
|
|
90
|
+
headings.push(currentHeading);
|
|
91
|
+
}
|
|
92
|
+
currentHeading = {
|
|
93
|
+
level: headingMatch[1].length,
|
|
94
|
+
text: headingMatch[2].trim(),
|
|
95
|
+
body: "",
|
|
96
|
+
};
|
|
97
|
+
currentBody = [];
|
|
98
|
+
}
|
|
99
|
+
else if (currentHeading) {
|
|
100
|
+
currentBody.push(line);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (currentHeading) {
|
|
104
|
+
currentHeading.body = currentBody.join("\n").trim();
|
|
105
|
+
headings.push(currentHeading);
|
|
106
|
+
}
|
|
107
|
+
return headings;
|
|
108
|
+
}
|
|
109
|
+
export function deriveDomain(frontmatter) {
|
|
110
|
+
const liveSpec = frontmatter["liveSpec"];
|
|
111
|
+
if (typeof liveSpec === "string" && liveSpec.length > 0) {
|
|
112
|
+
return liveSpec;
|
|
113
|
+
}
|
|
114
|
+
if (liveSpec === true) {
|
|
115
|
+
const packagesImpacted = frontmatter["packagesImpacted"];
|
|
116
|
+
if (Array.isArray(packagesImpacted) && packagesImpacted.length > 0) {
|
|
117
|
+
const firstPkg = String(packagesImpacted[0]);
|
|
118
|
+
return firstPkg.replace(/^packages\//, "").replace(/^@[^/]+\//, "");
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
export function parseLivingSpec(content) {
|
|
125
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
126
|
+
if (!match)
|
|
127
|
+
return null;
|
|
128
|
+
const fm = (YAML.parse(match[1]) ?? {});
|
|
129
|
+
return {
|
|
130
|
+
domain: String(fm["domain"] ?? ""),
|
|
131
|
+
title: String(fm["title"] ?? ""),
|
|
132
|
+
lastMergedRfc: String(fm["lastMergedRfc"] ?? ""),
|
|
133
|
+
updatedAt: String(fm["updatedAt"] ?? ""),
|
|
134
|
+
createdAt: String(fm["createdAt"] ?? ""),
|
|
135
|
+
history: (Array.isArray(fm["history"]) ? fm["history"] : []),
|
|
136
|
+
body: match[2] ?? "",
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
export function serializeLivingSpec(spec) {
|
|
140
|
+
const fm = {
|
|
141
|
+
domain: spec.domain,
|
|
142
|
+
title: spec.title,
|
|
143
|
+
lastMergedRfc: spec.lastMergedRfc,
|
|
144
|
+
updatedAt: spec.updatedAt,
|
|
145
|
+
createdAt: spec.createdAt,
|
|
146
|
+
history: spec.history,
|
|
147
|
+
};
|
|
148
|
+
const fmStr = YAML.stringify(fm).trimEnd();
|
|
149
|
+
return `---\n${fmStr}\n---\n\n${spec.body}`;
|
|
150
|
+
}
|
|
151
|
+
export function findHeadingInSpec(spec, headingText) {
|
|
152
|
+
const headings = parseHeadings(spec.body);
|
|
153
|
+
return headings.find((h) => h.text === headingText) ?? null;
|
|
154
|
+
}
|
|
155
|
+
export function applyDeltasToSpecBody(specBody, deltas, operations) {
|
|
156
|
+
const lines = specBody.split("\n");
|
|
157
|
+
for (const delta of deltas) {
|
|
158
|
+
const op = operations.find((o) => o.heading === delta.text);
|
|
159
|
+
if (!op)
|
|
160
|
+
continue;
|
|
161
|
+
if (op.type === "added") {
|
|
162
|
+
lines.push("", `${"#".repeat(delta.level)} ${delta.text}`, "", ...delta.body.split("\n"));
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// RFC-1232: line-slice boundaries instead of `(?=#{3,}|$)` regex lookaheads —
|
|
166
|
+
// those were unanchored and matched `###` inside fenced code blocks.
|
|
167
|
+
const fenced = fencedLineIndexes(lines);
|
|
168
|
+
let start = -1;
|
|
169
|
+
let next = lines.length;
|
|
170
|
+
for (let i = 0; i < lines.length; i++) {
|
|
171
|
+
if (fenced.has(i))
|
|
172
|
+
continue;
|
|
173
|
+
const m = lines[i].match(/^(#{3,})\s+(.+)$/);
|
|
174
|
+
if (!m)
|
|
175
|
+
continue;
|
|
176
|
+
if (start === -1) {
|
|
177
|
+
if (m[1].length === delta.level && m[2].trim() === delta.text)
|
|
178
|
+
start = i;
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
next = i;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (start === -1)
|
|
186
|
+
continue;
|
|
187
|
+
if (op.type === "modified") {
|
|
188
|
+
lines.splice(start + 1, next - start - 1, "", ...delta.body.split("\n"));
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// removed — absorb the blank lines separating the heading from the
|
|
192
|
+
// preceding content (old `\n*` regex prefix), then collapse the section
|
|
193
|
+
// to a single empty line.
|
|
194
|
+
let removeFrom = start;
|
|
195
|
+
while (removeFrom > 0 && lines[removeFrom - 1].trim() === "")
|
|
196
|
+
removeFrom--;
|
|
197
|
+
lines.splice(removeFrom, next - removeFrom, "");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return lines.join("\n").trim();
|
|
201
|
+
}
|
|
202
|
+
export function escapeRegex(str) {
|
|
203
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
204
|
+
}
|
|
205
|
+
export function namespaceHeadings(content, rfcId) {
|
|
206
|
+
const lines = content.split("\n");
|
|
207
|
+
const fenced = fencedLineIndexes(lines);
|
|
208
|
+
return lines
|
|
209
|
+
.map((line, i) => {
|
|
210
|
+
if (fenced.has(i))
|
|
211
|
+
return line;
|
|
212
|
+
const m = line.match(/^(#{3,})\s+(.+)$/);
|
|
213
|
+
if (!m)
|
|
214
|
+
return line;
|
|
215
|
+
// parseHeadings trims heading text — normalize here too so a heading like
|
|
216
|
+
// "### Foo " round-trips to "### Foo (RFC-XXXX)", not "### Foo (RFC-XXXX)".
|
|
217
|
+
const normalized = m[2].trim();
|
|
218
|
+
if (/\(RFC-\d{4}\)$/.test(normalized))
|
|
219
|
+
return `${m[1]} ${normalized}`;
|
|
220
|
+
return `${m[1]} ${normalized} (${rfcId})`;
|
|
221
|
+
})
|
|
222
|
+
.join("\n");
|
|
223
|
+
}
|
|
224
|
+
// RFC-1230: strip every ###+ section whose heading carries the ` (RFC-XXXX)`
|
|
225
|
+
// marker. Line-based and byte-preserving for kept sections — parseHeadings is
|
|
226
|
+
// lossy on whitespace, so surgical replacement filters lines instead.
|
|
227
|
+
export function removeNamespacedSections(body, rfcId) {
|
|
228
|
+
const suffix = ` (${rfcId})`;
|
|
229
|
+
const lines = body.split("\n");
|
|
230
|
+
const fenced = fencedLineIndexes(lines);
|
|
231
|
+
const out = [];
|
|
232
|
+
let skipping = false;
|
|
233
|
+
for (let i = 0; i < lines.length; i++) {
|
|
234
|
+
const line = lines[i];
|
|
235
|
+
const headingMatch = fenced.has(i) ? null : line.match(/^(#{3,})\s+(.+)$/);
|
|
236
|
+
if (headingMatch) {
|
|
237
|
+
skipping = headingMatch[2].trim().endsWith(suffix);
|
|
238
|
+
}
|
|
239
|
+
if (!skipping)
|
|
240
|
+
out.push(line);
|
|
241
|
+
}
|
|
242
|
+
return out.join("\n").replace(/\n{3,}/g, "\n\n").trim();
|
|
243
|
+
}
|
|
244
|
+
export function findRfcFile(rfcDir, rfcId) {
|
|
245
|
+
return (async () => {
|
|
246
|
+
const files = await listRfcFiles(rfcDir);
|
|
247
|
+
for (const file of files) {
|
|
248
|
+
const basename = path.basename(file);
|
|
249
|
+
if (basename.toLowerCase().startsWith(rfcId.toLowerCase())) {
|
|
250
|
+
return file;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
})();
|
|
255
|
+
}
|
|
256
|
+
// Canonical spec seed — identical to what the spec.live.merge creation path
|
|
257
|
+
// emits, so rebuild and first-merge produce the same skeleton.
|
|
258
|
+
export function seedSpecPrefix(domain, generatedHeader) {
|
|
259
|
+
return `${generatedHeader}# Living Spec: ${domain}\n\n## Overview\n\n`;
|
|
260
|
+
}
|
|
261
|
+
// RFC-1230: the docs.archive post-loop merges only RFCs moved this run — the
|
|
262
|
+
// selection derives from rfc.archive's `moved` result, not a rescan of the
|
|
263
|
+
// whole docs/rfcs tree (which is what caused the duplicate-merge corruption).
|
|
264
|
+
export function collectLiveMergeTargets(moved) {
|
|
265
|
+
const candidates = [];
|
|
266
|
+
const rejected = [];
|
|
267
|
+
for (const m of moved) {
|
|
268
|
+
if (m.direction !== "into-archive")
|
|
269
|
+
continue;
|
|
270
|
+
if (m.status === "implemented")
|
|
271
|
+
candidates.push(m.id);
|
|
272
|
+
else if (m.status === "rejected")
|
|
273
|
+
rejected.push(m.id);
|
|
274
|
+
}
|
|
275
|
+
return { candidates, rejected };
|
|
276
|
+
}
|
|
277
|
+
export function classifyLiveMergeOutcome(rfcId, result) {
|
|
278
|
+
const data = result.data;
|
|
279
|
+
if (result.exitCode === 0 && data) {
|
|
280
|
+
return {
|
|
281
|
+
kind: "merged",
|
|
282
|
+
entry: {
|
|
283
|
+
id: rfcId,
|
|
284
|
+
domain: String(data.domain ?? ""),
|
|
285
|
+
operation: String(data.operation ?? ""),
|
|
286
|
+
conflicts: Array.isArray(data.conflicts) ? data.conflicts.length : 0,
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
return {
|
|
291
|
+
kind: "failed",
|
|
292
|
+
entry: {
|
|
293
|
+
id: rfcId,
|
|
294
|
+
exitCode: result.exitCode,
|
|
295
|
+
error: result.summary ??
|
|
296
|
+
(result.exitCode === undefined
|
|
297
|
+
? "spec.live.merge returned no exit code"
|
|
298
|
+
: `spec.live.merge exited ${result.exitCode}`),
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
export function liveMergeFailureEntry(rfcId, error) {
|
|
303
|
+
return { id: rfcId, error: String(error instanceof Error ? error.message : error) };
|
|
304
|
+
}
|
|
305
|
+
export function formatLiveMergeFailure(entry) {
|
|
306
|
+
return `spec.live.merge: failed for ${entry.id}: ${entry.error}`;
|
|
307
|
+
}
|
|
308
|
+
/** Emission gate + block assembly for results["spec.live.merge"] — undefined
|
|
309
|
+
* when nothing was attempted, so an all-failed run still surfaces. */
|
|
310
|
+
export function buildLiveMergeBlock(merged, failed, skipped, dryRun) {
|
|
311
|
+
if (merged.length === 0 && failed.length === 0 && skipped === 0)
|
|
312
|
+
return undefined;
|
|
313
|
+
return { merged, failed, skipped, dryRun };
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=live-spec-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-spec-shared.js","sourceRoot":"","sources":["../../../os/spec/live-spec-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,11 +29,24 @@ export interface DeltaConflict {
|
|
|
29
29
|
export interface SpecLiveMergeResult {
|
|
30
30
|
command: "spec.live.merge";
|
|
31
31
|
domain: string;
|
|
32
|
-
operation: "created" | "modified";
|
|
32
|
+
operation: "created" | "modified" | "already-merged";
|
|
33
33
|
deltas: DeltaOperation[];
|
|
34
34
|
conflicts: DeltaConflict[];
|
|
35
35
|
dryRun: boolean;
|
|
36
36
|
}
|
|
37
|
+
export interface SpecLiveRebuildResult {
|
|
38
|
+
command: "spec.live.rebuild";
|
|
39
|
+
domain: string;
|
|
40
|
+
operation: "rebuilt" | "unchanged" | "skipped";
|
|
41
|
+
/** Unique RFC ids present in the deduplicated history — unreadable or
|
|
42
|
+
* not-implemented ids are still counted; the replayed count is
|
|
43
|
+
* uniqueRfcs − unreadableRfcs.length. */
|
|
44
|
+
uniqueRfcs: number;
|
|
45
|
+
droppedHistoryEntries: number;
|
|
46
|
+
droppedSections: number;
|
|
47
|
+
unreadableRfcs: string[];
|
|
48
|
+
dryRun: boolean;
|
|
49
|
+
}
|
|
37
50
|
export interface SpecLiveListEntry {
|
|
38
51
|
domain: string;
|
|
39
52
|
title: string;
|
|
@@ -61,6 +74,9 @@ export interface LivingSpecViolation {
|
|
|
61
74
|
rule: string;
|
|
62
75
|
message: string;
|
|
63
76
|
domain?: string;
|
|
77
|
+
/** Absent === "error"; only error-severity violations drive a non-zero
|
|
78
|
+
* exit code (RFC-1234). */
|
|
79
|
+
severity?: "error" | "warning";
|
|
64
80
|
}
|
|
65
81
|
export interface SpecLiveValidateResult {
|
|
66
82
|
command: "spec.live.validate";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-spec-types.d.ts","sourceRoot":"","sources":["../../../os/spec/live-spec-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"live-spec-types.d.ts","sourceRoot":"","sources":["../../../os/spec/live-spec-types.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;CAC/C;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,gBAAgB,CAAC;IACrD,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IAC/C;;6CAEyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,IAAI,CAAC;IACb,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;+BAC2B;IAC3B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -8,6 +8,9 @@ merge results, and validation (RFC-0711).</purpose>
|
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
10
|
<item>RFC-0711: initial living spec types — LivingSpec, DeltaOperation, DeltaConflict, merge/list/show/validate result types.</item>
|
|
11
|
+
<item>RFC-1230: added already-merged to SpecLiveMergeResult.operation; added SpecLiveRebuildResult for spec.live.rebuild.</item>
|
|
12
|
+
<item>RFC-1230: review findings — scoped droppedSections to namespaced headings, warn on unreadable spec, fail-fast merge on corrupt frontmatter, CHANGE_SUMMARY dedupe</item>
|
|
13
|
+
<item>RFC-1234: LivingSpecViolation gains optional severity field (absent = error; errors drive exit code); uniqueRfcs contract comment states deduplicated-history semantics.</item>
|
|
11
14
|
</CHANGE_SUMMARY>
|
|
12
15
|
*/
|
|
13
16
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-spec-types.js","sourceRoot":"","sources":["../../../os/spec/live-spec-types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"live-spec-types.js","sourceRoot":"","sources":["../../../os/spec/live-spec-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;EAcE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-spec-validate.d.ts","sourceRoot":"","sources":["../../../os/spec/live-spec-validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"live-spec-validate.d.ts","sourceRoot":"","sources":["../../../os/spec/live-spec-validate.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,sBAAsB,CAAC;AAQ9B,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAqOrD"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
/*
|
|
2
2
|
<MODULE_CONTRACT>
|
|
3
3
|
<purpose>spec.live.validate handler — validates all living specs in docs/specs/live/
|
|
4
|
-
with rules V-LS-01..
|
|
4
|
+
with rules V-LS-01..09 (RFC-0711, RFC-1230, RFC-1234). Detection layer only — repair routes
|
|
5
|
+
to spec.live.rebuild (V-LS-06/07/09) or spec.live.merge --id (V-LS-08), never hand-edits.</purpose>
|
|
5
6
|
<non-goals>
|
|
6
7
|
<item>Do not merge or list — use spec.live.merge / spec.live.list.</item>
|
|
8
|
+
<item>Do not repair — validators are read-only; spec.live.rebuild is the repair path.</item>
|
|
7
9
|
</non-goals>
|
|
8
10
|
</MODULE_CONTRACT>
|
|
9
11
|
<CHANGE_SUMMARY>
|
|
10
12
|
<item>RFC-0711: initial spec.live.validate handler with V-LS-01..05 rules.</item>
|
|
13
|
+
<item>RFC-1230: added V-LS-06 (duplicate namespaced headings), V-LS-07 (duplicate history RFCs), V-LS-08 (archive coverage — implemented liveSpec RFC absent from spec history).</item>
|
|
14
|
+
<item>RFC-1230: review findings — scoped droppedSections to namespaced headings, warn on unreadable spec, fail-fast merge on corrupt frontmatter, CHANGE_SUMMARY dedupe</item>
|
|
15
|
+
<item>RFC-1234: V-LS-09 content-drift rule — replays each spec's deduplicated history via the extracted projectLiveSpec core and compares committed bytes modulo updatedAt; LivingSpecViolation gains a severity channel (error findings drive the exit code, warning findings report unreadable history RFCs without failing the run).</item>
|
|
11
16
|
</CHANGE_SUMMARY>
|
|
12
17
|
*/
|
|
13
18
|
import { ambientIo as fs } from "../../src/utils/io.js";
|
|
@@ -16,6 +21,8 @@ import path from "node:path";
|
|
|
16
21
|
import YAML from "yaml";
|
|
17
22
|
import { listRfcFiles, readAndParseRfc } from "../rfc/frontmatter-io.js";
|
|
18
23
|
import { RFC_DIR } from "../rfc/types.js";
|
|
24
|
+
import { deriveDomain, parseHeadings } from "./live-spec-shared.js";
|
|
25
|
+
import { projectLiveSpec } from "./live-spec-rebuild.js";
|
|
19
26
|
const LIVE_SPECS_DIR = "docs/specs/live";
|
|
20
27
|
const REQUIRED_FM_FIELDS = ["domain", "title", "lastMergedRfc", "updatedAt", "createdAt", "history"];
|
|
21
28
|
export async function runSpecLiveValidate(_input, context) {
|
|
@@ -25,7 +32,9 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
25
32
|
const violations = [];
|
|
26
33
|
let specsChecked = 0;
|
|
27
34
|
const domains = new Set();
|
|
35
|
+
const specsByDomain = new Map();
|
|
28
36
|
const archivedRfcIds = new Set();
|
|
37
|
+
const archivedImplementedLiveSpecRfcs = [];
|
|
29
38
|
const rfcFiles = await listRfcFiles(rfcDir);
|
|
30
39
|
for (const file of rfcFiles) {
|
|
31
40
|
const parsed = await readAndParseRfc(rfcDir, file);
|
|
@@ -35,6 +44,14 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
35
44
|
if (id && (status === "implemented" || status === "rejected" || status === "superseded")) {
|
|
36
45
|
archivedRfcIds.add(id);
|
|
37
46
|
}
|
|
47
|
+
// V-LS-08 tracks only RFCs physically under archive/implemented/ — an
|
|
48
|
+
// implemented-but-not-yet-archived RFC must not fire a false positive.
|
|
49
|
+
if (id && file.startsWith("archive/implemented/") && parsed.parsed.frontmatter["liveSpec"]) {
|
|
50
|
+
const liveSpecDomain = deriveDomain(parsed.parsed.frontmatter);
|
|
51
|
+
if (liveSpecDomain) {
|
|
52
|
+
archivedImplementedLiveSpecRfcs.push({ id, domain: liveSpecDomain });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
38
55
|
}
|
|
39
56
|
}
|
|
40
57
|
if (!existsSync(liveSpecsDir)) {
|
|
@@ -55,6 +72,7 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
55
72
|
}
|
|
56
73
|
const files = (await fs.readdir(liveSpecsDir)).map((e) => e.name);
|
|
57
74
|
const specFiles = files.filter((f) => f.endsWith(".md") && f !== "README.md");
|
|
75
|
+
const parsedSpecPaths = [];
|
|
58
76
|
for (const file of specFiles) {
|
|
59
77
|
specsChecked++;
|
|
60
78
|
const filePath = path.join(liveSpecsDir, file);
|
|
@@ -91,6 +109,7 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
91
109
|
});
|
|
92
110
|
}
|
|
93
111
|
const history = Array.isArray(fm["history"]) ? fm["history"] : [];
|
|
112
|
+
const historyRfcIds = new Set();
|
|
94
113
|
for (const entry of history) {
|
|
95
114
|
if (entry.rfc && !archivedRfcIds.has(entry.rfc)) {
|
|
96
115
|
violations.push({
|
|
@@ -99,6 +118,44 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
99
118
|
domain,
|
|
100
119
|
});
|
|
101
120
|
}
|
|
121
|
+
if (entry.rfc)
|
|
122
|
+
historyRfcIds.add(entry.rfc);
|
|
123
|
+
}
|
|
124
|
+
// V-LS-06: duplicate RFC-namespaced headings (###+ ending in ` (RFC-XXXX)`)
|
|
125
|
+
// — one diagnostic per extra occurrence. Full namespaced text is compared,
|
|
126
|
+
// so distinct RFCs never collide.
|
|
127
|
+
const headingCounts = new Map();
|
|
128
|
+
for (const h of parseHeadings(content.slice(match[0].length))) {
|
|
129
|
+
if (!/\(RFC-\d{4}\)$/.test(h.text))
|
|
130
|
+
continue;
|
|
131
|
+
const seen = (headingCounts.get(h.text) ?? 0) + 1;
|
|
132
|
+
headingCounts.set(h.text, seen);
|
|
133
|
+
if (seen > 1) {
|
|
134
|
+
violations.push({
|
|
135
|
+
rule: "V-LS-06",
|
|
136
|
+
message: `${file}: duplicate section "${h.text}" (occurrence ${seen}) — repair via spec.live.rebuild`,
|
|
137
|
+
domain,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// V-LS-07: duplicate history[].rfc — one diagnostic per duplicated id.
|
|
142
|
+
const rfcCounts = new Map();
|
|
143
|
+
for (const entry of history) {
|
|
144
|
+
if (!entry.rfc)
|
|
145
|
+
continue;
|
|
146
|
+
rfcCounts.set(entry.rfc, (rfcCounts.get(entry.rfc) ?? 0) + 1);
|
|
147
|
+
}
|
|
148
|
+
for (const [rfcId, count] of rfcCounts) {
|
|
149
|
+
if (count > 1) {
|
|
150
|
+
violations.push({
|
|
151
|
+
rule: "V-LS-07",
|
|
152
|
+
message: `${file}: history contains ${count} entries for "${rfcId}" — repair via spec.live.rebuild`,
|
|
153
|
+
domain,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (domain) {
|
|
158
|
+
specsByDomain.set(domain, { file, historyRfcIds });
|
|
102
159
|
}
|
|
103
160
|
if (domain) {
|
|
104
161
|
if (domains.has(domain)) {
|
|
@@ -109,9 +166,55 @@ export async function runSpecLiveValidate(_input, context) {
|
|
|
109
166
|
});
|
|
110
167
|
}
|
|
111
168
|
domains.add(domain);
|
|
169
|
+
parsedSpecPaths.push({ file, filePath, domain });
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// V-LS-08 (coverage): every archived implemented RFC carrying liveSpec must
|
|
173
|
+
// appear in the history[] of its domain's living spec — also fires when that
|
|
174
|
+
// domain's spec file does not exist. Repair: spec.live.merge --id <rfc>.
|
|
175
|
+
for (const { id, domain } of archivedImplementedLiveSpecRfcs) {
|
|
176
|
+
const spec = specsByDomain.get(domain);
|
|
177
|
+
if (!spec) {
|
|
178
|
+
violations.push({
|
|
179
|
+
rule: "V-LS-08",
|
|
180
|
+
message: `${id}: living spec for domain "${domain}" does not exist — repair via spec.live.merge --id ${id}`,
|
|
181
|
+
domain,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
else if (!spec.historyRfcIds.has(id)) {
|
|
185
|
+
violations.push({
|
|
186
|
+
rule: "V-LS-08",
|
|
187
|
+
message: `${spec.file}: archived RFC "${id}" (liveSpec) is absent from history[] — repair via spec.live.merge --id ${id}`,
|
|
188
|
+
domain,
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// V-LS-09 (content drift): replay each spec's deduplicated history via the
|
|
193
|
+
// same projection core rebuild uses, compare against committed bytes modulo
|
|
194
|
+
// updatedAt (RFC-1234 — DNA-58 closure for living specs). Specs that failed
|
|
195
|
+
// frontmatter parse are already fail-closed via V-LS-01 and skip here.
|
|
196
|
+
for (const { file, filePath, domain } of parsedSpecPaths) {
|
|
197
|
+
const proj = await projectLiveSpec(filePath, domain, rfcFiles, rfcDir);
|
|
198
|
+
if (proj.kind !== "projected")
|
|
199
|
+
continue;
|
|
200
|
+
for (const rfcId of proj.unreadableRfcs) {
|
|
201
|
+
violations.push({
|
|
202
|
+
rule: "V-LS-09",
|
|
203
|
+
severity: "warning",
|
|
204
|
+
message: `${file}: history entry "${rfcId}" unreadable, not implemented, or lacks ## Design — excluded from replay`,
|
|
205
|
+
domain,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
if (proj.projection !== proj.content) {
|
|
209
|
+
violations.push({
|
|
210
|
+
rule: "V-LS-09",
|
|
211
|
+
severity: "error",
|
|
212
|
+
message: `${file}: spec content diverges from replay of history[] — repair via spec.live.rebuild --domain ${domain}`,
|
|
213
|
+
domain,
|
|
214
|
+
});
|
|
112
215
|
}
|
|
113
216
|
}
|
|
114
|
-
const hasFailures = violations.
|
|
217
|
+
const hasFailures = violations.some((v) => v.severity !== "warning");
|
|
115
218
|
const result = {
|
|
116
219
|
command: "spec.live.validate",
|
|
117
220
|
status: hasFailures ? "fail" : "pass",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-spec-validate.js","sourceRoot":"","sources":["../../../os/spec/live-spec-validate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"live-spec-validate.js","sourceRoot":"","sources":["../../../os/spec/live-spec-validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,8 @@ interface SpecMaterializeResult {
|
|
|
15
15
|
created: MaterializedNode[];
|
|
16
16
|
skipped: SkippedNode[];
|
|
17
17
|
front: string[];
|
|
18
|
+
/** RFC-1240: nodes excluded from the front by consumer ownership. */
|
|
19
|
+
foreignOwned: string[];
|
|
18
20
|
}
|
|
19
21
|
export declare function runSpecMaterialize(input: ForgeCommandInput, context: ForgeRuntimeContext): Promise<ForgeCommandResult<SpecMaterializeResult>>;
|
|
20
22
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-materialize.d.ts","sourceRoot":"","sources":["../../../os/spec/spec-materialize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spec-materialize.d.ts","sourceRoot":"","sources":["../../../os/spec/spec-materialize.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAkB5B,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAuBD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,CAAC,CA8VpD"}
|