@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.
Files changed (75) hide show
  1. package/CHANGELOG.md +162 -0
  2. package/README.md +10 -18
  3. package/bin/specgate.ts +10 -3
  4. package/dist/bin/specgate.js +8 -3
  5. package/dist/bin/specgate.js.map +1 -1
  6. package/dist/packages/core/src/domain/DerivedMatrix.js +348 -0
  7. package/dist/packages/core/src/domain/DerivedMatrix.js.map +1 -0
  8. package/dist/packages/core/src/domain/DoneVerification.js +22 -1
  9. package/dist/packages/core/src/domain/DoneVerification.js.map +1 -1
  10. package/dist/packages/core/src/domain/GherkinQuality.js +19 -3
  11. package/dist/packages/core/src/domain/GherkinQuality.js.map +1 -1
  12. package/dist/packages/core/src/domain/NewRequirement.js +46 -0
  13. package/dist/packages/core/src/domain/NewRequirement.js.map +1 -0
  14. package/dist/packages/core/src/domain/RequirementPlan.js +1 -0
  15. package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -1
  16. package/dist/packages/core/src/domain/RequirementReadiness.js +2 -2
  17. package/dist/packages/core/src/domain/RequirementReadiness.js.map +1 -1
  18. package/dist/packages/core/src/domain/TraceabilityFormat.js +8 -1
  19. package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -1
  20. package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js +157 -0
  21. package/dist/packages/core/src/infrastructure/DerivedMatrixSources.js.map +1 -0
  22. package/dist/packages/core/test/unit/derived-matrix.test.js +196 -0
  23. package/dist/packages/core/test/unit/derived-matrix.test.js.map +1 -0
  24. package/dist/packages/core/test/unit/done-verification.test.js +7 -6
  25. package/dist/packages/core/test/unit/done-verification.test.js.map +1 -1
  26. package/dist/packages/core/test/unit/gherkin-quality.test.js +28 -0
  27. package/dist/packages/core/test/unit/gherkin-quality.test.js.map +1 -1
  28. package/dist/packages/core/test/unit/new-requirement.test.js +67 -0
  29. package/dist/packages/core/test/unit/new-requirement.test.js.map +1 -0
  30. package/dist/scripts/agents/init.js +58 -14
  31. package/dist/scripts/agents/init.js.map +1 -1
  32. package/dist/scripts/check.js +10 -0
  33. package/dist/scripts/check.js.map +1 -0
  34. package/dist/scripts/cli/commands/change/ChangeCommand.js +4 -0
  35. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  36. package/dist/scripts/cli/commands/harness/RunCommand.js +17 -5
  37. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  38. package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js +9 -0
  39. package/dist/scripts/cli/commands/pack/ExpandDomainPackCommand.js.map +1 -1
  40. package/dist/scripts/cli/commands/project/AdoptCommand.js +17 -7
  41. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
  42. package/dist/scripts/cli/commands/project/InitProjectCommand.js +51 -1
  43. package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
  44. package/dist/scripts/cli/commands/project/UpdateCommand.js +118 -8
  45. package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -1
  46. package/dist/scripts/cli/commands/quality/CheckCommand.js +192 -0
  47. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -0
  48. package/dist/scripts/cli/commands/quality/FixCommand.js +20 -0
  49. package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -1
  50. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +83 -6
  51. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
  52. package/dist/scripts/cli/commands/spec/DoneCommand.js +23 -5
  53. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
  54. package/dist/scripts/cli/commands/spec/MatrixCommand.js +305 -0
  55. package/dist/scripts/cli/commands/spec/MatrixCommand.js.map +1 -0
  56. package/dist/scripts/cli/commands/spec/NewCommand.js +183 -0
  57. package/dist/scripts/cli/commands/spec/NewCommand.js.map +1 -0
  58. package/dist/scripts/cli/commands/spec/PlanCommand.js +6 -1
  59. package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -1
  60. package/dist/scripts/cli/commands/spec/ReqCommand.js +39 -8
  61. package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -1
  62. package/dist/scripts/cli/commands/spec/StatusCommand.js +94 -33
  63. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  64. package/dist/scripts/lib/derived-writes.js +91 -0
  65. package/dist/scripts/lib/derived-writes.js.map +1 -0
  66. package/dist/scripts/lib/surface.js +67 -37
  67. package/dist/scripts/lib/surface.js.map +1 -1
  68. package/dist/scripts/matrix.js +11 -0
  69. package/dist/scripts/matrix.js.map +1 -0
  70. package/dist/scripts/new.js +10 -0
  71. package/dist/scripts/new.js.map +1 -0
  72. package/dist/scripts/plugin/gate-hook.js +2 -2
  73. package/dist/scripts/plugin/gate-hook.js.map +1 -1
  74. package/package.json +2 -1
  75. 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 strong gate: --strict-tdd,\n" +
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
- const repo = new DiskTraceabilityRepository_1.DiskTraceabilityRepository();
189
- const useCase = new UpdateRequirementStatusUseCase_1.UpdateRequirementStatusUseCase(repo);
190
- const result = useCase.execute(projectDir, opts.reqId, opts.status);
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":"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"}
1
+ {"version":3,"file":"DoneCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/spec/DoneCommand.ts"],"names":[],"mappings":"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"}
@@ -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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"}