@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
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * Fase 1.1: `done --check` was a no-op that printed a tick.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const assert = __importStar(require("node:assert/strict"));
41
+ const DoneVerification_1 = require("../../src/domain/DoneVerification");
42
+ (0, node_test_1.test)("without --check nothing runs — plain `done` stays a status write", () => {
43
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: false, strict: false });
44
+ assert.deepEqual(plan.steps, []);
45
+ assert.equal(plan.testsUnverified, false, "not asked to verify is not the same as unverified");
46
+ });
47
+ (0, node_test_1.test)("--check validates", () => {
48
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: true, strict: false });
49
+ assert.deepEqual(plan.steps.map((s) => s.stage), ["validate"]);
50
+ assert.deepEqual(plan.steps[0].argv, ["/p"]);
51
+ });
52
+ (0, node_test_1.test)("--strict asks for the gate the project can actually give", () => {
53
+ // Following the documentation must not leave you with a weaker gate than the
54
+ // tool supports — that was a cold evaluator's packaging complaint.
55
+ // The whole gate: the old subset left out --strict-scenarios, so a scenario
56
+ // of unfilled <placeholder> steps closed as Implemented.
57
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: true, strict: true });
58
+ assert.deepEqual(plan.steps[0].argv, ["/p", "--strict"]);
59
+ });
60
+ (0, node_test_1.test)("the requirement being closed is checked as delivered", () => {
61
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: true, strict: true, reqId: "REQ-007" });
62
+ assert.deepEqual(plan.steps[0].argv, ["/p", "--strict", "--delivering", "REQ-007"]);
63
+ });
64
+ (0, node_test_1.test)("a configured test command runs, and it runs after validate", () => {
65
+ // validate is fast and its failures carry fixes; running a whole suite first
66
+ // to then reject the row for a missing matrix header wastes the slow step.
67
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: true, strict: false, testCmd: "npm test" });
68
+ assert.deepEqual(plan.steps.map((s) => s.stage), ["validate", "tests"]);
69
+ assert.deepEqual(plan.steps[1].argv, ["npm test"]);
70
+ assert.equal(plan.testsUnverified, false);
71
+ });
72
+ (0, node_test_1.test)("no test command is reported as unverified, never as passed", () => {
73
+ // The silent case must not be the flattering one.
74
+ for (const testCmd of [undefined, "", " "]) {
75
+ const plan = (0, DoneVerification_1.planDoneVerification)("/p", { check: true, strict: false, testCmd });
76
+ assert.equal(plan.testsUnverified, true, `${JSON.stringify(testCmd)} should be unverified`);
77
+ assert.deepEqual(plan.steps.map((s) => s.stage), ["validate"]);
78
+ }
79
+ });
80
+ (0, node_test_1.test)("the warning says what was and was not checked", () => {
81
+ assert.match(DoneVerification_1.NO_TEST_COMMAND_WARNING.message, /specification, not the code/);
82
+ assert.ok(DoneVerification_1.NO_TEST_COMMAND_WARNING.fix.some((l) => l.includes("test_cmd")));
83
+ });
84
+ //# sourceMappingURL=done-verification.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"done-verification.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/done-verification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ /**
3
+ * #167: the guard protected the contract but not the gate's own command.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const assert = __importStar(require("node:assert/strict"));
41
+ const GateCommandIntegrity_1 = require("../../src/domain/GateCommandIntegrity");
42
+ const PKG = (testScript) => JSON.stringify({ name: "x", scripts: { test: testScript, build: "tsc" } });
43
+ (0, node_test_1.test)("a gate command that names an npm script resolves to it", () => {
44
+ assert.deepEqual((0, GateCommandIntegrity_1.resolveGateScript)("npm test"), { manifest: "package.json", script: "test" });
45
+ assert.deepEqual((0, GateCommandIntegrity_1.resolveGateScript)("npm run verify"), {
46
+ manifest: "package.json",
47
+ script: "verify",
48
+ });
49
+ assert.deepEqual((0, GateCommandIntegrity_1.resolveGateScript)("pnpm run check"), {
50
+ manifest: "package.json",
51
+ script: "check",
52
+ });
53
+ assert.deepEqual((0, GateCommandIntegrity_1.resolveGateScript)("make check"), { manifest: "Makefile", script: "check" });
54
+ });
55
+ (0, node_test_1.test)("a command whose meaning is not in a readable file resolves to nothing", () => {
56
+ // Saying "I did not look" beats guessing. mvn's behaviour lives in a plugin
57
+ // graph; pytest's in configuration this would have to interpret.
58
+ for (const cmd of ["mvn -B test", "pytest -q", "go test ./...", "./gradlew test", ""]) {
59
+ assert.equal((0, GateCommandIntegrity_1.resolveGateScript)(cmd), null, `${cmd} should not resolve`);
60
+ }
61
+ });
62
+ (0, node_test_1.test)("the measured attack: the agent rewrites the test script", () => {
63
+ const before = PKG("node --test tests/*.test.js");
64
+ const after = PKG("echo 'all good'");
65
+ const r = (0, GateCommandIntegrity_1.gateCommandIntegrity)("npm test", before, after);
66
+ assert.equal(r.checked, true);
67
+ assert.equal(r.changed, true);
68
+ assert.equal(r.before, "node --test tests/*.test.js");
69
+ assert.equal(r.after, "echo 'all good'");
70
+ });
71
+ (0, node_test_1.test)("adding a dependency is not a violation — that is legitimate work", () => {
72
+ // A guard that blocks this gets turned off within a day, and then it
73
+ // protects nothing.
74
+ const before = JSON.stringify({ name: "x", scripts: { test: "node --test" } });
75
+ const after = JSON.stringify({
76
+ name: "x",
77
+ scripts: { test: "node --test" },
78
+ dependencies: { zod: "^3" },
79
+ });
80
+ assert.equal((0, GateCommandIntegrity_1.gateCommandIntegrity)("npm test", before, after).changed, false);
81
+ });
82
+ (0, node_test_1.test)("a script that appears where there was none is a change", () => {
83
+ // Inventing the target the gate names is the same move as rewriting it.
84
+ const before = JSON.stringify({ name: "x", scripts: { build: "tsc" } });
85
+ const after = JSON.stringify({ name: "x", scripts: { build: "tsc", test: "true" } });
86
+ const r = (0, GateCommandIntegrity_1.gateCommandIntegrity)("npm test", before, after);
87
+ assert.equal(r.checked, true);
88
+ assert.equal(r.changed, true);
89
+ });
90
+ (0, node_test_1.test)("no such script either side is reported as not checked, never as passed", () => {
91
+ const manifest = JSON.stringify({ name: "x", scripts: { build: "tsc" } });
92
+ const r = (0, GateCommandIntegrity_1.gateCommandIntegrity)("npm run nonexistent", manifest, manifest);
93
+ assert.equal(r.checked, false);
94
+ assert.equal(r.changed, false);
95
+ });
96
+ (0, node_test_1.test)("a Make target's recipe is compared, not the whole Makefile", () => {
97
+ const before = "check:\n\tpytest -q\n\nbuild:\n\tcc -o x x.c\n";
98
+ const afterWeakened = "check:\n\ttrue\n\nbuild:\n\tcc -o x x.c\n";
99
+ const afterUnrelated = "check:\n\tpytest -q\n\nbuild:\n\tcc -O2 -o x x.c\n";
100
+ assert.equal((0, GateCommandIntegrity_1.makeTargetRecipe)(before, "check"), "pytest -q");
101
+ assert.equal((0, GateCommandIntegrity_1.gateCommandIntegrity)("make check", before, afterWeakened).changed, true);
102
+ assert.equal((0, GateCommandIntegrity_1.gateCommandIntegrity)("make check", before, afterUnrelated).changed, false, "an edit to another target is not an edit to the gate");
103
+ });
104
+ (0, node_test_1.test)("a manifest that stops parsing is not silently a pass", () => {
105
+ const r = (0, GateCommandIntegrity_1.gateCommandIntegrity)("npm test", PKG("node --test"), "{ not json");
106
+ assert.equal(r.checked, true);
107
+ assert.equal(r.changed, true, "unreadable after a readable script is a change, not a pass");
108
+ });
109
+ (0, node_test_1.test)("npmScriptValue tolerates junk", () => {
110
+ assert.equal((0, GateCommandIntegrity_1.npmScriptValue)("{ not json", "test"), null);
111
+ assert.equal((0, GateCommandIntegrity_1.npmScriptValue)(JSON.stringify({ scripts: { test: 5 } }), "test"), null);
112
+ assert.equal((0, GateCommandIntegrity_1.npmScriptValue)(JSON.stringify({}), "test"), null);
113
+ });
114
+ //# sourceMappingURL=gate-command-integrity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-command-integrity.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/gate-command-integrity.test.ts"],"names":[],"mappings":"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"}
@@ -148,4 +148,32 @@ const GOOD = {
148
148
  ].join("\n");
