@rsaglobaltech/specgate 0.8.1 → 0.10.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 (144) hide show
  1. package/CHANGELOG.md +196 -0
  2. package/README.md +17 -25
  3. package/bin/specgate.ts +23 -5
  4. package/dist/bin/specgate.js +19 -4
  5. package/dist/bin/specgate.js.map +1 -1
  6. package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js +56 -0
  7. package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js.map +1 -1
  8. package/dist/packages/core/src/application/ValidateProjectUseCase.js +54 -0
  9. package/dist/packages/core/src/application/ValidateProjectUseCase.js.map +1 -1
  10. package/dist/packages/core/src/domain/AdversarialProbe.js +75 -0
  11. package/dist/packages/core/src/domain/AdversarialProbe.js.map +1 -0
  12. package/dist/packages/core/src/domain/AgentPrompt.js +52 -3
  13. package/dist/packages/core/src/domain/AgentPrompt.js.map +1 -1
  14. package/dist/packages/core/src/domain/DeclaredArtifacts.js +25 -0
  15. package/dist/packages/core/src/domain/DeclaredArtifacts.js.map +1 -1
  16. package/dist/packages/core/src/domain/DoneVerification.js +89 -0
  17. package/dist/packages/core/src/domain/DoneVerification.js.map +1 -0
  18. package/dist/packages/core/src/domain/GateCommandIntegrity.js +139 -0
  19. package/dist/packages/core/src/domain/GateCommandIntegrity.js.map +1 -0
  20. package/dist/packages/core/src/domain/GherkinQuality.js +19 -3
  21. package/dist/packages/core/src/domain/GherkinQuality.js.map +1 -1
  22. package/dist/packages/core/src/domain/HarnessConfig.js +6 -0
  23. package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
  24. package/dist/packages/core/src/domain/MultiStack.js +96 -0
  25. package/dist/packages/core/src/domain/MultiStack.js.map +1 -0
  26. package/dist/packages/core/src/domain/NewRequirement.js +46 -0
  27. package/dist/packages/core/src/domain/NewRequirement.js.map +1 -0
  28. package/dist/packages/core/src/domain/Precedents.js +96 -0
  29. package/dist/packages/core/src/domain/Precedents.js.map +1 -0
  30. package/dist/packages/core/src/domain/RequirementPlan.js +1 -0
  31. package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -1
  32. package/dist/packages/core/src/domain/RequirementRemoval.js +161 -0
  33. package/dist/packages/core/src/domain/RequirementRemoval.js.map +1 -0
  34. package/dist/packages/core/src/domain/ScenarioCoverage.js +178 -0
  35. package/dist/packages/core/src/domain/ScenarioCoverage.js.map +1 -0
  36. package/dist/packages/core/src/domain/SpecSections.js +206 -0
  37. package/dist/packages/core/src/domain/SpecSections.js.map +1 -0
  38. package/dist/packages/core/src/domain/TestCommand.js +82 -0
  39. package/dist/packages/core/src/domain/TestCommand.js.map +1 -0
  40. package/dist/packages/core/src/domain/TraceabilityFormat.js +45 -2
  41. package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -1
  42. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +31 -0
  43. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
  44. package/dist/packages/core/test/unit/adversarial-probe.test.js +81 -0
  45. package/dist/packages/core/test/unit/adversarial-probe.test.js.map +1 -0
  46. package/dist/packages/core/test/unit/done-verification.test.js +84 -0
  47. package/dist/packages/core/test/unit/done-verification.test.js.map +1 -0
  48. package/dist/packages/core/test/unit/gate-command-integrity.test.js +114 -0
  49. package/dist/packages/core/test/unit/gate-command-integrity.test.js.map +1 -0
  50. package/dist/packages/core/test/unit/gherkin-quality.test.js +28 -0
  51. package/dist/packages/core/test/unit/gherkin-quality.test.js.map +1 -1
  52. package/dist/packages/core/test/unit/multi-stack.test.js +86 -0
  53. package/dist/packages/core/test/unit/multi-stack.test.js.map +1 -0
  54. package/dist/packages/core/test/unit/new-requirement.test.js +67 -0
  55. package/dist/packages/core/test/unit/new-requirement.test.js.map +1 -0
  56. package/dist/packages/core/test/unit/precedents.test.js +99 -0
  57. package/dist/packages/core/test/unit/precedents.test.js.map +1 -0
  58. package/dist/packages/core/test/unit/requirement-removal.test.js +124 -0
  59. package/dist/packages/core/test/unit/requirement-removal.test.js.map +1 -0
  60. package/dist/packages/core/test/unit/scenario-coverage.test.js +146 -0
  61. package/dist/packages/core/test/unit/scenario-coverage.test.js.map +1 -0
  62. package/dist/packages/core/test/unit/spec-sections.test.js +146 -0
  63. package/dist/packages/core/test/unit/spec-sections.test.js.map +1 -0
  64. package/dist/packages/core/test/unit/test-command.test.js +81 -0
  65. package/dist/packages/core/test/unit/test-command.test.js.map +1 -0
  66. package/dist/packages/core/test/unit/validate-project.test.js +21 -0
  67. package/dist/packages/core/test/unit/validate-project.test.js.map +1 -1
  68. package/dist/scripts/agents/commands.js +1 -1
  69. package/dist/scripts/agents/commands.js.map +1 -1
  70. package/dist/scripts/agents/init.js +59 -15
  71. package/dist/scripts/agents/init.js.map +1 -1
  72. package/dist/scripts/change/instructions.js +2 -2
  73. package/dist/scripts/change/instructions.js.map +1 -1
  74. package/dist/scripts/check.js +10 -0
  75. package/dist/scripts/check.js.map +1 -0
  76. package/dist/scripts/cli/commands/change/ChangeCommand.js +2 -2
  77. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  78. package/dist/scripts/cli/commands/config/CiInitCommand.js +1 -1
  79. package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -1
  80. package/dist/scripts/cli/commands/harness/RunCommand.js +214 -9
  81. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  82. package/dist/scripts/cli/commands/pack/InferPackCommand.js +331 -31
  83. package/dist/scripts/cli/commands/pack/InferPackCommand.js.map +1 -1
  84. package/dist/scripts/cli/commands/project/AdoptCommand.js +86 -9
  85. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
  86. package/dist/scripts/cli/commands/project/InitProjectCommand.js +286 -45
  87. package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
  88. package/dist/scripts/cli/commands/project/UpdateCommand.js +118 -8
  89. package/dist/scripts/cli/commands/project/UpdateCommand.js.map +1 -1
  90. package/dist/scripts/cli/commands/quality/CheckCommand.js +184 -0
  91. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -0
  92. package/dist/scripts/cli/commands/quality/DoctorCommand.js +20 -2
  93. package/dist/scripts/cli/commands/quality/DoctorCommand.js.map +1 -1
  94. package/dist/scripts/cli/commands/quality/FixCommand.js +1 -1
  95. package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -1
  96. package/dist/scripts/cli/commands/quality/ReportCommand.js +1 -1
  97. package/dist/scripts/cli/commands/quality/ReportCommand.js.map +1 -1
  98. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +406 -24
  99. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
  100. package/dist/scripts/cli/commands/spec/DoneCommand.js +108 -0
  101. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
  102. package/dist/scripts/cli/commands/spec/NewCommand.js +178 -0
  103. package/dist/scripts/cli/commands/spec/NewCommand.js.map +1 -0
  104. package/dist/scripts/cli/commands/spec/PlanCommand.js +8 -2
  105. package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -1
  106. package/dist/scripts/cli/commands/spec/ReqCommand.js +124 -4
  107. package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -1
  108. package/dist/scripts/cli/commands/spec/StatusCommand.js +84 -32
  109. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  110. package/dist/scripts/docs/build-site.js +145 -35
  111. package/dist/scripts/docs/build-site.js.map +1 -1
  112. package/dist/scripts/docs/components.js +208 -0
  113. package/dist/scripts/docs/components.js.map +1 -0
  114. package/dist/scripts/docs/highlight.js +180 -0
  115. package/dist/scripts/docs/highlight.js.map +1 -0
  116. package/dist/scripts/docs/icons.js +63 -0
  117. package/dist/scripts/docs/icons.js.map +1 -0
  118. package/dist/scripts/docs/nav.js +9 -3
  119. package/dist/scripts/docs/nav.js.map +1 -1
  120. package/dist/scripts/gen_mcp_tools.js +22 -2
  121. package/dist/scripts/gen_mcp_tools.js.map +1 -1
  122. package/dist/scripts/harness/init.js +101 -40
  123. package/dist/scripts/harness/init.js.map +1 -1
  124. package/dist/scripts/harness/worktree-lock.js +161 -0
  125. package/dist/scripts/harness/worktree-lock.js.map +1 -0
  126. package/dist/scripts/infer_pack.js +4 -1
  127. package/dist/scripts/infer_pack.js.map +1 -1
  128. package/dist/scripts/lib/surface.js +88 -38
  129. package/dist/scripts/lib/surface.js.map +1 -1
  130. package/dist/scripts/new.js +10 -0
  131. package/dist/scripts/new.js.map +1 -0
  132. package/dist/scripts/plugin/gate-hook.js +2 -2
  133. package/dist/scripts/plugin/gate-hook.js.map +1 -1
  134. package/package.json +5 -2
  135. package/templates/adopt/AI_RULES.md.tpl +1 -1
  136. package/templates/adopt/spec.md.tpl +4 -4
  137. package/templates/base/spec.md.tpl +12 -0
  138. package/templates/ci/azure.yml.tpl +2 -2
  139. package/templates/ci/github.yml.tpl +2 -2
  140. package/templates/ci/gitlab.yml.tpl +1 -1
  141. package/templates/ci/jenkins.tpl +1 -1
  142. package/templates/contracts/test-strategy.md.tpl +2 -2
  143. package/templates/harness/harness.config.yaml.tpl +3 -3
  144. package/templates/harness/prompt-prefix.md.tpl +2 -5
