forge-cc 0.1.41 → 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 (203) hide show
  1. package/README.md +454 -338
  2. package/dist/cli.js +194 -935
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/loader.d.ts +1 -1
  5. package/dist/config/loader.js +49 -56
  6. package/dist/config/loader.js.map +1 -1
  7. package/dist/config/schema.d.ts +37 -125
  8. package/dist/config/schema.js +13 -28
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/doctor.d.ts +10 -0
  11. package/dist/doctor.js +148 -0
  12. package/dist/doctor.js.map +1 -0
  13. package/dist/gates/index.d.ts +14 -12
  14. package/dist/gates/index.js +53 -105
  15. package/dist/gates/index.js.map +1 -1
  16. package/dist/gates/lint-gate.d.ts +2 -2
  17. package/dist/gates/lint-gate.js +60 -66
  18. package/dist/gates/lint-gate.js.map +1 -1
  19. package/dist/gates/tests-gate.d.ts +2 -4
  20. package/dist/gates/tests-gate.js +75 -203
  21. package/dist/gates/tests-gate.js.map +1 -1
  22. package/dist/gates/types-gate.d.ts +2 -2
  23. package/dist/gates/types-gate.js +53 -59
  24. package/dist/gates/types-gate.js.map +1 -1
  25. package/dist/linear/client.d.ts +31 -108
  26. package/dist/linear/client.js +88 -388
  27. package/dist/linear/client.js.map +1 -1
  28. package/dist/linear/sync.d.ts +15 -0
  29. package/dist/linear/sync.js +102 -0
  30. package/dist/linear/sync.js.map +1 -0
  31. package/dist/runner/loop.d.ts +4 -0
  32. package/dist/runner/loop.js +168 -0
  33. package/dist/runner/loop.js.map +1 -0
  34. package/dist/runner/prompt.d.ts +14 -0
  35. package/dist/runner/prompt.js +59 -0
  36. package/dist/runner/prompt.js.map +1 -0
  37. package/dist/runner/update.d.ts +1 -0
  38. package/dist/runner/update.js +72 -0
  39. package/dist/runner/update.js.map +1 -0
  40. package/dist/server.d.ts +6 -2
  41. package/dist/server.js +43 -101
  42. package/dist/server.js.map +1 -1
  43. package/dist/setup.d.ts +5 -0
  44. package/dist/setup.js +208 -0
  45. package/dist/setup.js.map +1 -0
  46. package/dist/state/cache.d.ts +3 -0
  47. package/dist/state/cache.js +23 -0
  48. package/dist/state/cache.js.map +1 -0
  49. package/dist/state/status.d.ts +66 -0
  50. package/dist/state/status.js +96 -0
  51. package/dist/state/status.js.map +1 -0
  52. package/dist/types.d.ts +46 -114
  53. package/dist/worktree/manager.d.ts +6 -103
  54. package/dist/worktree/manager.js +25 -296
  55. package/dist/worktree/manager.js.map +1 -1
  56. package/hooks/pre-commit-verify.js +109 -109
  57. package/package.json +5 -3
  58. package/skills/forge-go.md +20 -13
  59. package/skills/forge-setup.md +149 -388
  60. package/skills/forge-spec.md +367 -342
  61. package/skills/forge-triage.md +179 -133
  62. package/skills/forge-update.md +87 -93
  63. package/dist/gates/codex-gate.d.ts +0 -51
  64. package/dist/gates/codex-gate.js +0 -121
  65. package/dist/gates/codex-gate.js.map +0 -1
  66. package/dist/gates/prd-gate.d.ts +0 -7
  67. package/dist/gates/prd-gate.js +0 -193
  68. package/dist/gates/prd-gate.js.map +0 -1
  69. package/dist/gates/remediation.d.ts +0 -46
  70. package/dist/gates/remediation.js +0 -423
  71. package/dist/gates/remediation.js.map +0 -1
  72. package/dist/gates/review-gate.d.ts +0 -16
  73. package/dist/gates/review-gate.js +0 -479
  74. package/dist/gates/review-gate.js.map +0 -1
  75. package/dist/gates/runtime-gate.d.ts +0 -5
  76. package/dist/gates/runtime-gate.js +0 -99
  77. package/dist/gates/runtime-gate.js.map +0 -1
  78. package/dist/gates/test-analysis.d.ts +0 -21
  79. package/dist/gates/test-analysis.js +0 -394
  80. package/dist/gates/test-analysis.js.map +0 -1
  81. package/dist/gates/visual-capture.d.ts +0 -24
  82. package/dist/gates/visual-capture.js +0 -144
  83. package/dist/gates/visual-capture.js.map +0 -1
  84. package/dist/gates/visual-gate.d.ts +0 -18
  85. package/dist/gates/visual-gate.js +0 -234
  86. package/dist/gates/visual-gate.js.map +0 -1
  87. package/dist/gates/visual-reviewer.d.ts +0 -11
  88. package/dist/gates/visual-reviewer.js +0 -211
  89. package/dist/gates/visual-reviewer.js.map +0 -1
  90. package/dist/go/auto-chain.d.ts +0 -136
  91. package/dist/go/auto-chain.js +0 -389
  92. package/dist/go/auto-chain.js.map +0 -1
  93. package/dist/go/executor.d.ts +0 -137
  94. package/dist/go/executor.js +0 -447
  95. package/dist/go/executor.js.map +0 -1
  96. package/dist/go/finalize.d.ts +0 -108
  97. package/dist/go/finalize.js +0 -331
  98. package/dist/go/finalize.js.map +0 -1
  99. package/dist/go/linear-sync-cli.d.ts +0 -55
  100. package/dist/go/linear-sync-cli.js +0 -192
  101. package/dist/go/linear-sync-cli.js.map +0 -1
  102. package/dist/go/linear-sync.d.ts +0 -112
  103. package/dist/go/linear-sync.js +0 -375
  104. package/dist/go/linear-sync.js.map +0 -1
  105. package/dist/go/prd-queue.d.ts +0 -43
  106. package/dist/go/prd-queue.js +0 -67
  107. package/dist/go/prd-queue.js.map +0 -1
  108. package/dist/go/prd-selector.d.ts +0 -57
  109. package/dist/go/prd-selector.js +0 -101
  110. package/dist/go/prd-selector.js.map +0 -1
  111. package/dist/go/verify-loop.d.ts +0 -64
  112. package/dist/go/verify-loop.js +0 -327
  113. package/dist/go/verify-loop.js.map +0 -1
  114. package/dist/hooks/pre-commit.d.ts +0 -5
  115. package/dist/hooks/pre-commit.js +0 -75
  116. package/dist/hooks/pre-commit.js.map +0 -1
  117. package/dist/linear/issues.d.ts +0 -22
  118. package/dist/linear/issues.js +0 -51
  119. package/dist/linear/issues.js.map +0 -1
  120. package/dist/linear/milestones.d.ts +0 -11
  121. package/dist/linear/milestones.js +0 -32
  122. package/dist/linear/milestones.js.map +0 -1
  123. package/dist/linear/projects.d.ts +0 -16
  124. package/dist/linear/projects.js +0 -51
  125. package/dist/linear/projects.js.map +0 -1
  126. package/dist/reporter/human.d.ts +0 -7
  127. package/dist/reporter/human.js +0 -93
  128. package/dist/reporter/human.js.map +0 -1
  129. package/dist/reporter/json.d.ts +0 -2
  130. package/dist/reporter/json.js +0 -4
  131. package/dist/reporter/json.js.map +0 -1
  132. package/dist/setup/structural-templates.d.ts +0 -12
  133. package/dist/setup/structural-templates.js +0 -288
  134. package/dist/setup/structural-templates.js.map +0 -1
  135. package/dist/setup/templates.d.ts +0 -17
  136. package/dist/setup/templates.js +0 -109
  137. package/dist/setup/templates.js.map +0 -1
  138. package/dist/setup/test-planner.d.ts +0 -38
  139. package/dist/setup/test-planner.js +0 -91
  140. package/dist/setup/test-planner.js.map +0 -1
  141. package/dist/setup/test-scaffold.d.ts +0 -31
  142. package/dist/setup/test-scaffold.js +0 -209
  143. package/dist/setup/test-scaffold.js.map +0 -1
  144. package/dist/setup/test-templates.d.ts +0 -37
  145. package/dist/setup/test-templates.js +0 -313
  146. package/dist/setup/test-templates.js.map +0 -1
  147. package/dist/spec/generator.d.ts +0 -34
  148. package/dist/spec/generator.js +0 -227
  149. package/dist/spec/generator.js.map +0 -1
  150. package/dist/spec/interview.d.ts +0 -142
  151. package/dist/spec/interview.js +0 -287
  152. package/dist/spec/interview.js.map +0 -1
  153. package/dist/spec/linear-sync.d.ts +0 -48
  154. package/dist/spec/linear-sync.js +0 -125
  155. package/dist/spec/linear-sync.js.map +0 -1
  156. package/dist/spec/scanner.d.ts +0 -79
  157. package/dist/spec/scanner.js +0 -566
  158. package/dist/spec/scanner.js.map +0 -1
  159. package/dist/spec/templates.d.ts +0 -375
  160. package/dist/spec/templates.js +0 -95
  161. package/dist/spec/templates.js.map +0 -1
  162. package/dist/state/prd-status.d.ts +0 -62
  163. package/dist/state/prd-status.js +0 -122
  164. package/dist/state/prd-status.js.map +0 -1
  165. package/dist/state/reader.d.ts +0 -7
  166. package/dist/state/reader.js +0 -43
  167. package/dist/state/reader.js.map +0 -1
  168. package/dist/state/writer.d.ts +0 -21
  169. package/dist/state/writer.js +0 -106
  170. package/dist/state/writer.js.map +0 -1
  171. package/dist/team/consensus.d.ts +0 -28
  172. package/dist/team/consensus.js +0 -130
  173. package/dist/team/consensus.js.map +0 -1
  174. package/dist/team/index.d.ts +0 -4
  175. package/dist/team/index.js +0 -5
  176. package/dist/team/index.js.map +0 -1
  177. package/dist/team/lifecycle.d.ts +0 -37
  178. package/dist/team/lifecycle.js +0 -92
  179. package/dist/team/lifecycle.js.map +0 -1
  180. package/dist/team/reviewer.d.ts +0 -10
  181. package/dist/team/reviewer.js +0 -345
  182. package/dist/team/reviewer.js.map +0 -1
  183. package/dist/team/types.d.ts +0 -269
  184. package/dist/team/types.js +0 -70
  185. package/dist/team/types.js.map +0 -1
  186. package/dist/utils/browser.d.ts +0 -10
  187. package/dist/utils/browser.js +0 -96
  188. package/dist/utils/browser.js.map +0 -1
  189. package/dist/utils/platform.d.ts +0 -29
  190. package/dist/utils/platform.js +0 -90
  191. package/dist/utils/platform.js.map +0 -1
  192. package/dist/worktree/identity.d.ts +0 -9
  193. package/dist/worktree/identity.js +0 -32
  194. package/dist/worktree/identity.js.map +0 -1
  195. package/dist/worktree/parallel.d.ts +0 -87
  196. package/dist/worktree/parallel.js +0 -328
  197. package/dist/worktree/parallel.js.map +0 -1
  198. package/dist/worktree/session.d.ts +0 -67
  199. package/dist/worktree/session.js +0 -194
  200. package/dist/worktree/session.js.map +0 -1
  201. package/dist/worktree/state-merge.d.ts +0 -43
  202. package/dist/worktree/state-merge.js +0 -162
  203. package/dist/worktree/state-merge.js.map +0 -1
