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,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>;