@@ -37,11 +37,15 @@ exports.InferPackCommand = void 0;
37
37
  exports.parseArgs = parseArgs;
38
38
  exports.parseFeatureFile = parseFeatureFile;
39
39
  exports.toPascalCase = toPascalCase;
40
+ exports.isQueryStep = isQueryStep;
41
+ exports.extractPayloadHints = extractPayloadHints;
40
42
  exports.collectRequirementIds = collectRequirementIds;
41
43
  exports.extractEventNames = extractEventNames;
42
44
  exports.inferModel = inferModel;
45
+ exports.mergeModels = mergeModels;
43
46
  exports.renderYamlFragment = renderYamlFragment;
44
47
  const fs = __importStar(require("node:fs"));
48
+ const path = __importStar(require("node:path"));
45
49
  const command_1 = require("../../../lib/command");
46
50
  const Gherkin_1 = require("../../../../packages/core/src/domain/Gherkin");
47
51
  function logError(msg) {
@@ -54,15 +58,22 @@ function usage() {
54
58
  "(requirements, use_cases, commands, events, scenarios) to stdout. The\n" +
55
59
  "output is a heuristic skeleton — review every TODO before merging.\n\n" +
56
60
  "Options:\n" +
57
- " --from <path> Gherkin .feature file to infer from (required)\n" +
61
+ " --from <path> Gherkin .feature file, or a directory of them.\n" +
62
+ " Repeat for several: one fragment is inferred from all\n" +
63
+ " of them together, so a command shared by three files\n" +
64
+ " is proposed once rather than three times.\n" +
58
65
  " --format <fmt> Output format: yaml (default) or json\n");
59
66
  }