149
149
  assert.deepEqual((0, GherkinQuality_1.analyseGherkinSource)(es, "features/facturacion.feature"), []);
150
150
  });
151
+ (0, node_test_1.test)("an unfilled <placeholder> in a plain Scenario is an error", () => {
152
+ // Three steps, a real title, no vague word — it passed every gate with its
153
+ // requirement Implemented. A template nobody filled in describes nothing.
154
+ const template = {
155
+ ...GOOD,
156
+ steps: [
157
+ { keyword: "given", text: "<the state before the action>" },
158
+ { keyword: "when", text: "<the action under test>" },
159
+ { keyword: "then", text: "<the observable outcome>" },
160
+ ],
161
+ };
162
+ const found = (0, GherkinQuality_1.analyseScenario)(template, "t");
163
+ assert.deepEqual(codesOf(found), Array(3).fill(GherkinQuality_1.QUALITY_CODES.PLACEHOLDER_STEP));
164
+ assert.equal(byCode(found, GherkinQuality_1.QUALITY_CODES.PLACEHOLDER_STEP).severity, "error");
165
+ });
166
+ (0, node_test_1.test)("in an Outline, <x> is a parameter, not a placeholder", () => {
167
+ const outline = {
168
+ ...GOOD,
169
+ outline: true,
170
+ hasExamples: true,
171
+ steps: [
172
+ { keyword: "given", text: "an order of <amount>" },
173
+ { keyword: "when", text: "the total is computed" },
174
+ { keyword: "then", text: "the total is <total>" },
175
+ ],
176
+ };
177
+ assert.deepEqual((0, GherkinQuality_1.analyseScenario)(outline, "t"), []);
178
+ });
151
179
  //# sourceMappingURL=gherkin-quality.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gherkin-quality.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/gherkin-quality.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gherkin-quality.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/gherkin-quality.test.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAiC;AACjC,2DAA6C;AAE7C,oEAMyC;AAEzC,MAAM,OAAO,GAAG,CAAC,QAAe,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACjE,MAAM,MAAM,GAAG,CAAC,QAAe,EAAE,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAExF,MAAM,IAAI,GAAG;IACX,IAAI,EAAE,mCAAmC;IACzC,KAAK,EAAE;QACL,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,uCAAuC,EAAE;QACnE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iDAAiD,EAAE;QAC5E,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,EAAE;KACpD;IACD,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,IAAA,gBAAI,EAAC,uCAAuC,EAAE,GAAG,EAAE;IACjD,MAAM,CAAC,SAAS,CAAC,IAAA,gCAAe,EAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,8DAA8D;IAC9D,2EAA2E;IAC3E,MAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,8BAAa,CAAC,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,8BAAa,CAAC,QAAQ,SAAS,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,uDAAuD,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;AACpF,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,sEAAsE,EAAE,GAAG,EAAE;IAChF,MAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,EAAE,8BAAa,CAAC,wBAAwB,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,IAAI,GAAG,IAAA,gCAAe,EAC1B,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,EAC3D,SAAS,CACV,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,8BAAa,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,8BAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,8BAAa,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,IAAA,gCAAe,EAC3B,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,EAAE,EACpF,SAAS,CACV,CAAC;IACF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,8BAAa,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,sCAAsC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,CAAC;QACjF,MAAM,CAAC,KAAK,CAAC,IAAA,+BAAc,EAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,IAAA,+BAAc,EAAC,mCAAmC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,MAAM,GAAG;QACb,gBAAgB;QAChB,+CAA+C;QAC/C,0BAA0B;QAC1B,kCAAkC;QAClC,iCAAiC;QACjC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,IAAA,mCAAkB,EAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,8BAAa,CAAC,YAAY,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,4EAA4E,EAAE,GAAG,EAAE;IACtF,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,MAAM,GAAG;QACb,gBAAgB;QAChB,+CAA+C;QAC/C,0BAA0B;QAC1B,kCAAkC;QAClC,iCAAiC;QACjC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,IAAA,qCAAoB,EAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,8BAAa,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,8BAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,EAAE,GAAG;QACT,gBAAgB;QAChB,6BAA6B;QAC7B,sDAAsD;QACtD,kCAAkC;QAClC,4CAA4C;QAC5C,qCAAqC;QACrC,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,SAAS,CAAC,IAAA,qCAAoB,EAAC,EAAE,EAAE,8BAA8B,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,QAAQ,GAAG;QACf,GAAG,IAAI;QACP,KAAK,EAAE;YACL,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,+BAA+B,EAAE;YAC3D,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,EAAE;YACpD,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE;SACtD;KACF,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,gCAAe,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,8BAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAChF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,8BAAa,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChF,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,OAAO,GAAG;QACd,GAAG,IAAI;QACP,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE;YACL,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE;YAClD,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,uBAAuB,EAAE;YAClD,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,EAAE;SAClD;KACF,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,IAAA,gCAAe,EAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * The decisions `init --multi-stack` makes before it touches a disk.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const assert = __importStar(require("node:assert/strict"));
