@rsaglobaltech/specgate 0.27.9 → 1.0.0-rc.2

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 +57 -0
  2. package/dist/packages/core/src/application/ValidateChangeUseCase.js +19 -3
  3. package/dist/packages/core/src/application/ValidateChangeUseCase.js.map +1 -1
  4. package/dist/packages/core/src/domain/ApiContract.js +157 -0
  5. package/dist/packages/core/src/domain/ApiContract.js.map +1 -0
  6. package/dist/packages/core/src/domain/Approvals.js +127 -0
  7. package/dist/packages/core/src/domain/Approvals.js.map +1 -0
  8. package/dist/packages/core/src/domain/ChangeLayers.js +285 -0
  9. package/dist/packages/core/src/domain/ChangeLayers.js.map +1 -0
  10. package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
  11. package/dist/packages/core/src/domain/HarnessGaps.js +182 -0
  12. package/dist/packages/core/src/domain/HarnessGaps.js.map +1 -0
  13. package/dist/packages/core/src/domain/HarnessReport.js +16 -1
  14. package/dist/packages/core/src/domain/HarnessReport.js.map +1 -1
  15. package/dist/packages/core/src/domain/HarnessRun.js.map +1 -1
  16. package/dist/packages/core/src/domain/Principles.js +119 -0
  17. package/dist/packages/core/src/domain/Principles.js.map +1 -0
  18. package/dist/packages/core/src/domain/RequirementGraph.js +12 -1
  19. package/dist/packages/core/src/domain/RequirementGraph.js.map +1 -1
  20. package/dist/packages/core/src/domain/Workspace.js +150 -0
  21. package/dist/packages/core/src/domain/Workspace.js.map +1 -0
  22. package/dist/packages/core/src/domain/WorkspaceStory.js +176 -0
  23. package/dist/packages/core/src/domain/WorkspaceStory.js.map +1 -0
  24. package/dist/packages/core/src/index.js +1 -0
  25. package/dist/packages/core/src/index.js.map +1 -1
  26. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +12 -0
  27. package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
  28. package/dist/packages/mcp-spec-driven/src/tools.js +18 -0
  29. package/dist/packages/mcp-spec-driven/src/tools.js.map +1 -1
  30. package/dist/scripts/alm/cli.js +45 -4
  31. package/dist/scripts/alm/cli.js.map +1 -1
  32. package/dist/scripts/alm/clients.js +3 -1
  33. package/dist/scripts/alm/clients.js.map +1 -1
  34. package/dist/scripts/alm/phases.js +279 -0
  35. package/dist/scripts/alm/phases.js.map +1 -0
  36. package/dist/scripts/alm/port.js +33 -5
  37. package/dist/scripts/alm/port.js.map +1 -1
  38. package/dist/scripts/alm/providers/azure.js +72 -11
  39. package/dist/scripts/alm/providers/azure.js.map +1 -1
  40. package/dist/scripts/alm/providers/github.js +67 -7
  41. package/dist/scripts/alm/providers/github.js.map +1 -1
  42. package/dist/scripts/alm/providers/index.js +8 -2
  43. package/dist/scripts/alm/providers/index.js.map +1 -1
  44. package/dist/scripts/alm/providers/jira.js +86 -8
  45. package/dist/scripts/alm/providers/jira.js.map +1 -1
  46. package/dist/scripts/alm/providers/linear.js +167 -0
  47. package/dist/scripts/alm/providers/linear.js.map +1 -0
  48. package/dist/scripts/change/artifacts.js +15 -1
  49. package/dist/scripts/change/artifacts.js.map +1 -1
  50. package/dist/scripts/change/instructions.js +47 -5
  51. package/dist/scripts/change/instructions.js.map +1 -1
  52. package/dist/scripts/cli/commands/alm/PhaseCommand.js +153 -0
  53. package/dist/scripts/cli/commands/alm/PhaseCommand.js.map +1 -0
  54. package/dist/scripts/cli/commands/alm/PullCommand.js +33 -2
  55. package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -1
  56. package/dist/scripts/cli/commands/alm/pull-back.js +104 -0
  57. package/dist/scripts/cli/commands/alm/pull-back.js.map +1 -0
  58. package/dist/scripts/cli/commands/change/ChangeCommand.js +149 -15
  59. package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
  60. package/dist/scripts/cli/commands/change/TicketCommand.js +20 -7
  61. package/dist/scripts/cli/commands/change/TicketCommand.js.map +1 -1
  62. package/dist/scripts/cli/commands/harness/RunCommand.js +64 -20
  63. package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
  64. package/dist/scripts/cli/commands/project/AdoptCommand.js +44 -4
  65. package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
  66. package/dist/scripts/cli/commands/project/InitProjectCommand.js +9 -14
  67. package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
  68. package/dist/scripts/cli/commands/project/MigrateCommand.js +166 -0
  69. package/dist/scripts/cli/commands/project/MigrateCommand.js.map +1 -0
  70. package/dist/scripts/cli/commands/project/OnboardCommand.js +23 -5
  71. package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -1
  72. package/dist/scripts/cli/commands/quality/CheckCommand.js +25 -0
  73. package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
  74. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +15 -0
  75. package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
  76. package/dist/scripts/cli/commands/spec/ContractCommand.js +117 -0
  77. package/dist/scripts/cli/commands/spec/ContractCommand.js.map +1 -0
  78. package/dist/scripts/cli/commands/spec/DoneCommand.js +22 -0
  79. package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
  80. package/dist/scripts/cli/commands/spec/DraftCommand.js +22 -8
  81. package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
  82. package/dist/scripts/cli/commands/spec/DriftCommand.js +128 -0
  83. package/dist/scripts/cli/commands/spec/DriftCommand.js.map +1 -0
  84. package/dist/scripts/cli/commands/spec/StatusCommand.js +85 -0
  85. package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
  86. package/dist/scripts/cli/commands/spec/StudioCommand.js +48 -6
  87. package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
  88. package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js +612 -0
  89. package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js.map +1 -0
  90. package/dist/scripts/contract.js +10 -0
  91. package/dist/scripts/contract.js.map +1 -0
  92. package/dist/scripts/docs/nav.js +16 -1
  93. package/dist/scripts/docs/nav.js.map +1 -1
  94. package/dist/scripts/draft/drafting-guide.js +6 -0
  95. package/dist/scripts/draft/drafting-guide.js.map +1 -1
  96. package/dist/scripts/draft/ticket-guide.js +5 -0
  97. package/dist/scripts/draft/ticket-guide.js.map +1 -1
  98. package/dist/scripts/drift.js +10 -0
  99. package/dist/scripts/drift.js.map +1 -0
  100. package/dist/scripts/harness/gap-evidence.js +149 -0
  101. package/dist/scripts/harness/gap-evidence.js.map +1 -0
  102. package/dist/scripts/harness/prompt.js +54 -1
  103. package/dist/scripts/harness/prompt.js.map +1 -1
  104. package/dist/scripts/harness/report.js +104 -5
  105. package/dist/scripts/harness/report.js.map +1 -1
  106. package/dist/scripts/lib/approvals.js +243 -0
  107. package/dist/scripts/lib/approvals.js.map +1 -0
  108. package/dist/scripts/lib/change-review.js +19 -11
  109. package/dist/scripts/lib/change-review.js.map +1 -1
  110. package/dist/scripts/lib/contracts.js +211 -0
  111. package/dist/scripts/lib/contracts.js.map +1 -0
  112. package/dist/scripts/lib/drift.js +80 -0
  113. package/dist/scripts/lib/drift.js.map +1 -0
  114. package/dist/scripts/lib/live-model.js +1 -0
  115. package/dist/scripts/lib/live-model.js.map +1 -1
  116. package/dist/scripts/lib/migrate.js +264 -0
  117. package/dist/scripts/lib/migrate.js.map +1 -0
  118. package/dist/scripts/lib/role-packages.js +230 -0
  119. package/dist/scripts/lib/role-packages.js.map +1 -0
  120. package/dist/scripts/lib/steering.js +180 -0
  121. package/dist/scripts/lib/steering.js.map +1 -0
  122. package/dist/scripts/lib/studio-app-page.js +28 -5
  123. package/dist/scripts/lib/studio-app-page.js.map +1 -1
  124. package/dist/scripts/lib/studio-app.js +29 -0
  125. package/dist/scripts/lib/studio-app.js.map +1 -1
  126. package/dist/scripts/lib/studio-route.js +20 -0
  127. package/dist/scripts/lib/studio-route.js.map +1 -1
  128. package/dist/scripts/lib/surface.js +55 -0
  129. package/dist/scripts/lib/surface.js.map +1 -1
  130. package/dist/scripts/lib/workspace-draft.js +146 -0
  131. package/dist/scripts/lib/workspace-draft.js.map +1 -0
  132. package/dist/scripts/lib/workspace-live-page.js +90 -0
  133. package/dist/scripts/lib/workspace-live-page.js.map +1 -0
  134. package/dist/scripts/lib/workspace-live.js +199 -0
  135. package/dist/scripts/lib/workspace-live.js.map +1 -0
  136. package/dist/scripts/lib/workspace.js +619 -0
  137. package/dist/scripts/lib/workspace.js.map +1 -0
  138. package/dist/scripts/migrate.js +10 -0
  139. package/dist/scripts/migrate.js.map +1 -0
  140. package/dist/scripts/schema/registry.js +12 -0
  141. package/dist/scripts/schema/registry.js.map +1 -1
  142. package/dist/scripts/workspace.js +10 -0
  143. package/dist/scripts/workspace.js.map +1 -0
  144. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../scripts/lib/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,230 @@
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.PACKAGES_DIR = void 0;
37
+ exports.readPackages = readPackages;
38
+ exports.requirementFacts = requirementFacts;
39
+ exports.packagesFor = packagesFor;
40
+ exports.rolePromptSection = rolePromptSection;
41
+ exports.reviewAdvice = reviewAdvice;
42
+ exports.packageUse = packageUse;
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ const YamlLite_1 = require("../../packages/core/src/domain/YamlLite");
46
+ /**
47
+ * Role packages (REQ-316..318, ADR-0043): what security, performance,
48
+ * infrastructure — any role — asks of the work, written once in
49
+ * `harness/<role>.md` and given to the agent for the requirements it concerns.
50
+ *
51
+ * ---
52
+ * role: security
53
+ * owner: sec@acme.eu
54
+ * version: 2
55
+ * applies-to:
56
+ * kind: [functional, business-rule]
57
+ * capability: [payments]
58
+ * tag: [pii]
59
+ * ---
60
+ * The constraints, in Markdown.
61
+ *
62
+ * A package applies when every dimension it lists matches the requirement (any
63
+ * value of a list); with no `applies-to`, to every requirement.
64
+ */
65
+ exports.PACKAGES_DIR = "harness";
66
+ const list = (v) => Array.isArray(v)
67
+ ? v.map((x) => String(x).trim().toLowerCase()).filter(Boolean)
68
+ : v === undefined || v === null || v === ""
69
+ ? []
70
+ : String(v)
71
+ .split(",")
72
+ .map((x) => x.trim().toLowerCase())
73
+ .filter(Boolean);
74
+ /** Every package of the project; one that cannot be read is left out, with why. */
75
+ function readPackages(projectDir) {
76
+ const dir = path.join(projectDir, exports.PACKAGES_DIR);
77
+ const packages = [];
78
+ const problems = [];
79
+ let names = [];
80
+ try {
81
+ names = fs
82
+ .readdirSync(dir)
83
+ .filter((n) => n.endsWith(".md"))
84
+ .sort();
85
+ }
86
+ catch {
87
+ return { packages, problems };
88
+ }
89
+ for (const name of names) {
90
+ const file = path.join(exports.PACKAGES_DIR, name).split(path.sep).join("/");
91
+ const text = fs.readFileSync(path.join(dir, name), "utf8").replace(/\r\n/g, "\n");
92
+ const m = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(text);
93
+ if (!m) {
94
+ problems.push(`${file}: no front matter (role, owner, version, applies-to)`);
95
+ continue;
96
+ }
97
+ let meta;
98
+ try {
99
+ meta = ((0, YamlLite_1.parseYamlLite)(m[1]) || {});
100
+ }
101
+ catch (err) {
102
+ problems.push(`${file}: ${err.message}`);
103
+ continue;
104
+ }
105
+ const role = String(meta.role || name.replace(/\.md$/, "")).trim();
106
+ const version = String(meta.version ?? "1").trim();
107
+ const applies = (meta["applies-to"] || {});
108
+ packages.push({
109
+ id: `${role}@${version}`,
110
+ role,
111
+ owner: String(meta.owner || "").trim(),
112
+ version,
113
+ appliesTo: {
114
+ kind: list(applies.kind),
115
+ capability: list(applies.capability),
116
+ tag: list(applies.tag ?? applies.tags),
117
+ },
118
+ body: m[2].trim(),
119
+ file,
120
+ });
121
+ }
122
+ return { packages, problems };
123
+ }
124
+ /** The requirement's kind, capability and tags, from where the specification states it. */
125
+ function requirementFacts(projectDir, id) {
126
+ const specs = [
127
+ { file: path.join(projectDir, "spec.md"), capability: "" },
128
+ ];
129
+ const caps = path.join(projectDir, "docs", "specs", "capabilities");
130
+ try {
131
+ for (const c of fs.readdirSync(caps)) {
132
+ specs.push({ file: path.join(caps, c, "spec.md"), capability: c });
133
+ }
134
+ }
135
+ catch {
136
+ /* no capability specs */
137
+ }
138
+ const heading = new RegExp(`^###\\s+Requirement:\\s+${id}\\b`, "m");
139
+ for (const s of specs) {
140
+ let text;
141
+ try {
142
+ text = fs.readFileSync(s.file, "utf8");
143
+ }
144
+ catch {
145
+ continue;
146
+ }
147
+ const at = text.search(heading);
148
+ if (at < 0)
149
+ continue;
150
+ const rest = text.slice(at + 4);
151
+ const next = rest.search(/^###\s+Requirement:/m);
152
+ const block = next >= 0 ? rest.slice(0, next) : rest;
153
+ const trace = /<!--\s*specgate:trace([^>]*)-->/.exec(block);
154
+ const attr = (k) => {
155
+ const m = trace ? new RegExp(`\\b${k}=(?:"([^"]*)"|(\\S+))`).exec(trace[1]) : null;
156
+ return m ? (m[1] ?? m[2]) : "";
157
+ };
158
+ return {
159
+ kind: attr("kind").toLowerCase(),
160
+ capability: s.capability.toLowerCase(),
161
+ tags: list(attr("tags")),
162
+ };
163
+ }
164
+ return null;
165
+ }
166
+ function applies(p, facts) {
167
+ const { kind, capability, tag } = p.appliesTo;
168
+ if (kind.length && !kind.includes(facts.kind))
169
+ return false;
170
+ if (capability.length && !capability.includes(facts.capability))
171
+ return false;
172
+ if (tag.length && !tag.some((t) => facts.tags.includes(t)))
173
+ return false;
174
+ return true;
175
+ }
176
+ /** The packages that apply to one requirement, in file order. */
177
+ function packagesFor(projectDir, id) {
178
+ const { packages } = readPackages(projectDir);
179
+ if (packages.length === 0)
180
+ return [];
181
+ const facts = requirementFacts(projectDir, id) || { kind: "", capability: "", tags: [] };
182
+ return packages.filter((p) => applies(p, facts));
183
+ }
184
+ /** The prompt section the agent reads, or "" when no package applies (REQ-316). */
185
+ function rolePromptSection(pkgs) {
186
+ if (pkgs.length === 0)
187
+ return "";
188
+ return [
189
+ "## Role constraints",
190
+ "",
191
+ "Each package below is a role's constraints on this work. Meet them as you meet the " +
192
+ "requirement: a change that breaks one is not done.",
193
+ "",
194
+ ...pkgs.flatMap((p) => [
195
+ `### ${p.role} · v${p.version}${p.owner ? ` · owner ${p.owner}` : ""}`,
196
+ "",
197
+ p.body,
198
+ "",
199
+ ]),
200
+ ].join("\n");
201
+ }
202
+ /** What the review check asks per package (REQ-318); "" when none applies. */
203
+ function reviewAdvice(pkgs) {
204
+ if (pkgs.length === 0)
205
+ return "";
206
+ return [
207
+ "",
208
+ "Then, for each role package under Role constraints, add one line: " +
209
+ pkgs.map((p) => `\`- ${p.role}: OK\``).join(", ") +
210
+ " — or `- <role>: ADVICE — what to change`. This advice is for the person; it does " +
211
+ "not decide the verdict.",
212
+ ].join("\n");
213
+ }
214
+ /** Each package, with the number of distinct requirements it reached across the runs (REQ-317). */
215
+ function packageUse(runs) {
216
+ const reached = new Map();
217
+ for (const run of runs) {
218
+ for (const r of run.results || []) {
219
+ for (const id of r.packages || []) {
220
+ if (!reached.has(id))
221
+ reached.set(id, new Set());
222
+ reached.get(id).add(String(r.requirement || ""));
223
+ }
224
+ }
225
+ }
226
+ return [...reached.entries()]
227
+ .map(([id, reqs]) => ({ id, requirements: reqs.size }))
228
+ .sort((a, b) => b.requirements - a.requirements || a.id.localeCompare(b.id));
229
+ }
230
+ //# sourceMappingURL=role-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-packages.js","sourceRoot":"","sources":["../../../scripts/lib/role-packages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ "use strict";
2
+ /**
3
+ * The organization's principles as `check` sees them (REQ-330..332): the
4
+ * version this repository follows, whether its source has a newer one, and the
5
+ * principles' machine checks.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.steering = steering;
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const node_child_process_1 = require("node:child_process");
45
+ const diagnostics_1 = require("./diagnostics");
46
+ const shell_command_1 = require("./shell-command");
47
+ const Principles_1 = require("../../packages/core/src/domain/Principles");
48
+ const YamlLite_1 = require("../../packages/core/src/domain/YamlLite");
49
+ const lock_1 = require("../specops/lock");
50
+ /** The version a pack's source declares, when the source is a local folder. */
51
+ function packVersion(projectDir, packId) {
52
+ let lock;
53
+ try {
54
+ lock = (0, lock_1.readLock)(projectDir);
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ const entry = lock?.packs.find((p) => p.pack_id === packId);
60
+ if (!entry)
61
+ return null;
62
+ const repo = path.resolve(projectDir, String(entry.repo || ""));
63
+ if (!fs.existsSync(repo) || !fs.statSync(repo).isDirectory())
64
+ return null;
65
+ const candidates = [entry.pack, entry.pack_id, ""].filter((x) => x !== undefined);
66
+ for (const sub of candidates) {
67
+ const file = path.join(repo, String(sub), "pack.yaml");
68
+ if (!fs.existsSync(file))
69
+ continue;
70
+ try {
71
+ const meta = (0, YamlLite_1.parseYamlLite)(fs.readFileSync(file, "utf8")).metadata;
72
+ if (meta && meta.version)
73
+ return String(meta.version);
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+ /** The version the source offers, and how to take it; null when unknown. */
82
+ function upstream(projectDir, doc) {
83
+ if (!doc.source)
84
+ return null;
85
+ if (doc.source.startsWith("pack:")) {
86
+ const id = doc.source.slice("pack:".length).trim();
87
+ const version = packVersion(projectDir, id);
88
+ return version ? { version, update: `specgate specops sync --pack ${id}` } : null;
89
+ }
90
+ const file = path.resolve(projectDir, doc.source);
91
+ if (!fs.existsSync(file))
92
+ return null;
93
+ const version = (0, Principles_1.parsePrinciples)(fs.readFileSync(file, "utf8")).version;
94
+ return version
95
+ ? { version, update: `copy ${doc.source} over ${Principles_1.PRINCIPLES_FILE}, and review what changed` }
96
+ : null;
97
+ }
98
+ /** Files a pattern principle reads: tracked ones, or every file without git. */
99
+ function projectFiles(projectDir) {
100
+ const r = (0, node_child_process_1.spawnSync)("git", ["-C", projectDir, "ls-files"], { encoding: "utf8" });
101
+ if (r.status === 0)
102
+ return (r.stdout || "").split("\n").filter(Boolean);
103
+ const out = [];
104
+ const skip = new Set([".git", "node_modules", "dist", "target", "build"]);
105
+ const walk = (rel) => {
106
+ for (const e of fs.readdirSync(path.join(projectDir, rel), { withFileTypes: true })) {
107
+ if (skip.has(e.name))
108
+ continue;
109
+ const p = rel ? `${rel}/${e.name}` : e.name;
110
+ if (e.isDirectory())
111
+ walk(p);
112
+ else
113
+ out.push(p);
114
+ }
115
+ };
116
+ walk("");
117
+ return out;
118
+ }
119
+ function steering(projectDir) {
120
+ const file = path.join(projectDir, Principles_1.PRINCIPLES_FILE);
121
+ if (!fs.existsSync(file))
122
+ return { principles: null, findings: [] };
123
+ const doc = (0, Principles_1.parsePrinciples)(fs.readFileSync(file, "utf8"));
124
+ const findings = [];
125
+ const up = upstream(projectDir, doc);
126
+ if (up && doc.version && (0, Principles_1.compareVersions)(up.version, doc.version) > 0) {
127
+ findings.push((0, diagnostics_1.warning)("principles_behind", `This repository follows the principles ${doc.version}; ${doc.source} has ${up.version}.`, { target: Principles_1.PRINCIPLES_FILE, fix: up.update }));
128
+ }
129
+ let files = null;
130
+ let checked = 0;
131
+ for (const p of doc.principles) {
132
+ const make = p.level === "warn" ? diagnostics_1.warning : diagnostics_1.error;
133
+ if (p.run) {
134
+ checked++;
135
+ const r = (0, node_child_process_1.spawnSync)((0, shell_command_1.forShell)(p.run), { cwd: projectDir, shell: true, encoding: "utf8" });
136
+ if (r.status !== 0) {
137
+ findings.push(make("principle_failed", `Principle ${p.id} (${p.title}): \`${p.run}\` exited ${r.status}.`, {
138
+ target: p.id,
139
+ fix: `Make \`${p.run}\` pass, or change ${p.id} in ${Principles_1.PRINCIPLES_FILE} on purpose.`,
140
+ }));
141
+ }
142
+ }
143
+ if (p.forbid) {
144
+ checked++;
145
+ let pattern;
146
+ try {
147
+ pattern = new RegExp(p.forbid);
148
+ }
149
+ catch {
150
+ findings.push((0, diagnostics_1.error)("principle_invalid", `Principle ${p.id}: forbid is not a valid pattern: ${p.forbid}`, {
151
+ target: p.id,
152
+ }));
153
+ continue;
154
+ }
155
+ files = files || projectFiles(projectDir);
156
+ const scope = p.in ? (0, Principles_1.globToRegExp)(p.in) : null;
157
+ const hits = [];
158
+ for (const f of files) {
159
+ if (f === Principles_1.PRINCIPLES_FILE || (scope && !scope.test(f)))
160
+ continue;
161
+ let text;
162
+ try {
163
+ text = fs.readFileSync(path.join(projectDir, f), "utf8");
164
+ }
165
+ catch {
166
+ continue;
167
+ }
168
+ text.split(/\r?\n/).forEach((line, i) => {
169
+ if (pattern.test(line))
170
+ hits.push(`${f}:${i + 1}`);
171
+ });
172
+ }
173
+ if (hits.length > 0) {
174
+ findings.push(make("principle_failed", `Principle ${p.id} (${p.title}): forbidden in ${hits.slice(0, 5).join(", ")}${hits.length > 5 ? ` and ${hits.length - 5} more` : ""}.`, { target: p.id, fix: `Remove it, or change ${p.id} in ${Principles_1.PRINCIPLES_FILE} on purpose.` }));
175
+ }
176
+ }
177
+ }
178
+ return { principles: { version: doc.version, source: doc.source, checked }, findings };
179
+ }
180
+ //# sourceMappingURL=steering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steering.js","sourceRoot":"","sources":["../../../scripts/lib/steering.ts"],"names":[],"mappings":"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"}
@@ -142,7 +142,7 @@ function studioAppPage(projectName, token = "") {
142
142
  s_build:"R listos · B de T construidos", s_build_locked:"Se abre cuando apruebes un borrador",
143
143
  s_report:"B de T construidos y probados", s_report_locked:"Aparece con el primer requisito construido", s_locked:"Se abre con el paso anterior",
144
144
  repeat:"Los pasos 3 a 6 se repiten por módulo: puedes construir uno mientras redactas otro.",
145
- loading:"Cargando…", mods:"módulos", sOf:"de", modules:"Módulos", ready:"listo", qWait:"pregunta", draft:"borrador por revisar", reqs:"requisitos",
145
+ loading:"Cargando…", mods:"módulos", sOf:"de", modules:"Módulos", ready:"listo", qWait:"pregunta", draft:"borrador por revisar", reqs:"requisitos", own_product:"producto", own_architect:"arquitectura", own_developer:"desarrollo", layerDone:"escrito", layerTodo:"por escribir", layerApproved:"aprobado", layerWaits:"aprobaciones", approveLayer:"Aprobar", byWhom:"por",
146
146
  newTitle:"Empecemos un proyecto", newIntro:"Esta carpeta está vacía. Cinco preguntas y specgate la prepara: especificación, pruebas y el asistente que programa.",
147
147
  q1:"1 · ¿Cómo se llama?", q2:"2 · ¿Qué vas a construir?", q3:"3 · ¿Con qué tecnología?", q4:"4 · ¿Qué asistente programa?",
148
148
  kWeb:"Una web", kWebP:"Pantallas que se abren en el navegador", kApi:"Un servicio (API)", kApiP:"Datos y reglas para otras apps", kMob:"Una app móvil", kMobP:"Para el teléfono",
@@ -193,7 +193,7 @@ function studioAppPage(projectName, token = "") {
193
193
  stAttempt:"en cada intento", stEnd:"al final", stCi:"en CI",
194
194
  q5:"5 · ¿Qué nivel de calidad?", qlBasic:"Básico (recomendado)", qlBasicP:"Secretos, dependencias, tests que cubren lo cambiado y análisis estático. Todo en Docker.",
195
195
  qlStrict:"Estricto", qlStrictP:"Además: tests de mutación, complejidad y SAST. Más lento, más exigente.", qlNone:"Ninguno por ahora", qlNoneP:"Se puede activar después en Proyecto.",
196
- rQuality:"Calidad del código", rQualityP:"cobertura C % · mutación M %", covShort:"cobertura", mutShort:"mutación"},
196
+ rQuality:"Calidad del código", rQualityP:"cobertura C % · mutación M %", covShort:"cobertura", mutShort:"mutación", rGaps:"Dónde se desvió", rGapsP:"spec → código S % · intención → spec I %"},
197
197
  en: {route:"Route", project:"Project", brief:"Brief", drafts:"Drafts", report:"Report",
198
198
  home:"Home", questions:"Questions", review:"Review", build:"Build", simple:"Simple", adv:"Advanced",
199
199
  routeTitle:"Your project, step by step", routeIntro:"From the brief to the app built and proven. Each step opens once the one before is ready; you can go back to any.",
@@ -212,7 +212,7 @@ function studioAppPage(projectName, token = "") {
212
212
  s_build:"R ready · B of T built", s_build_locked:"Opens once you approve a draft",
213
213
  s_report:"B of T built and proven", s_report_locked:"Appears with the first requirement built", s_locked:"Opens with the step before",
214
214
  repeat:"Steps 3 to 6 repeat per module: you can build one while another is drafted.",
215
- loading:"Loading…", mods:"modules", sOf:"of", modules:"Modules", ready:"done", qWait:"question", draft:"draft to review", reqs:"requirements",
215
+ loading:"Loading…", mods:"modules", sOf:"of", modules:"Modules", ready:"done", qWait:"question", draft:"draft to review", reqs:"requirements", own_product:"product", own_architect:"architect", own_developer:"developer", layerDone:"written", layerTodo:"to write", layerApproved:"approved", layerWaits:"approvals", approveLayer:"Approve", byWhom:"by",
216
216
  newTitle:"Let's start a project", newIntro:"This folder is empty. Five questions and specgate prepares it: specification, tests and the assistant that codes.",
217
217
  q1:"1 · What is it called?", q2:"2 · What are you building?", q3:"3 · With which technology?", q4:"4 · Which assistant codes?",
218
218
  kWeb:"A website", kWebP:"Screens opened in the browser", kApi:"A service (API)", kApiP:"Data and rules for other apps", kMob:"A mobile app", kMobP:"For the phone",
@@ -263,7 +263,7 @@ function studioAppPage(projectName, token = "") {
263
263
  stAttempt:"every attempt", stEnd:"at the end", stCi:"in CI",
264
264
  q5:"5 · Which quality level?", qlBasic:"Basic (recommended)", qlBasicP:"Secrets, dependencies, tests that cover the change and static analysis. All in Docker.",
265
265
  qlStrict:"Strict", qlStrictP:"Also: mutation tests, complexity and SAST. Slower, stricter.", qlNone:"None for now", qlNoneP:"It can be turned on later in Project.",
266
- rQuality:"Code quality", rQualityP:"coverage C % · mutation M %", covShort:"coverage", mutShort:"mutation"}
266
+ rQuality:"Code quality", rQualityP:"coverage C % · mutation M %", covShort:"coverage", mutShort:"mutation", rGaps:"Where it diverged", rGapsP:"spec → code S % · intent → spec I %"}
267
267
  };
268
268
  function load(k, d){ try { return localStorage.getItem(k) || d; } catch (e) { return d; } }
269
269
  function save(k, v){ try { localStorage.setItem(k, v); } catch (e) {} }
@@ -779,6 +779,26 @@ function studioAppPage(projectName, token = "") {
779
779
  list.forEach(function(d){
780
780
  var split = el("section", "split"), main = el("div", "main"), aside = el("aside");
781
781
  main.appendChild(el("h2", "", cap(d.module) + " · " + d.requirements.length + " " + t("reqs")));
782
+ // REQ-289: the change's layers, each with its owner (ADR-0042); REQ-319:
783
+ // who approved each, how many it needs, and a button for the layer the viewer owns.
784
+ if (d.layers && d.layers.length) {
785
+ var lys = el("div", "small muted");
786
+ d.layers.forEach(function(l){
787
+ var row = el("div"), mL = msgEl();
788
+ var who = (l.approvals || []).map(function(a){ return a.by.name || a.by.email; }).join(", ");
789
+ var state = !l.written ? t("layerTodo")
790
+ : l.approved ? t("layerApproved") + (who ? " " + t("byWhom") + " " + who : "")
791
+ : t("layerDone") + " · " + (l.approvals || []).length + "/" + (l.quorum || 1) + " " + t("layerWaits");
792
+ row.appendChild(el("span", "", l.file + " · " + t("own_" + l.owner) + " · " + state));
793
+ if (l.mine && l.written && !l.approved) {
794
+ row.append(" ", button("ghost", t("approveLayer"), function(){
795
+ post("api/approve", {change:d.change, layer:l.id}).then(function(res){ say(mL, res); if (res.ok) refresh(); });
796
+ }), mL);
797
+ }
798
+ lys.appendChild(row);
799
+ });
800
+ main.appendChild(lys);
801
+ }
782
802
  d.requirements.forEach(function(r){
783
803
  var waits = d.questions.filter(function(q){ return q.blocks.indexOf(r.id) >= 0; });
784
804
  var c = el("article", "card" + (waits.length ? " warn" : ""));
@@ -914,6 +934,9 @@ function studioAppPage(projectName, token = "") {
914
934
  }
915
935
 
916
936
  // ── Report (REQ-217) ────────────────────────────────────────────────────
937
+ // REQ-304: the two gaps, as harness report computes them.
938
+ function pctNum(v){ return v === null || v === undefined ? "—" : String(Math.round(v * 100)); }
939
+ function pctOrDash(v){ return v === null || v === undefined ? "—" : Math.round(v * 100) + "%"; }
917
940
  function viewReport(r){
918
941
  var m = $("view"); m.replaceChildren();
919
942
  var top = el("section"); flex(top); top.style.alignItems = "flex-end"; top.style.justifyContent = "space-between";
@@ -924,7 +947,7 @@ function studioAppPage(projectName, token = "") {
924
947
  var dl = el("a", "go", t("download")); dl.href = "report.html"; dl.style.display = "inline-flex"; dl.style.alignItems = "center"; dl.style.color = "#fff";
925
948
  acts.append(pdf, dl); top.append(g, acts); m.appendChild(top);
926
949
  var s = el("section", "stats");
927
- [[t("rBuilt"), r.built + " " + t("sOf") + " " + r.total, t("reqs"), ""], [t("rExamples"), String(r.scenarios), "", "var(--pass)"], [t("rGate"), r.gate.ok ? t("rGateOk") : t("rGateBad"), r.gate.findings[0] || "", r.gate.ok ? "var(--pass)" : "var(--fail)"], [t("rCost"), r.cost === null ? "—" : "$" + r.cost.toFixed(2), r.minutes + " min", ""]].concat(r.quality && r.quality.measured ? [[t("rQuality"), (r.quality.coverage === null ? "—" : r.quality.coverage + "%"), fill("rQualityP", {C: r.quality.coverage === null ? "—" : r.quality.coverage, M: r.quality.mutation === null ? "—" : r.quality.mutation}), "var(--pass)"]] : []).forEach(function(x){
950
+ [[t("rBuilt"), r.built + " " + t("sOf") + " " + r.total, t("reqs"), ""], [t("rExamples"), String(r.scenarios), "", "var(--pass)"], [t("rGate"), r.gate.ok ? t("rGateOk") : t("rGateBad"), r.gate.findings[0] || "", r.gate.ok ? "var(--pass)" : "var(--fail)"], [t("rCost"), r.cost === null ? "—" : "$" + r.cost.toFixed(2), r.minutes + " min", ""]].concat(r.quality && r.quality.measured ? [[t("rQuality"), (r.quality.coverage === null ? "—" : r.quality.coverage + "%"), fill("rQualityP", {C: r.quality.coverage === null ? "—" : r.quality.coverage, M: r.quality.mutation === null ? "—" : r.quality.mutation}), "var(--pass)"]] : []).concat(r.gaps ? [[t("rGaps"), pctOrDash(r.gaps.specImpl) + " · " + pctOrDash(r.gaps.intentSpec), fill("rGapsP", {S: pctNum(r.gaps.specImpl), I: pctNum(r.gaps.intentSpec)}), ""]] : []).forEach(function(x){
928
951
  var d = el("div", "stat"), b = el("b", "", x[1]); if (x[3]) b.style.color = x[3]; d.append(el("span", "muted small", x[0]), b); if (x[2]) d.appendChild(el("span", "small muted", x[2])); s.appendChild(d);
929
952
  });
930
953
  m.appendChild(s);
@@ -1 +1 @@
1
- {"version":3,"file":"studio-app-page.js","sourceRoot":"","sources":["../../../scripts/lib/studio-app-page.ts"],"names":[],"mappings":";;AAUA,sCAm/BC;AA7/BD;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO;;;uCAG8B,GAAG;2BACf,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iRA+FiP,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA44BvQ,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"studio-app-page.js","sourceRoot":"","sources":["../../../scripts/lib/studio-app-page.ts"],"names":[],"mappings":";;AAUA,sCA0gCC;AAphCD;;;;;;;;;GASG;AACH,SAAgB,aAAa,CAAC,WAAmB,EAAE,KAAK,GAAG,EAAE;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACpD,OAAO;;;uCAG8B,GAAG;2BACf,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iRA+FiP,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAm6BvQ,CAAC;AAChB,CAAC"}
@@ -46,6 +46,7 @@ const path = __importStar(require("node:path"));
46
46
  const node_child_process_1 = require("node:child_process");
47
47
  const ChangeWorkspace_1 = require("../../packages/core/src/infrastructure/ChangeWorkspace");
48
48
  const SpecParser_1 = require("../../packages/core/src/domain/SpecParser");
49
+ const ChangeLayers_1 = require("../../packages/core/src/domain/ChangeLayers");
49
50
  const Clarification_1 = require("../../packages/core/src/domain/Clarification");
50
51
  const HarnessConfigFile_1 = require("../../packages/core/src/infrastructure/HarnessConfigFile");
51
52
  const harness_environment_1 = require("./harness-environment");
@@ -57,6 +58,8 @@ const change_review_1 = require("./change-review");
57
58
  const harness_guard_1 = require("./harness-guard");
58
59
  const project_root_1 = require("./project-root");
59
60
  const in_flight_1 = require("./in-flight");
61
+ const approvals_1 = require("./approvals");
62
+ const Approvals_1 = require("../../packages/core/src/domain/Approvals");
60
63
  /**
61
64
  * What the visual studio shows and does (REQ-204..210): each read is built from
62
65
  * what the specgate commands read, and each write runs the command that makes
@@ -108,6 +111,31 @@ function draftRequirements(projectDir, change) {
108
111
  }
109
112
  return out;
110
113
  }
114
+ /**
115
+ * The change's layers with their owners, and whether each is written
116
+ * (REQ-289, ADR-0042). A 0.27 change shows its proposal as the Discover.
117
+ */
118
+ function draftLayers(projectDir, change) {
119
+ const dir = path.join(projectDir, "docs", "specs", "changes", change);
120
+ const state = (0, approvals_1.changeApprovals)(projectDir, change);
121
+ const settings = (0, approvals_1.approvalSettings)(projectDir);
122
+ const viewer = (0, approvals_1.gitIdentity)(projectDir);
123
+ return ChangeLayers_1.LAYERS.map((l) => {
124
+ const a = state.layers.find((x) => x.layer === l.id);
125
+ const file = l.id === "discover" && !fs.existsSync(path.join(dir, l.file)) ? ChangeLayers_1.LEGACY_DISCOVER : l.file;
126
+ const text = read(path.join(dir, file));
127
+ return {
128
+ id: l.id,
129
+ owner: l.owner,
130
+ file,
131
+ written: text !== undefined && !(0, ChangeLayers_1.isUntouchedLayer)(l.id, text, change),
132
+ approvals: a.approvals,
133
+ quorum: a.quorum,
134
+ approved: a.approved,
135
+ mine: (0, Approvals_1.holdsRole)(settings, l.owner, viewer),
136
+ };
137
+ });
138
+ }
111
139
  /** Open changes a person has not approved yet, each as Review shows it (REQ-206). */
112
140
  function drafts(projectDir) {
113
141
  const open = (0, clarification_1.waiting)(projectDir).questions;
@@ -117,6 +145,7 @@ function drafts(projectDir) {
117
145
  change,
118
146
  module: change.replace(/^draft-/, "").replace(/-additions$/, ""),
119
147
  requirements: draftRequirements(projectDir, change),
148
+ layers: draftLayers(projectDir, change),
120
149
  blockers: (0, change_review_1.approvalBlockers)(projectDir, change),
121
150
  notes: (0, change_review_1.reviewNotes)(projectDir, change),
122
151
  questions: open