@rsaglobaltech/specgate 0.9.0 → 0.11.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 +162 -0
- package/README.md +10 -18
- package/bin/specgate.ts +10 -3
- package/dist/bin/specgate.js +8 -3
- package/dist/bin/specgate.js.map +1 -1
- package/dist/packages/core/src/domain/DerivedMatrix.js +348 -0
- package/dist/packages/core/src/domain/DerivedMatrix.js.map +1 -0
- package/dist/packages/core/src/domain/DoneVerification.js +22 -1
- package/dist/packages/core/src/domain/DoneVerification.js.map +1 -1
- package/dist/packages/core/src/domain/GherkinQuality.js +19 -3
- package/dist/packages/core/src/domain/GherkinQuality.js.map +1 -1
- package/dist/packages/core/src/domain/NewRequirement.js +46 -0
- package/dist/packages/core/src/domain/NewRequirement.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementPlan.js +1 -0
- package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -1
- package/dist/packages/core/src/domain/RequirementReadiness.js +2 -2
- package/dist/packages/core/src/domain/RequirementReadiness.js.map +1 -1
- package/dist/packages/core/src/domain/TraceabilityFormat.js +8 -1
- package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -1
- package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js +157 -0
- package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js.map +1 -0
- package/dist/packages/core/test/unit/derived-matrix.test.js +196 -0
- package/dist/packages/core/test/unit/derived-matrix.test.js.map +1 -0
- package/dist/packages/core/test/unit/done-verification.test.js +7 -6
- package/dist/packages/core/test/unit/done-verification.test.js.map +1 -1
- package/dist/packages/core/test/unit/gherkin-quality.test.js +28 -0
- package/dist/packages/core/test/unit/gherkin-quality.test.js.map +1 -1
- package/dist/packages/core/test/unit/new-requirement.test.js +67 -0
- package/dist/packages/core/test/unit/new-requirement.test.js.map +1 -0
- package/dist/scripts/agents/init.js +58 -14
- package/dist/scripts/agents/init.js.map +1 -1
- package/dist/scripts/check.js +10 -0
- package/dist/scripts/check.js.map +1 -0
- package/dist/scripts/cli/commands/change/ChangeCommand.js +4 -0
- package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +17 -5
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +9 -0
- package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/AdoptCommand.js +17 -7
- package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/InitProjectCommand.js +51 -1
- package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/UpdateCommand.js +118 -8
- package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/CheckCommand.js +192 -0
- package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -0
- package/dist/scripts/cli/commands/quality/FixCommand.js +20 -0
- package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +83 -6
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DoneCommand.js +23 -5
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/MatrixCommand.js +305 -0
- package/dist/scripts/cli/commands/spec/MatrixCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/NewCommand.js +183 -0
- package/dist/scripts/cli/commands/spec/NewCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/PlanCommand.js +6 -1
- package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/ReqCommand.js +39 -8
- package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StatusCommand.js +94 -33
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
- package/dist/scripts/lib/derived-writes.js +91 -0
- package/dist/scripts/lib/derived-writes.js.map +1 -0
- package/dist/scripts/lib/surface.js +67 -37
- package/dist/scripts/lib/surface.js.map +1 -1
- package/dist/scripts/matrix.js +11 -0
- package/dist/scripts/matrix.js.map +1 -0
- package/dist/scripts/new.js +10 -0
- package/dist/scripts/new.js.map +1 -0
- package/dist/scripts/plugin/gate-hook.js +2 -2
- package/dist/scripts/plugin/gate-hook.js.map +1 -1
- package/package.json +2 -1
- package/templates/harness/harness.config.yaml.tpl +3 -3
|
@@ -46,6 +46,8 @@ const HarnessConfigFile_1 = require("../../../../packages/core/src/infrastructur
|
|
|
46
46
|
const node_child_process_1 = require("node:child_process");
|
|
47
47
|
const path = __importStar(require("node:path"));
|
|
48
48
|
const project_root_2 = require("../../../lib/project-root");
|
|
49
|
+
const derived_writes_1 = require("../../../lib/derived-writes");
|
|
50
|
+
const MatrixCommand_1 = require("./MatrixCommand");
|
|
49
51
|
const COLOR_ENABLED = process.stdout.isTTY && process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
|
|
50
52
|
const c = {
|
|
51
53
|
reset: COLOR_ENABLED ? "\x1b[0m" : "",
|
|
@@ -110,8 +112,7 @@ class DoneCommand extends command_1.BaseCommand {
|
|
|
110
112
|
` --status <Status> Target status (default: Implemented).\n` +
|
|
111
113
|
` One of: ${exports.ALLOWED_STATUSES.join(", ")}\n` +
|
|
112
114
|
" --check Run `validate` first and refuse to write if it fails.\n" +
|
|
113
|
-
" --strict --check with the
|
|
114
|
-
" --strict-links and --strict-coverage.\n" +
|
|
115
|
+
" --strict --check with the gate: validate --strict.\n" +
|
|
115
116
|
' --test-cmd "<cmd>" Also run the project\'s tests and require them to pass.\n' +
|
|
116
117
|
" Read from `test_cmd:` in harness.config.yaml when omitted.\n" +
|
|
117
118
|
" Without one, `done` says it checked the specification\n" +
|
|
@@ -152,10 +153,15 @@ class DoneCommand extends command_1.BaseCommand {
|
|
|
152
153
|
// `--check` and `--strict` used to be parsed and discarded, so `done
|
|
153
154
|
// REQ-001 --check` printed a tick over a matrix pointing at files that do
|
|
154
155
|
// not exist. Four documentation pages said it "validates first".
|
|
156
|
+
// A test written since the last regeneration is new evidence: bring a
|
|
157
|
+
// generated matrix up to date before checking it, or `done --check`
|
|
158
|
+
// would refuse the very test that makes the requirement deliverable.
|
|
159
|
+
(0, MatrixCommand_1.refreshDerivedMatrix)(projectDir);
|
|
155
160
|
const harness = (0, HarnessConfigFile_1.readHarnessConfig)(projectDir) || {};
|
|
156
161
|
const plan = (0, DoneVerification_1.planDoneVerification)(projectDir, {
|
|
157
162
|
check: opts.check,
|
|
158
163
|
strict: opts.strict,
|
|
164
|
+
reqId: opts.reqId || undefined,
|
|
159
165
|
testCmd: opts.testCmd || harness.testCmd,
|
|
160
166
|
});
|
|
161
167
|
for (const step of plan.steps) {
|
|
@@ -185,9 +191,21 @@ class DoneCommand extends command_1.BaseCommand {
|
|
|
185
191
|
}),
|
|
186
192
|
]);
|
|
187
193
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const
|
|
194
|
+
// A generated matrix gets its status from spec.md: writing the row would
|
|
195
|
+
// be undone by the next regeneration.
|
|
196
|
+
const derivedRows = (0, derived_writes_1.isDerivedProject)(projectDir)
|
|
197
|
+
? (0, derived_writes_1.writeRequirementFields)(projectDir, opts.reqId, { status: opts.status })
|
|
198
|
+
: undefined;
|
|
199
|
+
const result = derivedRows === undefined
|
|
200
|
+
? new UpdateRequirementStatusUseCase_1.UpdateRequirementStatusUseCase(new DiskTraceabilityRepository_1.DiskTraceabilityRepository()).execute(projectDir, opts.reqId, opts.status)
|
|
201
|
+
: derivedRows === null
|
|
202
|
+
? {
|
|
203
|
+
ok: false,
|
|
204
|
+
code: "requirement_not_in_matrix",
|
|
205
|
+
error: `${opts.reqId} has no section in spec.md.`,
|
|
206
|
+
updated: 0,
|
|
207
|
+
}
|
|
208
|
+
: { ok: true, updated: derivedRows };
|
|
191
209
|
if (!result.ok) {
|
|
192
210
|
if (result.code === "traceability_not_found") {
|
|
193
211
|
io.usage(NULL_SHAPE, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DoneCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/spec/DoneCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"DoneCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/spec/DoneCommand.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,8BAuBC;AAxED,4DAA8D;AAC9D,0DAAiD;AACjD,8CAAmD;AACnD,kDAAmD;AACnD,wHAAqH;AACrH,6HAA0H;AAC1H,4FAG+D;AAC/D,sGAAmG;AACnG,2DAA+C;AAC/C,gDAAkC;AAClC,4DAAwD;AACxD,gEAAuF;AACvF,mDAAuD;AAEvD,MAAM,aAAa,GACjB,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAC5F,MAAM,CAAC,GAAG;IACR,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACrC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACpC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;IACnC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACpC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACtC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;IACvC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;CACtC,CAAC;AAEW,QAAA,gBAAgB,GAAG;IAC9B,OAAO;IACP,UAAU;IACV,aAAa;IACb,UAAU;IACV,UAAU;IACV,YAAY;CACb,CAAC;AAaF,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAgB;QACxB,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;KACd,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACxD,IAAI,CAAC,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aACtE,IAAI,CAAC,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aACvC,IAAI,CAAC,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;aAChE,IAAI,CAAC,KAAK,QAAQ;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;aACrC,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAa,WAAY,SAAQ,qBAAW;IACnC,OAAO;QACZ,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,EAAE,GAAG,IAAA,eAAO,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAEzC,mEAAmE;QACnE,0EAA0E;QAC1E,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU;gBACR,qEAAqE;gBACrE,qFAAqF;gBACrF,8DAA8D;gBAC9D,YAAY;gBACZ,+DAA+D;gBAC/D,iCAAiC,wBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBAChE,+EAA+E;gBAC/E,mEAAmE;gBACnE,iFAAiF;gBACjF,oFAAoF;gBACpF,+EAA+E;gBAC/E,yEAAyE;gBACzE,2EAA2E;gBAC3E,2DAA2D,CAC9D,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,YAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE;gBACnB,IAAA,mBAAK,EAAC,iBAAiB,EAAE,oCAAoC,EAAE;oBAC7D,GAAG,EAAE,gDAAgD;iBACtD,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAM,CAAC,EAAE,CAAC;YACnC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE;gBACnB,IAAA,mBAAK,EAAC,kBAAkB,EAAE,mBAAmB,IAAI,CAAC,KAAK,sBAAsB,EAAE;oBAC7E,MAAM,EAAE,IAAI,CAAC,KAAM;oBACnB,GAAG,EAAE,qCAAqC;iBAC3C,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,IAAA,gCAAiB,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE;gBACnB,IAAA,mBAAK,EAAC,mBAAmB,EAAE,GAAG,CAAC,OAAO,EAAE;oBACtC,GAAG,EAAE,+DAA+D;iBACrE,CAAC;aACH,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,4EAA4E;QAC5E,EAAE;QACF,qEAAqE;QACrE,0EAA0E;QAC1E,iEAAiE;QACjE,sEAAsE;QACtE,oEAAoE;QACpE,qEAAqE;QACrE,IAAA,oCAAoB,EAAC,UAAU,CAAC,CAAC;QAEjC,MAAM,OAAO,GAAG,IAAA,qCAAiB,EAAC,UAAU,CAAC,IAAK,EAAU,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAA,uCAAoB,EAAC,UAAU,EAAE;YAC5C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;SACzC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,MAAM,GAAG,GACP,IAAI,CAAC,KAAK,KAAK,UAAU;gBACvB,CAAC,CAAC,IAAA,8BAAS,EACP,OAAO,CAAC,QAAQ,EAChB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAA,0BAAW,EAAC,SAAS,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EACnF,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;gBACH,CAAC,CAAC,IAAA,8BAAS,EAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACtB,GAAG,EAAE,UAAU;oBACf,QAAQ,EAAE,MAAM;oBAChB,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;YAET,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE/B,uEAAuE;YACvE,sEAAsE;YACtE,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAC/D,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;YAEhE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;gBAClB,IAAA,mBAAK,EACH,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,EACxE,IAAI,CAAC,KAAK,KAAK,UAAU;oBACvB,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,sBAAsB;oBACjD,CAAC,CAAC,cAAc,IAAI,CAAC,MAAM,+BAA+B,EAC5D;oBACE,MAAM,EAAE,IAAI,CAAC,KAAM;oBACnB,GAAG,EACD,IAAI,CAAC,KAAK,KAAK,UAAU;wBACvB,CAAC,CAAC,mDAAmD;wBACrD,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kDAAkD;4BACxE,4EAA4E;iBACnF,CACF;aACF,CAAC,CAAC;QACL,CAAC;QAED,yEAAyE;QACzE,sCAAsC;QACtC,MAAM,WAAW,GAAG,IAAA,iCAAgB,EAAC,UAAU,CAAC;YAC9C,CAAC,CAAC,IAAA,uCAAsB,EAAC,UAAU,EAAE,IAAI,CAAC,KAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1E,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GACV,WAAW,KAAK,SAAS;YACvB,CAAC,CAAC,IAAI,+DAA8B,CAAC,IAAI,uDAA0B,EAAE,CAAC,CAAC,OAAO,CAC1E,UAAU,EACV,IAAI,CAAC,KAAM,EACX,IAAI,CAAC,MAAM,CACZ;YACH,CAAC,CAAC,WAAW,KAAK,IAAI;gBACpB,CAAC,CAAC;oBACE,EAAE,EAAE,KAAK;oBACT,IAAI,EAAE,2BAA2B;oBACjC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,6BAA6B;oBACjD,OAAO,EAAE,CAAC;iBACX;gBACH,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QAE3C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,IAAI,MAAM,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;gBAC7C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE;oBACnB,IAAA,mBAAK,EAAC,wBAAwB,EAAE,MAAM,CAAC,KAAK,IAAI,2BAA2B,EAAE;wBAC3E,IAAI,EAAE,4BAA4B;wBAClC,GAAG,EAAE,+EAA+E;qBACrF,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE;oBAClB,IAAA,mBAAK,EACH,2BAA2B,EAC3B,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,KAAK,gCAAgC,EAC7D;wBACE,MAAM,EAAE,IAAI,CAAC,KAAM;wBACnB,GAAG,EAAE,iBAAiB,IAAI,CAAC,KAAK,6CAA6C;qBAC9E,CACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAC3F,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,KAAK,IAAI,CACpK,CACF,CAAC;QAEF,yEAAyE;QACzE,4EAA4E;QAC5E,6BAA6B;QAC7B,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,KAAK,0CAAuB,CAAC,OAAO,IAAI,CAAC,CAAC;YACrF,KAAK,MAAM,IAAI,IAAI,0CAAuB,CAAC,GAAG,EAAE,CAAC;gBAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,YAAI,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;CACF;AAhLD,kCAgLC"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.MatrixCommand = void 0;
|
|
37
|
+
exports.derivedMatrixFor = derivedMatrixFor;
|
|
38
|
+
exports.refreshDerivedMatrix = refreshDerivedMatrix;
|
|
39
|
+
exports.migrateToDerived = migrateToDerived;
|
|
40
|
+
const fs = __importStar(require("node:fs"));
|
|
41
|
+
const path = __importStar(require("node:path"));
|
|
42
|
+
const project_root_1 = require("../../../lib/project-root");
|
|
43
|
+
const diagnostics_1 = require("../../../lib/diagnostics");
|
|
44
|
+
const agent_1 = require("../../../lib/agent");
|
|
45
|
+
const command_1 = require("../../../lib/command");
|
|
46
|
+
const DerivedMatrix_1 = require("../../../../packages/core/src/domain/DerivedMatrix");
|
|
47
|
+
const DerivedMatrixSources_1 = require("../../../../packages/core/src/infrastructure/DerivedMatrixSources");
|
|
48
|
+
const SpecSections_1 = require("../../../../packages/core/src/domain/SpecSections");
|
|
49
|
+
const COLOR = process.stdout.isTTY && process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
|
|
50
|
+
const c = {
|
|
51
|
+
reset: COLOR ? "\x1b[0m" : "",
|
|
52
|
+
bold: COLOR ? "\x1b[1m" : "",
|
|
53
|
+
dim: COLOR ? "\x1b[2m" : "",
|
|
54
|
+
green: COLOR ? "\x1b[32m" : "",
|
|
55
|
+
yellow: COLOR ? "\x1b[33m" : "",
|
|
56
|
+
red: COLOR ? "\x1b[31m" : "",
|
|
57
|
+
};
|
|
58
|
+
const NULL_SHAPE = { matrix: null };
|
|
59
|
+
const MATRIX = path.join("docs", "specs", "traceability.md");
|
|
60
|
+
function usage() {
|
|
61
|
+
process.stdout.write(`
|
|
62
|
+
🧮 ${c.bold}specgate matrix${c.reset} [--check] [--migrate] [--dry-run] [--json]
|
|
63
|
+
|
|
64
|
+
The traceability matrix, generated instead of maintained. Each row comes from
|
|
65
|
+
what the project already says:
|
|
66
|
+
|
|
67
|
+
requirement, title ## REQ-NNN — title in spec.md
|
|
68
|
+
scenario, feature scenarios tagged @REQ-NNN @SCN-NNN
|
|
69
|
+
test test files that mention REQ-NNN
|
|
70
|
+
status, overrides <!-- csda:trace status=… --> in the requirement's section
|
|
71
|
+
|
|
72
|
+
specgate matrix regenerate docs/specs/traceability.md
|
|
73
|
+
specgate matrix --check exit 1 if the file no longer matches its sources
|
|
74
|
+
specgate matrix --migrate turn a hand-kept matrix into a generated one;
|
|
75
|
+
verifies the result is row-for-row identical first
|
|
76
|
+
|
|
77
|
+
`);
|
|
78
|
+
}
|
|
79
|
+
/** `# Traceability Matrix — demo` → `demo`. */
|
|
80
|
+
function projectNameOf(content) {
|
|
81
|
+
const m = /^#\s+Traceability Matrix\s+—\s+(.+)$/m.exec(content || "");
|
|
82
|
+
return m ? m[1].trim() : undefined;
|
|
83
|
+
}
|
|
84
|
+
function derivedMatrixFor(projectDir, existing) {
|
|
85
|
+
const rows = (0, DerivedMatrix_1.deriveRows)((0, DerivedMatrixSources_1.readDerivationSources)(projectDir));
|
|
86
|
+
return (0, DerivedMatrix_1.renderDerivedMatrix)(rows, projectNameOf(existing));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Regenerate a derived project's matrix. Returns true when the file changed.
|
|
90
|
+
* A hand-kept matrix is never touched.
|
|
91
|
+
*/
|
|
92
|
+
function refreshDerivedMatrix(projectDir) {
|
|
93
|
+
const file = path.join(projectDir, MATRIX);
|
|
94
|
+
const existing = fs.existsSync(file) ? fs.readFileSync(file, "utf8") : null;
|
|
95
|
+
if (!(0, DerivedMatrix_1.isDerivedMatrix)(existing))
|
|
96
|
+
return false;
|
|
97
|
+
const next = derivedMatrixFor(projectDir, existing);
|
|
98
|
+
if (next === existing)
|
|
99
|
+
return false;
|
|
100
|
+
fs.writeFileSync(file, next, "utf8");
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
/** The migration, computed and not written: what spec.md would become, and why it cannot. */
|
|
104
|
+
function planMigration(projectDir, original) {
|
|
105
|
+
const specFile = path.join(projectDir, "spec.md");
|
|
106
|
+
const specBefore = fs.existsSync(specFile) ? fs.readFileSync(specFile, "utf8") : "";
|
|
107
|
+
let spec = specBefore;
|
|
108
|
+
const sources = (0, DerivedMatrixSources_1.readDerivationSources)(projectDir);
|
|
109
|
+
const blocked = [];
|
|
110
|
+
const byReq = new Map();
|
|
111
|
+
for (const row of original) {
|
|
112
|
+
const id = String(row.requirement || "").trim();
|
|
113
|
+
if (!/^REQ-/.test(id))
|
|
114
|
+
continue;
|
|
115
|
+
byReq.set(id, [...(byReq.get(id) || []), row]);
|
|
116
|
+
}
|
|
117
|
+
for (const [id, rows] of byReq) {
|
|
118
|
+
const titleCell = String(rows[0].useCase || "")
|
|
119
|
+
.replace(/^UC-\d+\s*/, "")
|
|
120
|
+
.trim();
|
|
121
|
+
spec = (0, SpecSections_1.appendRequirementSection)(spec, id, titleCell && titleCell !== "-" ? titleCell : id).content;
|
|
122
|
+
const req = (0, DerivedMatrix_1.requirementsIn)(spec).find((r) => r.id === id);
|
|
123
|
+
if (!req) {
|
|
124
|
+
// spec.md states it in a table row (the §8 convention), which carries
|
|
125
|
+
// no csda:trace comment to hold status and links.
|
|
126
|
+
blocked.push(`${id}: stated in a table in spec.md, not a \`## ${id}\` section`);
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
const plan = (0, DerivedMatrix_1.fieldsToReproduce)(req, rows, sources);
|
|
130
|
+
if ("reason" in plan) {
|
|
131
|
+
blocked.push(`${id}: ${plan.reason}`);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
spec = (0, DerivedMatrix_1.setTraceFields)(spec, id, plan.fields) ?? spec;
|
|
135
|
+
}
|
|
136
|
+
const derived = (0, DerivedMatrix_1.deriveRows)({ ...sources, spec });
|
|
137
|
+
const d = (0, DerivedMatrix_1.diffRows)(original.filter((r) => /^REQ-/.test(r.requirement || "")), derived);
|
|
138
|
+
return { spec, specFile, derived, blocked, d, byReq };
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Switch a project to a generated matrix if that is lossless, silently.
|
|
142
|
+
* Used by `init` and `adopt`, which create the matrix a moment before: a new
|
|
143
|
+
* project should start generated, and one whose fresh matrix cannot be
|
|
144
|
+
* reproduced (it never happens with what they write) stays hand-kept.
|
|
145
|
+
*/
|
|
146
|
+
function migrateToDerived(projectDir) {
|
|
147
|
+
const file = path.join(projectDir, MATRIX);
|
|
148
|
+
if (!fs.existsSync(file))
|
|
149
|
+
return false;
|
|
150
|
+
const existing = fs.readFileSync(file, "utf8");
|
|
151
|
+
if ((0, DerivedMatrix_1.isDerivedMatrix)(existing))
|
|
152
|
+
return true;
|
|
153
|
+
const original = (0, DerivedMatrix_1.rowsOf)(existing);
|
|
154
|
+
if (original.length === 0)
|
|
155
|
+
return false;
|
|
156
|
+
const { spec, specFile, derived, blocked, d } = planMigration(projectDir, original);
|
|
157
|
+
if (blocked.length > 0 || d.missing.length > 0 || d.extra.length > 0)
|
|
158
|
+
return false;
|
|
159
|
+
fs.writeFileSync(specFile, spec, "utf8");
|
|
160
|
+
fs.writeFileSync(file, (0, DerivedMatrix_1.renderDerivedMatrix)(derived, projectNameOf(existing)), "utf8");
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
class MatrixCommand extends command_1.BaseCommand {
|
|
164
|
+
execute() {
|
|
165
|
+
const argv = this.args;
|
|
166
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
167
|
+
usage();
|
|
168
|
+
process.exit(0);
|
|
169
|
+
}
|
|
170
|
+
const io = (0, agent_1.agentIo)((0, agent_1.wantsJson)(argv));
|
|
171
|
+
const known = new Set(["--check", "--migrate", "--dry-run", "--json", "--project-dir"]);
|
|
172
|
+
for (let i = 0; i < argv.length; i++) {
|
|
173
|
+
if (argv[i] === "--project-dir")
|
|
174
|
+
i++;
|
|
175
|
+
else if (argv[i].startsWith("-") && !known.has(argv[i])) {
|
|
176
|
+
io.usage(NULL_SHAPE, [
|
|
177
|
+
(0, diagnostics_1.error)("unknown_flag", `Unknown flag for matrix: ${argv[i]}`, {
|
|
178
|
+
fix: "specgate matrix --help",
|
|
179
|
+
}),
|
|
180
|
+
]);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const dirAt = argv.indexOf("--project-dir");
|
|
184
|
+
let projectDir;
|
|
185
|
+
try {
|
|
186
|
+
projectDir = (0, project_root_1.resolveProjectDir)(dirAt >= 0 ? argv[dirAt + 1] : ".");
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
projectDir = path.resolve(dirAt >= 0 ? argv[dirAt + 1] : ".");
|
|
190
|
+
}
|
|
191
|
+
const file = path.join(projectDir, MATRIX);
|
|
192
|
+
const existing = fs.existsSync(file) ? fs.readFileSync(file, "utf8") : null;
|
|
193
|
+
const dryRun = argv.includes("--dry-run");
|
|
194
|
+
if (argv.includes("--migrate"))
|
|
195
|
+
return this.migrate(io, projectDir, existing, dryRun);
|
|
196
|
+
if (!(0, DerivedMatrix_1.isDerivedMatrix)(existing)) {
|
|
197
|
+
io.emit({
|
|
198
|
+
matrix: { projectDir, derived: false },
|
|
199
|
+
status: [
|
|
200
|
+
(0, diagnostics_1.info)("matrix_hand_kept", "This project keeps its matrix by hand.", {
|
|
201
|
+
fix: "specgate matrix --migrate",
|
|
202
|
+
}),
|
|
203
|
+
],
|
|
204
|
+
}, () => process.stdout.write(`\n ${c.dim}This project keeps its matrix by hand.${c.reset}\n` +
|
|
205
|
+
` ${c.green}specgate matrix --migrate${c.reset}${c.dim} generates it from spec.md, features and tests instead.${c.reset}\n\n`));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const next = derivedMatrixFor(projectDir, existing);
|
|
209
|
+
const stale = next !== existing;
|
|
210
|
+
if (argv.includes("--check")) {
|
|
211
|
+
if (!stale) {
|
|
212
|
+
io.emit({ matrix: { projectDir, derived: true, stale: false } }, () => process.stdout.write(`${c.green}✔${c.reset} The matrix matches its sources.\n`));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const d = (0, DerivedMatrix_1.diffRows)((0, DerivedMatrix_1.rowsOf)(next), (0, DerivedMatrix_1.rowsOf)(existing || ""));
|
|
216
|
+
if (!io.json) {
|
|
217
|
+
for (const k of d.missing)
|
|
218
|
+
process.stderr.write(` ${c.green}+ ${k}${c.reset}\n`);
|
|
219
|
+
for (const k of d.extra)
|
|
220
|
+
process.stderr.write(` ${c.red}- ${k}${c.reset}\n`);
|
|
221
|
+
}
|
|
222
|
+
io.fail(NULL_SHAPE, [
|
|
223
|
+
(0, diagnostics_1.error)("matrix_stale", "docs/specs/traceability.md no longer matches its sources.", {
|
|
224
|
+
file: "docs/specs/traceability.md",
|
|
225
|
+
fix: "Run `specgate matrix` and commit the result.",
|
|
226
|
+
}),
|
|
227
|
+
]);
|
|
228
|
+
}
|
|
229
|
+
if (stale && !dryRun)
|
|
230
|
+
fs.writeFileSync(file, next, "utf8");
|
|
231
|
+
const rows = (0, DerivedMatrix_1.rowsOf)(next).length;
|
|
232
|
+
io.emit({ matrix: { projectDir, derived: true, written: stale && !dryRun, rows } }, () => process.stdout.write(stale
|
|
233
|
+
? `${c.green}✔${c.reset} ${dryRun ? "Would regenerate" : "Regenerated"} docs/specs/traceability.md ${c.dim}(${rows} rows)${c.reset}\n`
|
|
234
|
+
: `${c.green}✔${c.reset} The matrix is up to date ${c.dim}(${rows} rows)${c.reset}\n`));
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Hand-kept → generated, or nothing at all.
|
|
238
|
+
*
|
|
239
|
+
* Writes into each requirement's section only what derivation would get
|
|
240
|
+
* wrong, then derives and compares row for row against the original. Any
|
|
241
|
+
* difference restores both files and names the requirements that cannot be
|
|
242
|
+
* expressed yet — a migration that loses a row is worse than none.
|
|
243
|
+
*/
|
|
244
|
+
migrate(io, projectDir, existing, dryRun) {
|
|
245
|
+
if (existing === null) {
|
|
246
|
+
io.usage(NULL_SHAPE, [
|
|
247
|
+
(0, diagnostics_1.error)("traceability_not_found", "No docs/specs/traceability.md to migrate.", {
|
|
248
|
+
fix: "specgate init",
|
|
249
|
+
}),
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
if ((0, DerivedMatrix_1.isDerivedMatrix)(existing)) {
|
|
253
|
+
io.emit({ matrix: { projectDir, derived: true, migrated: false } }, () => process.stdout.write(`${c.dim}Already generated — nothing to migrate.${c.reset}\n`));
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const original = (0, DerivedMatrix_1.rowsOf)(existing);
|
|
257
|
+
if (original.length === 0) {
|
|
258
|
+
io.fail(NULL_SHAPE, [
|
|
259
|
+
(0, diagnostics_1.error)("matrix_not_rich", "Only the ten-column matrix can be migrated.", {
|
|
260
|
+
file: "docs/specs/traceability.md",
|
|
261
|
+
}),
|
|
262
|
+
]);
|
|
263
|
+
}
|
|
264
|
+
const { spec, specFile, derived, blocked, d, byReq } = planMigration(projectDir, original);
|
|
265
|
+
if (blocked.length > 0 || d.missing.length > 0 || d.extra.length > 0) {
|
|
266
|
+
if (!io.json) {
|
|
267
|
+
for (const b of blocked)
|
|
268
|
+
process.stderr.write(` ${c.red}✖${c.reset} ${b}\n`);
|
|
269
|
+
for (const k of d.missing)
|
|
270
|
+
process.stderr.write(` ${c.red}lost: ${k}${c.reset}\n`);
|
|
271
|
+
for (const k of d.extra)
|
|
272
|
+
process.stderr.write(` ${c.yellow}new: ${k}${c.reset}\n`);
|
|
273
|
+
}
|
|
274
|
+
io.fail(NULL_SHAPE, [
|
|
275
|
+
(0, diagnostics_1.error)("migration_not_lossless", "The generated matrix would not match this one row for row, so nothing was changed.", {
|
|
276
|
+
file: "docs/specs/traceability.md",
|
|
277
|
+
fix: "Tag each scenario @REQ-NNN @SCN-NNN in its feature file for requirements with " +
|
|
278
|
+
"several rows, then run `specgate matrix --migrate` again.",
|
|
279
|
+
}),
|
|
280
|
+
]);
|
|
281
|
+
}
|
|
282
|
+
const next = (0, DerivedMatrix_1.renderDerivedMatrix)(derived, projectNameOf(existing));
|
|
283
|
+
if (!dryRun) {
|
|
284
|
+
fs.writeFileSync(specFile, spec, "utf8");
|
|
285
|
+
fs.writeFileSync(path.join(projectDir, MATRIX), next, "utf8");
|
|
286
|
+
}
|
|
287
|
+
const notes = [
|
|
288
|
+
(0, diagnostics_1.warning)("matrix_now_generated", "docs/specs/traceability.md is now generated. Edit spec.md, features and tests instead.", { fix: "specgate matrix regenerates it; validate fails when it is stale." }),
|
|
289
|
+
];
|
|
290
|
+
io.emit({
|
|
291
|
+
matrix: {
|
|
292
|
+
projectDir,
|
|
293
|
+
derived: true,
|
|
294
|
+
migrated: !dryRun,
|
|
295
|
+
requirements: byReq.size,
|
|
296
|
+
rows: derived.length,
|
|
297
|
+
},
|
|
298
|
+
status: notes,
|
|
299
|
+
}, () => process.stdout.write(`${c.green}✔${c.reset} ${dryRun ? "Would migrate" : "Migrated"} ${byReq.size} requirement(s), ${derived.length} row(s) — identical row for row.\n` +
|
|
300
|
+
` ${c.dim}spec.md now owns status and explicit links (csda:trace); the matrix is generated.${c.reset}\n` +
|
|
301
|
+
` ${c.dim}Next: commit both files. From now on: specgate new · specgate done · specgate check.${c.reset}\n`));
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
exports.MatrixCommand = MatrixCommand;
|
|
305
|
+
//# sourceMappingURL=MatrixCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MatrixCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/spec/MatrixCommand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NewCommand = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const project_root_1 = require("../../../lib/project-root");
|
|
40
|
+
const diagnostics_1 = require("../../../lib/diagnostics");
|
|
41
|
+
const agent_1 = require("../../../lib/agent");
|
|
42
|
+
const command_1 = require("../../../lib/command");
|
|
43
|
+
const MatrixCommand_1 = require("./MatrixCommand");
|
|
44
|
+
const derived_writes_1 = require("../../../lib/derived-writes");
|
|
45
|
+
const DiskTraceabilityRepository_1 = require("../../../../packages/core/src/infrastructure/DiskTraceabilityRepository");
|
|
46
|
+
const AddRequirementUseCase_1 = require("../../../../packages/core/src/application/AddRequirementUseCase");
|
|
47
|
+
const SpecSections_1 = require("../../../../packages/core/src/domain/SpecSections");
|
|
48
|
+
const NewRequirement_1 = require("../../../../packages/core/src/domain/NewRequirement");
|
|
49
|
+
const COLOR_ENABLED = process.stdout.isTTY && process.env.NO_COLOR === undefined && process.env.TERM !== "dumb";
|
|
50
|
+
const c = {
|
|
51
|
+
reset: COLOR_ENABLED ? "\x1b[0m" : "",
|
|
52
|
+
bold: COLOR_ENABLED ? "\x1b[1m" : "",
|
|
53
|
+
dim: COLOR_ENABLED ? "\x1b[2m" : "",
|
|
54
|
+
green: COLOR_ENABLED ? "\x1b[32m" : "",
|
|
55
|
+
};
|
|
56
|
+
const NULL_SHAPE = { requirement: null };
|
|
57
|
+
function usage() {
|
|
58
|
+
process.stdout.write(`
|
|
59
|
+
✨ ${c.bold}specgate new${c.reset} "<what the requirement does>" [--feature <path>] [--json]
|
|
60
|
+
|
|
61
|
+
One requirement, written in the three places it lives:
|
|
62
|
+
spec.md a draft ## REQ-NNN section to rewrite
|
|
63
|
+
features/<slug>.feature a tagged scenario of <placeholders> to fill in
|
|
64
|
+
docs/specs/traceability.md its row, linked to that scenario
|
|
65
|
+
|
|
66
|
+
--feature <path> put the scenario in this file (appended if it exists)
|
|
67
|
+
|
|
68
|
+
It starts as Draft, which owes nothing: the gate passes. Once it is
|
|
69
|
+
delivered, \`specgate check\` refuses any <placeholder> left in the scenario.
|
|
70
|
+
|
|
71
|
+
`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* `specgate new` — one requirement in one step.
|
|
75
|
+
*
|
|
76
|
+
* Before it, a requirement took `req add`, an edit to spec.md, a hand-written
|
|
77
|
+
* `.feature` with the right tags, and `req link --feature`. Four steps, three
|
|
78
|
+
* files, and a tag syntax nobody remembers: the team said the tool was hard
|
|
79
|
+
* to absorb, and this was the first thing they did with it.
|
|
80
|
+
*/
|
|
81
|
+
class NewCommand extends command_1.BaseCommand {
|
|
82
|
+
execute() {
|
|
83
|
+
const argv = this.args;
|
|
84
|
+
if (argv.includes("--help") || argv.includes("-h")) {
|
|
85
|
+
usage();
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
const io = (0, agent_1.agentIo)((0, agent_1.wantsJson)(argv));
|
|
89
|
+
let projectDirArg = ".";
|
|
90
|
+
let featureArg;
|
|
91
|
+
const words = [];
|
|
92
|
+
for (let i = 0; i < argv.length; i++) {
|
|
93
|
+
const a = argv[i];
|
|
94
|
+
if (a === "--project-dir")
|
|
95
|
+
projectDirArg = argv[++i] || ".";
|
|
96
|
+
else if (a === "--feature")
|
|
97
|
+
featureArg = argv[++i];
|
|
98
|
+
else if (a === "--json")
|
|
99
|
+
continue;
|
|
100
|
+
else if (a.startsWith("-")) {
|
|
101
|
+
io.usage(NULL_SHAPE, [
|
|
102
|
+
(0, diagnostics_1.error)("unknown_flag", `Unknown flag for new: ${a}`, { fix: "specgate new --help" }),
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
else
|
|
106
|
+
words.push(a);
|
|
107
|
+
}
|
|
108
|
+
const title = words.join(" ").trim();
|
|
109
|
+
if (!title) {
|
|
110
|
+
io.usage(NULL_SHAPE, [
|
|
111
|
+
(0, diagnostics_1.error)("title_required", "A title is required.", {
|
|
112
|
+
fix: 'specgate new "Totals are rounded half-up"',
|
|
113
|
+
}),
|
|
114
|
+
]);
|
|
115
|
+
}
|
|
116
|
+
let projectDir;
|
|
117
|
+
try {
|
|
118
|
+
projectDir = (0, project_root_1.resolveProjectDir)(projectDirArg);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
projectDir = path.resolve(projectDirArg);
|
|
122
|
+
}
|
|
123
|
+
if (!fs.existsSync(path.join(projectDir, "docs", "specs", "traceability.md"))) {
|
|
124
|
+
io.usage(NULL_SHAPE, [
|
|
125
|
+
(0, diagnostics_1.error)("traceability_not_found", "No docs/specs/traceability.md here.", {
|
|
126
|
+
file: "docs/specs/traceability.md",
|
|
127
|
+
fix: "Run `specgate adopt` on an existing repository, or `specgate init` for a new one.",
|
|
128
|
+
}),
|
|
129
|
+
]);
|
|
130
|
+
}
|
|
131
|
+
const featureRel = (featureArg || `features/${(0, NewRequirement_1.slugFor)(title)}.feature`)
|
|
132
|
+
.split(path.sep)
|
|
133
|
+
.join("/");
|
|
134
|
+
if (!featureRel.endsWith(".feature")) {
|
|
135
|
+
io.usage(NULL_SHAPE, [
|
|
136
|
+
(0, diagnostics_1.error)("not_a_feature_file", `--feature must name a .feature file: ${featureRel}`, {
|
|
137
|
+
fix: `specgate new "${title}" --feature features/${(0, NewRequirement_1.slugFor)(title)}.feature`,
|
|
138
|
+
}),
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
const result = new AddRequirementUseCase_1.AddRequirementUseCase(new DiskTraceabilityRepository_1.DiskTraceabilityRepository()).execute(projectDir, {
|
|
142
|
+
useCase: title,
|
|
143
|
+
featureFile: featureRel,
|
|
144
|
+
});
|
|
145
|
+
const reqId = result.reqId;
|
|
146
|
+
const scenarioId = result.scenarioId;
|
|
147
|
+
const featureAbs = path.join(projectDir, featureRel);
|
|
148
|
+
const existing = fs.existsSync(featureAbs) ? fs.readFileSync(featureAbs, "utf8") : null;
|
|
149
|
+
fs.mkdirSync(path.dirname(featureAbs), { recursive: true });
|
|
150
|
+
fs.writeFileSync(featureAbs, (0, NewRequirement_1.featureWithScenario)(existing, title, (0, NewRequirement_1.scenarioBlock)(reqId, scenarioId, title)), "utf8");
|
|
151
|
+
const specPath = path.join(projectDir, "spec.md");
|
|
152
|
+
let wroteSection = false;
|
|
153
|
+
if (fs.existsSync(specPath)) {
|
|
154
|
+
const written = (0, SpecSections_1.appendRequirementSection)(fs.readFileSync(specPath, "utf8"), reqId, title);
|
|
155
|
+
if (written.added) {
|
|
156
|
+
fs.writeFileSync(specPath, written.content, "utf8");
|
|
157
|
+
wroteSection = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
(0, MatrixCommand_1.refreshDerivedMatrix)(projectDir);
|
|
161
|
+
io.emit({
|
|
162
|
+
requirement: {
|
|
163
|
+
id: reqId,
|
|
164
|
+
scenarioId,
|
|
165
|
+
title,
|
|
166
|
+
status: "Draft",
|
|
167
|
+
featureFile: featureRel,
|
|
168
|
+
featureCreated: existing === null,
|
|
169
|
+
specSection: wroteSection,
|
|
170
|
+
},
|
|
171
|
+
}, () => process.stdout.write(`${c.green}✔${c.reset} ${c.bold}${reqId}${c.reset} ${title} ${c.dim}(Draft)${c.reset}\n` +
|
|
172
|
+
(wroteSection
|
|
173
|
+
? ` ${c.dim}spec.md ## ${reqId} — rewrite the obligation${c.reset}\n`
|
|
174
|
+
: "") +
|
|
175
|
+
` ${c.dim}${featureRel.padEnd(28)} @${scenarioId} — fill in the <placeholders>${c.reset}\n` +
|
|
176
|
+
` ${c.dim}docs/specs/traceability.md row linked to the scenario${c.reset}\n\n` +
|
|
177
|
+
((0, derived_writes_1.isDerivedProject)(projectDir)
|
|
178
|
+
? ` ${c.dim}Next: write a test that mentions ${reqId} — that is the link — then ${c.reset}specgate check\n`
|
|
179
|
+
: ` ${c.dim}Next: write the test, then ${c.reset}specgate req link ${reqId} --test <path> --code <path>\n`)));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.NewCommand = NewCommand;
|
|
183
|
+
//# sourceMappingURL=NewCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NewCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/spec/NewCommand.ts"],"names":[],"mappings":"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"}
|