forge-cc 1.0.0 → 1.0.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/package.json +3 -2
- package/dist/gates/codex-gate.d.ts +0 -51
- package/dist/gates/codex-gate.js +0 -121
- package/dist/gates/codex-gate.js.map +0 -1
- package/dist/gates/prd-gate.d.ts +0 -7
- package/dist/gates/prd-gate.js +0 -193
- package/dist/gates/prd-gate.js.map +0 -1
- package/dist/gates/remediation.d.ts +0 -46
- package/dist/gates/remediation.js +0 -423
- package/dist/gates/remediation.js.map +0 -1
- package/dist/gates/review-gate.d.ts +0 -16
- package/dist/gates/review-gate.js +0 -479
- package/dist/gates/review-gate.js.map +0 -1
- package/dist/gates/runtime-gate.d.ts +0 -5
- package/dist/gates/runtime-gate.js +0 -99
- package/dist/gates/runtime-gate.js.map +0 -1
- package/dist/gates/test-analysis.d.ts +0 -21
- package/dist/gates/test-analysis.js +0 -394
- package/dist/gates/test-analysis.js.map +0 -1
- package/dist/gates/visual-capture.d.ts +0 -24
- package/dist/gates/visual-capture.js +0 -144
- package/dist/gates/visual-capture.js.map +0 -1
- package/dist/gates/visual-gate.d.ts +0 -18
- package/dist/gates/visual-gate.js +0 -234
- package/dist/gates/visual-gate.js.map +0 -1
- package/dist/gates/visual-reviewer.d.ts +0 -11
- package/dist/gates/visual-reviewer.js +0 -211
- package/dist/gates/visual-reviewer.js.map +0 -1
- package/dist/go/auto-chain.d.ts +0 -136
- package/dist/go/auto-chain.js +0 -389
- package/dist/go/auto-chain.js.map +0 -1
- package/dist/go/executor.d.ts +0 -137
- package/dist/go/executor.js +0 -447
- package/dist/go/executor.js.map +0 -1
- package/dist/go/finalize.d.ts +0 -108
- package/dist/go/finalize.js +0 -331
- package/dist/go/finalize.js.map +0 -1
- package/dist/go/linear-sync-cli.d.ts +0 -55
- package/dist/go/linear-sync-cli.js +0 -192
- package/dist/go/linear-sync-cli.js.map +0 -1
- package/dist/go/linear-sync.d.ts +0 -112
- package/dist/go/linear-sync.js +0 -375
- package/dist/go/linear-sync.js.map +0 -1
- package/dist/go/prd-queue.d.ts +0 -43
- package/dist/go/prd-queue.js +0 -67
- package/dist/go/prd-queue.js.map +0 -1
- package/dist/go/prd-selector.d.ts +0 -57
- package/dist/go/prd-selector.js +0 -101
- package/dist/go/prd-selector.js.map +0 -1
- package/dist/go/verify-loop.d.ts +0 -64
- package/dist/go/verify-loop.js +0 -327
- package/dist/go/verify-loop.js.map +0 -1
- package/dist/hooks/pre-commit.d.ts +0 -5
- package/dist/hooks/pre-commit.js +0 -75
- package/dist/hooks/pre-commit.js.map +0 -1
- package/dist/linear/issues.d.ts +0 -22
- package/dist/linear/issues.js +0 -51
- package/dist/linear/issues.js.map +0 -1
- package/dist/linear/milestones.d.ts +0 -11
- package/dist/linear/milestones.js +0 -32
- package/dist/linear/milestones.js.map +0 -1
- package/dist/linear/projects.d.ts +0 -16
- package/dist/linear/projects.js +0 -51
- package/dist/linear/projects.js.map +0 -1
- package/dist/reporter/human.d.ts +0 -7
- package/dist/reporter/human.js +0 -93
- package/dist/reporter/human.js.map +0 -1
- package/dist/reporter/json.d.ts +0 -2
- package/dist/reporter/json.js +0 -4
- package/dist/reporter/json.js.map +0 -1
- package/dist/setup/structural-templates.d.ts +0 -12
- package/dist/setup/structural-templates.js +0 -288
- package/dist/setup/structural-templates.js.map +0 -1
- package/dist/setup/templates.d.ts +0 -17
- package/dist/setup/templates.js +0 -109
- package/dist/setup/templates.js.map +0 -1
- package/dist/setup/test-planner.d.ts +0 -38
- package/dist/setup/test-planner.js +0 -91
- package/dist/setup/test-planner.js.map +0 -1
- package/dist/setup/test-scaffold.d.ts +0 -31
- package/dist/setup/test-scaffold.js +0 -209
- package/dist/setup/test-scaffold.js.map +0 -1
- package/dist/setup/test-templates.d.ts +0 -37
- package/dist/setup/test-templates.js +0 -313
- package/dist/setup/test-templates.js.map +0 -1
- package/dist/spec/generator.d.ts +0 -34
- package/dist/spec/generator.js +0 -227
- package/dist/spec/generator.js.map +0 -1
- package/dist/spec/interview.d.ts +0 -142
- package/dist/spec/interview.js +0 -287
- package/dist/spec/interview.js.map +0 -1
- package/dist/spec/linear-sync.d.ts +0 -48
- package/dist/spec/linear-sync.js +0 -125
- package/dist/spec/linear-sync.js.map +0 -1
- package/dist/spec/scanner.d.ts +0 -79
- package/dist/spec/scanner.js +0 -566
- package/dist/spec/scanner.js.map +0 -1
- package/dist/spec/templates.d.ts +0 -375
- package/dist/spec/templates.js +0 -95
- package/dist/spec/templates.js.map +0 -1
- package/dist/state/prd-status.d.ts +0 -62
- package/dist/state/prd-status.js +0 -122
- package/dist/state/prd-status.js.map +0 -1
- package/dist/state/reader.d.ts +0 -7
- package/dist/state/reader.js +0 -43
- package/dist/state/reader.js.map +0 -1
- package/dist/state/writer.d.ts +0 -21
- package/dist/state/writer.js +0 -106
- package/dist/state/writer.js.map +0 -1
- package/dist/team/consensus.d.ts +0 -28
- package/dist/team/consensus.js +0 -130
- package/dist/team/consensus.js.map +0 -1
- package/dist/team/index.d.ts +0 -4
- package/dist/team/index.js +0 -5
- package/dist/team/index.js.map +0 -1
- package/dist/team/lifecycle.d.ts +0 -37
- package/dist/team/lifecycle.js +0 -92
- package/dist/team/lifecycle.js.map +0 -1
- package/dist/team/reviewer.d.ts +0 -10
- package/dist/team/reviewer.js +0 -345
- package/dist/team/reviewer.js.map +0 -1
- package/dist/team/types.d.ts +0 -269
- package/dist/team/types.js +0 -70
- package/dist/team/types.js.map +0 -1
- package/dist/utils/browser.d.ts +0 -10
- package/dist/utils/browser.js +0 -96
- package/dist/utils/browser.js.map +0 -1
- package/dist/utils/platform.d.ts +0 -29
- package/dist/utils/platform.js +0 -90
- package/dist/utils/platform.js.map +0 -1
- package/dist/worktree/identity.d.ts +0 -9
- package/dist/worktree/identity.js +0 -32
- package/dist/worktree/identity.js.map +0 -1
- package/dist/worktree/parallel.d.ts +0 -87
- package/dist/worktree/parallel.js +0 -328
- package/dist/worktree/parallel.js.map +0 -1
- package/dist/worktree/session.d.ts +0 -67
- package/dist/worktree/session.js +0 -194
- package/dist/worktree/session.js.map +0 -1
- package/dist/worktree/state-merge.d.ts +0 -43
- package/dist/worktree/state-merge.js +0 -162
- package/dist/worktree/state-merge.js.map +0 -1
package/dist/go/finalize.js
DELETED
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Final Milestone Detection and PR Creation
|
|
3
|
-
*
|
|
4
|
-
* Handles the transition from "last milestone complete" to "PR ready for review".
|
|
5
|
-
* Uses `gh pr create` to open a pull request with a forge verification report
|
|
6
|
-
* in the body. Designed to be called by the execution engine after the final
|
|
7
|
-
* milestone passes verification.
|
|
8
|
-
*/
|
|
9
|
-
import { execSync } from "node:child_process";
|
|
10
|
-
import { pollForCodexComments, runCodexGate, getUnresolvedComments, fetchPRComments, } from "../gates/codex-gate.js";
|
|
11
|
-
// ---------------------------------------------------------------------------
|
|
12
|
-
// extractRepoInfo
|
|
13
|
-
// ---------------------------------------------------------------------------
|
|
14
|
-
/**
|
|
15
|
-
* Extract the owner and repo name from the current Git remote using `gh`.
|
|
16
|
-
* Returns `null` if `gh` is unavailable or the command fails.
|
|
17
|
-
*/
|
|
18
|
-
export function extractRepoInfo(projectDir) {
|
|
19
|
-
try {
|
|
20
|
-
const raw = execSync("gh repo view --json owner,name", {
|
|
21
|
-
cwd: projectDir,
|
|
22
|
-
encoding: "utf-8",
|
|
23
|
-
timeout: 15_000,
|
|
24
|
-
}).trim();
|
|
25
|
-
const parsed = JSON.parse(raw);
|
|
26
|
-
return { owner: parsed.owner.login, repo: parsed.name };
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// ---------------------------------------------------------------------------
|
|
33
|
-
// pollAndResolvePRComments
|
|
34
|
-
// ---------------------------------------------------------------------------
|
|
35
|
-
/**
|
|
36
|
-
* Poll for Codex review comments on a PR and attempt to resolve them
|
|
37
|
-
* using the provided `onFixComment` callback. Returns the list of
|
|
38
|
-
* comments that remain unresolved after the fix cycle.
|
|
39
|
-
*/
|
|
40
|
-
export async function pollAndResolvePRComments(options) {
|
|
41
|
-
const { owner, repo, prNumber, projectDir, pollIntervalMs, maxPolls, onFixComment, } = options;
|
|
42
|
-
// First pass: poll for comments
|
|
43
|
-
const gateResult = await runCodexGate({
|
|
44
|
-
owner,
|
|
45
|
-
repo,
|
|
46
|
-
prNumber,
|
|
47
|
-
pollIntervalMs,
|
|
48
|
-
maxPolls,
|
|
49
|
-
projectDir,
|
|
50
|
-
});
|
|
51
|
-
// If no errors (gate passed), everything is clean
|
|
52
|
-
if (gateResult.passed) {
|
|
53
|
-
return { unresolved: [], gateResult };
|
|
54
|
-
}
|
|
55
|
-
// If we have no fix callback, just return the unresolved state
|
|
56
|
-
if (!onFixComment) {
|
|
57
|
-
const comments = fetchPRComments({ owner, repo, prNumber, projectDir });
|
|
58
|
-
const unresolved = getUnresolvedComments(comments);
|
|
59
|
-
return { unresolved, gateResult };
|
|
60
|
-
}
|
|
61
|
-
// Attempt to fix each unresolved comment, tracking addressed IDs
|
|
62
|
-
const comments = fetchPRComments({ owner, repo, prNumber, projectDir });
|
|
63
|
-
const addressedIds = new Set();
|
|
64
|
-
for (const comment of comments) {
|
|
65
|
-
await onFixComment(comment);
|
|
66
|
-
addressedIds.add(comment.id);
|
|
67
|
-
}
|
|
68
|
-
// After fixes, do one more poll cycle to check for any NEW comments
|
|
69
|
-
// from a re-review (exclude already-addressed IDs so the loop converges)
|
|
70
|
-
const recheckComments = await pollForCodexComments({
|
|
71
|
-
owner,
|
|
72
|
-
repo,
|
|
73
|
-
prNumber,
|
|
74
|
-
pollIntervalMs: pollIntervalMs ?? 60_000,
|
|
75
|
-
maxPolls: 1,
|
|
76
|
-
projectDir,
|
|
77
|
-
knownIds: addressedIds,
|
|
78
|
-
});
|
|
79
|
-
const stillUnresolved = recheckComments;
|
|
80
|
-
// Build a final gate result reflecting the post-fix state
|
|
81
|
-
const finalGateResult = {
|
|
82
|
-
gate: "codex",
|
|
83
|
-
passed: stillUnresolved.length === 0,
|
|
84
|
-
errors: stillUnresolved.map((c) => ({
|
|
85
|
-
file: c.path,
|
|
86
|
-
line: c.line,
|
|
87
|
-
message: c.body,
|
|
88
|
-
remediation: "Address the Codex review comment",
|
|
89
|
-
})),
|
|
90
|
-
warnings: stillUnresolved.length === 0
|
|
91
|
-
? ["All Codex comments resolved after fix cycle"]
|
|
92
|
-
: [],
|
|
93
|
-
duration_ms: gateResult.duration_ms,
|
|
94
|
-
};
|
|
95
|
-
return { unresolved: stillUnresolved, gateResult: finalGateResult };
|
|
96
|
-
}
|
|
97
|
-
// ---------------------------------------------------------------------------
|
|
98
|
-
// finalizeWithCodexGate
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
/**
|
|
101
|
-
* Create a PR and run the Codex review gate. The milestone only marks
|
|
102
|
-
* complete when 0 unresolved PR comments remain. If the Codex gate
|
|
103
|
-
* times out with no comments, the milestone still completes (gate is
|
|
104
|
-
* optional).
|
|
105
|
-
*/
|
|
106
|
-
export async function finalizeWithCodexGate(options) {
|
|
107
|
-
// Step 1: Create the PR
|
|
108
|
-
const pr = createPullRequest(options);
|
|
109
|
-
// If PR creation failed, return early
|
|
110
|
-
if (!pr.created) {
|
|
111
|
-
return { pr, allCommentsResolved: false };
|
|
112
|
-
}
|
|
113
|
-
// Step 2: Run the Codex review gate with pollAndResolve
|
|
114
|
-
const { unresolved, gateResult } = await pollAndResolvePRComments({
|
|
115
|
-
owner: options.owner,
|
|
116
|
-
repo: options.repo,
|
|
117
|
-
prNumber: pr.number,
|
|
118
|
-
projectDir: options.projectDir,
|
|
119
|
-
pollIntervalMs: options.codexPollIntervalMs,
|
|
120
|
-
maxPolls: options.codexMaxPolls,
|
|
121
|
-
onFixComment: options.onFixComment,
|
|
122
|
-
});
|
|
123
|
-
// Codex gate is optional: if it passed (no comments found / timed out),
|
|
124
|
-
// the milestone still completes
|
|
125
|
-
const allCommentsResolved = unresolved.length === 0;
|
|
126
|
-
return {
|
|
127
|
-
pr,
|
|
128
|
-
codexGate: gateResult,
|
|
129
|
-
allCommentsResolved,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
// buildPRTitle
|
|
134
|
-
// ---------------------------------------------------------------------------
|
|
135
|
-
/**
|
|
136
|
-
* Generate a PR title summarizing all completed milestones.
|
|
137
|
-
*
|
|
138
|
-
* Examples:
|
|
139
|
-
* - `feat: my-project — Milestone 1 complete`
|
|
140
|
-
* - `feat: my-project — Milestones 1-5 complete`
|
|
141
|
-
*/
|
|
142
|
-
export function buildPRTitle(project, milestoneCount) {
|
|
143
|
-
if (milestoneCount <= 0) {
|
|
144
|
-
return `feat: ${project} — implementation complete`;
|
|
145
|
-
}
|
|
146
|
-
if (milestoneCount === 1) {
|
|
147
|
-
return `feat: ${project} — Milestone 1 complete`;
|
|
148
|
-
}
|
|
149
|
-
return `feat: ${project} — Milestones 1-${milestoneCount} complete`;
|
|
150
|
-
}
|
|
151
|
-
// ---------------------------------------------------------------------------
|
|
152
|
-
// buildVerificationSection
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
/**
|
|
155
|
-
* Format a PipelineResult into a PR-ready verification section.
|
|
156
|
-
*
|
|
157
|
-
* Includes gate-level pass/fail status with error counts and
|
|
158
|
-
* duration information. Designed to be embedded in a PR body.
|
|
159
|
-
*/
|
|
160
|
-
export function buildVerificationSection(result) {
|
|
161
|
-
const lines = [];
|
|
162
|
-
const status = result.passed ? "PASSED" : "FAILED";
|
|
163
|
-
lines.push(`**Status:** ${status}`);
|
|
164
|
-
lines.push(`**Iterations:** ${result.iteration}/${result.maxIterations}`);
|
|
165
|
-
lines.push("");
|
|
166
|
-
// Gate results table
|
|
167
|
-
lines.push("| Gate | Status | Duration | Details |");
|
|
168
|
-
lines.push("|------|--------|----------|---------|");
|
|
169
|
-
for (const gate of result.gates) {
|
|
170
|
-
const statusIcon = gate.passed ? "Pass" : "Fail";
|
|
171
|
-
const duration = `${(gate.duration_ms / 1000).toFixed(1)}s`;
|
|
172
|
-
let details = "";
|
|
173
|
-
if (!gate.passed && gate.errors.length > 0) {
|
|
174
|
-
details = `${gate.errors.length} error${gate.errors.length === 1 ? "" : "s"}`;
|
|
175
|
-
}
|
|
176
|
-
else if (gate.passed && gate.warnings.length > 0) {
|
|
177
|
-
details = `${gate.warnings.length} warning${gate.warnings.length === 1 ? "" : "s"}`;
|
|
178
|
-
}
|
|
179
|
-
else if (gate.passed) {
|
|
180
|
-
details = "Clean";
|
|
181
|
-
}
|
|
182
|
-
lines.push(`| ${gate.gate} | ${statusIcon} | ${duration} | ${details} |`);
|
|
183
|
-
}
|
|
184
|
-
lines.push("");
|
|
185
|
-
// Error details (collapsed for readability)
|
|
186
|
-
const failedGates = result.gates.filter((g) => !g.passed && g.errors.length > 0);
|
|
187
|
-
if (failedGates.length > 0) {
|
|
188
|
-
lines.push("<details>");
|
|
189
|
-
lines.push("<summary>Error Details</summary>");
|
|
190
|
-
lines.push("");
|
|
191
|
-
for (const gate of failedGates) {
|
|
192
|
-
lines.push(`**${gate.gate}:**`);
|
|
193
|
-
for (const err of gate.errors) {
|
|
194
|
-
const loc = err.file
|
|
195
|
-
? `${err.file}${err.line ? `:${err.line}` : ""}`
|
|
196
|
-
: "";
|
|
197
|
-
const prefix = loc ? `\`${loc}\`: ` : "";
|
|
198
|
-
lines.push(`- ${prefix}${err.message}`);
|
|
199
|
-
}
|
|
200
|
-
lines.push("");
|
|
201
|
-
}
|
|
202
|
-
lines.push("</details>");
|
|
203
|
-
lines.push("");
|
|
204
|
-
}
|
|
205
|
-
return lines.join("\n");
|
|
206
|
-
}
|
|
207
|
-
// ---------------------------------------------------------------------------
|
|
208
|
-
// buildPRBody
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
/**
|
|
211
|
-
* Assemble the complete PR body from milestones, verification, and metadata.
|
|
212
|
-
*/
|
|
213
|
-
function buildPRBody(options) {
|
|
214
|
-
const lines = [];
|
|
215
|
-
// Summary section — milestone checklist
|
|
216
|
-
lines.push("## Summary");
|
|
217
|
-
lines.push("");
|
|
218
|
-
for (const m of options.milestones) {
|
|
219
|
-
const checkbox = m.success ? "[x]" : "[ ]";
|
|
220
|
-
lines.push(`- ${checkbox} M${m.number}: ${m.name}`);
|
|
221
|
-
}
|
|
222
|
-
lines.push("");
|
|
223
|
-
// Linear Issues section — enables auto-close on PR merge via Linear's
|
|
224
|
-
// GitHub integration. Identifiers are workspace-specific (e.g., MSIG-123).
|
|
225
|
-
if (options.linearIssueIdentifiers &&
|
|
226
|
-
options.linearIssueIdentifiers.length > 0) {
|
|
227
|
-
lines.push("## Linear Issues");
|
|
228
|
-
lines.push("");
|
|
229
|
-
lines.push(`Closes ${options.linearIssueIdentifiers.join(", ")}`);
|
|
230
|
-
lines.push("");
|
|
231
|
-
}
|
|
232
|
-
// Verification report section
|
|
233
|
-
lines.push("## Verification Report");
|
|
234
|
-
lines.push("");
|
|
235
|
-
if (options.verificationReport) {
|
|
236
|
-
lines.push(options.verificationReport);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
lines.push("_No verification report available._");
|
|
240
|
-
}
|
|
241
|
-
lines.push("");
|
|
242
|
-
// Details section
|
|
243
|
-
lines.push("## Details");
|
|
244
|
-
lines.push(`- **Branch:** ${options.branch}`);
|
|
245
|
-
if (options.commitSha) {
|
|
246
|
-
lines.push(`- **Commit:** ${options.commitSha.slice(0, 8)}`);
|
|
247
|
-
}
|
|
248
|
-
lines.push("");
|
|
249
|
-
// Footer
|
|
250
|
-
lines.push("---");
|
|
251
|
-
lines.push("Generated with [forge-cc](https://github.com/troyhoffman/forge-cc)");
|
|
252
|
-
return lines.join("\n");
|
|
253
|
-
}
|
|
254
|
-
// ---------------------------------------------------------------------------
|
|
255
|
-
// createPullRequest
|
|
256
|
-
// ---------------------------------------------------------------------------
|
|
257
|
-
/**
|
|
258
|
-
* Create a GitHub pull request using the `gh` CLI.
|
|
259
|
-
*
|
|
260
|
-
* Builds a structured PR body with milestone status, verification report,
|
|
261
|
-
* and metadata, then calls `gh pr create`. If `gh` is not installed or the
|
|
262
|
-
* command fails, returns a descriptive error result instead of throwing.
|
|
263
|
-
*/
|
|
264
|
-
export function createPullRequest(options) {
|
|
265
|
-
const baseBranch = options.baseBranch ?? "main";
|
|
266
|
-
const body = buildPRBody(options);
|
|
267
|
-
// Check that gh CLI is available
|
|
268
|
-
try {
|
|
269
|
-
execSync("gh --version", { cwd: options.projectDir, stdio: "pipe" });
|
|
270
|
-
}
|
|
271
|
-
catch {
|
|
272
|
-
return {
|
|
273
|
-
url: "",
|
|
274
|
-
number: 0,
|
|
275
|
-
title: options.title,
|
|
276
|
-
created: false,
|
|
277
|
-
error: "GitHub CLI (gh) is not installed or not in PATH. " +
|
|
278
|
-
"Install it from https://cli.github.com/ and run `gh auth login`.",
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
// Create the PR
|
|
282
|
-
try {
|
|
283
|
-
// Write body to a temp approach using stdin to avoid shell escaping issues
|
|
284
|
-
const output = execSync(`gh pr create --title ${JSON.stringify(options.title)} --base ${JSON.stringify(baseBranch)} --body ${JSON.stringify(body)}`, {
|
|
285
|
-
cwd: options.projectDir,
|
|
286
|
-
encoding: "utf-8",
|
|
287
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
288
|
-
}).trim();
|
|
289
|
-
// gh pr create outputs the PR URL on success
|
|
290
|
-
const url = output.trim();
|
|
291
|
-
const prNumberMatch = url.match(/\/pull\/(\d+)/);
|
|
292
|
-
const prNumber = prNumberMatch ? parseInt(prNumberMatch[1], 10) : 0;
|
|
293
|
-
return {
|
|
294
|
-
url,
|
|
295
|
-
number: prNumber,
|
|
296
|
-
title: options.title,
|
|
297
|
-
created: true,
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
catch (err) {
|
|
301
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
302
|
-
// Check for common failure modes
|
|
303
|
-
if (message.includes("already exists")) {
|
|
304
|
-
return {
|
|
305
|
-
url: "",
|
|
306
|
-
number: 0,
|
|
307
|
-
title: options.title,
|
|
308
|
-
created: false,
|
|
309
|
-
error: `A pull request already exists for branch '${options.branch}'. Close or merge the existing PR first.`,
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
if (message.includes("not authenticated") ||
|
|
313
|
-
message.includes("auth login")) {
|
|
314
|
-
return {
|
|
315
|
-
url: "",
|
|
316
|
-
number: 0,
|
|
317
|
-
title: options.title,
|
|
318
|
-
created: false,
|
|
319
|
-
error: "GitHub CLI is not authenticated. Run `gh auth login` to authenticate.",
|
|
320
|
-
};
|
|
321
|
-
}
|
|
322
|
-
return {
|
|
323
|
-
url: "",
|
|
324
|
-
number: 0,
|
|
325
|
-
title: options.title,
|
|
326
|
-
created: false,
|
|
327
|
-
error: `Failed to create PR: ${message}`,
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
//# sourceMappingURL=finalize.js.map
|
package/dist/go/finalize.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/go/finalize.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,EACrB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAuDhC,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,gCAAgC,EAAE;YACrD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+C,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAQ9C;IACC,MAAM,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,cAAc,EACd,QAAQ,EACR,YAAY,GACb,GAAG,OAAO,CAAC;IAEZ,gCAAgC;IAChC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC;QACpC,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,UAAU;KACX,CAAC,CAAC;IAEH,kDAAkD;IAClD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;IACxC,CAAC;IAED,+DAA+D;IAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACxE,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC;IACpC,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,oEAAoE;IACpE,yEAAyE;IACzE,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC;QACjD,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,cAAc,EAAE,cAAc,IAAI,MAAM;QACxC,QAAQ,EAAE,CAAC;QACX,UAAU;QACV,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,eAAe,CAAC;IAExC,0DAA0D;IAC1D,MAAM,eAAe,GAAe;QAClC,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,eAAe,CAAC,MAAM,KAAK,CAAC;QACpC,MAAM,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,IAAI;YACf,WAAW,EAAE,kCAAkC;SAChD,CAAC,CAAC;QACH,QAAQ,EACN,eAAe,CAAC,MAAM,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC,6CAA6C,CAAC;YACjD,CAAC,CAAC,EAAE;QACR,WAAW,EAAE,UAAU,CAAC,WAAW;KACpC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;AACtE,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAiC;IAEjC,wBAAwB;IACxB,MAAM,EAAE,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEtC,sCAAsC;IACtC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,wDAAwD;IACxD,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,wBAAwB,CAAC;QAChE,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,QAAQ,EAAE,EAAE,CAAC,MAAM;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,cAAc,EAAE,OAAO,CAAC,mBAAmB;QAC3C,QAAQ,EAAE,OAAO,CAAC,aAAa;QAC/B,YAAY,EAAE,OAAO,CAAC,YAAY;KACnC,CAAC,CAAC;IAEH,wEAAwE;IACxE,gCAAgC;IAChC,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;IAEpD,OAAO;QACL,EAAE;QACF,SAAS,EAAE,UAAU;QACrB,mBAAmB;KACpB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,cAAsB;IAClE,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,OAAO,4BAA4B,CAAC;IACtD,CAAC;IAED,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,OAAO,yBAAyB,CAAC;IACnD,CAAC;IAED,OAAO,SAAS,OAAO,mBAAmB,cAAc,WAAW,CAAC;AACtE,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAsB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CACR,mBAAmB,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,EAAE,CAC9D,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,qBAAqB;IACrB,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QAE5D,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAChF,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACtF,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,UAAU,MAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4CAA4C;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CACxC,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI;oBAClB,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBAChD,CAAC,CAAC,EAAE,CAAC;gBACP,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;GAEG;AACH,SAAS,WAAW,CAAC,OAAwB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,wCAAwC;IACxC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,sEAAsE;IACtE,2EAA2E;IAC3E,IACE,OAAO,CAAC,sBAAsB;QAC9B,OAAO,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,EACzC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,8BAA8B;IAC9B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,kBAAkB;IAClB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,SAAS;IACT,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CACR,oEAAoE,CACrE,CAAC;IAEF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAwB;IAExB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAElC,iCAAiC;IACjC,IAAI,CAAC;QACH,QAAQ,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EACH,mDAAmD;gBACnD,kEAAkE;SACrE,CAAC;IACJ,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC;QACH,2EAA2E;QAC3E,MAAM,MAAM,GAAG,QAAQ,CACrB,wBAAwB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAC3H;YACE,GAAG,EAAE,OAAO,CAAC,UAAU;YACvB,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SAChC,CACF,CAAC,IAAI,EAAE,CAAC;QAET,6CAA6C;QAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO;YACL,GAAG;YACH,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEnD,iCAAiC;QACjC,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACvC,OAAO;gBACL,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6CAA6C,OAAO,CAAC,MAAM,0CAA0C;aAC7G,CAAC;QACJ,CAAC;QAED,IACE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC9B,CAAC;YACD,OAAO;gBACL,GAAG,EAAE,EAAE;gBACP,MAAM,EAAE,CAAC;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,KAAK;gBACd,KAAK,EACH,uEAAuE;aAC1E,CAAC;QACJ,CAAC;QAED,OAAO;YACL,GAAG,EAAE,EAAE;YACP,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,wBAAwB,OAAO,EAAE;SACzC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI adapter for Linear milestone sync.
|
|
3
|
-
*
|
|
4
|
-
* Bridges CLI arguments (slug + milestone number) to the LinearSyncOptions
|
|
5
|
-
* that syncMilestoneStart() / syncMilestoneComplete() need. All functions
|
|
6
|
-
* degrade gracefully — they return null when config or API key is missing.
|
|
7
|
-
*/
|
|
8
|
-
import type { MilestoneStartSync, MilestoneCompleteSync, ProjectIssueIdentifiers, ProjectDoneSync } from "./linear-sync.js";
|
|
9
|
-
/**
|
|
10
|
-
* Resolve the Linear project ID for a PRD slug.
|
|
11
|
-
*
|
|
12
|
-
* 1. Reads `linearProjectId` from `.planning/status/<slug>.json`
|
|
13
|
-
* 2. Falls back to `linearProject` name from `.forge.json`, resolved via
|
|
14
|
-
* `findProjectByName()` against the Linear API
|
|
15
|
-
*
|
|
16
|
-
* Returns null if neither is configured or if the API key is missing.
|
|
17
|
-
*/
|
|
18
|
-
export declare function resolveLinearProjectId(projectDir: string, slug: string): Promise<string | null>;
|
|
19
|
-
/**
|
|
20
|
-
* Resolve the milestone display name from the PRD.
|
|
21
|
-
*
|
|
22
|
-
* Parses the `### Milestone N: Name` header and formats as `M{N}: {name}`
|
|
23
|
-
* to match how `src/spec/linear-sync.ts` creates Linear milestones.
|
|
24
|
-
*
|
|
25
|
-
* Falls back to `M{N}` when the milestone is not found in the PRD.
|
|
26
|
-
*/
|
|
27
|
-
export declare function resolveMilestoneName(projectDir: string, slug: string, milestoneNumber: number): Promise<string>;
|
|
28
|
-
/**
|
|
29
|
-
* Sync Linear state when a milestone starts, resolving options from CLI
|
|
30
|
-
* context (slug + milestone number).
|
|
31
|
-
*
|
|
32
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
33
|
-
*/
|
|
34
|
-
export declare function cliSyncStart(projectDir: string, slug: string, milestoneNumber: number): Promise<MilestoneStartSync | null>;
|
|
35
|
-
/**
|
|
36
|
-
* Sync Linear state when a milestone completes, resolving options from CLI
|
|
37
|
-
* context (slug + milestone number).
|
|
38
|
-
*
|
|
39
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
40
|
-
*/
|
|
41
|
-
export declare function cliSyncComplete(projectDir: string, slug: string, milestoneNumber: number, isLastMilestone: boolean, prUrl?: string): Promise<MilestoneCompleteSync | null>;
|
|
42
|
-
/**
|
|
43
|
-
* Fetch all Linear issue identifiers for a project, resolving the project ID
|
|
44
|
-
* from the PRD slug. Used to inject `Closes TEAM-XXX` into PR descriptions.
|
|
45
|
-
*
|
|
46
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
47
|
-
*/
|
|
48
|
-
export declare function cliFetchIssueIdentifiers(projectDir: string, slug: string): Promise<ProjectIssueIdentifiers | null>;
|
|
49
|
-
/**
|
|
50
|
-
* Transition all project issues and the project to "Done" (post-merge).
|
|
51
|
-
* Resolves the project ID from the PRD slug.
|
|
52
|
-
*
|
|
53
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
54
|
-
*/
|
|
55
|
-
export declare function cliSyncDone(projectDir: string, slug: string): Promise<ProjectDoneSync | null>;
|
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI adapter for Linear milestone sync.
|
|
3
|
-
*
|
|
4
|
-
* Bridges CLI arguments (slug + milestone number) to the LinearSyncOptions
|
|
5
|
-
* that syncMilestoneStart() / syncMilestoneComplete() need. All functions
|
|
6
|
-
* degrade gracefully — they return null when config or API key is missing.
|
|
7
|
-
*/
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { LinearClient, LinearClientError } from "../linear/client.js";
|
|
10
|
-
import { findProjectByName } from "../linear/projects.js";
|
|
11
|
-
import { readPRDStatus } from "../state/prd-status.js";
|
|
12
|
-
import { readCurrentMilestone } from "../state/reader.js";
|
|
13
|
-
import { loadConfig } from "../config/loader.js";
|
|
14
|
-
import { syncMilestoneStart, syncMilestoneComplete, fetchProjectIssueIdentifiers, syncProjectDone, } from "./linear-sync.js";
|
|
15
|
-
// ---------------------------------------------------------------------------
|
|
16
|
-
// Resolve Linear Project ID
|
|
17
|
-
// ---------------------------------------------------------------------------
|
|
18
|
-
/**
|
|
19
|
-
* Resolve the Linear project ID for a PRD slug.
|
|
20
|
-
*
|
|
21
|
-
* 1. Reads `linearProjectId` from `.planning/status/<slug>.json`
|
|
22
|
-
* 2. Falls back to `linearProject` name from `.forge.json`, resolved via
|
|
23
|
-
* `findProjectByName()` against the Linear API
|
|
24
|
-
*
|
|
25
|
-
* Returns null if neither is configured or if the API key is missing.
|
|
26
|
-
*/
|
|
27
|
-
export async function resolveLinearProjectId(projectDir, slug) {
|
|
28
|
-
// Try status file first
|
|
29
|
-
const status = await readPRDStatus(projectDir, slug);
|
|
30
|
-
if (status?.linearProjectId) {
|
|
31
|
-
return status.linearProjectId;
|
|
32
|
-
}
|
|
33
|
-
// Fall back to .forge.json linearProject name
|
|
34
|
-
const config = loadConfig(projectDir);
|
|
35
|
-
if (!config.linearProject) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
// Need a LinearClient to resolve by name
|
|
39
|
-
let client;
|
|
40
|
-
try {
|
|
41
|
-
client = new LinearClient();
|
|
42
|
-
}
|
|
43
|
-
catch (error) {
|
|
44
|
-
if (error instanceof LinearClientError) {
|
|
45
|
-
console.warn("[linear-sync] WARN: LINEAR_API_KEY not set — skipping Linear sync");
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
throw error;
|
|
49
|
-
}
|
|
50
|
-
const project = await findProjectByName(client, config.linearProject);
|
|
51
|
-
return project?.id ?? null;
|
|
52
|
-
}
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
// Resolve Milestone Name
|
|
55
|
-
// ---------------------------------------------------------------------------
|
|
56
|
-
/**
|
|
57
|
-
* Resolve the milestone display name from the PRD.
|
|
58
|
-
*
|
|
59
|
-
* Parses the `### Milestone N: Name` header and formats as `M{N}: {name}`
|
|
60
|
-
* to match how `src/spec/linear-sync.ts` creates Linear milestones.
|
|
61
|
-
*
|
|
62
|
-
* Falls back to `M{N}` when the milestone is not found in the PRD.
|
|
63
|
-
*/
|
|
64
|
-
export async function resolveMilestoneName(projectDir, slug, milestoneNumber) {
|
|
65
|
-
const prdPath = join(projectDir, ".planning", "prds", `${slug}.md`);
|
|
66
|
-
const section = await readCurrentMilestone(prdPath, milestoneNumber);
|
|
67
|
-
if (!section) {
|
|
68
|
-
return `M${milestoneNumber}`;
|
|
69
|
-
}
|
|
70
|
-
// Extract name from "### Milestone N: Name" header
|
|
71
|
-
const headerMatch = section.match(/^###\s*Milestone\s+\d+\s*[:\u2014\u2013-]\s*(.+)/m);
|
|
72
|
-
if (!headerMatch) {
|
|
73
|
-
return `M${milestoneNumber}`;
|
|
74
|
-
}
|
|
75
|
-
const name = headerMatch[1].trim();
|
|
76
|
-
return `M${milestoneNumber}: ${name}`;
|
|
77
|
-
}
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
// CLI Sync Start
|
|
80
|
-
// ---------------------------------------------------------------------------
|
|
81
|
-
/**
|
|
82
|
-
* Sync Linear state when a milestone starts, resolving options from CLI
|
|
83
|
-
* context (slug + milestone number).
|
|
84
|
-
*
|
|
85
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
86
|
-
*/
|
|
87
|
-
export async function cliSyncStart(projectDir, slug, milestoneNumber) {
|
|
88
|
-
const projectId = await resolveLinearProjectId(projectDir, slug);
|
|
89
|
-
if (!projectId)
|
|
90
|
-
return null;
|
|
91
|
-
// Verify API key is available before resolving milestone name
|
|
92
|
-
try {
|
|
93
|
-
new LinearClient();
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
if (error instanceof LinearClientError) {
|
|
97
|
-
console.warn("[linear-sync] WARN: LINEAR_API_KEY not set — skipping Linear sync");
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
throw error;
|
|
101
|
-
}
|
|
102
|
-
const milestoneName = await resolveMilestoneName(projectDir, slug, milestoneNumber);
|
|
103
|
-
return syncMilestoneStart({
|
|
104
|
-
projectId,
|
|
105
|
-
milestoneNumber,
|
|
106
|
-
milestoneName,
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
// ---------------------------------------------------------------------------
|
|
110
|
-
// CLI Sync Complete
|
|
111
|
-
// ---------------------------------------------------------------------------
|
|
112
|
-
/**
|
|
113
|
-
* Sync Linear state when a milestone completes, resolving options from CLI
|
|
114
|
-
* context (slug + milestone number).
|
|
115
|
-
*
|
|
116
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
117
|
-
*/
|
|
118
|
-
export async function cliSyncComplete(projectDir, slug, milestoneNumber, isLastMilestone, prUrl) {
|
|
119
|
-
const projectId = await resolveLinearProjectId(projectDir, slug);
|
|
120
|
-
if (!projectId)
|
|
121
|
-
return null;
|
|
122
|
-
// Verify API key is available before resolving milestone name
|
|
123
|
-
try {
|
|
124
|
-
new LinearClient();
|
|
125
|
-
}
|
|
126
|
-
catch (error) {
|
|
127
|
-
if (error instanceof LinearClientError) {
|
|
128
|
-
console.warn("[linear-sync] WARN: LINEAR_API_KEY not set — skipping Linear sync");
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
throw error;
|
|
132
|
-
}
|
|
133
|
-
const milestoneName = await resolveMilestoneName(projectDir, slug, milestoneNumber);
|
|
134
|
-
return syncMilestoneComplete({
|
|
135
|
-
projectId,
|
|
136
|
-
milestoneNumber,
|
|
137
|
-
milestoneName,
|
|
138
|
-
isLastMilestone,
|
|
139
|
-
prUrl,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
// ---------------------------------------------------------------------------
|
|
143
|
-
// CLI Fetch Issue Identifiers
|
|
144
|
-
// ---------------------------------------------------------------------------
|
|
145
|
-
/**
|
|
146
|
-
* Fetch all Linear issue identifiers for a project, resolving the project ID
|
|
147
|
-
* from the PRD slug. Used to inject `Closes TEAM-XXX` into PR descriptions.
|
|
148
|
-
*
|
|
149
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
150
|
-
*/
|
|
151
|
-
export async function cliFetchIssueIdentifiers(projectDir, slug) {
|
|
152
|
-
const projectId = await resolveLinearProjectId(projectDir, slug);
|
|
153
|
-
if (!projectId)
|
|
154
|
-
return null;
|
|
155
|
-
try {
|
|
156
|
-
new LinearClient();
|
|
157
|
-
}
|
|
158
|
-
catch (error) {
|
|
159
|
-
if (error instanceof LinearClientError) {
|
|
160
|
-
console.warn("[linear-sync] WARN: LINEAR_API_KEY not set — skipping Linear sync");
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
throw error;
|
|
164
|
-
}
|
|
165
|
-
return fetchProjectIssueIdentifiers({ projectId });
|
|
166
|
-
}
|
|
167
|
-
// ---------------------------------------------------------------------------
|
|
168
|
-
// CLI Sync Done
|
|
169
|
-
// ---------------------------------------------------------------------------
|
|
170
|
-
/**
|
|
171
|
-
* Transition all project issues and the project to "Done" (post-merge).
|
|
172
|
-
* Resolves the project ID from the PRD slug.
|
|
173
|
-
*
|
|
174
|
-
* Returns null when no project ID is found or no LINEAR_API_KEY is set.
|
|
175
|
-
*/
|
|
176
|
-
export async function cliSyncDone(projectDir, slug) {
|
|
177
|
-
const projectId = await resolveLinearProjectId(projectDir, slug);
|
|
178
|
-
if (!projectId)
|
|
179
|
-
return null;
|
|
180
|
-
try {
|
|
181
|
-
new LinearClient();
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
if (error instanceof LinearClientError) {
|
|
185
|
-
console.warn("[linear-sync] WARN: LINEAR_API_KEY not set — skipping Linear sync");
|
|
186
|
-
return null;
|
|
187
|
-
}
|
|
188
|
-
throw error;
|
|
189
|
-
}
|
|
190
|
-
return syncProjectDone({ projectId });
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=linear-sync-cli.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"linear-sync-cli.js","sourceRoot":"","sources":["../../src/go/linear-sync-cli.ts"],"names":[],"mappings":"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"}
|