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.
Files changed (142) hide show
  1. package/package.json +3 -2
  2. package/dist/gates/codex-gate.d.ts +0 -51
  3. package/dist/gates/codex-gate.js +0 -121
  4. package/dist/gates/codex-gate.js.map +0 -1
  5. package/dist/gates/prd-gate.d.ts +0 -7
  6. package/dist/gates/prd-gate.js +0 -193
  7. package/dist/gates/prd-gate.js.map +0 -1
  8. package/dist/gates/remediation.d.ts +0 -46
  9. package/dist/gates/remediation.js +0 -423
  10. package/dist/gates/remediation.js.map +0 -1
  11. package/dist/gates/review-gate.d.ts +0 -16
  12. package/dist/gates/review-gate.js +0 -479
  13. package/dist/gates/review-gate.js.map +0 -1
  14. package/dist/gates/runtime-gate.d.ts +0 -5
  15. package/dist/gates/runtime-gate.js +0 -99
  16. package/dist/gates/runtime-gate.js.map +0 -1
  17. package/dist/gates/test-analysis.d.ts +0 -21
  18. package/dist/gates/test-analysis.js +0 -394
  19. package/dist/gates/test-analysis.js.map +0 -1
  20. package/dist/gates/visual-capture.d.ts +0 -24
  21. package/dist/gates/visual-capture.js +0 -144
  22. package/dist/gates/visual-capture.js.map +0 -1
  23. package/dist/gates/visual-gate.d.ts +0 -18
  24. package/dist/gates/visual-gate.js +0 -234
  25. package/dist/gates/visual-gate.js.map +0 -1
  26. package/dist/gates/visual-reviewer.d.ts +0 -11
  27. package/dist/gates/visual-reviewer.js +0 -211
  28. package/dist/gates/visual-reviewer.js.map +0 -1
  29. package/dist/go/auto-chain.d.ts +0 -136
  30. package/dist/go/auto-chain.js +0 -389
  31. package/dist/go/auto-chain.js.map +0 -1
  32. package/dist/go/executor.d.ts +0 -137
  33. package/dist/go/executor.js +0 -447
  34. package/dist/go/executor.js.map +0 -1
  35. package/dist/go/finalize.d.ts +0 -108
  36. package/dist/go/finalize.js +0 -331
  37. package/dist/go/finalize.js.map +0 -1
  38. package/dist/go/linear-sync-cli.d.ts +0 -55
  39. package/dist/go/linear-sync-cli.js +0 -192
  40. package/dist/go/linear-sync-cli.js.map +0 -1
  41. package/dist/go/linear-sync.d.ts +0 -112
  42. package/dist/go/linear-sync.js +0 -375
  43. package/dist/go/linear-sync.js.map +0 -1
  44. package/dist/go/prd-queue.d.ts +0 -43
  45. package/dist/go/prd-queue.js +0 -67
  46. package/dist/go/prd-queue.js.map +0 -1
  47. package/dist/go/prd-selector.d.ts +0 -57
  48. package/dist/go/prd-selector.js +0 -101
  49. package/dist/go/prd-selector.js.map +0 -1
  50. package/dist/go/verify-loop.d.ts +0 -64
  51. package/dist/go/verify-loop.js +0 -327
  52. package/dist/go/verify-loop.js.map +0 -1
  53. package/dist/hooks/pre-commit.d.ts +0 -5
  54. package/dist/hooks/pre-commit.js +0 -75
  55. package/dist/hooks/pre-commit.js.map +0 -1
  56. package/dist/linear/issues.d.ts +0 -22
  57. package/dist/linear/issues.js +0 -51
  58. package/dist/linear/issues.js.map +0 -1
  59. package/dist/linear/milestones.d.ts +0 -11
  60. package/dist/linear/milestones.js +0 -32
  61. package/dist/linear/milestones.js.map +0 -1
  62. package/dist/linear/projects.d.ts +0 -16
  63. package/dist/linear/projects.js +0 -51
  64. package/dist/linear/projects.js.map +0 -1
  65. package/dist/reporter/human.d.ts +0 -7
  66. package/dist/reporter/human.js +0 -93
  67. package/dist/reporter/human.js.map +0 -1
  68. package/dist/reporter/json.d.ts +0 -2
  69. package/dist/reporter/json.js +0 -4
  70. package/dist/reporter/json.js.map +0 -1
  71. package/dist/setup/structural-templates.d.ts +0 -12
  72. package/dist/setup/structural-templates.js +0 -288
  73. package/dist/setup/structural-templates.js.map +0 -1
  74. package/dist/setup/templates.d.ts +0 -17
  75. package/dist/setup/templates.js +0 -109
  76. package/dist/setup/templates.js.map +0 -1
  77. package/dist/setup/test-planner.d.ts +0 -38
  78. package/dist/setup/test-planner.js +0 -91
  79. package/dist/setup/test-planner.js.map +0 -1
  80. package/dist/setup/test-scaffold.d.ts +0 -31
  81. package/dist/setup/test-scaffold.js +0 -209
  82. package/dist/setup/test-scaffold.js.map +0 -1
  83. package/dist/setup/test-templates.d.ts +0 -37
  84. package/dist/setup/test-templates.js +0 -313
  85. package/dist/setup/test-templates.js.map +0 -1
  86. package/dist/spec/generator.d.ts +0 -34
  87. package/dist/spec/generator.js +0 -227
  88. package/dist/spec/generator.js.map +0 -1
  89. package/dist/spec/interview.d.ts +0 -142
  90. package/dist/spec/interview.js +0 -287
  91. package/dist/spec/interview.js.map +0 -1
  92. package/dist/spec/linear-sync.d.ts +0 -48
  93. package/dist/spec/linear-sync.js +0 -125
  94. package/dist/spec/linear-sync.js.map +0 -1
  95. package/dist/spec/scanner.d.ts +0 -79
  96. package/dist/spec/scanner.js +0 -566
  97. package/dist/spec/scanner.js.map +0 -1
  98. package/dist/spec/templates.d.ts +0 -375
  99. package/dist/spec/templates.js +0 -95
  100. package/dist/spec/templates.js.map +0 -1
  101. package/dist/state/prd-status.d.ts +0 -62
  102. package/dist/state/prd-status.js +0 -122
  103. package/dist/state/prd-status.js.map +0 -1
  104. package/dist/state/reader.d.ts +0 -7
  105. package/dist/state/reader.js +0 -43
  106. package/dist/state/reader.js.map +0 -1
  107. package/dist/state/writer.d.ts +0 -21
  108. package/dist/state/writer.js +0 -106
  109. package/dist/state/writer.js.map +0 -1
  110. package/dist/team/consensus.d.ts +0 -28
  111. package/dist/team/consensus.js +0 -130
  112. package/dist/team/consensus.js.map +0 -1
  113. package/dist/team/index.d.ts +0 -4
  114. package/dist/team/index.js +0 -5
  115. package/dist/team/index.js.map +0 -1
  116. package/dist/team/lifecycle.d.ts +0 -37
  117. package/dist/team/lifecycle.js +0 -92
  118. package/dist/team/lifecycle.js.map +0 -1
  119. package/dist/team/reviewer.d.ts +0 -10
  120. package/dist/team/reviewer.js +0 -345
  121. package/dist/team/reviewer.js.map +0 -1
  122. package/dist/team/types.d.ts +0 -269
  123. package/dist/team/types.js +0 -70
  124. package/dist/team/types.js.map +0 -1
  125. package/dist/utils/browser.d.ts +0 -10
  126. package/dist/utils/browser.js +0 -96
  127. package/dist/utils/browser.js.map +0 -1
  128. package/dist/utils/platform.d.ts +0 -29
  129. package/dist/utils/platform.js +0 -90
  130. package/dist/utils/platform.js.map +0 -1
  131. package/dist/worktree/identity.d.ts +0 -9
  132. package/dist/worktree/identity.js +0 -32
  133. package/dist/worktree/identity.js.map +0 -1
  134. package/dist/worktree/parallel.d.ts +0 -87
  135. package/dist/worktree/parallel.js +0 -328
  136. package/dist/worktree/parallel.js.map +0 -1
  137. package/dist/worktree/session.d.ts +0 -67
  138. package/dist/worktree/session.js +0 -194
  139. package/dist/worktree/session.js.map +0 -1
  140. package/dist/worktree/state-merge.d.ts +0 -43
  141. package/dist/worktree/state-merge.js +0 -162
  142. package/dist/worktree/state-merge.js.map +0 -1
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"finalize.js","sourceRoot":"","sources":["../../src/go/finalize.ts"],"names":[],"mappings":"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"}
@@ -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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"}