41
+ const MultiStack_1 = require("../../src/domain/MultiStack");
42
+ const YamlLite_1 = require("../../src/domain/YamlLite");
43
+ (0, node_test_1.test)("a comma-separated list becomes one project entry per stack", () => {
44
+ const plan = (0, MultiStack_1.planStacks)("spring,quarkus,micronaut");
45
+ assert.deepEqual(plan.stacks.map((s) => s.name), ["spring", "quarkus", "micronaut"]);
46
+ assert.deepEqual(plan.stacks.map((s) => s.entry), ["./spring", "./quarkus", "./micronaut"]);
47
+ });
48
+ (0, node_test_1.test)("whitespace around the commas is the user being tidy, not an error", () => {
49
+ const plan = (0, MultiStack_1.planStacks)(" spring , quarkus ");
50
+ assert.deepEqual(plan.stacks.map((s) => s.name), ["spring", "quarkus"]);
51
+ });
52
+ (0, node_test_1.test)("one stack is plain init, and says so", () => {
53
+ assert.throws(() => (0, MultiStack_1.planStacks)("spring"), (e) => {
54
+ assert.ok(e instanceof MultiStack_1.InvalidStackList);
55
+ assert.match(e.message, /plain `specgate init`/);
56
+ return true;
57
+ });
58
+ assert.throws(() => (0, MultiStack_1.planStacks)(""), MultiStack_1.InvalidStackList);
59
+ assert.throws(() => (0, MultiStack_1.planStacks)(" , "), MultiStack_1.InvalidStackList);
60
+ });
61
+ (0, node_test_1.test)("a stack name that would escape the root is refused", () => {
62
+ // `projects:` already takes relative paths nobody checks stay inside the
63
+ // repository. No reason to open a second door to the same place.
64
+ for (const bad of ["../etc", "..", ".", "a/b", "/abs"]) {
65
+ assert.throws(() => (0, MultiStack_1.planStacks)(`spring,${bad}`), MultiStack_1.InvalidStackList, `${bad} should be refused`);
66
+ }
67
+ });
68
+ (0, node_test_1.test)("the same stack twice is refused — each stack is one directory", () => {
69
+ assert.throws(() => (0, MultiStack_1.planStacks)("spring,Spring"), (e) => {
70
+ assert.match(e.message, /listed twice/);
71
+ return true;
72
+ });
73
+ });
74
+ (0, node_test_1.test)("the generated config is readable by the parser that will read it", () => {
75
+ // A writer that emits something its own reader rejects is worse than none.
76
+ const yaml = (0, MultiStack_1.renderSpecopsConfig)((0, MultiStack_1.planStacks)("spring,quarkus"), "acme-api");
77
+ const parsed = (0, YamlLite_1.parseYamlLite)(yaml);
78
+ assert.equal(parsed.name, "acme-api");
79
+ assert.deepEqual(parsed.projects, ["./spring", "./quarkus"]);
80
+ });
81
+ (0, node_test_1.test)("a shared path is reached from the right depth", () => {
82
+ assert.equal((0, MultiStack_1.relativeToRoot)("spec.md"), "../spec.md");
83
+ assert.equal((0, MultiStack_1.relativeToRoot)("features"), "../features");
84
+ assert.equal((0, MultiStack_1.relativeToRoot)("docs/specs/adr"), "../../../docs/specs/adr");
85
+ });
86
+ //# sourceMappingURL=multi-stack.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-stack.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/multi-stack.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * What `specgate new` writes: a slug, and a tagged scenario of placeholders.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const node_test_1 = require("node:test");
40
+ const assert = __importStar(require("node:assert/strict"));
41
+ const NewRequirement_1 = require("../../src/domain/NewRequirement");
42
+ const GherkinQuality_1 = require("../../src/domain/GherkinQuality");
43
+ const GherkinTags_1 = require("../../src/domain/GherkinTags");
44
+ (0, node_test_1.test)("a slug is the first six words, lowercased and ascii", () => {
45
+ assert.equal((0, NewRequirement_1.slugFor)("Totals are rounded half-up"), "totals-are-rounded-half-up");
46
+ assert.equal((0, NewRequirement_1.slugFor)("Facturación: el IVA se redondea"), "facturacion-el-iva-se-redondea");
47
+ assert.equal((0, NewRequirement_1.slugFor)("one two three four five six seven"), "one-two-three-four-five-six");
48
+ assert.equal((0, NewRequirement_1.slugFor)("!!!"), "requirement");
49
+ });
50
+ (0, node_test_1.test)("the scenario carries the tags validate ties to the matrix row", () => {
51
+ const source = (0, NewRequirement_1.featureWithScenario)(null, "Totals", (0, NewRequirement_1.scenarioBlock)("REQ-007", "SCN-007", "Totals"));
52
+ const tags = (0, GherkinTags_1.csdaTagsIn)(source);
53
+ assert.ok(JSON.stringify(tags).includes("REQ-007"), JSON.stringify(tags));
54
+ assert.ok(JSON.stringify(tags).includes("SCN-007"), JSON.stringify(tags));
55
+ });
56
+ (0, node_test_1.test)("the scenario is three placeholders the gate refuses on delivery", () => {
57
+ const source = (0, NewRequirement_1.featureWithScenario)(null, "Totals are rounded", (0, NewRequirement_1.scenarioBlock)("REQ-1", "SCN-1", "Totals are rounded"));
58
+ const codes = (0, GherkinQuality_1.analyseGherkinSource)(source, "f.feature").map((d) => d.code);
59
+ assert.deepEqual(codes, Array(3).fill("scenario_placeholder_step"));
60
+ });
61
+ (0, node_test_1.test)("an existing feature file gets the scenario appended, not replaced", () => {
62
+ const out = (0, NewRequirement_1.featureWithScenario)("Feature: Totals\n\n Scenario: old one\n", "x", " @REQ-2 @SCN-2\n Scenario: x\n");
63
+ assert.match(out, /^Feature: Totals/);
64
+ assert.match(out, /Scenario: old one/);
65
+ assert.match(out, /@REQ-2 @SCN-2\n {2}Scenario: x/);
66
+ });
67
+ //# sourceMappingURL=new-requirement.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new-requirement.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/new-requirement.test.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAiC;AACjC,2DAA6C;AAE7C,oEAA8F;AAC9F,oEAAuE;AACvE,8DAA0D;AAE1D,IAAA,gBAAI,EAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,MAAM,CAAC,KAAK,CAAC,IAAA,wBAAO,EAAC,4BAA4B,CAAC,EAAE,4BAA4B,CAAC,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,IAAA,wBAAO,EAAC,iCAAiC,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAC3F,MAAM,CAAC,KAAK,CAAC,IAAA,wBAAO,EAAC,mCAAmC,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAC1F,MAAM,CAAC,KAAK,CAAC,IAAA,wBAAO,EAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,MAAM,GAAG,IAAA,oCAAmB,EAAC,IAAI,EAAE,QAAQ,EAAE,IAAA,8BAAa,EAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,MAAM,MAAM,GAAG,IAAA,oCAAmB,EAChC,IAAI,EACJ,oBAAoB,EACpB,IAAA,8BAAa,EAAC,OAAO,EAAE,OAAO,EAAE,oBAAoB,CAAC,CACtD,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,qCAAoB,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3E,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAI,EAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAA,oCAAmB,EAC7B,0CAA0C,EAC1C,GAAG,EACH,kCAAkC,CACnC,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gCAAgC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Choosing the precedent (D2).
5
+ *
6
+ * The prompt is entirely normative — facts, Gherkin, rules, definition of done.
7
+ * None of it shows an agent what an accepted implementation looks like *here*,
8
+ * so it invents a house style and the next attempt is spent correcting it.
9
+ *
10
+ * The rules below are the ones that decide whether a precedent helps or hurts:
11
+ * a precedent from another bounded context teaches conventions that do not
12
+ * apply, with the authority of "this was accepted".
13
+ */
14
+ const test = require("node:test");
15
+ const assert = require("node:assert/strict");
16
+ const { choosePrecedent, excerpt } = require("../../src/domain/Precedents");
17
+ const row = (id, status, testArtifact = "", technicalArtifact = "") => ({
18
+ requirementId: id,
19
+ status,
20
+ testArtifact,
21
+ technicalArtifact,
22
+ });
23
+ test("the most recent accepted requirement in the same context wins", () => {
24
+ const rows = [
25
+ row("REQ-001", "Verified", "t/one.test.ts", "src/one.ts"),
26
+ row("REQ-002", "Verified", "t/two.test.ts", "src/two.ts"),
27
+ ];
28
+ const contexts = { "REQ-001": "Billing", "REQ-002": "Billing", "REQ-003": "Billing" };
29
+ const choice = choosePrecedent(rows, contexts, "REQ-003");
30
+ assert.equal(choice.requirementId, "REQ-002");
31
+ assert.equal(choice.testArtifact, "t/two.test.ts");
32
+ assert.equal(choice.technicalArtifact, "src/two.ts");
33
+ });
34
+ test("a different bounded context is not a precedent", () => {
35
+ // Worse than none: it teaches conventions that do not apply, with the
36
+ // authority of having been accepted.
37
+ const rows = [row("REQ-001", "Verified", "t/one.test.ts", "src/one.ts")];
38
+ const contexts = { "REQ-001": "Billing", "REQ-002": "Shipping" };
39
+ assert.equal(choosePrecedent(rows, contexts, "REQ-002"), null);
40
+ });
41
+ test("a project with no contexts at all shares one", () => {
42
+ // A codebase nobody has divided yet is one context, not none.
43
+ const rows = [row("REQ-001", "Verified", "t/one.test.ts", "src/one.ts")];
44
+ assert.equal(choosePrecedent(rows, {}, "REQ-002").requirementId, "REQ-001");
45
+ });
46
+ test("Implemented is not Verified", () => {
47
+ // `Implemented` means the code exists; `Verified` means somebody checked it.
48
+ // Copying an unchecked implementation propagates whatever is wrong with it.
49
+ const rows = [row("REQ-001", "Implemented", "t/one.test.ts", "src/one.ts")];
50
+ assert.equal(choosePrecedent(rows, {}, "REQ-002"), null);
51
+ });
52
+ test("status matching ignores case and padding", () => {
53
+ const rows = [row("REQ-001", " verified ", "t/one.test.ts", "src/one.ts")];
54
+ assert.equal(choosePrecedent(rows, {}, "REQ-002").requirementId, "REQ-001");
55
+ });
56
+ test("a row with no artifacts is not a precedent", () => {
57
+ // There is nothing to show. A section naming a requirement and quoting
58
+ // nothing is worse than no section.
59
+ const rows = [row("REQ-001", "Verified", "TBD", "-")];
60
+ assert.equal(choosePrecedent(rows, {}, "REQ-002"), null);
61
+ });
62
+ test("one artifact is enough", () => {
63
+ const rows = [row("REQ-001", "Verified", "t/one.test.ts", "TBD")];
64
+ const choice = choosePrecedent(rows, {}, "REQ-002");
65
+ assert.equal(choice.testArtifact, "t/one.test.ts");
66
+ assert.equal(choice.technicalArtifact, "", "a placeholder must not become a path");
67
+ });
68
+ test("a requirement is never its own precedent", () => {
69
+ const rows = [row("REQ-002", "Verified", "t/two.test.ts", "src/two.ts")];
70
+ assert.equal(choosePrecedent(rows, {}, "REQ-002"), null);
71
+ });
72
+ test("a later requirement is not a precedent for an earlier one", () => {
73
+ // Precedent means already settled. Pointing REQ-001 at REQ-009 would make
74
+ // the example depend on work that may not exist when REQ-001 is attempted.
75
+ const rows = [row("REQ-009", "Verified", "t/nine.test.ts", "src/nine.ts")];
76
+ assert.equal(choosePrecedent(rows, {}, "REQ-001"), null);
77
+ });
78
+ test("backticks around a path are not part of the path", () => {
79
+ const rows = [row("REQ-001", "Verified", "`t/one.test.ts`", "`src/one.ts`")];
80
+ const choice = choosePrecedent(rows, {}, "REQ-002");
81
+ assert.equal(choice.testArtifact, "t/one.test.ts");
82
+ });
83
+ // ── excerpt ──────────────────────────────────────────────────────────────────
84
+ test("a short file is quoted whole", () => {
85
+ assert.equal(excerpt("a\nb\nc"), "a\nb\nc");
86
+ });
87
+ test("a long file is cut and says so", () => {
88
+ // A thousand-line class in the prompt costs the agent the budget it needs
89
+ // for its own work, and the part that teaches the convention is the top.
90
+ const out = excerpt(Array.from({ length: 100 }, (_, i) => `line ${i}`).join("\n"), 10);
91
+ assert.match(out, /^line 0\n/);
92
+ assert.match(out, /… \(90 more lines\)$/);
93
+ assert.doesNotMatch(out, /line 50/);
94
+ });
95
+ test("excerpt survives an empty file", () => {
96
+ assert.equal(excerpt(""), "");
97
+ assert.equal(excerpt(null), "");
98
+ });
99
+ //# sourceMappingURL=precedents.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedents.test.js","sourceRoot":"","sources":["../../../../../packages/core/test/unit/precedents.test.ts"],"names":[],"mappings":"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"}