@rsaglobaltech/specgate 0.24.0 → 0.26.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 (79) hide show
  1. package/CHANGELOG.md +91 -42
  2. package/dist/packages/core/src/domain/AgentPrompt.js +12 -0
  3. package/dist/packages/core/src/domain/AgentPrompt.js.map +1 -1
  4. package/dist/packages/core/src/domain/Clarification.js +178 -0
  5. package/dist/packages/core/src/domain/Clarification.js.map +1 -0
  6. package/dist/packages/core/src/domain/DraftChecklist.js +16 -16
  7. package/dist/packages/core/src/domain/DraftChecklist.js.map +1 -1
  8. package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
  9. package/dist/packages/core/src/domain/HarnessRun.js.map +1 -1
  10. package/dist/packages/core/src/domain/RequirementPlan.js +11 -0
  11. package/dist/packages/core/src/domain/RequirementPlan.js.map +1 -1
  12. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js +15 -3
  13. package/dist/packages/core/src/infrastructure/ChangeWorkspace.js.map +1 -1
  14. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +5 -0
  15. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
  16. package/dist/packages/core/src/infrastructure/IdsAcrossBranches.js +4 -1
  17. package/dist/packages/core/src/infrastructure/IdsAcrossBranches.js.map +1 -1
  18. package/dist/packages/core/test/unit/clarification.test.js +161 -0
  19. package/dist/packages/core/test/unit/clarification.test.js.map +1 -0
  20. package/dist/packages/core/test/unit/rework.test.js +62 -0
  21. package/dist/packages/core/test/unit/rework.test.js.map +1 -0
  22. package/dist/scripts/answer.js +10 -0
  23. package/dist/scripts/answer.js.map +1 -0
  24. package/dist/scripts/ask.js +10 -0
  25. package/dist/scripts/ask.js.map +1 -0
  26. package/dist/scripts/brief_add.js +10 -0
  27. package/dist/scripts/brief_add.js.map +1 -0
  28. package/dist/scripts/cli/commands/change/ChangeCommand.js +124 -1
  29. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  30. package/dist/scripts/cli/commands/harness/RunCommand.js +135 -5
  31. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  32. package/dist/scripts/cli/commands/spec/ClarifyCommands.js +275 -0
  33. package/dist/scripts/cli/commands/spec/ClarifyCommands.js.map +1 -0
  34. package/dist/scripts/cli/commands/spec/DraftCommand.js +44 -4
  35. package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
  36. package/dist/scripts/cli/commands/spec/StatusCommand.js +5 -1
  37. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  38. package/dist/scripts/cli/commands/spec/StudioCommand.js +194 -1
  39. package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
  40. package/dist/scripts/docs/record-journey.js +1 -0
  41. package/dist/scripts/docs/record-journey.js.map +1 -1
  42. package/dist/scripts/docs/record-terminal.js +18 -0
  43. package/dist/scripts/docs/record-terminal.js.map +1 -1
  44. package/dist/scripts/draft/drafting-guide.js +11 -1
  45. package/dist/scripts/draft/drafting-guide.js.map +1 -1
  46. package/dist/scripts/harness/prompt.js +2 -0
  47. package/dist/scripts/harness/prompt.js.map +1 -1
  48. package/dist/scripts/lib/brief-add.js +197 -0
  49. package/dist/scripts/lib/brief-add.js.map +1 -0
  50. package/dist/scripts/lib/change-impact.js +156 -0
  51. package/dist/scripts/lib/change-impact.js.map +1 -0
  52. package/dist/scripts/lib/change-review.js +145 -0
  53. package/dist/scripts/lib/change-review.js.map +1 -0
  54. package/dist/scripts/lib/clarification.js +319 -0
  55. package/dist/scripts/lib/clarification.js.map +1 -0
  56. package/dist/scripts/lib/harness-guard.js +18 -0
  57. package/dist/scripts/lib/harness-guard.js.map +1 -1
  58. package/dist/scripts/lib/in-flight.js +17 -11
  59. package/dist/scripts/lib/in-flight.js.map +1 -1
  60. package/dist/scripts/lib/live-detail.js +3 -2
  61. package/dist/scripts/lib/live-detail.js.map +1 -1
  62. package/dist/scripts/lib/live-model.js +35 -4
  63. package/dist/scripts/lib/live-model.js.map +1 -1
  64. package/dist/scripts/lib/live-page.js +80 -15
  65. package/dist/scripts/lib/live-page.js.map +1 -1
  66. package/dist/scripts/lib/screen-requirements.js +149 -0
  67. package/dist/scripts/lib/screen-requirements.js.map +1 -0
  68. package/dist/scripts/lib/studio-app-page.js +960 -0
  69. package/dist/scripts/lib/studio-app-page.js.map +1 -0
  70. package/dist/scripts/lib/studio-app.js +362 -0
  71. package/dist/scripts/lib/studio-app.js.map +1 -0
  72. package/dist/scripts/lib/studio-route.js +933 -0
  73. package/dist/scripts/lib/studio-route.js.map +1 -0
  74. package/dist/scripts/lib/surface.js +52 -0
  75. package/dist/scripts/lib/surface.js.map +1 -1
  76. package/dist/scripts/questions.js +10 -0
  77. package/dist/scripts/questions.js.map +1 -0
  78. package/package.json +1 -1
  79. package/templates/harness/harness.config.yaml.tpl +10 -1
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SCREEN_SURFACES = void 0;
37
+ exports.requirementSurfaces = requirementSurfaces;
38
+ exports.onScreen = onScreen;
39
+ exports.e2eTestsNaming = e2eTestsNaming;
40
+ const fs = __importStar(require("node:fs"));
41
+ const path = __importStar(require("node:path"));
42
+ const DraftChecklist_1 = require("../../packages/core/src/domain/DraftChecklist");
43
+ /**
44
+ * Which requirements are used on a screen, and whether an end-to-end test
45
+ * names them (REQ-199). Twenty requirements of the form "WHEN the user taps
46
+ * …, THEN they see …" passed the harness with a use case and a unit test and
47
+ * no screen at all; with `e2e_dir` set, the gate asks for the e2e test.
48
+ */
49
+ /** The surfaces that are a screen someone looks at. */
50
+ exports.SCREEN_SURFACES = new Set(["web", "mobile", "tablet", "desktop"]);
51
+ function read(file) {
52
+ try {
53
+ return fs.readFileSync(file, "utf8");
54
+ }
55
+ catch {
56
+ return "";
57
+ }
58
+ }
59
+ function specFiles(dir) {
60
+ const out = [path.join(dir, "spec.md")];
61
+ const walk = (d) => {
62
+ let entries = [];
63
+ try {
64
+ entries = fs.readdirSync(d, { withFileTypes: true });
65
+ }
66
+ catch {
67
+ return;
68
+ }
69
+ for (const e of entries) {
70
+ const full = path.join(d, e.name);
71
+ if (e.isDirectory() && e.name !== "archive")
72
+ walk(full);
73
+ else if (e.name === "spec.md")
74
+ out.push(full);
75
+ }
76
+ };
77
+ walk(path.join(dir, "docs", "specs"));
78
+ return out;
79
+ }
80
+ /** The trace comment of a requirement, wherever the project defines it. */
81
+ function traceOf(dir, id) {
82
+ const head = new RegExp(`^(?:###\\s+Requirement:|#{2,3})\\s+${id}\\b`);
83
+ for (const file of specFiles(dir)) {
84
+ const lines = read(file).split(/\r?\n/);
85
+ const at = lines.findIndex((l) => head.test(l));
86
+ if (at === -1)
87
+ continue;
88
+ for (let i = at + 1; i < lines.length && !/^#{2,3}\s(?!#)/.test(lines[i]); i += 1) {
89
+ if (/<!--\s*specgate:trace\b/.test(lines[i]))
90
+ return lines[i];
91
+ }
92
+ return "";
93
+ }
94
+ return "";
95
+ }
96
+ function field(trace, name) {
97
+ const m = new RegExp(`\\b${name}=(?:"([^"]*)"|([^\\s"]+?))(?=\\s|-->)`).exec(trace);
98
+ return m ? m[1] || m[2] || "" : "";
99
+ }
100
+ /**
101
+ * The surfaces a requirement is used on: its own `surfaces=`, else its actor's
102
+ * in the brief's front matter. Empty when neither says.
103
+ */
104
+ function requirementSurfaces(dir, id) {
105
+ const trace = traceOf(dir, id);
106
+ const own = field(trace, "surfaces");
107
+ if (own)
108
+ return own.split(/[,\s]+/).filter(Boolean);
109
+ const actor = field(trace, "actor").toLowerCase();
110
+ if (!actor)
111
+ return [];
112
+ for (const rel of [path.join("docs", "brief.md"), "brief.md"]) {
113
+ const brief = read(path.join(dir, rel));
114
+ if (brief)
115
+ return (0, DraftChecklist_1.actorSurfaces)(brief).get(actor) || [];
116
+ }
117
+ return [];
118
+ }
119
+ /** Whether the requirement is used on a screen. */
120
+ function onScreen(dir, id) {
121
+ return requirementSurfaces(dir, id).some((s) => exports.SCREEN_SURFACES.has(s.toLowerCase()));
122
+ }
123
+ /** The files under the e2e folder whose name or content names the requirement. */
124
+ function e2eTestsNaming(dir, e2eDir, id) {
125
+ const named = new RegExp(`(^|[^\\w-])${id}(?!\\d)`);
126
+ const out = [];
127
+ const walk = (d) => {
128
+ let entries = [];
129
+ try {
130
+ entries = fs.readdirSync(d, { withFileTypes: true });
131
+ }
132
+ catch {
133
+ return;
134
+ }
135
+ for (const e of entries) {
136
+ const full = path.join(d, e.name);
137
+ if (e.isDirectory()) {
138
+ if (e.name !== "node_modules" && !e.name.startsWith("."))
139
+ walk(full);
140
+ }
141
+ else if (named.test(e.name) || named.test(read(full))) {
142
+ out.push(path.relative(dir, full).split(path.sep).join("/"));
143
+ }
144
+ }
145
+ };
146
+ walk(path.join(dir, e2eDir));
147
+ return out;
148
+ }
149
+ //# sourceMappingURL=screen-requirements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-requirements.js","sourceRoot":"","sources":["../../../scripts/lib/screen-requirements.ts"],"names":[],"mappings":"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"}