forge-cc 0.1.40 → 1.0.0

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 (72) hide show
  1. package/README.md +454 -338
  2. package/dist/cli.js +194 -906
  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/go/linear-sync-cli.js +13 -4
  26. package/dist/go/linear-sync-cli.js.map +1 -1
  27. package/dist/go/linear-sync.d.ts +1 -0
  28. package/dist/go/linear-sync.js +67 -4
  29. package/dist/go/linear-sync.js.map +1 -1
  30. package/dist/linear/client.d.ts +34 -105
  31. package/dist/linear/client.js +85 -365
  32. package/dist/linear/client.js.map +1 -1
  33. package/dist/linear/issues.d.ts +3 -1
  34. package/dist/linear/issues.js +14 -2
  35. package/dist/linear/issues.js.map +1 -1
  36. package/dist/linear/projects.js +3 -2
  37. package/dist/linear/projects.js.map +1 -1
  38. package/dist/linear/sync.d.ts +15 -0
  39. package/dist/linear/sync.js +102 -0
  40. package/dist/linear/sync.js.map +1 -0
  41. package/dist/runner/loop.d.ts +4 -0
  42. package/dist/runner/loop.js +168 -0
  43. package/dist/runner/loop.js.map +1 -0
  44. package/dist/runner/prompt.d.ts +14 -0
  45. package/dist/runner/prompt.js +59 -0
  46. package/dist/runner/prompt.js.map +1 -0
  47. package/dist/runner/update.d.ts +1 -0
  48. package/dist/runner/update.js +72 -0
  49. package/dist/runner/update.js.map +1 -0
  50. package/dist/server.d.ts +6 -2
  51. package/dist/server.js +43 -101
  52. package/dist/server.js.map +1 -1
  53. package/dist/setup.d.ts +5 -0
  54. package/dist/setup.js +208 -0
  55. package/dist/setup.js.map +1 -0
  56. package/dist/state/cache.d.ts +3 -0
  57. package/dist/state/cache.js +23 -0
  58. package/dist/state/cache.js.map +1 -0
  59. package/dist/state/status.d.ts +66 -0
  60. package/dist/state/status.js +96 -0
  61. package/dist/state/status.js.map +1 -0
  62. package/dist/types.d.ts +46 -114
  63. package/dist/worktree/manager.d.ts +6 -103
  64. package/dist/worktree/manager.js +25 -296
  65. package/dist/worktree/manager.js.map +1 -1
  66. package/hooks/pre-commit-verify.js +109 -109
  67. package/package.json +3 -2
  68. package/skills/forge-go.md +583 -575
  69. package/skills/forge-setup.md +149 -388
  70. package/skills/forge-spec.md +367 -342
  71. package/skills/forge-triage.md +179 -133
  72. package/skills/forge-update.md +87 -93
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
- import type { GateResult, PipelineInput, PipelineResult } from "../types.js";
2
- /** Gate registry -- maps gate name to its function */
3
- export declare const gateRegistry: Record<string, (input: PipelineInput) => Promise<GateResult>>;
4
- /** Run the full verification pipeline */
5
- export declare function runPipeline(input: PipelineInput): Promise<PipelineResult>;
6
- export { verifyTypes } from "./types-gate.js";
7
- export { verifyLint } from "./lint-gate.js";
8
- export { verifyTests } from "./tests-gate.js";
9
- export { verifyVisual, captureBeforeSnapshots, clearBeforeSnapshots } from "./visual-gate.js";
10
- export { verifyRuntime } from "./runtime-gate.js";
11
- export { verifyPrd } from "./prd-gate.js";
12
- export { verifyReview } from "./review-gate.js";
1
+ import type { ForgeConfig, GateResult, PipelineResult } from "../types.js";
2
+ /** A single verification gate. */
3
+ export interface Gate {
4
+ name: string;
5
+ run: (projectDir: string) => Promise<GateResult>;
6
+ }
7
+ /** Register a gate in the global registry. */
8
+ export declare function registerGate(gate: Gate): void;
9
+ /** List all registered gate names in insertion order. */
10
+ export declare function listGates(): string[];
11
+ /** Clear all registered gates (for testing). */
12
+ export declare function clearGates(): void;
13
+ /** Run the verification pipeline: execute configured gates sequentially with per-gate timeouts. */
14
+ export declare function runPipeline(config: ForgeConfig, projectDir: string): Promise<PipelineResult>;
@@ -1,115 +1,63 @@
1
- import { closeBrowser } from "../utils/browser.js";
2
- import { verifyTypes } from "./types-gate.js";
3
- import { verifyLint } from "./lint-gate.js";
4
- import { verifyTests } from "./tests-gate.js";
5
- import { verifyVisual } from "./visual-gate.js";
6
- import { verifyRuntime } from "./runtime-gate.js";
7
- import { verifyPrd } from "./prd-gate.js";
8
- import { verifyReview } from "./review-gate.js";
9
- /** Gate registry -- maps gate name to its function */
10
- export const gateRegistry = {
11
- types: (input) => verifyTypes(input.appDir ?? input.projectDir),
12
- lint: (input) => verifyLint(input.appDir ?? input.projectDir),
13
- tests: (input) => verifyTests(input.appDir ?? input.projectDir, { configRoot: input.projectDir }),
14
- visual: (input) => verifyVisual(input.appDir ?? input.projectDir, input.pages ?? [], {
15
- devServerCommand: input.devServerCommand,
16
- devServerPort: input.devServerPort,
17
- }),
18
- runtime: (input) => verifyRuntime(input.appDir ?? input.projectDir, input.apiEndpoints ?? [], {
19
- devServerCommand: input.devServerCommand,
20
- devServerPort: input.devServerPort,
21
- }),
22
- prd: (input) => verifyPrd(input.projectDir, input.prdPath ?? "", input.baseBranch),
23
- review: (input) => verifyReview(input.projectDir, {
24
- prdPath: input.prdPath,
25
- baseBranch: input.baseBranch,
26
- blocking: input.reviewBlocking,
27
- }),
28
- };
29
- /** Run the full verification pipeline */
30
- export async function runPipeline(input) {
31
- const { gates: requestedGates, maxIterations = 3, } = input;
32
- // Determine which gates to run
33
- const gatesToRun = requestedGates ?? ["types", "lint", "tests"];
1
+ const registry = new Map();
2
+ /** Register a gate in the global registry. */
3
+ export function registerGate(gate) {
4
+ registry.set(gate.name, gate);
5
+ }
6
+ /** List all registered gate names in insertion order. */
7
+ export function listGates() {
8
+ return [...registry.keys()];
9
+ }
10
+ /** Clear all registered gates (for testing). */
11
+ export function clearGates() {
12
+ registry.clear();
13
+ }
14
+ /** Run the verification pipeline: execute configured gates sequentially with per-gate timeouts. */
15
+ export async function runPipeline(config, projectDir) {
16
+ const start = Date.now();
34
17
  const results = [];
35
- try {
36
- for (const gateName of gatesToRun) {
37
- const gateFn = gateRegistry[gateName];
38
- if (!gateFn) {
39
- // Gates like "codex" are post-PR only and handled outside the pipeline.
40
- // Treat them as a skip with a warning, not a hard failure.
41
- results.push({
42
- gate: gateName,
43
- passed: true,
44
- errors: [],
45
- warnings: [`Gate "${gateName}" is not in the verify pipeline — skipped`],
46
- duration_ms: 0,
47
- });
48
- continue;
49
- }
50
- const result = await runGateSafe(gateName, () => gateFn(input));
51
- results.push(result);
52
- // Early exit: if all core gates (types, lint, tests) fail, skip remaining
53
- const coreGates = results.filter(r => ["types", "lint", "tests"].includes(r.gate));
54
- if (coreGates.length === 3 && coreGates.every(r => !r.passed)) {
55
- // Add skipped gates
56
- for (const remaining of gatesToRun.slice(gatesToRun.indexOf(gateName) + 1)) {
57
- results.push({
58
- gate: remaining,
59
- passed: false,
60
- errors: [],
61
- warnings: ["Skipped due to core gate failures"],
62
- duration_ms: 0,
63
- });
64
- }
65
- break;
66
- }
18
+ const defaultTimeout = 120_000;
19
+ for (const gateName of config.gates) {
20
+ const gate = registry.get(gateName);
21
+ if (!gate) {
22
+ results.push({
23
+ gate: gateName,
24
+ passed: false,
25
+ errors: [{ file: "", line: 0, message: `Gate "${gateName}" not registered` }],
26
+ durationMs: 0,
27
+ });
28
+ continue;
67
29
  }
68
- }
69
- finally {
30
+ const timeout = config.gateTimeouts[gateName] ?? defaultTimeout;
31
+ const gateStart = Date.now();
32
+ let timer;
70
33
  try {
71
- await closeBrowser();
34
+ const result = await Promise.race([
35
+ gate.run(projectDir),
36
+ new Promise((_resolve, reject) => {
37
+ timer = setTimeout(() => reject(new Error(`Gate "${gateName}" timed out after ${timeout}ms`)), timeout);
38
+ }),
39
+ ]);
40
+ results.push(result);
41
+ }
42
+ catch (err) {
43
+ const message = err instanceof Error ? err.message : String(err);
44
+ results.push({
45
+ gate: gateName,
46
+ passed: false,
47
+ errors: [{ file: "", line: 0, message }],
48
+ durationMs: Date.now() - gateStart,
49
+ });
50
+ }
51
+ finally {
52
+ if (timer !== undefined)
53
+ clearTimeout(timer);
72
54
  }
73
- catch { /* non-fatal */ }
74
55
  }
75
- const passed = results.every(g => g.passed);
56
+ const allPassed = results.every((r) => r.passed);
76
57
  return {
77
- passed,
78
- iteration: 1,
79
- maxIterations,
58
+ result: allPassed ? "PASSED" : "FAILED",
80
59
  gates: results,
81
- report: "", // Reporter agent in Wave 2 will handle this
60
+ durationMs: Date.now() - start,
82
61
  };
83
62
  }
84
- const GATE_TIMEOUT_MS = 120_000; // 2 minutes per gate
85
- async function runGateSafe(name, fn) {
86
- const start = Date.now();
87
- try {
88
- const result = await Promise.race([
89
- fn(),
90
- new Promise((_, reject) => globalThis.setTimeout(() => reject(new Error(`Gate "${name}" timed out after ${GATE_TIMEOUT_MS / 1000}s`)), GATE_TIMEOUT_MS)),
91
- ]);
92
- return result;
93
- }
94
- catch (err) {
95
- const duration = Date.now() - start;
96
- const message = err instanceof Error ? err.message : String(err);
97
- const isTimeout = message.includes("timed out");
98
- return {
99
- gate: name,
100
- passed: false,
101
- errors: [{ message: isTimeout ? message : `Gate "${name}" crashed: ${message}` }],
102
- warnings: [],
103
- duration_ms: duration,
104
- };
105
- }
106
- }
107
- // Re-export individual gates for direct use
108
- export { verifyTypes } from "./types-gate.js";
109
- export { verifyLint } from "./lint-gate.js";
110
- export { verifyTests } from "./tests-gate.js";
111
- export { verifyVisual, captureBeforeSnapshots, clearBeforeSnapshots } from "./visual-gate.js";
112
- export { verifyRuntime } from "./runtime-gate.js";
113
- export { verifyPrd } from "./prd-gate.js";
114
- export { verifyReview } from "./review-gate.js";
115
63
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gates/index.ts"],"names":[],"mappings":"AAQA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgB,CAAC;AAEzC,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,IAAU;IACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,UAAU;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAmB,EACnB,UAAkB;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,OAAO,CAAC;IAE/B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,QAAQ,kBAAkB,EAAE,CAAC;gBAC7E,UAAU,EAAE,CAAC;aACd,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,KAAgD,CAAC;QAErD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;gBAChC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;gBACpB,IAAI,OAAO,CAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;oBACtC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,QAAQ,qBAAqB,OAAO,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1G,CAAC,CAAC;aACH,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;gBACxC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;aACnC,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO;QACL,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;QACvC,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC/B,CAAC;AACJ,CAAC"}
@@ -1,2 +1,2 @@
1
- import type { GateResult } from "../types.js";
2
- export declare function verifyLint(projectDir: string): Promise<GateResult>;
1
+ import type { Gate } from "./index.js";
2
+ export declare const lintGate: Gate;
@@ -1,71 +1,65 @@
1
- import { execSync } from "node:child_process";
2
- import { buildLintRemediation } from "./remediation.js";
3
- /**
4
- * Biome diagnostics often look like:
5
- * path/to/file.ts:10:5 lint/rule ...
6
- * or header lines with ━━ separators
7
- */
8
- const BIOME_LOC_RE = /^(.+?):(\d+):\d+\s+(.+)$/;
9
- export async function verifyLint(projectDir) {
10
- const start = Date.now();
11
- const errors = [];
12
- const warnings = [];
1
+ import { spawn } from "node:child_process";
2
+ /** Parse biome check --reporter=json output into structured errors. */
3
+ function parseBiomeOutput(output) {
13
4
  try {
14
- execSync("npx biome check", {
15
- cwd: projectDir,
16
- stdio: "pipe",
17
- timeout: 60_000,
18
- });
19
- return { gate: "lint", passed: true, errors, warnings, duration_ms: Date.now() - start };
5
+ const report = JSON.parse(output);
6
+ if (!report.diagnostics)
7
+ return [];
8
+ return report.diagnostics
9
+ .filter((d) => d.severity === "error" || d.severity === "warning")
10
+ .map((d) => ({
11
+ file: d.location?.path?.file ?? "",
12
+ line: 0, // JSON reporter doesn't provide line numbers directly; span offsets are byte-based
13
+ column: 0,
14
+ message: d.description ?? d.message ?? "Unknown lint error",
15
+ rule: d.category,
16
+ }));
20
17
  }
21
- catch (err) {
22
- const stdout = err instanceof Error && "stdout" in err
23
- ? String(err.stdout)
24
- : "";
25
- const stderr = err instanceof Error && "stderr" in err
26
- ? String(err.stderr)
27
- : "";
28
- const output = `${stdout}\n${stderr}`;
29
- const rawErrors = [];
30
- for (const line of output.split("\n")) {
31
- const trimmed = line.trim();
32
- if (!trimmed)
33
- continue;
34
- if (trimmed.includes(" ━━") ||
35
- trimmed.toLowerCase().includes("error") ||
36
- trimmed.includes("×")) {
37
- const match = BIOME_LOC_RE.exec(trimmed);
38
- if (match) {
39
- rawErrors.push({
40
- file: match[1],
41
- line: Number.parseInt(match[2], 10),
42
- message: match[3],
43
- });
44
- }
45
- else {
46
- rawErrors.push({ message: trimmed });
47
- }
48
- }
49
- }
50
- // Cap at 50 errors to avoid massive output
51
- const cappedErrors = rawErrors.slice(0, 50);
52
- if (rawErrors.length > 50) {
53
- cappedErrors.push({ message: `... and ${rawErrors.length - 50} more errors` });
54
- }
55
- if (cappedErrors.length === 0) {
56
- cappedErrors.push({ message: "biome check exited with non-zero status but no errors were parsed" });
57
- }
58
- // Enrich errors with remediation hints
59
- for (const error of cappedErrors) {
60
- error.remediation = buildLintRemediation(error);
61
- }
62
- return {
63
- gate: "lint",
64
- passed: false,
65
- errors: cappedErrors,
66
- warnings,
67
- duration_ms: Date.now() - start,
68
- };
18
+ catch {
19
+ // If JSON parsing fails, return a single error with the raw output
20
+ return output.trim()
21
+ ? [{ file: "", line: 0, message: `Biome output parse error: ${output.slice(0, 200)}` }]
22
+ : [];
69
23
  }
70
24
  }
25
+ function runBiome(projectDir) {
26
+ return new Promise((resolve) => {
27
+ const start = Date.now();
28
+ const child = spawn("npx", ["biome", "check", "--reporter=json", "."], {
29
+ cwd: projectDir,
30
+ shell: true,
31
+ stdio: ["ignore", "pipe", "pipe"],
32
+ });
33
+ let stdout = "";
34
+ let stderr = "";
35
+ child.stdout.on("data", (data) => {
36
+ stdout += data.toString();
37
+ });
38
+ child.stderr.on("data", (data) => {
39
+ stderr += data.toString();
40
+ });
41
+ child.on("close", (code) => {
42
+ const output = stdout + stderr;
43
+ const errors = parseBiomeOutput(output);
44
+ resolve({
45
+ gate: "lint",
46
+ passed: code === 0,
47
+ errors,
48
+ durationMs: Date.now() - start,
49
+ });
50
+ });
51
+ child.on("error", (err) => {
52
+ resolve({
53
+ gate: "lint",
54
+ passed: false,
55
+ errors: [{ file: "", line: 0, message: err.message }],
56
+ durationMs: Date.now() - start,
57
+ });
58
+ });
59
+ });
60
+ }
61
+ export const lintGate = {
62
+ name: "lint",
63
+ run: runBiome,
64
+ };
71
65
  //# sourceMappingURL=lint-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lint-gate.js","sourceRoot":"","sources":["../../src/gates/lint-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lint-gate.js","sourceRoot":"","sources":["../../src/gates/lint-gate.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,2 @@
1
- import type { GateResult } from "../types.js";
2
- export declare function verifyTests(projectDir: string, options?: {
3
- configRoot?: string;
4
- }): Promise<GateResult>;
1
+ import type { Gate } from "./index.js";
2
+ export declare const testsGate: Gate;