@rsaglobaltech/specgate 0.27.8 → 1.0.0-rc.1
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 +47 -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 +281 -0
- package/dist/packages/core/src/domain/ChangeLayers.js.map +1 -0
- package/dist/packages/core/src/domain/DraftChecklist.js +15 -2
- package/dist/packages/core/src/domain/DraftChecklist.js.map +1 -1
- 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/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 +39 -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 +92 -14
- 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/config/ConfigSetCommand.js +2 -1
- package/dist/scripts/cli/commands/config/ConfigSetCommand.js.map +1 -1
- package/dist/scripts/cli/commands/harness/RunCommand.js +85 -21
- 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/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/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 +12 -0
- package/dist/scripts/cli/commands/spec/StatusCommand.js.map +1 -1
- package/dist/scripts/cli/commands/spec/StudioCommand.js +43 -1
- package/dist/scripts/cli/commands/spec/StudioCommand.js.map +1 -1
- package/dist/scripts/cli/commands/workspace/WorkspaceCommand.js +485 -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 +5 -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/agent-permission.js +19 -0
- package/dist/scripts/lib/agent-permission.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/harness-environment.js +118 -0
- package/dist/scripts/lib/harness-environment.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/quality-run.js +3 -1
- package/dist/scripts/lib/quality-run.js.map +1 -1
- 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 +42 -0
- package/dist/scripts/lib/studio-app.js.map +1 -1
- package/dist/scripts/lib/studio-route.js +54 -8
- 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-live-page.js +90 -0
- package/dist/scripts/lib/workspace-live-page.js.map +1 -0
- package/dist/scripts/lib/workspace-live.js +216 -0
- package/dist/scripts/lib/workspace-live.js.map +1 -0
- package/dist/scripts/lib/workspace.js +406 -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,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The board follows the change (REQ-305, REQ-307).
|
|
4
|
+
*
|
|
5
|
+
* A change's phase is read from the repository, never from the board: open
|
|
6
|
+
* and not yet built, one of its requirements being built, or archived. The
|
|
7
|
+
* board is told; it is never asked what the change is (ADR-0021). What the
|
|
8
|
+
* sync has told the board is kept in `.specops/alm-phases.json`, beside the
|
|
9
|
+
* REQ ↔ issue mapping, so a move already made is not made again and a
|
|
10
|
+
* sub-issue is never created twice.
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
29
|
+
var ownKeys = function(o) {
|
|
30
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
31
|
+
var ar = [];
|
|
32
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
33
|
+
return ar;
|
|
34
|
+
};
|
|
35
|
+
return ownKeys(o);
|
|
36
|
+
};
|
|
37
|
+
return function (mod) {
|
|
38
|
+
if (mod && mod.__esModule) return mod;
|
|
39
|
+
var result = {};
|
|
40
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
41
|
+
__setModuleDefault(result, mod);
|
|
42
|
+
return result;
|
|
43
|
+
};
|
|
44
|
+
})();
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.PHASES_RELPATH = void 0;
|
|
47
|
+
exports.readPhaseMap = readPhaseMap;
|
|
48
|
+
exports.writePhaseMap = writePhaseMap;
|
|
49
|
+
exports.changeTicket = changeTicket;
|
|
50
|
+
exports.boardChanges = boardChanges;
|
|
51
|
+
exports.namedState = namedState;
|
|
52
|
+
exports.movePhase = movePhase;
|
|
53
|
+
exports.syncPhases = syncPhases;
|
|
54
|
+
exports.syncSubIssues = syncSubIssues;
|
|
55
|
+
const fs = __importStar(require("node:fs"));
|
|
56
|
+
const path = __importStar(require("node:path"));
|
|
57
|
+
const node_child_process_1 = require("node:child_process");
|
|
58
|
+
const YamlLite_1 = require("../../packages/core/src/domain/YamlLite");
|
|
59
|
+
exports.PHASES_RELPATH = path.join(".specops", "alm-phases.json");
|
|
60
|
+
const CHANGES = path.join("docs", "specs", "changes");
|
|
61
|
+
// ── The map ───────────────────────────────────────────────────────────────────
|
|
62
|
+
function readPhaseMap(projectDir) {
|
|
63
|
+
const mapPath = path.join(projectDir, exports.PHASES_RELPATH);
|
|
64
|
+
if (!fs.existsSync(mapPath))
|
|
65
|
+
return {};
|
|
66
|
+
return JSON.parse(fs.readFileSync(mapPath, "utf8"));
|
|
67
|
+
}
|
|
68
|
+
function writePhaseMap(projectDir, map, dryRun) {
|
|
69
|
+
const mapPath = path.join(projectDir, exports.PHASES_RELPATH);
|
|
70
|
+
if (dryRun)
|
|
71
|
+
return mapPath;
|
|
72
|
+
fs.mkdirSync(path.dirname(mapPath), { recursive: true });
|
|
73
|
+
fs.writeFileSync(mapPath, `${JSON.stringify(map, null, 2)}\n`, "utf8");
|
|
74
|
+
return mapPath;
|
|
75
|
+
}
|
|
76
|
+
// ── Changes and their phase ───────────────────────────────────────────────────
|
|
77
|
+
/** The ticket a change carries: `ticket:`, or the issue `alm pull` opened it from. */
|
|
78
|
+
function changeTicket(yaml) {
|
|
79
|
+
const ticket = typeof yaml.ticket === "string" ? yaml.ticket.trim() : "";
|
|
80
|
+
if (ticket)
|
|
81
|
+
return ticket;
|
|
82
|
+
const origin = typeof yaml.origin === "string" ? /^alm:(\S+)$/.exec(yaml.origin.trim()) : null;
|
|
83
|
+
return origin ? origin[1] : null;
|
|
84
|
+
}
|
|
85
|
+
function readYaml(file) {
|
|
86
|
+
if (!fs.existsSync(file))
|
|
87
|
+
return {};
|
|
88
|
+
return ((0, YamlLite_1.parseYamlLite)(fs.readFileSync(file, "utf8")) || {});
|
|
89
|
+
}
|
|
90
|
+
function deltaRequirements(changeDir) {
|
|
91
|
+
const found = new Set();
|
|
92
|
+
const walk = (dir) => {
|
|
93
|
+
if (!fs.existsSync(dir))
|
|
94
|
+
return;
|
|
95
|
+
for (const e of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
96
|
+
const full = path.join(dir, e.name);
|
|
97
|
+
if (e.isDirectory())
|
|
98
|
+
walk(full);
|
|
99
|
+
else if (e.name === "spec.md") {
|
|
100
|
+
for (const m of fs
|
|
101
|
+
.readFileSync(full, "utf8")
|
|
102
|
+
.matchAll(/^###\s+Requirement:\s+(REQ-\d+)/gm)) {
|
|
103
|
+
found.add(m[1]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
walk(path.join(changeDir, "specs"));
|
|
109
|
+
return [...found];
|
|
110
|
+
}
|
|
111
|
+
/** The local `harness/REQ-NNN` branches: a requirement the harness has started. */
|
|
112
|
+
function harnessBranches(projectDir) {
|
|
113
|
+
const r = (0, node_child_process_1.spawnSync)("git", ["branch", "--list", "harness/REQ-*", "--format=%(refname:short)"], {
|
|
114
|
+
cwd: projectDir,
|
|
115
|
+
encoding: "utf8",
|
|
116
|
+
});
|
|
117
|
+
if (r.status !== 0)
|
|
118
|
+
return new Set();
|
|
119
|
+
return new Set(r.stdout
|
|
120
|
+
.split("\n")
|
|
121
|
+
.map((l) => l.trim().replace(/^harness\//, ""))
|
|
122
|
+
.filter(Boolean));
|
|
123
|
+
}
|
|
124
|
+
/** Requirements the matrix says are delivered. */
|
|
125
|
+
function implementedRequirements(projectDir) {
|
|
126
|
+
const file = path.join(projectDir, "docs", "specs", "traceability.md");
|
|
127
|
+
const done = new Set();
|
|
128
|
+
if (!fs.existsSync(file))
|
|
129
|
+
return done;
|
|
130
|
+
for (const line of fs.readFileSync(file, "utf8").split("\n")) {
|
|
131
|
+
const cells = line.split("|").map((c) => c.trim());
|
|
132
|
+
const req = cells.find((c) => /^REQ-\d+$/.test(c));
|
|
133
|
+
if (req && /^(Implemented|Verified|Released)$/.test(cells[cells.length - 2] || "")) {
|
|
134
|
+
done.add(req);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return done;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Every change, open or archived, with its phase. An archived change keeps its
|
|
141
|
+
* id after the date prefix the archive gives it (`2026-10-29-alerts`).
|
|
142
|
+
*/
|
|
143
|
+
function boardChanges(projectDir) {
|
|
144
|
+
const root = path.join(projectDir, CHANGES);
|
|
145
|
+
if (!fs.existsSync(root))
|
|
146
|
+
return [];
|
|
147
|
+
const branches = harnessBranches(projectDir);
|
|
148
|
+
const implemented = implementedRequirements(projectDir);
|
|
149
|
+
const out = [];
|
|
150
|
+
const add = (dir, id, archived) => {
|
|
151
|
+
const yaml = readYaml(path.join(dir, "change.yaml"));
|
|
152
|
+
const requirements = deltaRequirements(dir);
|
|
153
|
+
const building = requirements.some((r) => branches.has(r) || implemented.has(r));
|
|
154
|
+
const repositories = Array.isArray(yaml.repositories)
|
|
155
|
+
? yaml.repositories.map(String).filter(Boolean)
|
|
156
|
+
: [];
|
|
157
|
+
out.push({
|
|
158
|
+
id,
|
|
159
|
+
dir,
|
|
160
|
+
archived,
|
|
161
|
+
ticket: changeTicket(yaml),
|
|
162
|
+
repositories,
|
|
163
|
+
requirements,
|
|
164
|
+
phase: archived ? "archived" : building ? "building" : "proposed",
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
for (const e of fs.readdirSync(root, { withFileTypes: true })) {
|
|
168
|
+
if (!e.isDirectory() || e.name.startsWith("."))
|
|
169
|
+
continue;
|
|
170
|
+
if (e.name === "archive") {
|
|
171
|
+
const archive = path.join(root, "archive");
|
|
172
|
+
for (const a of fs.readdirSync(archive, { withFileTypes: true })) {
|
|
173
|
+
if (!a.isDirectory())
|
|
174
|
+
continue;
|
|
175
|
+
add(path.join(archive, a.name), a.name.replace(/^\d{4}-\d{2}-\d{2}-/, ""), true);
|
|
176
|
+
}
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
add(path.join(root, e.name), e.name, false);
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
// ── Moving the board ──────────────────────────────────────────────────────────
|
|
184
|
+
/** The state `phases:` names for a phase, or undefined for the provider's default. */
|
|
185
|
+
function namedState(cfg, phase) {
|
|
186
|
+
const phases = cfg.phases;
|
|
187
|
+
if (!phases || typeof phases !== "object")
|
|
188
|
+
return undefined;
|
|
189
|
+
const value = phases[phase];
|
|
190
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
191
|
+
}
|
|
192
|
+
/** Move one change's ticket to its phase, unless the board was already told. */
|
|
193
|
+
async function movePhase(change, map, client, cfg, opts = {}) {
|
|
194
|
+
const phase = opts.phase ?? change.phase;
|
|
195
|
+
const record = (map[change.id] ??= { ticket: change.ticket });
|
|
196
|
+
record.ticket = change.ticket;
|
|
197
|
+
const named = namedState(cfg, phase);
|
|
198
|
+
if (!opts.force && record.phase === phase) {
|
|
199
|
+
return {
|
|
200
|
+
change: change.id,
|
|
201
|
+
action: "in-sync",
|
|
202
|
+
issue: change.ticket,
|
|
203
|
+
phase,
|
|
204
|
+
state: record.state,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
if (!client.capabilities.phase || typeof client.setPhase !== "function") {
|
|
208
|
+
return {
|
|
209
|
+
change: change.id,
|
|
210
|
+
action: "phase-unsupported",
|
|
211
|
+
issue: change.ticket,
|
|
212
|
+
phase,
|
|
213
|
+
detail: `${change.ticket} should be ${phase}, but provider '${cfg.provider}' cannot move an issue — move it by hand.`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
if (opts.dryRun) {
|
|
217
|
+
return {
|
|
218
|
+
change: change.id,
|
|
219
|
+
action: "would-move",
|
|
220
|
+
issue: change.ticket,
|
|
221
|
+
phase,
|
|
222
|
+
state: named ?? `the ${phase} state`,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
const state = await client.setPhase(change.ticket, phase, named);
|
|
226
|
+
record.phase = phase;
|
|
227
|
+
record.state = state;
|
|
228
|
+
return { change: change.id, action: "moved", issue: change.ticket, phase, state };
|
|
229
|
+
}
|
|
230
|
+
/** REQ-305: every change with a ticket, moved to its phase. */
|
|
231
|
+
async function syncPhases(changes, map, client, cfg, opts = {}) {
|
|
232
|
+
const actions = [];
|
|
233
|
+
for (const change of changes) {
|
|
234
|
+
if (!change.ticket)
|
|
235
|
+
continue;
|
|
236
|
+
actions.push(await movePhase({ ...change, ticket: change.ticket }, map, client, cfg, opts));
|
|
237
|
+
}
|
|
238
|
+
return actions;
|
|
239
|
+
}
|
|
240
|
+
/** REQ-307: one sub-issue per repository a change names, created once. */
|
|
241
|
+
async function syncSubIssues(changes, map, client, opts = {}) {
|
|
242
|
+
const actions = [];
|
|
243
|
+
for (const change of changes) {
|
|
244
|
+
if (change.archived || change.repositories.length === 0)
|
|
245
|
+
continue;
|
|
246
|
+
if (!change.ticket) {
|
|
247
|
+
actions.push({
|
|
248
|
+
change: change.id,
|
|
249
|
+
action: "no-ticket",
|
|
250
|
+
detail: `${change.id} names repositories but no ticket to hang their sub-issues on — add ticket: <KEY> to its change.yaml.`,
|
|
251
|
+
});
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
const record = (map[change.id] ??= { ticket: change.ticket });
|
|
255
|
+
const children = (record.children ??= {});
|
|
256
|
+
for (const repo of change.repositories) {
|
|
257
|
+
if (children[repo])
|
|
258
|
+
continue;
|
|
259
|
+
if (!client.capabilities.subIssues || typeof client.createSubIssue !== "function") {
|
|
260
|
+
actions.push({
|
|
261
|
+
change: change.id,
|
|
262
|
+
action: "sub-issues-unsupported",
|
|
263
|
+
repo,
|
|
264
|
+
detail: `${change.ticket} needs a sub-issue for ${repo}, but this provider cannot create one — create it by hand.`,
|
|
265
|
+
});
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (opts.dryRun) {
|
|
269
|
+
actions.push({ change: change.id, action: "would-create", repo });
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
const created = await client.createSubIssue(change.ticket, `${change.ticket} — ${repo}: ${change.id}`);
|
|
273
|
+
children[repo] = created.key;
|
|
274
|
+
actions.push({ change: change.id, action: "created", repo, issue: created.key });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return actions;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=phases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../scripts/alm/phases.ts"],"names":[],"mappings":"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"}
|
package/dist/scripts/alm/port.js
CHANGED
|
@@ -33,24 +33,46 @@
|
|
|
33
33
|
* implementation and its declaration disagree.
|
|
34
34
|
*/
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.CORE_CONFIG_KEYS = exports.CAPABILITY_METHOD = exports.CAPABILITIES = void 0;
|
|
36
|
+
exports.CORE_CONFIG_KEYS = exports.CAPABILITY_METHOD = exports.OPTIONAL_CAPABILITIES = exports.CAPABILITIES = exports.PHASES = void 0;
|
|
37
37
|
exports.checkProviderDeclaration = checkProviderDeclaration;
|
|
38
|
-
|
|
38
|
+
exports.PHASES = ["proposed", "building", "archived"];
|
|
39
|
+
/** Every capability a provider must declare, for the checks that iterate them. */
|
|
39
40
|
exports.CAPABILITIES = [
|
|
40
41
|
"create",
|
|
41
42
|
"readStatus",
|
|
42
43
|
"close",
|
|
43
44
|
"listIssues",
|
|
44
45
|
];
|
|
46
|
+
/** The capabilities a provider may declare (REQ-305..307). */
|
|
47
|
+
exports.OPTIONAL_CAPABILITIES = [
|
|
48
|
+
"phase",
|
|
49
|
+
"subIssues",
|
|
50
|
+
"comments",
|
|
51
|
+
"readText",
|
|
52
|
+
];
|
|
45
53
|
/** The client method each capability promises. */
|
|
46
54
|
exports.CAPABILITY_METHOD = {
|
|
47
55
|
create: "createIssue",
|
|
48
56
|
readStatus: "getIssueStatus",
|
|
49
57
|
close: "closeIssue",
|
|
50
58
|
listIssues: "listIssues",
|
|
59
|
+
phase: "setPhase",
|
|
60
|
+
subIssues: "createSubIssue",
|
|
61
|
+
comments: "listComments",
|
|
62
|
+
readText: "readIssueText",
|
|
51
63
|
};
|
|
52
|
-
/**
|
|
53
|
-
|
|
64
|
+
/**
|
|
65
|
+
* Config keys the core itself reads, whatever the provider. `phases` names the
|
|
66
|
+
* board state of each phase (REQ-305); `mirror: false` keeps `alm sync` from
|
|
67
|
+
* creating an issue per requirement on a project whose tickets are the source.
|
|
68
|
+
*/
|
|
69
|
+
exports.CORE_CONFIG_KEYS = [
|
|
70
|
+
"alm_version",
|
|
71
|
+
"provider",
|
|
72
|
+
"pr",
|
|
73
|
+
"phases",
|
|
74
|
+
"mirror",
|
|
75
|
+
];
|
|
54
76
|
/**
|
|
55
77
|
* Check a provider declaration is well formed.
|
|
56
78
|
*
|
|
@@ -107,7 +129,13 @@ function checkCapabilities(candidate) {
|
|
|
107
129
|
problems.push(`${label}: capability '${capability}' is not declared as a boolean`);
|
|
108
130
|
}
|
|
109
131
|
}
|
|
110
|
-
const
|
|
132
|
+
for (const capability of exports.OPTIONAL_CAPABILITIES) {
|
|
133
|
+
if (capability in caps && typeof caps[capability] !== "boolean") {
|
|
134
|
+
problems.push(`${label}: capability '${capability}' is not declared as a boolean`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const known = [...exports.CAPABILITIES, ...exports.OPTIONAL_CAPABILITIES];
|
|
138
|
+
const extra = Object.keys(caps).filter((name) => !known.includes(name));
|
|
111
139
|
if (extra.length > 0) {
|
|
112
140
|
problems.push(`${label}: declares unknown capabilit(y/ies): ${extra.join(", ")}`);
|
|
113
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../../scripts/alm/port.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../../scripts/alm/port.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;AA8LH,4DAcC;AAvLY,QAAA,MAAM,GAAqB,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAuH7E,kFAAkF;AACrE,QAAA,YAAY,GAAuC;IAC9D,QAAQ;IACR,YAAY;IACZ,OAAO;IACP,YAAY;CACb,CAAC;AAEF,8DAA8D;AACjD,QAAA,qBAAqB,GAAuC;IACvE,OAAO;IACP,WAAW;IACX,UAAU;IACV,UAAU;CACX,CAAC;AAEF,kDAAkD;AACrC,QAAA,iBAAiB,GAA6D;IACzF,MAAM,EAAE,aAAa;IACrB,UAAU,EAAE,gBAAgB;IAC5B,KAAK,EAAE,YAAY;IACnB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,UAAU;IACjB,SAAS,EAAE,gBAAgB;IAC3B,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,eAAe;CAC1B,CAAC;AAEF;;;;GAIG;AACU,QAAA,gBAAgB,GAAsB;IACjD,aAAa;IACb,UAAU;IACV,IAAI;IACJ,QAAQ;IACR,QAAQ;CACT,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAgB,wBAAwB,CAAC,QAAiB;IACxD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAG,QAAgC,CAAC;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,EAAE,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC,CAAC;IAEtF,IAAI,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,EAAE;QAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;IAC5E,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK;QAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;IACrF,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU;QAAE,EAAE,CAAC,8BAA8B,CAAC,CAAC;IAE/E,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,SAA+B;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,aAAa,CAAC;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAChC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IAE5F,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,MAAM,IAAI,CAAC,UAAU,EAAE,UAAU,CAAU,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,YAAY,MAAM,kBAAkB,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE9F,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,wBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC;YAChC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,+BAA+B,GAAG,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA+B;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,IAAI,aAAa,CAAC;IAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC;IACpC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;IAErF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,UAAU,IAAI,oBAAY,EAAE,CAAC;QACtC,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,iBAAiB,UAAU,gCAAgC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,6BAAqB,EAAE,CAAC;QAC/C,IAAI,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;YAChE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,iBAAiB,UAAU,gCAAgC,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,GAAG,oBAAY,EAAE,GAAG,6BAAqB,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAA6B,CAAC,CAAC,CAAC;IACjG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,wCAAwC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -13,16 +13,7 @@ const API_VERSION = "api-version=7.1";
|
|
|
13
13
|
* which is why this provider, and only this one, declares `done_state`.
|
|
14
14
|
*/
|
|
15
15
|
class AzureClient extends http_client_1.HttpAlmClient {
|
|
16
|
-
capabilities =
|
|
17
|
-
create: true,
|
|
18
|
-
readStatus: true,
|
|
19
|
-
close: true,
|
|
20
|
-
// Azure searches with WIQL — a POST carrying a query language, then a
|
|
21
|
-
// second request to hydrate each id. That is a different shape from the
|
|
22
|
-
// other two, and declaring `false` degrades `alm pull` with a message
|
|
23
|
-
// rather than pretending and failing at the first request.
|
|
24
|
-
listIssues: false,
|
|
25
|
-
};
|
|
16
|
+
capabilities = AZURE_CAPABILITIES;
|
|
26
17
|
authorization;
|
|
27
18
|
projectKey;
|
|
28
19
|
issueType;
|
|
@@ -57,6 +48,55 @@ class AzureClient extends http_client_1.HttpAlmClient {
|
|
|
57
48
|
const state = item.fields?.["System.State"];
|
|
58
49
|
return state !== undefined && DONE_STATES.includes(state) ? "done" : "open";
|
|
59
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* REQ-305: Azure Boards' default process states — New, Active, and the
|
|
53
|
+
* configured done state — unless `phases:` names the project's own.
|
|
54
|
+
*/
|
|
55
|
+
async setPhase(issueKey, phase, state) {
|
|
56
|
+
const target = state ?? (phase === "proposed" ? "New" : phase === "building" ? "Active" : this.doneState);
|
|
57
|
+
await this.request(`/_apis/wit/workitems/${workItemId(issueKey)}?${API_VERSION}`, `Azure move work item ${issueKey} to ${target}`, {
|
|
58
|
+
method: "PATCH",
|
|
59
|
+
headers: this.patchHeaders(),
|
|
60
|
+
body: JSON.stringify([{ op: "add", path: "/fields/System.State", value: target }]),
|
|
61
|
+
});
|
|
62
|
+
return target;
|
|
63
|
+
}
|
|
64
|
+
/** REQ-307: a child work item, linked to its parent by the hierarchy relation. */
|
|
65
|
+
async createSubIssue(parentKey, title) {
|
|
66
|
+
const created = await this.requestJson(`/${this.projectKey}/_apis/wit/workitems/$${encodeURIComponent(this.issueType)}?${API_VERSION}`, `Azure create child of work item ${parentKey}`, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
headers: this.patchHeaders(),
|
|
69
|
+
body: JSON.stringify([
|
|
70
|
+
{ op: "add", path: "/fields/System.Title", value: title },
|
|
71
|
+
{ op: "add", path: "/fields/System.Tags", value: "spec-driven" },
|
|
72
|
+
{
|
|
73
|
+
op: "add",
|
|
74
|
+
path: "/relations/-",
|
|
75
|
+
value: {
|
|
76
|
+
rel: "System.LinkTypes.Hierarchy-Reverse",
|
|
77
|
+
url: `${this.baseUrl}/_apis/wit/workItems/${workItemId(parentKey)}`,
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
]),
|
|
81
|
+
});
|
|
82
|
+
return { key: String(created.id), url: created._links?.html?.href ?? null };
|
|
83
|
+
}
|
|
84
|
+
/** REQ-306: the work item's title and description, its HTML flattened. */
|
|
85
|
+
async readIssueText(issueKey) {
|
|
86
|
+
const item = await this.requestJson(`/_apis/wit/workitems/${workItemId(issueKey)}?fields=System.Title,System.Description&${API_VERSION}`, `Azure read work item ${issueKey}`, { headers: { Authorization: this.authorization } });
|
|
87
|
+
const html = String(item.fields?.["System.Description"] ?? "");
|
|
88
|
+
return {
|
|
89
|
+
title: String(item.fields?.["System.Title"] ?? ""),
|
|
90
|
+
body: html
|
|
91
|
+
.replace(/<br\s*\/?>|<\/(?:p|div|li)>/gi, "\n")
|
|
92
|
+
.replace(/<[^>]+>/g, "")
|
|
93
|
+
.replace(/ /g, " ")
|
|
94
|
+
.replace(/&/g, "&")
|
|
95
|
+
.replace(/</g, "<")
|
|
96
|
+
.replace(/>/g, ">")
|
|
97
|
+
.trim(),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
60
100
|
async closeIssue(issueKey) {
|
|
61
101
|
await this.request(`/_apis/wit/workitems/${issueKey}?${API_VERSION}`, `Azure close work item ${issueKey}`, {
|
|
62
102
|
method: "PATCH",
|
|
@@ -65,6 +105,27 @@ class AzureClient extends http_client_1.HttpAlmClient {
|
|
|
65
105
|
});
|
|
66
106
|
}
|
|
67
107
|
}
|
|
108
|
+
/** A work item id as a path segment: digits, nothing a path could be walked with. */
|
|
109
|
+
function workItemId(key) {
|
|
110
|
+
if (!/^\d+$/.test(key))
|
|
111
|
+
throw new Error(`Azure: '${key}' is not a work item id.`);
|
|
112
|
+
return key;
|
|
113
|
+
}
|
|
114
|
+
/** Comments are a preview API on Azure Boards: not read, and `alm pull` says so. */
|
|
115
|
+
const AZURE_CAPABILITIES = {
|
|
116
|
+
create: true,
|
|
117
|
+
readStatus: true,
|
|
118
|
+
close: true,
|
|
119
|
+
// Azure searches with WIQL — a POST carrying a query language, then a
|
|
120
|
+
// second request to hydrate each id. That is a different shape from the
|
|
121
|
+
// other two, and declaring `false` degrades `alm pull` with a message
|
|
122
|
+
// rather than pretending and failing at the first request.
|
|
123
|
+
listIssues: false,
|
|
124
|
+
phase: true,
|
|
125
|
+
subIssues: true,
|
|
126
|
+
comments: false,
|
|
127
|
+
readText: true,
|
|
128
|
+
};
|
|
68
129
|
exports.azureProvider = {
|
|
69
130
|
id: "azure",
|
|
70
131
|
label: "Azure Boards",
|
|
@@ -72,7 +133,7 @@ exports.azureProvider = {
|
|
|
72
133
|
required: ["base_url", "project_key", "token_env"],
|
|
73
134
|
optional: ["issue_type", "done_state"],
|
|
74
135
|
},
|
|
75
|
-
capabilities:
|
|
136
|
+
capabilities: AZURE_CAPABILITIES,
|
|
76
137
|
create: (cfg, fetchImpl) => new AzureClient(cfg, fetchImpl),
|
|
77
138
|
};
|
|
78
139
|
exports.default = exports.azureProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/azure.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;
|
|
1
|
+
{"version":3,"file":"azure.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/azure.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,12 +27,7 @@ const API_VERSION = "2022-11-28";
|
|
|
27
27
|
* which is what ADR-0021 asks for.
|
|
28
28
|
*/
|
|
29
29
|
class GitHubClient extends http_client_1.HttpAlmClient {
|
|
30
|
-
capabilities =
|
|
31
|
-
create: true,
|
|
32
|
-
readStatus: true,
|
|
33
|
-
close: true,
|
|
34
|
-
listIssues: true,
|
|
35
|
-
};
|
|
30
|
+
capabilities = GITHUB_CAPABILITIES;
|
|
36
31
|
headers;
|
|
37
32
|
repo;
|
|
38
33
|
constructor(cfg, fetchImpl) {
|
|
@@ -99,6 +94,54 @@ class GitHubClient extends http_client_1.HttpAlmClient {
|
|
|
99
94
|
url: issue.html_url ?? null,
|
|
100
95
|
}));
|
|
101
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* REQ-305: GitHub has two states, so a phase short of archived is a label —
|
|
99
|
+
* `specgate:proposed`, `specgate:building`, or the one `phases:` names — and
|
|
100
|
+
* the other phase's label comes off. Archived closes the issue.
|
|
101
|
+
*/
|
|
102
|
+
async setPhase(issueKey, phase, state) {
|
|
103
|
+
const n = issueNumber(issueKey);
|
|
104
|
+
if (phase === "archived") {
|
|
105
|
+
await this.closeIssue(n);
|
|
106
|
+
return "closed";
|
|
107
|
+
}
|
|
108
|
+
const label = state ?? `specgate:${phase}`;
|
|
109
|
+
const other = phase === "proposed" ? "specgate:building" : "specgate:proposed";
|
|
110
|
+
await this.request(`/repos/${this.repo}/issues/${n}/labels`, `GitHub label issue ${n}`, {
|
|
111
|
+
method: "POST",
|
|
112
|
+
headers: this.headers,
|
|
113
|
+
body: JSON.stringify({ labels: [label] }),
|
|
114
|
+
});
|
|
115
|
+
// The other phase's label may never have been set: a 404 is the answer
|
|
116
|
+
// that it is not there, which is what removing it wanted.
|
|
117
|
+
await this.fetchImpl(`${this.baseUrl}/repos/${this.repo}/issues/${n}/labels/${encodeURIComponent(other)}`, { method: "DELETE", headers: this.headers });
|
|
118
|
+
return label;
|
|
119
|
+
}
|
|
120
|
+
/** REQ-307: a new issue, attached to its parent as a sub-issue. */
|
|
121
|
+
async createSubIssue(parentKey, title) {
|
|
122
|
+
const parent = issueNumber(parentKey);
|
|
123
|
+
const created = await this.requestJson(`/repos/${this.repo}/issues`, `GitHub create a sub-issue of #${parent}`, {
|
|
124
|
+
method: "POST",
|
|
125
|
+
headers: this.headers,
|
|
126
|
+
body: JSON.stringify({ title, labels: ["spec-driven"] }),
|
|
127
|
+
});
|
|
128
|
+
await this.request(`/repos/${this.repo}/issues/${parent}/sub_issues`, `GitHub attach #${created.number} to #${parent}`, { method: "POST", headers: this.headers, body: JSON.stringify({ sub_issue_id: created.id }) });
|
|
129
|
+
return { key: String(created.number), url: created.html_url ?? null };
|
|
130
|
+
}
|
|
131
|
+
/** REQ-306: the issue's comments, oldest first. */
|
|
132
|
+
async listComments(issueKey) {
|
|
133
|
+
const comments = await this.requestJson(`/repos/${this.repo}/issues/${issueNumber(issueKey)}/comments?per_page=100`, `GitHub read the comments of #${issueKey}`, { headers: this.headers });
|
|
134
|
+
return (comments || []).map((c) => ({
|
|
135
|
+
id: String(c.id),
|
|
136
|
+
author: String(c.user?.login ?? ""),
|
|
137
|
+
body: String(c.body ?? ""),
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
/** REQ-306: the issue's title and body. */
|
|
141
|
+
async readIssueText(issueKey) {
|
|
142
|
+
const issue = await this.requestJson(`/repos/${this.repo}/issues/${issueNumber(issueKey)}`, `GitHub read issue #${issueKey}`, { headers: this.headers });
|
|
143
|
+
return { title: String(issue.title ?? ""), body: String(issue.body ?? "") };
|
|
144
|
+
}
|
|
102
145
|
async closeIssue(issueKey) {
|
|
103
146
|
await this.request(`/repos/${this.repo}/issues/${issueKey}`, `GitHub close issue ${issueKey}`, {
|
|
104
147
|
method: "PATCH",
|
|
@@ -109,6 +152,23 @@ class GitHubClient extends http_client_1.HttpAlmClient {
|
|
|
109
152
|
});
|
|
110
153
|
}
|
|
111
154
|
}
|
|
155
|
+
/** An issue number as a path segment. */
|
|
156
|
+
function issueNumber(key) {
|
|
157
|
+
const n = String(key).replace(/^#/, "");
|
|
158
|
+
if (!/^\d+$/.test(n))
|
|
159
|
+
throw new Error(`GitHub: '${key}' is not an issue number.`);
|
|
160
|
+
return n;
|
|
161
|
+
}
|
|
162
|
+
const GITHUB_CAPABILITIES = {
|
|
163
|
+
create: true,
|
|
164
|
+
readStatus: true,
|
|
165
|
+
close: true,
|
|
166
|
+
listIssues: true,
|
|
167
|
+
phase: true,
|
|
168
|
+
subIssues: true,
|
|
169
|
+
comments: true,
|
|
170
|
+
readText: true,
|
|
171
|
+
};
|
|
112
172
|
exports.githubProvider = {
|
|
113
173
|
id: "github",
|
|
114
174
|
label: "GitHub Issues",
|
|
@@ -117,7 +177,7 @@ exports.githubProvider = {
|
|
|
117
177
|
// Only GitHub Enterprise Server needs a base URL; github.com is the default.
|
|
118
178
|
optional: ["base_url"],
|
|
119
179
|
},
|
|
120
|
-
capabilities:
|
|
180
|
+
capabilities: GITHUB_CAPABILITIES,
|
|
121
181
|
create: (cfg, fetchImpl) => new GitHubClient(cfg, fetchImpl),
|
|
122
182
|
};
|
|
123
183
|
exports.default = exports.githubProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/github.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../scripts/alm/providers/github.ts"],"names":[],"mappings":"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"}
|