@seanmars/tospec 0.7.0 → 0.9.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/README.md +19 -0
- package/assets/dashboard/app.js +168 -0
- package/assets/dashboard/index.html +4 -0
- package/assets/dashboard/style.css +158 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +18 -31
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/config.d.ts +1 -2
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +8 -13
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -1
- package/dist/commands/dashboard.js +36 -3
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/decision.d.ts +8 -0
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +9 -10
- package/dist/commands/decision.js.map +1 -1
- package/dist/commands/shared-output.d.ts +18 -4
- package/dist/commands/shared-output.d.ts.map +1 -1
- package/dist/commands/shared-output.js +16 -3
- package/dist/commands/shared-output.js.map +1 -1
- package/dist/commands/show.d.ts.map +1 -1
- package/dist/commands/show.js +9 -13
- package/dist/commands/show.js.map +1 -1
- package/dist/commands/validate.d.ts +10 -0
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +48 -32
- package/dist/commands/validate.js.map +1 -1
- package/dist/commands/workflow/instructions.d.ts.map +1 -1
- package/dist/commands/workflow/instructions.js +20 -6
- package/dist/commands/workflow/instructions.js.map +1 -1
- package/dist/commands/workflow/new-change.d.ts +2 -0
- package/dist/commands/workflow/new-change.d.ts.map +1 -1
- package/dist/commands/workflow/new-change.js +15 -7
- package/dist/commands/workflow/new-change.js.map +1 -1
- package/dist/commands/workflow/schemas.d.ts.map +1 -1
- package/dist/commands/workflow/schemas.js +12 -3
- package/dist/commands/workflow/schemas.js.map +1 -1
- package/dist/commands/workflow/shared.d.ts +1 -3
- package/dist/commands/workflow/shared.d.ts.map +1 -1
- package/dist/commands/workflow/shared.js +2 -14
- package/dist/commands/workflow/shared.js.map +1 -1
- package/dist/commands/workflow/status.d.ts.map +1 -1
- package/dist/commands/workflow/status.js +6 -2
- package/dist/commands/workflow/status.js.map +1 -1
- package/dist/commands/workflow/templates.d.ts.map +1 -1
- package/dist/commands/workflow/templates.js +13 -2
- package/dist/commands/workflow/templates.js.map +1 -1
- package/dist/core/archive.d.ts +9 -0
- package/dist/core/archive.d.ts.map +1 -1
- package/dist/core/archive.js +63 -114
- package/dist/core/archive.js.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.d.ts +4 -2
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
- package/dist/core/artifact-graph/instruction-loader.js +54 -0
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
- package/dist/core/change-metadata/schema.d.ts +1 -0
- package/dist/core/change-metadata/schema.d.ts.map +1 -1
- package/dist/core/change-metadata/schema.js +4 -0
- package/dist/core/change-metadata/schema.js.map +1 -1
- package/dist/core/change-presenter.d.ts.map +1 -1
- package/dist/core/change-presenter.js +2 -8
- package/dist/core/change-presenter.js.map +1 -1
- package/dist/core/change-status-policy.d.ts +1 -1
- package/dist/core/change-status-policy.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/index.d.ts +1 -2
- package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
- package/dist/core/command-generation/adapters/index.js +1 -2
- package/dist/core/command-generation/adapters/index.js.map +1 -1
- package/dist/core/command-generation/index.d.ts +4 -15
- package/dist/core/command-generation/index.d.ts.map +1 -1
- package/dist/core/command-generation/index.js +5 -17
- package/dist/core/command-generation/index.js.map +1 -1
- package/dist/core/config-schema.d.ts +0 -14
- package/dist/core/config-schema.d.ts.map +1 -1
- package/dist/core/config-schema.js +0 -57
- package/dist/core/config-schema.js.map +1 -1
- package/dist/core/config.d.ts +0 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +0 -4
- package/dist/core/config.js.map +1 -1
- package/dist/core/dashboard-data.d.ts +19 -1
- package/dist/core/dashboard-data.d.ts.map +1 -1
- package/dist/core/dashboard-data.js +24 -1
- package/dist/core/dashboard-data.js.map +1 -1
- package/dist/core/global-config.d.ts +0 -5
- package/dist/core/global-config.d.ts.map +1 -1
- package/dist/core/global-config.js +3 -20
- package/dist/core/global-config.js.map +1 -1
- package/dist/core/init.d.ts +0 -1
- package/dist/core/init.d.ts.map +1 -1
- package/dist/core/init.js +18 -62
- package/dist/core/init.js.map +1 -1
- package/dist/core/list.d.ts.map +1 -1
- package/dist/core/list.js +6 -5
- package/dist/core/list.js.map +1 -1
- package/dist/core/migrate.d.ts +20 -3
- package/dist/core/migrate.d.ts.map +1 -1
- package/dist/core/migrate.js +140 -40
- package/dist/core/migrate.js.map +1 -1
- package/dist/core/parsers/change-parser.d.ts +0 -2
- package/dist/core/parsers/change-parser.d.ts.map +1 -1
- package/dist/core/parsers/change-parser.js +7 -72
- package/dist/core/parsers/change-parser.js.map +1 -1
- package/dist/core/parsers/markdown-parser.d.ts +1 -1
- package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
- package/dist/core/parsers/markdown-parser.js +13 -4
- package/dist/core/parsers/markdown-parser.js.map +1 -1
- package/dist/core/parsers/requirement-blocks.d.ts +19 -0
- package/dist/core/parsers/requirement-blocks.d.ts.map +1 -1
- package/dist/core/parsers/requirement-blocks.js +56 -26
- package/dist/core/parsers/requirement-blocks.js.map +1 -1
- package/dist/core/parsers/requirement-text.d.ts +33 -0
- package/dist/core/parsers/requirement-text.d.ts.map +1 -1
- package/dist/core/parsers/requirement-text.js +55 -13
- package/dist/core/parsers/requirement-text.js.map +1 -1
- package/dist/core/profiles.d.ts +2 -10
- package/dist/core/profiles.d.ts.map +1 -1
- package/dist/core/profiles.js +5 -9
- package/dist/core/profiles.js.map +1 -1
- package/dist/core/project-config.d.ts +0 -22
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +5 -75
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/root-selection.d.ts.map +1 -1
- package/dist/core/root-selection.js +2 -2
- package/dist/core/root-selection.js.map +1 -1
- package/dist/core/shared/index.d.ts +1 -1
- package/dist/core/shared/index.d.ts.map +1 -1
- package/dist/core/shared/index.js +1 -1
- package/dist/core/shared/index.js.map +1 -1
- package/dist/core/shared/skill-generation.d.ts +47 -1
- package/dist/core/shared/skill-generation.d.ts.map +1 -1
- package/dist/core/shared/skill-generation.js +37 -33
- package/dist/core/shared/skill-generation.js.map +1 -1
- package/dist/core/shared/tool-detection.d.ts +4 -10
- package/dist/core/shared/tool-detection.d.ts.map +1 -1
- package/dist/core/shared/tool-detection.js +5 -27
- package/dist/core/shared/tool-detection.js.map +1 -1
- package/dist/core/spec-presenter.d.ts.map +1 -1
- package/dist/core/spec-presenter.js +3 -4
- package/dist/core/spec-presenter.js.map +1 -1
- package/dist/core/specs-apply.d.ts.map +1 -1
- package/dist/core/specs-apply.js +1 -0
- package/dist/core/specs-apply.js.map +1 -1
- package/dist/core/templates/skill-templates.d.ts +1 -0
- package/dist/core/templates/skill-templates.d.ts.map +1 -1
- package/dist/core/templates/skill-templates.js +1 -0
- package/dist/core/templates/skill-templates.js.map +1 -1
- package/dist/core/templates/workflows/apply.d.ts.map +1 -1
- package/dist/core/templates/workflows/apply.js +35 -57
- package/dist/core/templates/workflows/apply.js.map +1 -1
- package/dist/core/templates/workflows/archive.d.ts.map +1 -1
- package/dist/core/templates/workflows/archive.js +5 -3
- package/dist/core/templates/workflows/archive.js.map +1 -1
- package/dist/core/templates/workflows/decision.js +3 -3
- package/dist/core/templates/workflows/decision.js.map +1 -1
- package/dist/core/templates/workflows/explore.js +1 -1
- package/dist/core/templates/workflows/grill.d.ts +12 -0
- package/dist/core/templates/workflows/grill.d.ts.map +1 -0
- package/dist/core/templates/workflows/grill.js +61 -0
- package/dist/core/templates/workflows/grill.js.map +1 -0
- package/dist/core/templates/workflows/propose.d.ts.map +1 -1
- package/dist/core/templates/workflows/propose.js +3 -1
- package/dist/core/templates/workflows/propose.js.map +1 -1
- package/dist/core/templates/workflows/update.js +2 -2
- package/dist/core/templates/workflows/update.js.map +1 -1
- package/dist/core/update.d.ts +0 -9
- package/dist/core/update.d.ts.map +1 -1
- package/dist/core/update.js +9 -55
- package/dist/core/update.js.map +1 -1
- package/dist/core/validation/validator.d.ts +7 -1
- package/dist/core/validation/validator.d.ts.map +1 -1
- package/dist/core/validation/validator.js +98 -17
- package/dist/core/validation/validator.js.map +1 -1
- package/dist/ui/welcome-screen.d.ts.map +1 -1
- package/dist/ui/welcome-screen.js +6 -3
- package/dist/ui/welcome-screen.js.map +1 -1
- package/dist/utils/change-utils.d.ts +1 -1
- package/dist/utils/change-utils.d.ts.map +1 -1
- package/dist/utils/link.d.ts +2 -18
- package/dist/utils/link.d.ts.map +1 -1
- package/dist/utils/link.js +2 -65
- package/dist/utils/link.js.map +1 -1
- package/package.json +1 -1
- package/schemas/decision/templates/decision.md +12 -3
- package/dist/core/command-generation/adapters/cursor.d.ts +0 -14
- package/dist/core/command-generation/adapters/cursor.d.ts.map +0 -1
- package/dist/core/command-generation/adapters/cursor.js +0 -31
- package/dist/core/command-generation/adapters/cursor.js.map +0 -1
- package/dist/core/command-generation/registry.d.ts +0 -24
- package/dist/core/command-generation/registry.d.ts.map +0 -1
- package/dist/core/command-generation/registry.js +0 -38
- package/dist/core/command-generation/registry.js.map +0 -1
|
@@ -15,7 +15,9 @@ export class MarkdownParser {
|
|
|
15
15
|
parseSpec(name) {
|
|
16
16
|
const sections = this.parseSections();
|
|
17
17
|
const purpose = this.findSection(sections, 'Purpose')?.content || '';
|
|
18
|
-
|
|
18
|
+
// Level 2 only — the same definition extractRequirementsSection uses
|
|
19
|
+
// (`## Requirements`); a nested `### Requirements` is not the section.
|
|
20
|
+
const requirementsSection = this.findSection(sections, 'Requirements', 2);
|
|
19
21
|
if (!purpose) {
|
|
20
22
|
throw new Error('Spec must have a Purpose section');
|
|
21
23
|
}
|
|
@@ -108,12 +110,13 @@ export class MarkdownParser {
|
|
|
108
110
|
}
|
|
109
111
|
return contentLines.join('\n').trim();
|
|
110
112
|
}
|
|
111
|
-
findSection(sections, title) {
|
|
113
|
+
findSection(sections, title, level) {
|
|
112
114
|
for (const section of sections) {
|
|
113
|
-
if (section.title.toLowerCase() === title.toLowerCase()
|
|
115
|
+
if (section.title.toLowerCase() === title.toLowerCase() &&
|
|
116
|
+
(level === undefined || section.level === level)) {
|
|
114
117
|
return section;
|
|
115
118
|
}
|
|
116
|
-
const child = this.findSection(section.children, title);
|
|
119
|
+
const child = this.findSection(section.children, title, level);
|
|
117
120
|
if (child) {
|
|
118
121
|
return child;
|
|
119
122
|
}
|
|
@@ -137,6 +140,12 @@ export class MarkdownParser {
|
|
|
137
140
|
parseScenarios(requirementSection) {
|
|
138
141
|
const scenarios = [];
|
|
139
142
|
for (const scenarioSection of requirementSection.children) {
|
|
143
|
+
// Only `#### Scenario:` children are scenarios — a `#### Notes` header
|
|
144
|
+
// is not one (report 2.1; kept in parity with the delta path's
|
|
145
|
+
// SCENARIO_HEADER in requirement-text.ts).
|
|
146
|
+
if (!/^Scenario:/i.test(scenarioSection.title.trim())) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
140
149
|
// Store the raw text content of the scenario section
|
|
141
150
|
if (scenarioSection.content.trim()) {
|
|
142
151
|
scenarios.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AASnF,MAAM,OAAO,cAAc;IACjB,KAAK,CAAW;IAChB,iBAAiB,CAAY;IAC7B,WAAW,CAAS;IAE5B,YAAY,OAAe;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;IAES,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAErE,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-parser.js","sourceRoot":"","sources":["../../../src/core/parsers/markdown-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AASnF,MAAM,OAAO,cAAc;IACjB,KAAK,CAAW;IAChB,iBAAiB,CAAY;IAC7B,WAAW,CAAS;IAE5B,YAAY,OAAe;QACzB,MAAM,UAAU,GAAG,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;IAES,MAAM,CAAC,gBAAgB,CAAC,OAAe;QAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAErE,qEAAqE;QACrE,uEAAuE;QACvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QAEjE,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE;YACxB,YAAY;YACZ,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,QAAQ;aACjB;SACF,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAE9E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAE7C,OAAO;YACL,IAAI;YACJ,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE;YACf,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE;YAC/B,MAAM;YACN,QAAQ,EAAE;gBACR,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,eAAe;aACxB;SACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAES,aAAa;QACrB,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAc,EAAE,CAAC;QAE5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,SAAS;YACX,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEpD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACpC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;gBAE7D,MAAM,OAAO,GAAY;oBACvB,KAAK;oBACL,KAAK;oBACL,OAAO;oBACP,QAAQ,EAAE,EAAE;iBACb,CAAC;gBAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;oBAClE,KAAK,CAAC,GAAG,EAAE,CAAC;gBACd,CAAC;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjD,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAES,yBAAyB,CAAC,SAAiB,EAAE,YAAoB;QACzE,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAElF,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;gBACzD,MAAM;YACR,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAES,WAAW,CAAC,QAAmB,EAAE,KAAa,EAAE,KAAc;QACtE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IACE,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW,EAAE;gBACnD,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,EAChD,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAES,iBAAiB,CAAC,OAAgB;QAC1C,MAAM,YAAY,GAAkB,EAAE,CAAC;QAEvC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrC,0EAA0E;YAC1E,2EAA2E;YAC3E,MAAM,IAAI,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAE5E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAE7C,YAAY,CAAC,IAAI,CAAC;gBAChB,IAAI;gBACJ,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAES,cAAc,CAAC,kBAA2B;QAClD,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,KAAK,MAAM,eAAe,IAAI,kBAAkB,CAAC,QAAQ,EAAE,CAAC;YAC1D,uEAAuE;YACvE,+DAA+D;YAC/D,2CAA2C;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACtD,SAAS;YACX,CAAC;YACD,qDAAqD;YACrD,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnC,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,eAAe,CAAC,OAAO;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAGS,WAAW,CAAC,OAAe;QACnC,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,8CAA8C;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAC7E,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEzC,IAAI,SAAS,GAAmB,UAAU,CAAC;gBAC3C,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;gBAE5C,8EAA8E;gBAC9E,8EAA8E;gBAC9E,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACxF,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;qBAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBACvH,SAAS,GAAG,OAAO,CAAC;gBACtB,CAAC;qBAAM,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5F,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,QAAQ;oBACd,SAAS;oBACT,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -2,6 +2,8 @@ export interface RequirementBlock {
|
|
|
2
2
|
headerLine: string;
|
|
3
3
|
name: string;
|
|
4
4
|
raw: string;
|
|
5
|
+
/** 1-based line number of headerLine in the source document. */
|
|
6
|
+
startLine: number;
|
|
5
7
|
}
|
|
6
8
|
export interface RequirementsSectionParts {
|
|
7
9
|
before: string;
|
|
@@ -15,14 +17,31 @@ export declare function normalizeRequirementName(name: string): string;
|
|
|
15
17
|
* Extracts the Requirements section from a spec file and parses requirement blocks.
|
|
16
18
|
*/
|
|
17
19
|
export declare function extractRequirementsSection(content: string): RequirementsSectionParts;
|
|
20
|
+
export interface RemovedEntry {
|
|
21
|
+
name: string;
|
|
22
|
+
/** 1-based line number of the entry in the source document. */
|
|
23
|
+
startLine: number;
|
|
24
|
+
hasReason: boolean;
|
|
25
|
+
hasMigration: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RenamedIssue {
|
|
28
|
+
kind: 'from-without-to' | 'to-without-from';
|
|
29
|
+
name: string;
|
|
30
|
+
/** 1-based line number of the orphaned FROM:/TO: line. */
|
|
31
|
+
line: number;
|
|
32
|
+
}
|
|
18
33
|
export interface DeltaPlan {
|
|
19
34
|
added: RequirementBlock[];
|
|
20
35
|
modified: RequirementBlock[];
|
|
21
36
|
removed: string[];
|
|
37
|
+
/** REMOVED entries with per-entry Reason/Migration presence (report 2.4). */
|
|
38
|
+
removedEntries: RemovedEntry[];
|
|
22
39
|
renamed: Array<{
|
|
23
40
|
from: string;
|
|
24
41
|
to: string;
|
|
25
42
|
}>;
|
|
43
|
+
/** Orphaned FROM:/TO: lines that would otherwise be silently dropped. */
|
|
44
|
+
renamedIssues: RenamedIssue[];
|
|
26
45
|
sectionPresence: {
|
|
27
46
|
added: boolean;
|
|
28
47
|
modified: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-blocks.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"requirement-blocks.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAID;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,wBAAwB,CA+EpF;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,6EAA6E;IAC7E,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,yEAAyE;IACzE,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,eAAe,EAAE;QACf,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CA2BzD"}
|
|
@@ -55,6 +55,7 @@ export function extractRequirementsSection(content) {
|
|
|
55
55
|
}
|
|
56
56
|
const headerMatch = headerLineCandidate.match(REQUIREMENT_HEADER_REGEX);
|
|
57
57
|
const name = normalizeRequirementName(headerMatch[1]);
|
|
58
|
+
const startLine = reqHeaderIndex + 1 + cursor + 1;
|
|
58
59
|
cursor++;
|
|
59
60
|
// Gather lines until next requirement header or end of section
|
|
60
61
|
const bodyLines = [headerLineCandidate];
|
|
@@ -63,7 +64,7 @@ export function extractRequirementsSection(content) {
|
|
|
63
64
|
cursor++;
|
|
64
65
|
}
|
|
65
66
|
const raw = bodyLines.join('\n').trimEnd();
|
|
66
|
-
blocks.push({ headerLine: headerLineCandidate, name, raw });
|
|
67
|
+
blocks.push({ headerLine: headerLineCandidate, name, raw, startLine });
|
|
67
68
|
}
|
|
68
69
|
const after = lines.slice(endIndex).join('\n');
|
|
69
70
|
const preamble = preambleLines.join('\n').trimEnd();
|
|
@@ -92,13 +93,15 @@ export function parseDeltaSpec(content) {
|
|
|
92
93
|
const renamedLookup = getSectionCaseInsensitive(sections, 'RENAMED Requirements');
|
|
93
94
|
const added = parseRequirementBlocksFromSection(addedLookup.body);
|
|
94
95
|
const modified = parseRequirementBlocksFromSection(modifiedLookup.body);
|
|
95
|
-
const
|
|
96
|
-
const renamedPairs = parseRenamedPairs(renamedLookup.body);
|
|
96
|
+
const removedEntries = parseRemovedEntries(removedLookup.body);
|
|
97
|
+
const { pairs: renamedPairs, issues: renamedIssues } = parseRenamedPairs(renamedLookup.body);
|
|
97
98
|
return {
|
|
98
99
|
added,
|
|
99
100
|
modified,
|
|
100
|
-
removed:
|
|
101
|
+
removed: removedEntries.map((e) => e.name),
|
|
102
|
+
removedEntries,
|
|
101
103
|
renamed: renamedPairs,
|
|
104
|
+
renamedIssues,
|
|
102
105
|
sectionPresence: {
|
|
103
106
|
added: addedLookup.found,
|
|
104
107
|
modified: modifiedLookup.found,
|
|
@@ -107,7 +110,7 @@ export function parseDeltaSpec(content) {
|
|
|
107
110
|
},
|
|
108
111
|
};
|
|
109
112
|
}
|
|
110
|
-
const EMPTY_SECTION_BODY = { lines: [], fenceMask: [] };
|
|
113
|
+
const EMPTY_SECTION_BODY = { lines: [], fenceMask: [], offset: 0 };
|
|
111
114
|
function splitTopLevelSections(lines, fenceMask) {
|
|
112
115
|
const result = {};
|
|
113
116
|
const indices = [];
|
|
@@ -126,6 +129,7 @@ function splitTopLevelSections(lines, fenceMask) {
|
|
|
126
129
|
result[current.title] = {
|
|
127
130
|
lines: lines.slice(current.index + 1, end),
|
|
128
131
|
fenceMask: fenceMask.slice(current.index + 1, end),
|
|
132
|
+
offset: current.index + 1,
|
|
129
133
|
};
|
|
130
134
|
}
|
|
131
135
|
return result;
|
|
@@ -153,6 +157,7 @@ function parseRequirementBlocksFromSection(sectionBody) {
|
|
|
153
157
|
if (i >= lines.length)
|
|
154
158
|
break;
|
|
155
159
|
const headerLine = lines[i];
|
|
160
|
+
const startLine = sectionBody.offset + i + 1;
|
|
156
161
|
const name = normalizeRequirementName(headerLine.match(REQUIREMENT_HEADER_REGEX)[1]);
|
|
157
162
|
const buf = [headerLine];
|
|
158
163
|
i++;
|
|
@@ -160,38 +165,52 @@ function parseRequirementBlocksFromSection(sectionBody) {
|
|
|
160
165
|
buf.push(lines[i]);
|
|
161
166
|
i++;
|
|
162
167
|
}
|
|
163
|
-
blocks.push({ headerLine, name, raw: buf.join('\n').trimEnd() });
|
|
168
|
+
blocks.push({ headerLine, name, raw: buf.join('\n').trimEnd(), startLine });
|
|
164
169
|
}
|
|
165
170
|
return blocks;
|
|
166
171
|
}
|
|
167
|
-
|
|
168
|
-
|
|
172
|
+
/** `**Reason**:` / `- Reason:` style field line inside a REMOVED entry. */
|
|
173
|
+
const REMOVED_REASON_LINE = /^\s*-?\s*(\*\*)?Reason(\*\*)?\s*:/i;
|
|
174
|
+
const REMOVED_MIGRATION_LINE = /^\s*-?\s*(\*\*)?Migration(\*\*)?\s*:/i;
|
|
175
|
+
function parseRemovedEntries(sectionBody) {
|
|
176
|
+
const { lines, fenceMask, offset } = sectionBody;
|
|
169
177
|
if (lines.length === 0)
|
|
170
178
|
return [];
|
|
171
|
-
const
|
|
179
|
+
const entries = [];
|
|
180
|
+
let current = null;
|
|
172
181
|
for (let i = 0; i < lines.length; i++) {
|
|
173
182
|
if (fenceMask[i])
|
|
174
183
|
continue;
|
|
175
184
|
const line = lines[i];
|
|
176
|
-
const m = line.match(REQUIREMENT_HEADER_REGEX)
|
|
185
|
+
const m = line.match(REQUIREMENT_HEADER_REGEX) ??
|
|
186
|
+
// Also support bullet list of headers
|
|
187
|
+
line.match(/^\s*-\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
177
188
|
if (m) {
|
|
178
|
-
|
|
189
|
+
current = {
|
|
190
|
+
name: normalizeRequirementName(m[1]),
|
|
191
|
+
startLine: offset + i + 1,
|
|
192
|
+
hasReason: false,
|
|
193
|
+
hasMigration: false,
|
|
194
|
+
};
|
|
195
|
+
entries.push(current);
|
|
179
196
|
continue;
|
|
180
197
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
if (
|
|
184
|
-
|
|
185
|
-
|
|
198
|
+
if (!current)
|
|
199
|
+
continue;
|
|
200
|
+
if (REMOVED_REASON_LINE.test(line))
|
|
201
|
+
current.hasReason = true;
|
|
202
|
+
if (REMOVED_MIGRATION_LINE.test(line))
|
|
203
|
+
current.hasMigration = true;
|
|
186
204
|
}
|
|
187
|
-
return
|
|
205
|
+
return entries;
|
|
188
206
|
}
|
|
189
207
|
function parseRenamedPairs(sectionBody) {
|
|
190
|
-
const { lines, fenceMask } = sectionBody;
|
|
208
|
+
const { lines, fenceMask, offset } = sectionBody;
|
|
191
209
|
if (lines.length === 0)
|
|
192
|
-
return [];
|
|
210
|
+
return { pairs: [], issues: [] };
|
|
193
211
|
const pairs = [];
|
|
194
|
-
|
|
212
|
+
const issues = [];
|
|
213
|
+
let current = null;
|
|
195
214
|
for (let i = 0; i < lines.length; i++) {
|
|
196
215
|
if (fenceMask[i])
|
|
197
216
|
continue;
|
|
@@ -199,16 +218,27 @@ function parseRenamedPairs(sectionBody) {
|
|
|
199
218
|
const fromMatch = line.match(/^\s*-?\s*FROM:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
200
219
|
const toMatch = line.match(/^\s*-?\s*TO:\s*`?###\s*Requirement:\s*(.+?)`?\s*$/);
|
|
201
220
|
if (fromMatch) {
|
|
202
|
-
|
|
221
|
+
if (current) {
|
|
222
|
+
// Two FROMs in a row: the first one has no TO (report 2.4 — was
|
|
223
|
+
// silently dropped before).
|
|
224
|
+
issues.push({ kind: 'from-without-to', name: current.from, line: current.line });
|
|
225
|
+
}
|
|
226
|
+
current = { from: normalizeRequirementName(fromMatch[1]), line: offset + i + 1 };
|
|
203
227
|
}
|
|
204
228
|
else if (toMatch) {
|
|
205
|
-
|
|
206
|
-
if (current
|
|
207
|
-
pairs.push({ from: current.from, to
|
|
208
|
-
current =
|
|
229
|
+
const to = normalizeRequirementName(toMatch[1]);
|
|
230
|
+
if (current) {
|
|
231
|
+
pairs.push({ from: current.from, to });
|
|
232
|
+
current = null;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
issues.push({ kind: 'to-without-from', name: to, line: offset + i + 1 });
|
|
209
236
|
}
|
|
210
237
|
}
|
|
211
238
|
}
|
|
212
|
-
|
|
239
|
+
if (current) {
|
|
240
|
+
issues.push({ kind: 'from-without-to', name: current.from, line: current.line });
|
|
241
|
+
}
|
|
242
|
+
return { pairs, issues };
|
|
213
243
|
}
|
|
214
244
|
//# sourceMappingURL=requirement-blocks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-blocks.js","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"requirement-blocks.js","sourceRoot":"","sources":["../../../src/core/parsers/requirement-blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,18 @@
|
|
|
15
15
|
* length >= 3 and closes on a line of the same marker whose length is >= the
|
|
16
16
|
* opening length, with nothing but whitespace after it.
|
|
17
17
|
*/
|
|
18
|
+
export interface CodeFenceScan {
|
|
19
|
+
mask: boolean[];
|
|
20
|
+
/** 1-based line of a fence that was opened but never closed, else null. */
|
|
21
|
+
unclosedFenceLine: number | null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Fence scan that also reports an unclosed fence: a fence opened without a
|
|
25
|
+
* closing line masks every following line, which silently hides all content
|
|
26
|
+
* after it — callers on the validation path must surface that as an ERROR
|
|
27
|
+
* instead of letting the document degrade silently (report 2.3).
|
|
28
|
+
*/
|
|
29
|
+
export declare function scanCodeFences(lines: string[]): CodeFenceScan;
|
|
18
30
|
export declare function buildCodeFenceMask(lines: string[]): boolean[];
|
|
19
31
|
/**
|
|
20
32
|
* The one predicate for normative-keyword detection. Matches `SHALL` or `MUST`
|
|
@@ -52,4 +64,25 @@ export declare function extractRequirementText(headerTitle: string, bodyLines: s
|
|
|
52
64
|
* scenario and is not counted.
|
|
53
65
|
*/
|
|
54
66
|
export declare function countScenarios(bodyLines: string[]): number;
|
|
67
|
+
export interface ScenarioAnalysis {
|
|
68
|
+
scenarios: Array<{
|
|
69
|
+
title: string;
|
|
70
|
+
/** 0-based index of the scenario header within the given lines. */
|
|
71
|
+
relLine: number;
|
|
72
|
+
hasWhen: boolean;
|
|
73
|
+
hasThen: boolean;
|
|
74
|
+
}>;
|
|
75
|
+
/** Level-4 headers that are not `#### Scenario:` (e.g. `#### Notes`). */
|
|
76
|
+
nonScenarioHeaders: Array<{
|
|
77
|
+
title: string;
|
|
78
|
+
relLine: number;
|
|
79
|
+
}>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Analyze the scenarios of a requirement block: which `####` headers are real
|
|
83
|
+
* scenarios, whether each scenario body contains the WHEN and THEN keywords
|
|
84
|
+
* (uppercase, per the spec convention), and which level-4 headers are not
|
|
85
|
+
* scenarios at all. Fence-aware like the other readers.
|
|
86
|
+
*/
|
|
87
|
+
export declare function analyzeScenarios(lines: string[]): ScenarioAnalysis;
|
|
55
88
|
//# sourceMappingURL=requirement-text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-text.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"requirement-text.d.ts","sourceRoot":"","sources":["../../../src/core/parsers/requirement-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,2EAA2E;IAC3E,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,CAsB7D;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAE7D;AA2CD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAoBlE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAQ1D;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,mEAAmE;QACnE,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;IACH,yEAAyE;IACzE,kBAAkB,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,gBAAgB,CA8BlE"}
|
|
@@ -9,20 +9,19 @@
|
|
|
9
9
|
* `validate <change>`, `validate <spec>`, and `archive`.
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* opening length, with nothing but whitespace after it.
|
|
12
|
+
* Fence scan that also reports an unclosed fence: a fence opened without a
|
|
13
|
+
* closing line masks every following line, which silently hides all content
|
|
14
|
+
* after it — callers on the validation path must surface that as an ERROR
|
|
15
|
+
* instead of letting the document degrade silently (report 2.3).
|
|
17
16
|
*/
|
|
18
|
-
export function
|
|
17
|
+
export function scanCodeFences(lines) {
|
|
19
18
|
const mask = new Array(lines.length).fill(false);
|
|
20
19
|
let activeFence = null;
|
|
21
20
|
for (let i = 0; i < lines.length; i++) {
|
|
22
21
|
const fence = getFenceMarker(lines[i]);
|
|
23
22
|
if (!activeFence) {
|
|
24
23
|
if (fence) {
|
|
25
|
-
activeFence = fence;
|
|
24
|
+
activeFence = { ...fence, openLine: i + 1 };
|
|
26
25
|
mask[i] = true;
|
|
27
26
|
}
|
|
28
27
|
continue;
|
|
@@ -32,7 +31,10 @@ export function buildCodeFenceMask(lines) {
|
|
|
32
31
|
activeFence = null;
|
|
33
32
|
}
|
|
34
33
|
}
|
|
35
|
-
return mask;
|
|
34
|
+
return { mask, unclosedFenceLine: activeFence ? activeFence.openLine : null };
|
|
35
|
+
}
|
|
36
|
+
export function buildCodeFenceMask(lines) {
|
|
37
|
+
return scanCodeFences(lines).mask;
|
|
36
38
|
}
|
|
37
39
|
function getFenceMarker(line) {
|
|
38
40
|
const fenceMatch = line.match(/^\s*(`{3,}|~{3,})/);
|
|
@@ -55,12 +57,14 @@ const METADATA_LINE = /^\*\*[^*]+\*\*:/;
|
|
|
55
57
|
/** Any markdown header line — the boundary where a requirement body ends. */
|
|
56
58
|
const HEADER_LINE = /^#{1,6}\s/;
|
|
57
59
|
/**
|
|
58
|
-
* A
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
60
|
+
* A scenario header. Only `#### Scenario:` counts — a `#### Notes` or other
|
|
61
|
+
* level-4 header under a requirement is NOT a scenario (report 2.1). The spec
|
|
62
|
+
* path (`MarkdownParser.parseScenarios`) applies the same filter, so both
|
|
63
|
+
* paths stay in parity.
|
|
62
64
|
*/
|
|
63
|
-
const SCENARIO_HEADER = /^####\s
|
|
65
|
+
const SCENARIO_HEADER = /^####\s+Scenario:/i;
|
|
66
|
+
/** Any level-4 header — used to detect non-scenario `####` headers. */
|
|
67
|
+
const ANY_H4_HEADER = /^####\s+/;
|
|
64
68
|
/**
|
|
65
69
|
* The one predicate for normative-keyword detection. Matches `SHALL` or `MUST`
|
|
66
70
|
* as whole words so the change-delta reader and the schema-based reader accept
|
|
@@ -133,4 +137,42 @@ export function countScenarios(bodyLines) {
|
|
|
133
137
|
}
|
|
134
138
|
return count;
|
|
135
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Analyze the scenarios of a requirement block: which `####` headers are real
|
|
142
|
+
* scenarios, whether each scenario body contains the WHEN and THEN keywords
|
|
143
|
+
* (uppercase, per the spec convention), and which level-4 headers are not
|
|
144
|
+
* scenarios at all. Fence-aware like the other readers.
|
|
145
|
+
*/
|
|
146
|
+
export function analyzeScenarios(lines) {
|
|
147
|
+
const mask = buildCodeFenceMask(lines);
|
|
148
|
+
const analysis = { scenarios: [], nonScenarioHeaders: [] };
|
|
149
|
+
let current = null;
|
|
150
|
+
for (let i = 0; i < lines.length; i++) {
|
|
151
|
+
if (mask[i])
|
|
152
|
+
continue;
|
|
153
|
+
const line = lines[i];
|
|
154
|
+
if (SCENARIO_HEADER.test(line)) {
|
|
155
|
+
current = {
|
|
156
|
+
title: line.replace(SCENARIO_HEADER, '').trim(),
|
|
157
|
+
relLine: i,
|
|
158
|
+
hasWhen: false,
|
|
159
|
+
hasThen: false,
|
|
160
|
+
};
|
|
161
|
+
analysis.scenarios.push(current);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (ANY_H4_HEADER.test(line)) {
|
|
165
|
+
analysis.nonScenarioHeaders.push({ title: line.trim(), relLine: i });
|
|
166
|
+
current = null; // body lines after a non-scenario header belong to it
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (current) {
|
|
170
|
+
if (/\bWHEN\b/.test(line))
|
|
171
|
+
current.hasWhen = true;
|
|
172
|
+
if (/\bTHEN\b/.test(line))
|
|
173
|
+
current.hasThen = true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return analysis;
|
|
177
|
+
}
|
|
136
178
|
//# sourceMappingURL=requirement-text.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-text.js","sourceRoot":"","sources":["../../../src/core/parsers/requirement-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"requirement-text.js","sourceRoot":"","sources":["../../../src/core/parsers/requirement-text.ts"],"names":[],"mappings":"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"}
|
package/dist/core/profiles.d.ts
CHANGED
|
@@ -2,18 +2,10 @@
|
|
|
2
2
|
* Profile System
|
|
3
3
|
*
|
|
4
4
|
* Defines workflow profiles that control which workflows are installed.
|
|
5
|
-
* Profiles determine WHICH workflows
|
|
5
|
+
* Profiles determine WHICH workflows are installed.
|
|
6
6
|
*/
|
|
7
7
|
import type { Profile } from './global-config.js';
|
|
8
|
-
|
|
9
|
-
* All seven tospec workflows. There is only one profile's worth of
|
|
10
|
-
* workflows now (no more core/custom split) — every install gets the
|
|
11
|
-
* full explore → propose/issue → update → apply → sync → archive set.
|
|
12
|
-
* verify runs automatically at the end of apply; sync is a standalone
|
|
13
|
-
* skill the archive workflow offers to run when it judges one is needed.
|
|
14
|
-
*/
|
|
15
|
-
export declare const ALL_WORKFLOWS: readonly ["explore", "propose", "issue", "decision", "update", "apply", "apply-with-tdd", "sync", "archive"];
|
|
16
|
-
export type WorkflowId = (typeof ALL_WORKFLOWS)[number];
|
|
8
|
+
export { ALL_WORKFLOWS, type WorkflowId } from './shared/skill-generation.js';
|
|
17
9
|
/**
|
|
18
10
|
* Resolves which workflows should be active for a given profile configuration.
|
|
19
11
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAG9E;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,eAAe,CAAC,EAAE,MAAM,EAAE,GACzB,SAAS,MAAM,EAAE,CAKnB"}
|
package/dist/core/profiles.js
CHANGED
|
@@ -2,16 +2,12 @@
|
|
|
2
2
|
* Profile System
|
|
3
3
|
*
|
|
4
4
|
* Defines workflow profiles that control which workflows are installed.
|
|
5
|
-
* Profiles determine WHICH workflows
|
|
5
|
+
* Profiles determine WHICH workflows are installed.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
* verify runs automatically at the end of apply; sync is a standalone
|
|
12
|
-
* skill the archive workflow offers to run when it judges one is needed.
|
|
13
|
-
*/
|
|
14
|
-
export const ALL_WORKFLOWS = ['explore', 'propose', 'issue', 'decision', 'update', 'apply', 'apply-with-tdd', 'sync', 'archive'];
|
|
7
|
+
// The workflow id list lives in the single workflow registry
|
|
8
|
+
// (shared/skill-generation.ts) — re-exported here for existing importers.
|
|
9
|
+
export { ALL_WORKFLOWS } from './shared/skill-generation.js';
|
|
10
|
+
import { ALL_WORKFLOWS } from './shared/skill-generation.js';
|
|
15
11
|
/**
|
|
16
12
|
* Resolves which workflows should be active for a given profile configuration.
|
|
17
13
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/core/profiles.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,6DAA6D;AAC7D,0EAA0E;AAC1E,OAAO,EAAE,aAAa,EAAmB,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAgB,EAChB,eAA0B;IAE1B,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,eAAe,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
|
|
@@ -19,17 +19,6 @@ export declare const ProjectConfigSchema: z.ZodObject<{
|
|
|
19
19
|
dashboard: z.ZodOptional<z.ZodObject<{
|
|
20
20
|
staleDays: z.ZodOptional<z.ZodNumber>;
|
|
21
21
|
}, z.core.$strip>>;
|
|
22
|
-
agentsLinkMode: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
23
|
-
skills: z.ZodOptional<z.ZodEnum<{
|
|
24
|
-
link: "link";
|
|
25
|
-
hardlink: "hardlink";
|
|
26
|
-
copy: "copy";
|
|
27
|
-
}>>;
|
|
28
|
-
commands: z.ZodOptional<z.ZodEnum<{
|
|
29
|
-
link: "link";
|
|
30
|
-
copy: "copy";
|
|
31
|
-
}>>;
|
|
32
|
-
}, z.core.$strip>>>;
|
|
33
22
|
}, z.core.$strip>;
|
|
34
23
|
/** Normalized in-memory shape of a referenced store declaration. */
|
|
35
24
|
export interface DeclarationEntry {
|
|
@@ -86,15 +75,4 @@ export declare function suggestSchemas(invalidSchemaName: string, availableSchem
|
|
|
86
75
|
}[]): string;
|
|
87
76
|
/** Shared .yaml/.yml probe used by project-config readers. */
|
|
88
77
|
export declare function resolveConfigFilePath(projectRoot: string): string | null;
|
|
89
|
-
/**
|
|
90
|
-
* Records how a tool's skills/commands were delivered (link vs copy) into
|
|
91
|
-
* tospec/config.yaml. Read-modify-write via the yaml package: does not
|
|
92
|
-
* preserve config-prompts.ts's hand-authored comment block if present —
|
|
93
|
-
* an accepted tradeoff of round-tripping a machine-owned field through a
|
|
94
|
-
* plain YAML parser/stringifier.
|
|
95
|
-
*/
|
|
96
|
-
export declare function writeAgentsLinkMode(projectRoot: string, toolId: string, modes: {
|
|
97
|
-
skills?: 'hardlink' | 'link' | 'copy';
|
|
98
|
-
commands?: 'link' | 'copy';
|
|
99
|
-
}): void;
|
|
100
78
|
//# sourceMappingURL=project-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/core/project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/core/project-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB;;;;;;;iBAwC9B,CAAC;AAEH,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG;IAChE,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACjC,CAAC;AAiEF,eAAO,MAAM,gBAAgB,QAAY,CAAC;AAE1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA6G3E;AAMD;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,UAAU,EAAE,MAAM,GACjB,MAAM,EAAE,CAcV;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,EAAE,GACvD,MAAM,CA4DR;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOxE"}
|