@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.
- package/CHANGELOG.md +57 -0
- package/dist/packages/core/src/application/ValidateChangeUseCase.js +19 -3
- package/dist/packages/core/src/application/ValidateChangeUseCase.js.map +1 -1
- package/dist/packages/core/src/domain/ApiContract.js +157 -0
- package/dist/packages/core/src/domain/ApiContract.js.map +1 -0
- package/dist/packages/core/src/domain/Approvals.js +127 -0
- package/dist/packages/core/src/domain/Approvals.js.map +1 -0
- package/dist/packages/core/src/domain/ChangeLayers.js +285 -0
- package/dist/packages/core/src/domain/ChangeLayers.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessConfig.js.map +1 -1
- package/dist/packages/core/src/domain/HarnessGaps.js +182 -0
- package/dist/packages/core/src/domain/HarnessGaps.js.map +1 -0
- package/dist/packages/core/src/domain/HarnessReport.js +16 -1
- package/dist/packages/core/src/domain/HarnessReport.js.map +1 -1
- package/dist/packages/core/src/domain/HarnessRun.js.map +1 -1
- package/dist/packages/core/src/domain/Principles.js +119 -0
- package/dist/packages/core/src/domain/Principles.js.map +1 -0
- package/dist/packages/core/src/domain/RequirementGraph.js +12 -1
- package/dist/packages/core/src/domain/RequirementGraph.js.map +1 -1
- package/dist/packages/core/src/domain/Workspace.js +150 -0
- package/dist/packages/core/src/domain/Workspace.js.map +1 -0
- package/dist/packages/core/src/domain/WorkspaceStory.js +176 -0
- package/dist/packages/core/src/domain/WorkspaceStory.js.map +1 -0
- package/dist/packages/core/src/index.js +1 -0
- package/dist/packages/core/src/index.js.map +1 -1
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js +12 -0
- package/dist/packages/core/src/infrastructure/HarnessConfigFile.js.map +1 -1
- package/dist/packages/mcp-spec-driven/src/tools.js +18 -0
- package/dist/packages/mcp-spec-driven/src/tools.js.map +1 -1
- package/dist/scripts/alm/cli.js +45 -4
- package/dist/scripts/alm/cli.js.map +1 -1
- package/dist/scripts/alm/clients.js +3 -1
- package/dist/scripts/alm/clients.js.map +1 -1
- package/dist/scripts/alm/phases.js +279 -0
- package/dist/scripts/alm/phases.js.map +1 -0
- package/dist/scripts/alm/port.js +33 -5
- package/dist/scripts/alm/port.js.map +1 -1
- package/dist/scripts/alm/providers/azure.js +72 -11
- package/dist/scripts/alm/providers/azure.js.map +1 -1
- package/dist/scripts/alm/providers/github.js +67 -7
- package/dist/scripts/alm/providers/github.js.map +1 -1
- package/dist/scripts/alm/providers/index.js +8 -2
- package/dist/scripts/alm/providers/index.js.map +1 -1
- package/dist/scripts/alm/providers/jira.js +86 -8
- package/dist/scripts/alm/providers/jira.js.map +1 -1
- package/dist/scripts/alm/providers/linear.js +167 -0
- package/dist/scripts/alm/providers/linear.js.map +1 -0
- package/dist/scripts/change/artifacts.js +15 -1
- package/dist/scripts/change/artifacts.js.map +1 -1
- package/dist/scripts/change/instructions.js +47 -5
- package/dist/scripts/change/instructions.js.map +1 -1
- package/dist/scripts/cli/commands/alm/PhaseCommand.js +153 -0
- package/dist/scripts/cli/commands/alm/PhaseCommand.js.map +1 -0
- package/dist/scripts/cli/commands/alm/PullCommand.js +33 -2
- package/dist/scripts/cli/commands/alm/PullCommand.js.map +1 -1
- package/dist/scripts/cli/commands/alm/pull-back.js +104 -0
- package/dist/scripts/cli/commands/alm/pull-back.js.map +1 -0
- package/dist/scripts/cli/commands/change/ChangeCommand.js +149 -15
- package/dist/scripts/cli/commands/change/ChangeCommand.js.map +1 -1
- package/dist/scripts/cli/commands/change/TicketCommand.js +20 -7
- package/dist/scripts/cli/commands/change/TicketCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +64 -20
- package/dist/scripts/cli/commands/harness/RunCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/AdoptCommand.js +44 -4
- package/dist/scripts/cli/commands/project/AdoptCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/InitProjectCommand.js +9 -14
- package/dist/scripts/cli/commands/project/InitProjectCommand.js.map +1 -1
- package/dist/scripts/cli/commands/project/MigrateCommand.js +166 -0
- package/dist/scripts/cli/commands/project/MigrateCommand.js.map +1 -0
- package/dist/scripts/cli/commands/project/OnboardCommand.js +23 -5
- package/dist/scripts/cli/commands/project/OnboardCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/CheckCommand.js +25 -0
- package/dist/scripts/cli/commands/quality/CheckCommand.js.map +1 -1
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js +15 -0
- package/dist/scripts/cli/commands/quality/ValidateSpecsCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/ContractCommand.js +117 -0
- package/dist/scripts/cli/commands/spec/ContractCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/DoneCommand.js +22 -0
- package/dist/scripts/cli/commands/spec/DoneCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DraftCommand.js +22 -8
- package/dist/scripts/cli/commands/spec/DraftCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/DriftCommand.js +128 -0
- package/dist/scripts/cli/commands/spec/DriftCommand.js.map +1 -0
- package/dist/scripts/cli/commands/spec/StatusCommand.js +85 -0
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StudioCommand.js +48 -6
- package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
- package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js +612 -0
- package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js.map +1 -0
- package/dist/scripts/contract.js +10 -0
- package/dist/scripts/contract.js.map +1 -0
- package/dist/scripts/docs/nav.js +16 -1
- package/dist/scripts/docs/nav.js.map +1 -1
- package/dist/scripts/draft/drafting-guide.js +6 -0
- package/dist/scripts/draft/drafting-guide.js.map +1 -1
- package/dist/scripts/draft/ticket-guide.js +5 -0
- package/dist/scripts/draft/ticket-guide.js.map +1 -1
- package/dist/scripts/drift.js +10 -0
- package/dist/scripts/drift.js.map +1 -0
- package/dist/scripts/harness/gap-evidence.js +149 -0
- package/dist/scripts/harness/gap-evidence.js.map +1 -0
- package/dist/scripts/harness/prompt.js +54 -1
- package/dist/scripts/harness/prompt.js.map +1 -1
- package/dist/scripts/harness/report.js +104 -5
- package/dist/scripts/harness/report.js.map +1 -1
- package/dist/scripts/lib/approvals.js +243 -0
- package/dist/scripts/lib/approvals.js.map +1 -0
- package/dist/scripts/lib/change-review.js +19 -11
- package/dist/scripts/lib/change-review.js.map +1 -1
- package/dist/scripts/lib/contracts.js +211 -0
- package/dist/scripts/lib/contracts.js.map +1 -0
- package/dist/scripts/lib/drift.js +80 -0
- package/dist/scripts/lib/drift.js.map +1 -0
- package/dist/scripts/lib/live-model.js +1 -0
- package/dist/scripts/lib/live-model.js.map +1 -1
- package/dist/scripts/lib/migrate.js +264 -0
- package/dist/scripts/lib/migrate.js.map +1 -0
- package/dist/scripts/lib/role-packages.js +230 -0
- package/dist/scripts/lib/role-packages.js.map +1 -0
- package/dist/scripts/lib/steering.js +180 -0
- package/dist/scripts/lib/steering.js.map +1 -0
- package/dist/scripts/lib/studio-app-page.js +28 -5
- package/dist/scripts/lib/studio-app-page.js.map +1 -1
- package/dist/scripts/lib/studio-app.js +29 -0
- package/dist/scripts/lib/studio-app.js.map +1 -1
- package/dist/scripts/lib/studio-route.js +20 -0
- package/dist/scripts/lib/studio-route.js.map +1 -1
- package/dist/scripts/lib/surface.js +55 -0
- package/dist/scripts/lib/surface.js.map +1 -1
- package/dist/scripts/lib/workspace-draft.js +146 -0
- package/dist/scripts/lib/workspace-draft.js.map +1 -0
- package/dist/scripts/lib/workspace-live-page.js +90 -0
- package/dist/scripts/lib/workspace-live-page.js.map +1 -0
- package/dist/scripts/lib/workspace-live.js +199 -0
- package/dist/scripts/lib/workspace-live.js.map +1 -0
- package/dist/scripts/lib/workspace.js +619 -0
- package/dist/scripts/lib/workspace.js.map +1 -0
- package/dist/scripts/migrate.js +10 -0
- package/dist/scripts/migrate.js.map +1 -0
- package/dist/scripts/schema/registry.js +12 -0
- package/dist/scripts/schema/registry.js.map +1 -1
- package/dist/scripts/workspace.js +10 -0
- package/dist/scripts/workspace.js.map +1 -0
- 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":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFH,4BAiFC;AAtKD,4CAA8B;AAC9B,gDAAkC;AAClC,2DAA+C;AAC/C,+CAAgE;AAChE,mDAA2C;AAC3C,0EAMmD;AACnD,sEAAwE;AACxE,0CAA2C;AAQ3C,+EAA+E;AAC/E,SAAS,WAAW,CAAC,UAAkB,EAAE,MAAc;IACrD,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,IAAA,eAAQ,EAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IAClF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,wBAAa,EAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,QACrB,CAAC;YACtC,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,SAAS,QAAQ,CACf,UAAkB,EAClB,GAAkB;IAElB,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,gCAAgC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,IAAA,4BAAe,EAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IACvE,OAAO,OAAO;QACZ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAG,CAAC,MAAM,SAAS,4BAAe,2BAA2B,EAAE;QAC5F,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,gFAAgF;AAChF,SAAS,YAAY,CAAC,UAAkB;IACtC,MAAM,CAAC,GAAG,IAAA,8BAAS,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;QAC3B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACpF,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5C,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAC;;gBACxB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,QAAQ,CAAC,UAAkB;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAAe,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACpE,MAAM,GAAG,GAAG,IAAA,4BAAe,EAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACrC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,IAAI,IAAA,4BAAe,EAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACtE,QAAQ,CAAC,IAAI,CACX,IAAA,qBAAO,EACL,mBAAmB,EACnB,0CAA0C,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,OAAO,GAAG,EACzF,EAAE,MAAM,EAAE,4BAAe,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAC5C,CACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAoB,IAAI,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAO,CAAC,CAAC,CAAC,mBAAK,CAAC;QAClD,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,IAAA,8BAAS,EAAC,IAAA,wBAAQ,EAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CACX,IAAI,CACF,kBAAkB,EAClB,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,MAAM,GAAG,EAClE;oBACE,MAAM,EAAE,CAAC,CAAC,EAAE;oBACZ,GAAG,EAAE,UAAU,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,OAAO,4BAAe,cAAc;iBACnF,CACF,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,QAAQ,CAAC,IAAI,CACX,IAAA,mBAAK,EACH,mBAAmB,EACnB,aAAa,CAAC,CAAC,EAAE,oCAAoC,CAAC,CAAC,MAAM,EAAE,EAC/D;oBACE,MAAM,EAAE,CAAC,CAAC,EAAE;iBACb,CACF,CACF,CAAC;gBACF,SAAS;YACX,CAAC;YACD,KAAK,GAAG,KAAK,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAA,yBAAY,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,KAAK,4BAAe,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACjE,IAAI,IAAY,CAAC;gBACjB,IAAI,CAAC;oBACH,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;oBACtC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,QAAQ,CAAC,IAAI,CACX,IAAI,CACF,kBAAkB,EAClB,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,mBAAmB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EACtI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC,EAAE,OAAO,4BAAe,cAAc,EAAE,CACxF,CACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -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,
|
|
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
|