@rsaglobaltech/specgate 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -0
- package/README.md +8 -8
- package/bin/specgate.ts +13 -2
- package/dist/bin/specgate.js +11 -1
- package/dist/bin/specgate.js.map +1 -1
- package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js +56 -0
- package/dist/packages/core/src/application/GenerateAgentPromptUseCase.js.map +1 -1
- package/dist/packages/core/src/application/ValidateProjectUseCase.js +54 -0
- package/dist/packages/core/src/application/ValidateProjectUseCase.js.map +1 -1
- package/dist/packages/core/src/domain/AdversarialProbe.js +75 -0
- package/dist/packages/core/src/domain/AdversarialProbe.js.map +1 -0
- package/dist/packages/core/src/domain/AgentPrompt.js +52 -3
- package/dist/packages/core/src/domain/AgentPrompt.js.map +1 -1
- package/dist/packages/core/src/domain/DeclaredArtifacts.js +25 -0
- package/dist/packages/core/src/domain/DeclaredArtifacts.js.map +1 -1
- package/dist/packages/core/src/domain/DoneVerification.js +68 -0
- package/dist/packages/core/src/domain/DoneVerification.js.map +1 -0
- package/dist/packages/core/src/domain/GateCommandIntegrity.js +139 -0
- package/dist/packages/core/src/domain/GateCommandIntegrity.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessConfig.js +6 -0
- package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
- package/dist/packages/core/src/domain/MultiStack.js +96 -0
- package/dist/packages/core/src/domain/MultiStack.js.map +1 -0
- package/dist/packages/core/src/domain/Precedents.js +96 -0
- package/dist/packages/core/src/domain/Precedents.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementRemoval.js +161 -0
- package/dist/packages/core/src/domain/RequirementRemoval.js.map +1 -0
- package/dist/packages/core/src/domain/ScenarioCoverage.js +178 -0
- package/dist/packages/core/src/domain/ScenarioCoverage.js.map +1 -0
- package/dist/packages/core/src/domain/SpecSections.js +206 -0
- package/dist/packages/core/src/domain/SpecSections.js.map +1 -0
- package/dist/packages/core/src/domain/TestCommand.js +82 -0
- package/dist/packages/core/src/domain/TestCommand.js.map +1 -0
- package/dist/packages/core/src/domain/TraceabilityFormat.js +37 -1
- package/dist/packages/core/src/domain/TraceabilityFormat.js.map +1 -1
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +31 -0
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
- package/dist/packages/core/test/unit/adversarial-probe.test.js +81 -0
- package/dist/packages/core/test/unit/adversarial-probe.test.js.map +1 -0
- package/dist/packages/core/test/unit/done-verification.test.js +83 -0
- package/dist/packages/core/test/unit/done-verification.test.js.map +1 -0
- package/dist/packages/core/test/unit/gate-command-integrity.test.js +114 -0
- package/dist/packages/core/test/unit/gate-command-integrity.test.js.map +1 -0
- package/dist/packages/core/test/unit/multi-stack.test.js +86 -0
- package/dist/packages/core/test/unit/multi-stack.test.js.map +1 -0
- package/dist/packages/core/test/unit/precedents.test.js +99 -0
- package/dist/packages/core/test/unit/precedents.test.js.map +1 -0
- package/dist/packages/core/test/unit/requirement-removal.test.js +124 -0
- package/dist/packages/core/test/unit/requirement-removal.test.js.map +1 -0
- package/dist/packages/core/test/unit/scenario-coverage.test.js +146 -0
- package/dist/packages/core/test/unit/scenario-coverage.test.js.map +1 -0
- package/dist/packages/core/test/unit/spec-sections.test.js +146 -0
- package/dist/packages/core/test/unit/spec-sections.test.js.map +1 -0
- package/dist/packages/core/test/unit/test-command.test.js +81 -0
- package/dist/packages/core/test/unit/test-command.test.js.map +1 -0
- package/dist/packages/core/test/unit/validate-project.test.js +21 -0
- package/dist/packages/core/test/unit/validate-project.test.js.map +1 -1
- package/dist/scripts/agents/commands.js +1 -1
- package/dist/scripts/agents/commands.js.map +1 -1
- package/dist/scripts/agents/init.js +1 -1
- package/dist/scripts/agents/init.js.map +1 -1
- package/dist/scripts/change/instructions.js +2 -2
- package/dist/scripts/change/instructions.js.map +1 -1
- package/dist/scripts/cli/commands/change/ChangeCommand.js +2 -2
- package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
- package/dist/scripts/cli/commands/config/CiInitCommand.js +1 -1
- package/dist/scripts/cli/commands/config/CiInitCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +203 -4
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
- package/dist/scripts/cli/commands/pack/InferPackCommand.js +331 -31
- package/dist/scripts/cli/commands/pack/InferPackCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/AdoptCommand.js +81 -4
- package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/InitProjectCommand.js +245 -45
- package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/DoctorCommand.js +20 -2
- package/dist/scripts/cli/commands/quality/DoctorCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/FixCommand.js +1 -1
- package/dist/scripts/cli/commands/quality/FixCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ReportCommand.js +1 -1
- package/dist/scripts/cli/commands/quality/ReportCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +340 -18
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DoneCommand.js +108 -0
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/PlanCommand.js +7 -1
- package/dist/scripts/cli/commands/spec/PlanCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/ReqCommand.js +112 -2
- package/dist/scripts/cli/commands/spec/ReqCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StatusCommand.js +2 -2
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
- package/dist/scripts/docs/build-site.js +145 -35
- package/dist/scripts/docs/build-site.js.map +1 -1
- package/dist/scripts/docs/components.js +208 -0
- package/dist/scripts/docs/components.js.map +1 -0
- package/dist/scripts/docs/highlight.js +180 -0
- package/dist/scripts/docs/highlight.js.map +1 -0
- package/dist/scripts/docs/icons.js +63 -0
- package/dist/scripts/docs/icons.js.map +1 -0
- package/dist/scripts/docs/nav.js +9 -3
- package/dist/scripts/docs/nav.js.map +1 -1
- package/dist/scripts/gen_mcp_tools.js +22 -2
- package/dist/scripts/gen_mcp_tools.js.map +1 -1
- package/dist/scripts/harness/init.js +101 -40
- package/dist/scripts/harness/init.js.map +1 -1
- package/dist/scripts/harness/worktree-lock.js +161 -0
- package/dist/scripts/harness/worktree-lock.js.map +1 -0
- package/dist/scripts/infer_pack.js +4 -1
- package/dist/scripts/infer_pack.js.map +1 -1
- package/dist/scripts/lib/surface.js +35 -7
- package/dist/scripts/lib/surface.js.map +1 -1
- package/package.json +5 -2
- package/templates/adopt/AI_RULES.md.tpl +1 -1
- package/templates/adopt/spec.md.tpl +4 -4
- package/templates/base/spec.md.tpl +12 -0
- package/templates/ci/azure.yml.tpl +2 -2
- package/templates/ci/github.yml.tpl +2 -2
- package/templates/ci/gitlab.yml.tpl +1 -1
- package/templates/ci/jenkins.tpl +1 -1
- package/templates/contracts/test-strategy.md.tpl +2 -2
- 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
|
|
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
|
-
|
|
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
|
|
275
|
+
let operationName = null;
|
|
276
|
+
let isQuery = false;
|
|
169
277
|
if (whenStep) {
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
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
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
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 =
|
|
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:
|
|
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,
|
|
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 =
|
|
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 =
|
|
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
|
|
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 {
|
|
@@ -396,6 +469,10 @@ class AdoptProjectCommand extends command_1.BaseCommand {
|
|
|
396
469
|
if (capabilities.length > 0) {
|
|
397
470
|
logInfo(`- Requirements seeded: ${capabilities.length} proposal(s) from the layout — ${capabilities.map((c) => c.id).join(", ")}`);
|
|
398
471
|
}
|
|
472
|
+
logWarn("This does not certify your code yet — it certifies the skeleton.");
|
|
473
|
+
logInfo(" A green `validate` right now means the structure is in place, not that any");
|
|
474
|
+
logInfo(" behaviour is covered. It starts meaning something when the requirements below");
|
|
475
|
+
logInfo(" are real and their scenarios are linked to tests.");
|
|
399
476
|
logInfo("✅ Adoption completed. Next steps:");
|
|
400
477
|
logInfo(" 1. specgate validate . # should pass right now");
|
|
401
478
|
if (capabilities.length > 0) {
|
|
@@ -406,7 +483,7 @@ class AdoptProjectCommand extends command_1.BaseCommand {
|
|
|
406
483
|
logInfo(" 2. Retro-fill real requirements in spec.md (one REQ per behaviour you rely on)");
|
|
407
484
|
logInfo(" 3. specgate plan # see what each REQ still needs");
|
|
408
485
|
}
|
|
409
|
-
logInfo(" 4. Add `validate --strict
|
|
486
|
+
logInfo(" 4. Add `validate . --strict` to CI to lock the gate in");
|
|
410
487
|
process.exit(0);
|
|
411
488
|
}
|
|
412
489
|
}
|