@@ -1,70 +0,0 @@
1
- import { z } from "zod";
2
- // ---------------------------------------------------------------------------
3
- // Agent Role
4
- // ---------------------------------------------------------------------------
5
- export const AgentRoleSchema = z.enum([
6
- "executive",
7
- "builder",
8
- "reviewer",
9
- "notetaker",
10
- ]);
11
- // ---------------------------------------------------------------------------
12
- // Team Config
13
- // ---------------------------------------------------------------------------
14
- export const TeamConfigSchema = z.object({
15
- teamName: z.string(),
16
- prdSlug: z.string(),
17
- milestoneNumber: z.number(),
18
- roles: z.record(z.string(), AgentRoleSchema),
19
- });
20
- // ---------------------------------------------------------------------------
21
- // Finding
22
- // ---------------------------------------------------------------------------
23
- export const FindingSchema = z.object({
24
- id: z.string(),
25
- severity: z.enum(["error", "warning"]),
26
- file: z.string().optional(),
27
- line: z.number().optional(),
28
- message: z.string(),
29
- remediation: z.string(),
30
- source: z.string(),
31
- });
32
- // ---------------------------------------------------------------------------
33
- // Consensus Round
34
- // ---------------------------------------------------------------------------
35
- export const ConsensusRoundSchema = z.object({
36
- findingId: z.string(),
37
- round: z.number(),
38
- builderName: z.string(),
39
- response: z.enum(["agree", "disagree", "alternative"]),
40
- reason: z.string().optional(),
41
- alternativeProposal: z.string().optional(),
42
- });
43
- // ---------------------------------------------------------------------------
44
- // Consensus Result
45
- // ---------------------------------------------------------------------------
46
- export const ConsensusResultSchema = z.object({
47
- findingId: z.string(),
48
- resolution: z.enum(["accepted", "rejected", "escalated"]),
49
- rounds: z.array(ConsensusRoundSchema),
50
- finalDecision: z.string().optional(),
51
- });
52
- // ---------------------------------------------------------------------------
53
- // Team Review Result
54
- // ---------------------------------------------------------------------------
55
- export const TeamReviewResultSchema = z.object({
56
- findings: z.array(FindingSchema),
57
- consensusResults: z.array(ConsensusResultSchema),
58
- duration_ms: z.number(),
59
- });
60
- // ---------------------------------------------------------------------------
61
- // Codex Comment
62
- // ---------------------------------------------------------------------------
63
- export const CodexCommentSchema = z.object({
64
- id: z.number(),
65
- body: z.string(),
66
- path: z.string(),
67
- line: z.number().optional(),
68
- resolved: z.boolean(),
69
- });
70
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/team/types.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { Browser } from "playwright";
2
- import { type ChildProcess } from "node:child_process";
3
- export declare function getBrowser(): Promise<Browser>;
4
- export declare function closeBrowser(): Promise<void>;
5
- export declare function startDevServer(projectDir: string, command?: string, port?: number): Promise<{
6
- port: number;
7
- process: ChildProcess;
8
- }>;
9
- export declare function stopDevServer(): Promise<void>;
10
- export declare function waitForServer(port: number, timeoutMs?: number): Promise<boolean>;
@@ -1,96 +0,0 @@
1
- import { spawn, execSync } from "node:child_process";
2
- import { setTimeout } from "node:timers/promises";
3
- let browserInstance = null;
4
- let devServerProcess = null;
5
- export async function getBrowser() {
6
- if (!browserInstance || !browserInstance.isConnected()) {
7
- let chromium;
8
- try {
9
- const pw = await import("playwright");
10
- chromium = pw.chromium;
11
- }
12
- catch {
13
- throw new Error("Playwright is not installed. Run `npm install playwright` to enable visual gates.");
14
- }
15
- try {
16
- browserInstance = await chromium.launch({ headless: true });
17
- }
18
- catch (err) {
19
- const message = err instanceof Error ? err.message : String(err);
20
- if (message.includes("Executable doesn't exist") || message.includes("browserType.launch")) {
21
- throw new Error(`Playwright browsers are not installed. Run "npx playwright install chromium" to fix this. Original error: ${message}`);
22
- }
23
- throw err;
24
- }
25
- }
26
- return browserInstance;
27
- }
28
- export async function closeBrowser() {
29
- if (browserInstance) {
30
- await browserInstance.close();
31
- browserInstance = null;
32
- }
33
- }
34
- export async function startDevServer(projectDir, command, port) {
35
- const resolvedCommand = command ?? "npm run dev";
36
- const resolvedPort = port ?? 3000;
37
- // Kill any existing dev server before starting a new one
38
- await stopDevServer();
39
- devServerProcess = spawn(resolvedCommand, {
40
- cwd: projectDir,
41
- shell: true,
42
- stdio: "pipe",
43
- });
44
- // Wait for the server to become reachable
45
- const ready = await waitForServer(resolvedPort);
46
- if (!ready) {
47
- await stopDevServer();
48
- throw new Error(`Dev server failed to start on port ${resolvedPort} within timeout`);
49
- }
50
- return { port: resolvedPort, process: devServerProcess };
51
- }
52
- export async function stopDevServer() {
53
- if (devServerProcess) {
54
- const proc = devServerProcess;
55
- devServerProcess = null;
56
- try {
57
- if (process.platform === "win32" && proc.pid) {
58
- // On Windows, proc.kill() doesn't kill the child process tree.
59
- // Use taskkill with /T (tree) /F (force) to kill the process and its children.
60
- try {
61
- execSync(`taskkill /pid ${proc.pid} /T /F`, { stdio: "pipe" });
62
- }
63
- catch {
64
- // taskkill may fail if the process already exited — fall back to proc.kill()
65
- try {
66
- proc.kill();
67
- }
68
- catch { /* already exited */ }
69
- }
70
- }
71
- else {
72
- proc.kill();
73
- }
74
- }
75
- catch {
76
- // Process may have already exited — ignore
77
- }
78
- // Brief wait for cleanup
79
- await setTimeout(500);
80
- }
81
- }
82
- export async function waitForServer(port, timeoutMs) {
83
- const deadline = Date.now() + (timeoutMs ?? 30_000);
84
- while (Date.now() < deadline) {
85
- try {
86
- await fetch(`http://localhost:${port}`);
87
- return true;
88
- }
89
- catch {
90
- // Server not ready yet — wait and retry
91
- await setTimeout(1000);
92
- }
93
- }
94
- return false;
95
- }
96
- //# sourceMappingURL=browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"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"}
@@ -1,29 +0,0 @@
1
- /**
2
- * Write content to a file atomically using temp+rename.
3
- * On Windows, rename can fail if another process has the file open --
4
- * retry with exponential backoff (3 attempts: 50ms, 100ms, 200ms).
5
- */
6
- export declare function atomicWriteFileSync(filePath: string, content: string): void;
7
- /**
8
- * Read and parse a JSON file. Returns null if the file doesn't exist.
9
- * Throws on parse errors.
10
- */
11
- export declare function readJsonFileSync<T>(filePath: string): T | null;
12
- /**
13
- * Atomically write a JSON object to a file with pretty printing.
14
- */
15
- export declare function writeJsonFileSync(filePath: string, data: unknown): void;
16
- /**
17
- * Generate a short 8-character hex session ID from random bytes.
18
- */
19
- export declare function generateSessionId(): string;
20
- /**
21
- * Normalize a path using path.resolve and path.join.
22
- * Ensures consistent separators on all platforms.
23
- */
24
- export declare function normalizePath(...segments: string[]): string;
25
- /**
26
- * Quote a string for safe shell usage.
27
- * On Windows, uses double quotes. On POSIX, uses single quotes with escaping.
28
- */
29
- export declare function shellQuote(value: string): string;
@@ -1,90 +0,0 @@
1
- import { writeFileSync, readFileSync, renameSync, unlinkSync, mkdirSync, existsSync, } from "node:fs";
2
- import { join, resolve, dirname } from "node:path";
3
- import { randomBytes } from "node:crypto";
4
- /**
5
- * Write content to a file atomically using temp+rename.
6
- * On Windows, rename can fail if another process has the file open --
7
- * retry with exponential backoff (3 attempts: 50ms, 100ms, 200ms).
8
- */
9
- export function atomicWriteFileSync(filePath, content) {
10
- const resolved = resolve(filePath);
11
- const dir = dirname(resolved);
12
- if (!existsSync(dir)) {
13
- mkdirSync(dir, { recursive: true });
14
- }
15
- const tmpFile = resolved + ".tmp." + randomBytes(4).toString("hex");
16
- writeFileSync(tmpFile, content, "utf-8");
17
- const delays = [50, 100, 200];
18
- for (let attempt = 0; attempt < delays.length; attempt++) {
19
- try {
20
- renameSync(tmpFile, resolved);
21
- return;
22
- }
23
- catch (err) {
24
- const isLastAttempt = attempt === delays.length - 1;
25
- if (isLastAttempt) {
26
- // Clean up temp file on final failure, then rethrow
27
- try {
28
- unlinkSync(tmpFile);
29
- }
30
- catch {
31
- // Ignore cleanup errors
32
- }
33
- throw err;
34
- }
35
- // Synchronous sleep for retry backoff
36
- const waitUntil = Date.now() + delays[attempt];
37
- while (Date.now() < waitUntil) {
38
- // Busy-wait (sync context, no async available)
39
- }
40
- }
41
- }
42
- }
43
- /**
44
- * Read and parse a JSON file. Returns null if the file doesn't exist.
45
- * Throws on parse errors.
46
- */
47
- export function readJsonFileSync(filePath) {
48
- const resolved = resolve(filePath);
49
- if (!existsSync(resolved)) {
50
- return null;
51
- }
52
- const raw = readFileSync(resolved, "utf-8");
53
- return JSON.parse(raw);
54
- }
55
- /**
56
- * Atomically write a JSON object to a file with pretty printing.
57
- */
58
- export function writeJsonFileSync(filePath, data) {
59
- const content = JSON.stringify(data, null, 2) + "\n";
60
- atomicWriteFileSync(filePath, content);
61
- }
62
- /**
63
- * Generate a short 8-character hex session ID from random bytes.
64
- */
65
- export function generateSessionId() {
66
- return randomBytes(4).toString("hex");
67
- }
68
- /**
69
- * Normalize a path using path.resolve and path.join.
70
- * Ensures consistent separators on all platforms.
71
- */
72
- export function normalizePath(...segments) {
73
- return resolve(join(...segments));
74
- }
75
- /**
76
- * Quote a string for safe shell usage.
77
- * On Windows, uses double quotes. On POSIX, uses single quotes with escaping.
78
- */
79
- export function shellQuote(value) {
80
- if (process.platform === "win32") {
81
- // Windows: wrap in double quotes, escape internal double quotes
82
- const escaped = value.replace(/"/g, '\\"');
83
- return `"${escaped}"`;
84
- }
85
- // POSIX: wrap in single quotes, escape internal single quotes
86
- // Replace ' with '\'' (end quote, escaped quote, start quote)
87
- const escaped = value.replace(/'/g, "'\\''");
88
- return `'${escaped}'`;
89
- }
90
- //# sourceMappingURL=platform.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/utils/platform.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- export interface UserIdentity {
2
- name: string;
3
- email: string;
4
- }
5
- /**
6
- * Get the current user's identity from git config.
7
- * Falls back to OS username if git config is not set.
8
- */
9
- export declare function getCurrentUser(cwd?: string): UserIdentity;
@@ -1,32 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import { userInfo } from "node:os";
3
- /**
4
- * Get the current user's identity from git config.
5
- * Falls back to OS username if git config is not set.
6
- */
7
- export function getCurrentUser(cwd) {
8
- let name;
9
- let email;
10
- try {
11
- name = execSync("git config user.name", {
12
- cwd,
13
- encoding: "utf-8",
14
- stdio: "pipe",
15
- }).trim();
16
- }
17
- catch {
18
- name = userInfo().username;
19
- }
20
- try {
21
- email = execSync("git config user.email", {
22
- cwd,
23
- encoding: "utf-8",
24
- stdio: "pipe",
25
- }).trim();
26
- }
27
- catch {
28
- email = "unknown";
29
- }
30
- return { name, email };
31
- }
32
- //# sourceMappingURL=identity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/worktree/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAOnC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,IAAY,CAAC;IACjB,IAAI,KAAa,CAAC;IAElB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,sBAAsB,EAAE;YACtC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,uBAAuB,EAAE;YACxC,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,SAAS,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACzB,CAAC"}
@@ -1,87 +0,0 @@
1
- /**
2
- * Parallel Scheduler — Milestone Dependency Analyzer & Execution Planner
3
- *
4
- * Parses `dependsOn` from PRD milestones, builds a DAG, determines which
5
- * milestones can run simultaneously in parallel waves, and provides
6
- * functions to query ready milestones given completed set.
7
- *
8
- * Backward compatible: milestones without `dependsOn` are treated as
9
- * having no dependencies (roots).
10
- */
11
- export interface MilestoneDep {
12
- number: number;
13
- name: string;
14
- dependsOn: number[];
15
- }
16
- export interface DAGNode {
17
- milestone: MilestoneDep;
18
- children: number[];
19
- parents: number[];
20
- depth: number;
21
- }
22
- export interface ExecutionWave {
23
- waveNumber: number;
24
- milestones: number[];
25
- }
26
- export interface SchedulerResult {
27
- waves: ExecutionWave[];
28
- totalMilestones: number;
29
- maxParallelism: number;
30
- isSequential: boolean;
31
- }
32
- /**
33
- * Build a directed acyclic graph from milestone dependencies.
34
- *
35
- * Validates:
36
- * - All referenced dependencies exist in the milestone set
37
- * - No cycles exist in the dependency graph
38
- *
39
- * Throws descriptive errors on validation failure.
40
- */
41
- export declare function buildDAG(milestones: MilestoneDep[]): Map<number, DAGNode>;
42
- /**
43
- * Topological sort milestones into parallel execution waves.
44
- *
45
- * - Wave 1: all milestones with no dependencies (roots)
46
- * - Wave 2: milestones whose dependencies are all in Wave 1
47
- * - Wave N: milestones whose dependencies are all in waves < N
48
- */
49
- export declare function computeExecutionWaves(dag: Map<number, DAGNode>): SchedulerResult;
50
- /**
51
- * Parse a PRD markdown document to extract milestone definitions and
52
- * their `dependsOn` fields.
53
- *
54
- * Looks for milestone headers like:
55
- * ### Milestone 1: Name Here
56
- * ### Milestone 2 — Name Here
57
- *
58
- * And within each milestone section, looks for:
59
- * **dependsOn:** 1, 3
60
- * dependsOn: [1, 3]
61
- * **dependsOn:** [1]
62
- *
63
- * If no `dependsOn` field is found, treats the milestone as having no
64
- * dependencies (backward compatible).
65
- */
66
- export declare function parseMilestoneDependencies(prdContent: string): MilestoneDep[];
67
- /**
68
- * Given execution waves and a set of completed milestone numbers,
69
- * return which milestones are ready to start.
70
- *
71
- * A milestone is ready if:
72
- * 1. It has not been completed yet
73
- * 2. All of its dependencies (from the wave schedule) are in the completed set
74
- *
75
- * This requires the original DAG to check dependencies, so we accept
76
- * the waves plus the DAG.
77
- */
78
- export declare function getReadyMilestones(dag: Map<number, DAGNode>, completed: Set<number>): number[];
79
- /**
80
- * Parse a PRD file and build the full execution schedule.
81
- * Combines parseMilestoneDependencies + buildDAG + computeExecutionWaves.
82
- *
83
- * If the PRD has no `dependsOn` fields, all milestones will be in wave 1
84
- * (all roots), which is backward compatible with sequential execution
85
- * when the caller processes them in milestone-number order.
86
- */
87
- export declare function buildScheduleFromPRD(prdPath: string): Promise<SchedulerResult>;