60
67
  function parseArgs(argv) {
61
- const opts = { from: null, format: "yaml" };
68
+ const opts = { from: null, sources: [], format: "yaml" };
62
69
  for (let i = 0; i < argv.length; i++) {
63
70
  const a = argv[i];
64
71
  if (a === "--from" && argv[i + 1]) {
65
- opts.from = argv[++i];
72
+ // Repeatable: a capability is rarely one file, and inferring per file
73
+ // proposes the same command once per file, each with its own id.
74
+ const value = argv[++i];
75
+ opts.sources.push(value);
76
+ opts.from = opts.from ?? value;
66
77
  }
67
78
  else if (a === "--format" && argv[i + 1]) {
68
79
  opts.format = argv[++i];
@@ -103,18 +114,112 @@ function parseFeatureFile(content) {
103
114
  function pad(n) {
104
115
  return String(n).padStart(3, "0");
105
116
  }
117
+ /**
118
+ * Words that carry no meaning in a name.
119
+ *
120
+ * Gherkin is written as prose — "the user submits the form for a new order" —
121
+ * and a name built from every word is `TheUserSubmitsThe`. Dropping the glue
122
+ * leaves `UserSubmitsForm`, which is the name a person would have written.
123
+ *
124
+ * Deliberately short. A long stopword list starts removing domain words that
125
+ * happen to be common, and a name missing its noun is worse than a long one.
126
+ */
127
+ const STOPWORDS = new Set([
128
+ "a",
129
+ "an",
130
+ "the",
131
+ "and",
132
+ "or",
133
+ "of",
134
+ "for",
135
+ "to",
136
+ "in",
137
+ "on",
138
+ "at",
139
+ "by",
140
+ "with",
141
+ "from",
142
+ "into",
143
+ "that",
144
+ "this",
145
+ "then",
146
+ "when",
147
+ "is",
148
+ "are",
149
+ "be",
150
+ "has",
151
+ "have",
152
+ "it",
153
+ "its",
154
+ "as",
155
+ "so",
156
+ "if",
157
+ ]);
158
+ /**
159
+ * Strip `<placeholder>` tokens, repeatedly until nothing changes.
160
+ *
161
+ * One pass leaves a nested or malformed token behind — `<<a>b>` becomes `<b>` —
162
+ * which CodeQL reports as `js/incomplete-multi-character-sanitization`. Nothing
163
+ * here reaches a browser, but a half-stripped step would still produce a wrong
164
+ * command name, and `build-site.ts` strips tags the same way for the same
165
+ * reason.
166
+ */
167
+ function stripPlaceholders(text) {
168
+ let out = String(text);
169
+ let previous;
170
+ do {
171
+ previous = out;
172
+ out = out.replace(/<[^<>]*>/g, " ");
173
+ } while (out !== previous);
174
+ return out;
175
+ }
106
176
  function toPascalCase(text) {
107
- const words = text
108
- .replace(/"[^"]*"/g, "")
177
+ const words = stripPlaceholders(text.replace(/"[^"]*"/g, ""))
109
178
  .replace(/[^A-Za-z0-9 ]/g, " ")
110
179
  .split(/\s+/)
111
180
  .filter(Boolean)
112
181
  .filter((w) => !/^\d+$/.test(w))
182
+ .filter((w) => !STOPWORDS.has(w.toLowerCase()))
113
183
  .slice(0, 4);
114
184
  if (words.length === 0)
115
185
  return "Action";
116
186
  return words.map((w) => w[0].toUpperCase() + w.slice(1).toLowerCase()).join("");
117
187
  }
188
+ /**
189
+ * Does this `When` read the system, or change it?
190
+ *
191
+ * The pack model already separates the two — commands and `QRY-*` ids — and
192
+ * inference did not, so every query arrived proposed as a command and had to be
193
+ * corrected by hand. The verb is the only signal a heuristic has, and it is a
194
+ * good one: "views", "searches", "lists" are not writes in any domain.
195
+ *
196
+ * Wrong sometimes, like everything here. The output keeps its `TODO` and is a
197
+ * skeleton to review (ADR-0014).
198
+ */
199
+ const QUERY_VERBS = /\b(views?|sees?|reads?|lists?|searches|filters?|browses?|gets?|fetch(es)?|queries|requests? the|opens?|checks?)\b/i;
200
+ function isQueryStep(text) {
201
+ return QUERY_VERBS.test(String(text || ""));
202
+ }
203
+ /**
204
+ * Field names a step mentions, as a starting point for a payload.
205
+ *
206
+ * Two sources, both explicit in the Gherkin rather than guessed from prose:
207
+ * `<placeholders>` from a Scenario Outline, and `key: value` or `key = value`
208
+ * pairs. Quoted literals are values, not names, so they are not fields.
209
+ *
210
+ * The least certain of the five inferences, which is why every field it
211
+ * proposes carries `TODO` for its type.
212
+ */
213
+ function extractPayloadHints(text) {
214
+ const found = new Set();
215
+ for (const m of String(text || "").matchAll(/<([A-Za-z][\w ]*)>/g)) {
216
+ found.add(m[1].trim().replace(/\s+/g, "_").toLowerCase());
217
+ }
218
+ for (const m of String(text || "").matchAll(/\b([a-z][\w]*)\s*[:=]\s*(?:"|\d)/gi)) {
219
+ found.add(m[1].toLowerCase());
220
+ }
221
+ return [...found];
222
+ }
118
223
  function collectRequirementIds(parsed) {
119
224
  const ids = new Set();
120
225
  const scan = (tags) => {
@@ -157,18 +262,45 @@ function inferModel(parsed, sourceFile) {
157
262
  emits: [],
158
263
  };
159
264
  const commands = [];
265
+ const queries = [];
160
266
  const events = [];
161
267
  const scenarios = [];
162
268
  let ci = 1;
269
+ let qi = 1;
163
270
  let ei = 1;
164
271
  let si = 1;
165
272
  for (const scn of parsed.scenarios) {
166
273
  const scnId = `SCN-${pad(si++)}`;
167
274
  const whenStep = scn.steps.find((s) => s.keyword === "when");
168
- let commandName = null;
275
+ let operationName = null;
276
+ let isQuery = false;
169
277
  if (whenStep) {
170
- commandName = `${toPascalCase(whenStep.text)}Command`;
171
- commands.push({ id: `CMD-${pad(ci++)}`, name: commandName });
278
+ isQuery = isQueryStep(whenStep.text);
279
+ operationName = `${toPascalCase(whenStep.text)}${isQuery ? "Query" : "Command"}`;
280
+ const bucket = isQuery ? queries : commands;
281
+ // Deduplicated by name. Two scenarios exercising the same operation —
282
+ // the happy path and its failure — used to produce two identical entries
283
+ // with different ids, which was the most common thing a reader deleted
284
+ // by hand.
285
+ const existing = bucket.find((c) => c.name === operationName);
286
+ if (existing) {
287
+ // A second scenario usually mentions fields the first did not.
288
+ for (const field of extractPayloadHints(whenStep.text)) {
289
+ if (!existing.fields.some((f) => f.name === field)) {
290
+ existing.fields.push({ name: field, type: "TODO: type" });
291
+ }
292
+ }
293
+ }
294
+ else {
295
+ bucket.push({
296
+ id: isQuery ? `QRY-${pad(qi++)}` : `CMD-${pad(ci++)}`,
297
+ name: operationName,
298
+ fields: extractPayloadHints(whenStep.text).map((name) => ({
299
+ name,
300
+ type: "TODO: type",
301
+ })),
302
+ });
303
+ }
172
304
  }
173
305
  const eventNames = [];
174
306
  for (const step of scn.steps.filter((s) => s.keyword === "then")) {
@@ -184,14 +316,125 @@ function inferModel(parsed, sourceFile) {
184
316
  id: scnId,
185
317
  title: scn.title,
186
318
  use_case: useCase.id,
187
- command: commandName || "TODO: command",
319
+ // The key still says `command` for a query, because that is what the
320
+ // matrix column is called. Renaming it here would be a format change
321
+ // wearing an inference's clothes.
322
+ command: operationName || "TODO: command",
188
323
  events: eventNames,
189
324
  });
190
325
  }
191
326
  if (commands.length > 0)
192
327
  useCase.command = commands[0].name;
328
+ else if (queries.length > 0)
329
+ useCase.command = queries[0].name;
193
330
  useCase.emits = [...new Set(events.map((e) => e.name))];
194
- return { requirements, use_cases: [useCase], commands, events, scenarios };
331
+ return {
332
+ requirements,
333
+ use_cases: [useCase],
334
+ commands,
335
+ queries,
336
+ events,
337
+ scenarios,
338
+ __file: sourceFile,
339
+ };
340
+ }
341
+ /**
342
+ * One model from several feature files.
343
+ *
344
+ * A capability is rarely one file, and inferring per file loses what they
345
+ * share: the same command appears in three of them and is proposed three
346
+ * times, each with its own id. Merging by name is the same rule the per-file
347
+ * dedup uses, applied one level up.
348
+ *
349
+ * Requirement ids are unioned; the placeholder `REQ-XXX` only survives when no
350
+ * file named a real one, so one tagged file rescues the whole set.
351
+ */
352
+ function mergeModels(models, sourceFiles) {
353
+ if (models.length === 1)
354
+ return models[0];
355
+ const merged = {
356
+ requirements: [],
357
+ use_cases: [],
358
+ commands: [],
359
+ queries: [],
360
+ events: [],
361
+ scenarios: [],
362
+ };
363
+ const byName = (list, entry) => list.find((e) => e.name === entry.name);
364
+ let si = 1;
365
+ for (const model of models) {
366
+ for (const req of model.requirements) {
367
+ if (req.id === "REQ-XXX")
368
+ continue;
369
+ if (!merged.requirements.some((r) => r.id === req.id))
370
+ merged.requirements.push(req);
371
+ }
372
+ for (const key of ["commands", "queries", "events"]) {
373
+ for (const entry of model[key] || []) {
374
+ const existing = byName(merged[key], entry);
375
+ if (!existing) {
376
+ merged[key].push({ ...entry });
377
+ continue;
378
+ }
379
+ for (const field of entry.fields || []) {
380
+ if (!(existing.fields || []).some((f) => f.name === field.name)) {
381
+ existing.fields = [...(existing.fields || []), field];
382
+ }
383
+ }
384
+ }
385
+ }
386
+ // `__file` is bookkeeping for the renumbering below and never rendered:
387
+ // two files may both carry `UC-XXX`, so the name alone cannot say which
388
+ // use case a scenario belonged to.
389
+ for (const scn of model.scenarios) {
390
+ merged.scenarios.push({ ...scn, id: `SCN-${pad(si++)}`, __file: model.__file });
391
+ }
392
+ for (const uc of model.use_cases) {
393
+ if (!merged.use_cases.some((u) => u.name === uc.name)) {
394
+ merged.use_cases.push({ ...uc, __file: model.__file });
395
+ }
396
+ }
397
+ }
398
+ // Ids are renumbered so the fragment reads as one document rather than as
399
+ // three concatenated ones with three CMD-001s.
400
+ const renumber = (list, prefix) => list.forEach((entry, i) => {
401
+ entry.id = `${prefix}-${pad(i + 1)}`;
402
+ });
403
+ renumber(merged.commands, "CMD");
404
+ renumber(merged.queries, "QRY");
405
+ renumber(merged.events, "EVT");
406
+ if (merged.requirements.length === 0) {
407
+ merged.requirements.push({
408
+ id: "REQ-XXX",
409
+ title: `TODO: requirement behind ${sourceFiles.length} feature file(s)`,
410
+ });
411
+ }
412
+ // Each use case keeps the requirement its own file tagged. Overwriting them
413
+ // all with the first file's would be an inference nobody made, and it would
414
+ // read as a fact rather than as the placeholder it is.
415
+ for (const uc of merged.use_cases) {
416
+ if (!merged.requirements.some((r) => r.id === uc.requirement)) {
417
+ uc.requirement = merged.requirements[0].id;
418
+ }
419
+ }
420
+ // A single file keeps `UC-XXX`, which is honest: nothing inferred an id.
421
+ // Several files cannot, because two `UC-XXX` entries in one fragment is not
422
+ // a placeholder, it is invalid YAML semantics a reader has to repair.
423
+ if (merged.use_cases.length > 1) {
424
+ merged.use_cases.forEach((uc, i) => {
425
+ const from = uc.id;
426
+ uc.id = `UC-${pad(i + 1)}`;
427
+ for (const scn of merged.scenarios) {
428
+ if (scn.use_case === from && scn.__file === uc.__file)
429
+ scn.use_case = uc.id;
430
+ }
431
+ });
432
+ }
433
+ for (const list of [merged.use_cases, merged.scenarios]) {
434
+ for (const entry of list)
435
+ delete entry.__file;
436
+ }
437
+ return merged;
195
438
  }
196
439
  function yamlScalar(value) {
197
440
  const s = String(value);
@@ -233,13 +476,37 @@ function renderYamlFragment(model, sourceFile) {
233
476
  }
234
477
  }
235
478
  out.push("");
236
- out.push("commands:");
237
- if (model.commands.length === 0)
238
- out.push(" []");
239
- for (const c of model.commands) {
240
- out.push(` - id: ${yamlScalar(c.id)}`);
241
- out.push(` name: ${yamlScalar(c.name)}`);
242
- }
479
+ // Commands and queries render the same way; the pack model separates them and
480
+ // so does this, because a query proposed as a command is a correction every
481
+ // reader had to make by hand.
482
+ const renderOperations = (label, list) => {
483
+ // `label: []` on one line. The project's YAML reader rejects a bare `[]`
484
+ // on the line below the key, and an empty `commands:` could always produce
485
+ // one — it just never had an empty list to render until queries arrived.
486
+ if (!list || list.length === 0) {
487
+ out.push(`${label}: []`);
488
+ return;
489
+ }
490
+ out.push(`${label}:`);
491
+ for (const c of list) {
492
+ out.push(` - id: ${yamlScalar(c.id)}`);
493
+ out.push(` name: ${yamlScalar(c.name)}`);
494
+ if (c.fields && c.fields.length > 0) {
495
+ // Field *names* come from the Gherkin — placeholders and `key: value`
496
+ // pairs — and never the types. A guessed type that looked confident
497
+ // would be the failure ADR-0014 names: an inference that stops looking
498
+ // like a guess.
499
+ out.push(` fields:`);
500
+ for (const f of c.fields) {
501
+ out.push(` - name: ${yamlScalar(f.name)}`);
502
+ out.push(` type: ${yamlScalar(f.type)}`);
503
+ }
504
+ }
505
+ }
506
+ };
507
+ renderOperations("commands", model.commands);
508
+ out.push("");
509
+ renderOperations("queries", model.queries || []);
243
510
  out.push("");
244
511
  out.push("events:");
245
512
  if (model.events.length === 0)
@@ -277,25 +544,58 @@ class InferPackCommand extends command_1.BaseCommand {
277
544
  usage();
278
545
  process.exit(2);
279
546
  }
280
- let content;
281
- try {
282
- content = fs.readFileSync(opts.from, "utf8");
283
- }
284
- catch (err) {
285
- logError(`Cannot read feature file '${opts.from}': ${err.message}`);
286
- process.exit(1);
547
+ // A directory expands to the `.feature` files in it, which is how a
548
+ // capability is usually laid out.
549
+ const files = [];
550
+ for (const source of opts.sources) {
551
+ let stat;
552
+ try {
553
+ stat = fs.statSync(source);
554
+ }
555
+ catch (err) {
556
+ logError(`Cannot read '${source}': ${err.message}`);
557
+ process.exit(1);
558
+ }
559
+ if (stat.isDirectory()) {
560
+ const found = fs
561
+ .readdirSync(source)
562
+ .filter((name) => name.endsWith(".feature"))
563
+ .sort()
564
+ .map((name) => path.join(source, name));
565
+ if (found.length === 0) {
566
+ logError(`No .feature files in directory '${source}'.`);
567
+ process.exit(1);
568
+ }
569
+ files.push(...found);
570
+ }
571
+ else {
572
+ files.push(source);
573
+ }
287
574
  }
288
- const parsed = parseFeatureFile(content);
289
- if (parsed.scenarios.length === 0) {
290
- logError(`No Gherkin scenarios found in '${opts.from}'.`);
291
- process.exit(1);
575
+ const models = [];
576
+ for (const file of files) {
577
+ let content;
578
+ try {
579
+ content = fs.readFileSync(file, "utf8");
580
+ }
581
+ catch (err) {
582
+ logError(`Cannot read feature file '${file}': ${err.message}`);
583
+ process.exit(1);
584
+ }
585
+ const parsed = parseFeatureFile(content);
586
+ if (parsed.scenarios.length === 0) {
587
+ logError(`No Gherkin scenarios found in '${file}'.`);
588
+ process.exit(1);
589
+ }
590
+ models.push(inferModel(parsed, file));
292
591
  }
293
- const model = inferModel(parsed, opts.from);
592
+ const model = mergeModels(models, files);
593
+ const label = files.length === 1 ? files[0] : `${files.length} feature files`;
294
594
  if (opts.format === "json") {
295
- process.stdout.write(JSON.stringify({ schemaVersion: 1, source: opts.from, ...model }, null, 2) + "\n");
595
+ process.stdout.write(JSON.stringify({ schemaVersion: 1, source: files, ...model }, null, 2) + "\n");
296
596
  }
297
597
  else {
298
- process.stdout.write(renderYamlFragment(model, opts.from) + "\n");
598
+ process.stdout.write(renderYamlFragment(model, label) + "\n");
299
599
  }
300
600
  process.exit(0);
301
601
  }
@@ -1 +1 @@
1
- {"version":3,"file":"InferPackCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/pack/InferPackCommand.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InferPackCommand.js","sourceRoot":"","sources":["../../../../../scripts/cli/commands/pack/InferPackCommand.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,24 @@ const PackSpec_1 = require("../../../../packages/core/src/domain/PackSpec");
43
43
  const WizardCommand_1 = require("./WizardCommand");
44
44
  const command_1 = require("../../../lib/command");
45
45
  const project_root_1 = require("../../../lib/project-root");
46
+ const TestCommand_1 = require("../../../../packages/core/src/domain/TestCommand");
47
+ /**
48
+ * `adopt` and `harness init` used to answer this differently on the same
49
+ * `pom.xml`. One detector now, so a project gets one answer.
50
+ */
51
+ function sharedTestCommand(dir) {
52
+ return ((0, TestCommand_1.detectTestCommand)({
53
+ exists: (rel) => fs.existsSync(path.join(dir, rel)),
54
+ read: (rel) => {
55
+ try {
56
+ return fs.readFileSync(path.join(dir, rel), "utf8");
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ },
62
+ }) || "");
63
+ }
46
64
  const ROOT_DIR = (0, project_root_1.findCliRoot)(__dirname);
47
65
  const ADOPT_TEMPLATES = path.join(ROOT_DIR, "templates", "adopt");
48
66
  function logInfo(msg) {
@@ -156,7 +174,7 @@ function detectStack(dir) {
156
174
  facts.PROJECT_NAME = artifactId[1].trim();
157
175
  facts.STACK = parts.join(", ");
158
176
  facts.TESTING = pom.includes("testcontainers") ? "JUnit 5, Testcontainers" : "JUnit 5";
159
- facts.TEST_CMD = fs.existsSync(path.join(dir, "mvnw")) ? "./mvnw -B test" : "mvn -B test";
177
+ facts.TEST_CMD = sharedTestCommand(dir);
160
178
  facts.detected = "pom.xml";
161
179
  return facts;
162
180
  }
@@ -170,7 +188,7 @@ function detectStack(dir) {
170
188
  parts.push("Gradle");
171
189
  facts.STACK = parts.join(", ");
172
190
  facts.TESTING = "JUnit 5";
173
- facts.TEST_CMD = fs.existsSync(path.join(dir, "gradlew")) ? "./gradlew test" : "gradle test";
191
+ facts.TEST_CMD = sharedTestCommand(dir);
174
192
  facts.detected = "build.gradle";
175
193
  return facts;
176
194
  }
@@ -208,6 +226,57 @@ function detectStack(dir) {
208
226
  facts.detected = "go.mod";
209
227
  return facts;
210
228
  }
229
+ // Python. A cold adoption on Flask reported `detected from none` with
230
+ // `pyproject.toml` sitting in the root, so `Stack: unknown` propagated into
231
+ // spec.md, AI_RULES.md and every capability proposal downstream. Meanwhile
232
+ // `harness init`, in the same directory, wrote `test_cmd: pytest` — the two
233
+ // halves of the tool disagreeing about what the project even is.
234
+ const pyproject = readIfExists(path.join(dir, "pyproject.toml"));
235
+ const setupPy = readIfExists(path.join(dir, "setup.py"));
236
+ if (pyproject !== null || setupPy !== null) {
237
+ const source = pyproject || setupPy || "";
238
+ const parts = ["Python"];
239
+ if (/\bdjango\b/i.test(source))
240
+ parts.push("Django");
241
+ else if (/\bfastapi\b/i.test(source))
242
+ parts.push("FastAPI");
243
+ else if (/\bflask\b/i.test(source))
244
+ parts.push("Flask");
245
+ if (/\bpoetry\b/i.test(source))
246
+ parts.push("Poetry");
247
+ else if (pyproject !== null)
248
+ parts.push("pyproject");
249
+ facts.STACK = parts.join(", ");
250
+ // `tox.ini` means the project runs its suite through tox; saying `pytest`
251
+ // there would be a guess that fails on the first run.
252
+ const viaTox = readIfExists(path.join(dir, "tox.ini")) !== null;
253
+ facts.TESTING = viaTox ? "tox" : "pytest";
254
+ facts.TEST_CMD = viaTox ? "tox" : "pytest";
255
+ facts.detected = pyproject !== null ? "pyproject.toml" : "setup.py";
256
+ const nameMatch = /^\s*name\s*=\s*["']([^"']+)["']/m.exec(source);
257
+ if (nameMatch)
258
+ facts.PROJECT_NAME = nameMatch[1].trim();
259
+ return facts;
260
+ }
261
+ if (readIfExists(path.join(dir, "Cargo.toml")) !== null) {
262
+ facts.STACK = "Rust, Cargo";
263
+ facts.TESTING = "cargo test";
264
+ facts.TEST_CMD = "cargo test";
265
+ facts.detected = "Cargo.toml";
266
+ return facts;
267
+ }
268
+ // .NET puts the manifest next to the code rather than at the root, so this
269
+ // looks for one rather than reading a fixed name.
270
+ const csproj = fs.existsSync(dir)
271
+ ? fs.readdirSync(dir).find((f) => f.endsWith(".csproj") || f.endsWith(".sln"))
272
+ : undefined;
273
+ if (csproj) {
274
+ facts.STACK = ".NET";
275
+ facts.TESTING = "dotnet test";
276
+ facts.TEST_CMD = "dotnet test";
277
+ facts.detected = csproj;
278
+ return facts;
279
+ }
211
280
  return facts;
212
281
  }
213
282
  const ADOPT_FILES = [
@@ -367,10 +436,14 @@ function adoptMonorepo(dir, opts) {
367
436
  logInfo("📋 Summary");
368
437
  logInfo(`- Files written: ${written}${opts.dryRun ? " (dry-run, nothing on disk)" : ""}`);
369
438
  logInfo(`- Skipped: ${skipped}`);
439
+ logWarn("This does not certify your code yet — it certifies the skeleton.");
440
+ logInfo(" A green `validate` right now means the structure is in place, not that any");
441
+ logInfo(" behaviour is covered. It starts meaning something when the requirements below");
442
+ logInfo(" are real and their scenarios are linked to tests.");
370
443
  logInfo("✅ Adoption completed. Next steps:");
371
444
  logInfo(" 1. specgate validate . # validates every module listed");
372
445
  logInfo(" 2. Replace the seeded proposals in each module's spec.md with real behaviour");
373
- logInfo(" 3. Add `validate --strict-tdd` to CI to lock the gate in");
446
+ logInfo(" 3. Add `validate . --strict` to CI to lock the gate in");
374
447
  process.exit(0);
375
448
  }
376
449
  class AdoptProjectCommand extends command_1.BaseCommand {
@@ -387,7 +460,8 @@ class AdoptProjectCommand extends command_1.BaseCommand {
387
460
  adoptMonorepo(dir, opts);
388
461
  if (fs.existsSync(path.join(dir, "spec.md"))) {
389
462
  fail(`${path.join(dir, "spec.md")} already exists — this repository looks spec-driven already.\n` +
390
- "Run `specgate validate .` to check it, or remove spec.md to re-adopt.", 2);
463
+ "Run `specgate status` to see what is left, `specgate check` to gate it,\n" +
464
+ "or remove spec.md to re-adopt.", 2);
391
465
  }
392
466
  const { written, skipped, capabilities } = adoptOne(dir, opts);
393
467
  logInfo("📋 Summary");
@@ -396,17 +470,20 @@ class AdoptProjectCommand extends command_1.BaseCommand {
396
470
  if (capabilities.length > 0) {
397
471
  logInfo(`- Requirements seeded: ${capabilities.length} proposal(s) from the layout — ${capabilities.map((c) => c.id).join(", ")}`);
398
472
  }
473
+ logWarn("This does not certify your code yet — it certifies the skeleton.");
474
+ logInfo(" A green `validate` right now means the structure is in place, not that any");
475
+ logInfo(" behaviour is covered. It starts meaning something when the requirements below");
476
+ logInfo(" are real and their scenarios are linked to tests.");
399
477
  logInfo("✅ Adoption completed. Next steps:");
400
- logInfo(" 1. specgate validate . # should pass right now");
478
+ logInfo(" 1. specgate check # the gate — should pass right now");
401
479
  if (capabilities.length > 0) {
402
480
  logInfo(" 2. Argue with the seeded proposals in spec.md — each one names its evidence");
403
- logInfo(" 3. specgate plan # see what each REQ still needs");
404
481
  }
405
482
  else {
406
- logInfo(" 2. Retro-fill real requirements in spec.md (one REQ per behaviour you rely on)");
407
- logInfo(" 3. specgate plan # see what each REQ still needs");
483
+ logInfo(' 2. specgate new "<behaviour>" # one requirement you already rely on');
408
484
  }
409
- logInfo(" 4. Add `validate --strict-tdd` to CI to lock the gate in");
485
+ logInfo(" 3. specgate status # what each requirement still needs");
486
+ logInfo(" 4. specgate ci init # put the gate in CI");
410
487
  process.exit(0);
411
488
  }
412
489
  }