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,109 +0,0 @@
1
- // ── Setup Templates ─────────────────────────────────────────────────
2
- // String template functions used by /forge:setup to scaffold project files.
3
- // ── .forge.json ─────────────────────────────────────────────────────
4
- export function forgeConfigTemplate(ctx) {
5
- const config = {
6
- gates: ctx.gates,
7
- maxIterations: 5,
8
- };
9
- if (ctx.appDir) {
10
- config.appDir = ctx.appDir;
11
- }
12
- if (ctx.testing) {
13
- config.testing = ctx.testing;
14
- }
15
- if (ctx.forgeVersion) {
16
- config.forgeVersion = ctx.forgeVersion;
17
- }
18
- return JSON.stringify(config, null, 2) + "\n";
19
- }
20
- // ── Project CLAUDE.md ───────────────────────────────────────────────
21
- export function claudeMdTemplate(ctx) {
22
- const gatesList = ctx.gates.map((g) => `\`${g}\``).join(", ");
23
- return `# ${ctx.projectName} — Claude Code Instructions
24
-
25
- ## What This Is
26
- ${ctx.description}
27
-
28
- **Tech:** ${ctx.techStack}
29
-
30
- ## Quick Reference
31
-
32
- | Action | Command |
33
- |--------|---------|
34
- | Run verification | \`npx forge verify\` |
35
- | Run specific gates | \`npx forge verify --gate ${ctx.gates.join(",")}\` |
36
- | Check status | \`npx forge status\` |
37
- | Build | \`npm run build\` |
38
- | Test | \`npm test\` |
39
-
40
- ## Code Map
41
-
42
- \`\`\`
43
- src/
44
- (add your project structure here)
45
- \`\`\`
46
-
47
- ## Key Docs
48
-
49
- | File | Purpose |
50
- |------|---------|
51
- | \`.planning/status/<slug>.json\` | Per-PRD milestone status |
52
- | \`tasks/lessons.md\` | Lessons learned (max 10 active) |
53
-
54
- ## Session Protocol
55
- - **On start:** Read CLAUDE.md → .planning/status/*.json → tasks/lessons.md
56
- - **When lost:** Re-read planning docs, don't guess from stale context
57
-
58
- ## Session Protocol END (Mandatory)
59
- 1. \`.planning/status/<slug>.json\` — update milestone status
60
- 2. \`tasks/lessons.md\` — add/refine lessons (max 10, promote when full)
61
- 3. Commit doc updates to the feature branch
62
-
63
- ## Execution Rules
64
- - **Plan before building.** Read the PRD before touching code.
65
- - **Verify everything.** Run \`npx forge verify\` after changes land.
66
- - **All changes via PR.** Never commit directly to main.
67
- - **Branch naming:** \`feat/short-description\` or \`fix/short-description\`
68
-
69
- ## Verification Gates
70
- Active gates: ${gatesList}
71
-
72
- ## Learned Rules
73
- (none yet)
74
- `;
75
- }
76
- // ── tasks/lessons.md ────────────────────────────────────────────────
77
- export function lessonsMdTemplate(ctx) {
78
- return `# Lessons Learned — ${ctx.projectName}
79
-
80
- <!-- Max 10 active one-liners. Format: - **[topic]** The rule -->
81
- <!-- When full, promote the most battle-tested to CLAUDE.md ## Learned Rules -->
82
-
83
- (none yet)
84
- `;
85
- }
86
- // ── ~/.claude/CLAUDE.md (global, for fresh installs) ────────────────
87
- export function globalClaudeMdTemplate() {
88
- return `# Global Claude Code Instructions
89
-
90
- ## How to Work
91
- - **Follow instructions exactly.** Skills, CLAUDE.md rules, and workflow steps are tested — execute every step as written, including all AskUserQuestion prompts.
92
- - **Default to action.** Don't ask for confirmation. Plan internally, execute, verify.
93
- - **Iterate on failure.** Fix what breaks. Only stop to ask when truly blocked on missing credentials, ambiguous business requirements, or destructive actions on shared infrastructure.
94
- - **Use agent teams** for non-trivial work (3+ files or 3+ steps).
95
-
96
- ## Verification
97
- - Never mark complete without proving it works.
98
- - Build and tests must pass. Run them.
99
-
100
- ## Principles
101
- - Simple changes only. Find root causes. Touch only what's necessary.
102
- `;
103
- }
104
- // ── .gitignore lines ────────────────────────────────────────────────
105
- export function gitignoreForgeLines() {
106
- return `.forge/
107
- `;
108
- }
109
- //# sourceMappingURL=templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/setup/templates.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,4EAA4E;AAgB5E,uEAAuE;AAEvE,MAAM,UAAU,mBAAmB,CAAC,GAAiB;IACnD,MAAM,MAAM,GAA4B;QACtC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,aAAa,EAAE,CAAC;KACjB,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7B,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACrB,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAChD,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE9D,OAAO,KAAK,GAAG,CAAC,WAAW;;;EAG3B,GAAG,CAAC,WAAW;;YAEL,GAAG,CAAC,SAAS;;;;;;;mDAO0B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAmCtD,SAAS;;;;CAIxB,CAAC;AACF,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,OAAO,uBAAuB,GAAG,CAAC,WAAW;;;;;;CAM9C,CAAC;AACF,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC;AAED,uEAAuE;AAEvE,MAAM,UAAU,mBAAmB;IACjC,OAAO;CACR,CAAC;AACF,CAAC"}
@@ -1,38 +0,0 @@
1
- import type { TestAnalysisReport } from "../gates/test-analysis.js";
2
- import type { TestingConfig } from "../types.js";
3
- import type { ScaffoldPlan } from "./test-scaffold.js";
4
- export interface TestPlanningData {
5
- /** The test analysis report from scanning the project */
6
- report: TestAnalysisReport;
7
- /** Human-readable summary of findings */
8
- summary: string;
9
- /** Per-category summaries for user confirmation prompts */
10
- categorySummaries: CategorySummary[];
11
- }
12
- export interface CategorySummary {
13
- name: string;
14
- sourceCount: number;
15
- testCount: number;
16
- untestedCount: number;
17
- description: string;
18
- }
19
- export interface TestPlannerResult {
20
- /** The test analysis report from scanning the project */
21
- report: TestAnalysisReport;
22
- /** Categories the user confirmed for test scaffolding */
23
- confirmedCategories: string[];
24
- /** The chosen test runner */
25
- runner: "vitest" | "jest";
26
- /** The test directory */
27
- testDir: string;
28
- /** Whether structural tests are included */
29
- structural: boolean;
30
- /** The generated testing config to persist to .forge.json */
31
- testingConfig: TestingConfig;
32
- /** The scaffold plan (ready to execute) */
33
- scaffoldPlan: ScaffoldPlan;
34
- }
35
- /** Analyze the project and prepare the test planning data. */
36
- export declare function analyzeForTestPlanning(projectDir: string): Promise<TestPlanningData>;
37
- /** Build the final plan + config after user confirms categories. */
38
- export declare function buildTestPlan(report: TestAnalysisReport, confirmedCategories: string[], runner: "vitest" | "jest", testDir: string, structural: boolean, projectDir: string): Promise<TestPlannerResult>;
@@ -1,91 +0,0 @@
1
- // ── Test Planner ────────────────────────────────────────────────────
2
- // Interactive test planning module for /forge:setup integration.
3
- // Analyzes project test coverage, then builds a scaffold plan + config
4
- // from user-confirmed categories.
5
- import { analyzeTestCoverage } from "../gates/test-analysis.js";
6
- import { buildScaffoldPlan } from "./test-scaffold.js";
7
- // ---------------------------------------------------------------------------
8
- // Category Description Helpers
9
- // ---------------------------------------------------------------------------
10
- function describeCategoryName(name) {
11
- switch (name) {
12
- case "api-routes":
13
- return "API routes and endpoint handlers";
14
- case "components":
15
- return "UI components (React/TSX)";
16
- case "utils":
17
- return "Utility functions and helpers";
18
- case "middleware":
19
- return "Middleware and interceptors";
20
- case "models":
21
- return "Data models, schemas, and entities";
22
- case "other":
23
- return "Other source files";
24
- default:
25
- return name;
26
- }
27
- }
28
- // ---------------------------------------------------------------------------
29
- // Analysis Phase
30
- // ---------------------------------------------------------------------------
31
- /** Analyze the project and prepare the test planning data. */
32
- export async function analyzeForTestPlanning(projectDir) {
33
- const report = await analyzeTestCoverage(projectDir);
34
- const categorySummaries = report.categories.map((cat) => ({
35
- name: cat.name,
36
- sourceCount: cat.sourceFiles.length,
37
- testCount: cat.testFiles.length,
38
- untestedCount: cat.untestedFiles.length,
39
- description: describeCategoryName(cat.name),
40
- }));
41
- const lines = [];
42
- lines.push(`Framework: ${report.framework.appFramework}`);
43
- lines.push(`Test runner: ${report.framework.testRunner}`);
44
- lines.push(`Coverage: ${report.coverage.testFiles} test files / ${report.coverage.sourceFiles} source files (ratio: ${report.coverage.ratio})`);
45
- if (report.framework.detectedPatterns.length > 0) {
46
- lines.push(`Detected: ${report.framework.detectedPatterns.join(", ")}`);
47
- }
48
- if (categorySummaries.length > 0) {
49
- lines.push("");
50
- lines.push("Categories:");
51
- for (const cat of categorySummaries) {
52
- lines.push(` - ${cat.name}: ${cat.sourceCount} source, ${cat.testCount} tested, ${cat.untestedCount} untested`);
53
- }
54
- }
55
- return {
56
- report,
57
- summary: lines.join("\n"),
58
- categorySummaries,
59
- };
60
- }
61
- // ---------------------------------------------------------------------------
62
- // Plan Building Phase
63
- // ---------------------------------------------------------------------------
64
- /** Build the final plan + config after user confirms categories. */
65
- export async function buildTestPlan(report, confirmedCategories, runner, testDir, structural, projectDir) {
66
- const scaffoldPlan = await buildScaffoldPlan(report, {
67
- projectDir,
68
- testDir,
69
- runner,
70
- structural,
71
- categories: confirmedCategories,
72
- });
73
- const testingConfig = {
74
- enforce: true,
75
- runner,
76
- testDir,
77
- sourceDir: "src",
78
- structural,
79
- categories: confirmedCategories,
80
- };
81
- return {
82
- report,
83
- confirmedCategories,
84
- runner,
85
- testDir,
86
- structural,
87
- testingConfig,
88
- scaffoldPlan,
89
- };
90
- }
91
- //# sourceMappingURL=test-planner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-planner.js","sourceRoot":"","sources":["../../src/setup/test-planner.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { TestAnalysisReport } from "../gates/test-analysis.js";
2
- export interface ScaffoldPlan {
3
- configFile: {
4
- path: string;
5
- content: string;
6
- } | null;
7
- packageJsonUpdates: {
8
- scripts?: Record<string, string>;
9
- devDependencies?: Record<string, string>;
10
- };
11
- testFiles: Array<{
12
- path: string;
13
- content: string;
14
- }>;
15
- structuralTests: Array<{
16
- path: string;
17
- content: string;
18
- }>;
19
- }
20
- export interface ScaffoldOptions {
21
- projectDir: string;
22
- testDir?: string;
23
- runner?: "vitest" | "jest";
24
- structural?: boolean;
25
- categories?: string[];
26
- entryPoints?: string[];
27
- }
28
- export declare function buildScaffoldPlan(report: TestAnalysisReport, options: ScaffoldOptions): Promise<ScaffoldPlan>;
29
- export declare function executeScaffoldPlan(plan: ScaffoldPlan, projectDir: string): Promise<{
30
- filesWritten: string[];
31
- }>;
@@ -1,209 +0,0 @@
1
- // ── Test Scaffold Engine ────────────────────────────────────────────
2
- // Orchestrator that takes a TestAnalysisReport + options and produces
3
- // a ScaffoldPlan: config files, package.json updates, unit test stubs,
4
- // and structural test stubs. Can also execute the plan to disk.
5
- import { mkdir, writeFile } from "node:fs/promises";
6
- import { dirname, basename, extname } from "node:path";
7
- import { generateTestTemplate } from "./test-templates.js";
8
- import { generateStructuralTests } from "./structural-templates.js";
9
- // ---------------------------------------------------------------------------
10
- // Config Generation
11
- // ---------------------------------------------------------------------------
12
- function needsJsdom(report) {
13
- const fw = report.framework.appFramework;
14
- return fw === "nextjs-app" || fw === "nextjs-pages" || fw === "react-vite";
15
- }
16
- function generateVitestConfig(report, testDir) {
17
- const lines = [];
18
- lines.push(`import { defineConfig } from "vitest/config";`);
19
- lines.push(``);
20
- lines.push(`export default defineConfig({`);
21
- lines.push(` test: {`);
22
- lines.push(` include: ["${testDir}/**/*.test.ts", "${testDir}/**/*.test.tsx"],`);
23
- if (needsJsdom(report)) {
24
- lines.push(` environment: "jsdom",`);
25
- }
26
- lines.push(` coverage: {`);
27
- lines.push(` provider: "v8",`);
28
- lines.push(` include: ["src/**/*.ts", "src/**/*.tsx"],`);
29
- lines.push(` exclude: ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.d.ts"],`);
30
- lines.push(` },`);
31
- lines.push(` },`);
32
- lines.push(`});`);
33
- lines.push(``);
34
- return lines.join("\n");
35
- }
36
- function generateJestConfig(report, testDir) {
37
- const lines = [];
38
- lines.push(`import type { Config } from "jest";`);
39
- lines.push(``);
40
- lines.push(`const config: Config = {`);
41
- lines.push(` testMatch: ["<rootDir>/${testDir}/**/*.test.ts", "<rootDir>/${testDir}/**/*.test.tsx"],`);
42
- lines.push(` transform: {`);
43
- lines.push(` "^.+\\\\.tsx?$": "ts-jest",`);
44
- lines.push(` },`);
45
- if (needsJsdom(report)) {
46
- lines.push(` testEnvironment: "jsdom",`);
47
- }
48
- lines.push(`};`);
49
- lines.push(``);
50
- lines.push(`export default config;`);
51
- lines.push(``);
52
- return lines.join("\n");
53
- }
54
- // ---------------------------------------------------------------------------
55
- // Package.json Updates
56
- // ---------------------------------------------------------------------------
57
- function buildPackageJsonUpdates(runner, report) {
58
- const scripts = {};
59
- const devDependencies = {};
60
- if (runner === "vitest") {
61
- scripts["test"] = "vitest run";
62
- devDependencies["vitest"] = "^4.0.0";
63
- }
64
- else {
65
- scripts["test"] = "jest";
66
- devDependencies["jest"] = "^29.0.0";
67
- devDependencies["ts-jest"] = "^29.0.0";
68
- devDependencies["@types/jest"] = "^29.0.0";
69
- }
70
- const fw = report.framework.appFramework;
71
- // React frameworks need testing-library
72
- if (fw === "nextjs-app" || fw === "nextjs-pages" || fw === "react-vite") {
73
- devDependencies["@testing-library/react"] = "^16.0.0";
74
- devDependencies["@testing-library/user-event"] = "^14.0.0";
75
- if (runner === "vitest") {
76
- devDependencies["jsdom"] = "^25.0.0";
77
- }
78
- }
79
- // Express needs supertest
80
- if (fw === "express") {
81
- devDependencies["supertest"] = "^7.0.0";
82
- devDependencies["@types/supertest"] = "^6.0.0";
83
- }
84
- return { scripts, devDependencies };
85
- }
86
- // ---------------------------------------------------------------------------
87
- // Unit Test Stub Generation
88
- // ---------------------------------------------------------------------------
89
- function deriveTestFilePath(sourcePath, testDir) {
90
- // Strip leading source directory prefix to get the relative sub-path
91
- const srcPrefixes = ["src/", "lib/", "app/", "pages/"];
92
- let subPath = sourcePath.replace(/\\/g, "/");
93
- for (const prefix of srcPrefixes) {
94
- if (subPath.startsWith(prefix)) {
95
- subPath = subPath.slice(prefix.length);
96
- break;
97
- }
98
- }
99
- const dir = dirname(subPath);
100
- const base = basename(subPath);
101
- const ext = extname(base);
102
- const nameWithoutExt = base.replace(/\.(ts|tsx|js|jsx)$/, "");
103
- const testExt = ext === ".tsx" || ext === ".jsx" ? ext : ".ts";
104
- const dirPart = dir === "." ? "" : `${dir}/`;
105
- return `${testDir}/${dirPart}${nameWithoutExt}.test${testExt}`;
106
- }
107
- function buildUnitTestStubs(report, testDir, categoryFilter) {
108
- const results = [];
109
- const appFramework = report.framework.appFramework;
110
- for (const category of report.categories) {
111
- // If a category filter is provided, skip categories not in the list
112
- if (categoryFilter && categoryFilter.length > 0) {
113
- if (!categoryFilter.includes(category.name)) {
114
- continue;
115
- }
116
- }
117
- for (const untestedFile of category.untestedFiles) {
118
- const testPath = deriveTestFilePath(untestedFile, testDir);
119
- const content = generateTestTemplate(untestedFile, category.name, appFramework);
120
- results.push({ path: testPath, content });
121
- }
122
- }
123
- return results;
124
- }
125
- // ---------------------------------------------------------------------------
126
- // Main
127
- // ---------------------------------------------------------------------------
128
- export async function buildScaffoldPlan(report, options) {
129
- const testDir = options.testDir ?? "tests";
130
- const runner = options.runner ?? "vitest";
131
- const structural = options.structural ?? true;
132
- // Config file
133
- let configFile = null;
134
- if (runner === "vitest") {
135
- configFile = {
136
- path: "vitest.config.ts",
137
- content: generateVitestConfig(report, testDir),
138
- };
139
- }
140
- else {
141
- configFile = {
142
- path: "jest.config.ts",
143
- content: generateJestConfig(report, testDir),
144
- };
145
- }
146
- // Package.json updates
147
- const packageJsonUpdates = buildPackageJsonUpdates(runner, report);
148
- // Unit test stubs
149
- const testFiles = buildUnitTestStubs(report, testDir, options.categories);
150
- // Structural tests
151
- let structuralTests = [];
152
- if (structural) {
153
- const sourceDir = report.categories.length > 0
154
- ? guessSourceDir(report)
155
- : "src";
156
- structuralTests = generateStructuralTests({
157
- sourceDir,
158
- testDir,
159
- entryPoints: options.entryPoints,
160
- });
161
- }
162
- return {
163
- configFile,
164
- packageJsonUpdates,
165
- testFiles,
166
- structuralTests,
167
- };
168
- }
169
- /** Infer the source directory from the report's source file paths. */
170
- function guessSourceDir(report) {
171
- for (const cat of report.categories) {
172
- for (const f of cat.sourceFiles) {
173
- const normalized = f.replace(/\\/g, "/");
174
- if (normalized.startsWith("src/"))
175
- return "src";
176
- if (normalized.startsWith("lib/"))
177
- return "lib";
178
- if (normalized.startsWith("app/"))
179
- return "app";
180
- }
181
- }
182
- return "src";
183
- }
184
- export async function executeScaffoldPlan(plan, projectDir) {
185
- const filesWritten = [];
186
- // Write config file
187
- if (plan.configFile) {
188
- const fullPath = `${projectDir}/${plan.configFile.path}`;
189
- await mkdir(dirname(fullPath), { recursive: true });
190
- await writeFile(fullPath, plan.configFile.content, "utf-8");
191
- filesWritten.push(plan.configFile.path);
192
- }
193
- // Write unit test stubs
194
- for (const file of plan.testFiles) {
195
- const fullPath = `${projectDir}/${file.path}`;
196
- await mkdir(dirname(fullPath), { recursive: true });
197
- await writeFile(fullPath, file.content, "utf-8");
198
- filesWritten.push(file.path);
199
- }
200
- // Write structural tests
201
- for (const file of plan.structuralTests) {
202
- const fullPath = `${projectDir}/${file.path}`;
203
- await mkdir(dirname(fullPath), { recursive: true });
204
- await writeFile(fullPath, file.content, "utf-8");
205
- filesWritten.push(file.path);
206
- }
207
- return { filesWritten };
208
- }
209
- //# sourceMappingURL=test-scaffold.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-scaffold.js","sourceRoot":"","sources":["../../src/setup/test-scaffold.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- /**
2
- * Compute the relative import path from a test file to its source file.
3
- * Assumes test files live in __tests__/ adjacent to source, or co-located.
4
- * Returns a path with no extension (for TS imports).
5
- */
6
- export declare function computeRelativeImport(testFilePath: string, sourceFilePath: string): string;
7
- /**
8
- * Test stub for Next.js App Router API route handlers.
9
- * Tests GET/POST/PUT/DELETE handler functions with mocked NextRequest/NextResponse.
10
- */
11
- export declare function nextjsApiRouteTemplate(sourcePath: string): string;
12
- /**
13
- * Test stub for React components using React Testing Library patterns.
14
- * Includes render test and basic interaction test.
15
- */
16
- export declare function reactComponentTemplate(sourcePath: string): string;
17
- /**
18
- * Test stub for pure utility/helper functions.
19
- * Input/output pattern with describe blocks.
20
- */
21
- export declare function utilityTemplate(sourcePath: string): string;
22
- /**
23
- * Test stub for Express routes using supertest patterns.
24
- * Tests GET and POST endpoints.
25
- */
26
- export declare function expressRouteTemplate(sourcePath: string): string;
27
- /**
28
- * Select the right template based on the file category and detected app framework.
29
- *
30
- * @param sourcePath - Path to the source file being tested
31
- * @param category - From TestCategory.name: "api-routes", "components", "utils",
32
- * "middleware", "models", "other"
33
- * @param appFramework - From TestAnalysisReport.framework.appFramework:
34
- * "nextjs-app", "nextjs-pages", "react-vite", "express",
35
- * "plain-ts", "unknown"
36
- */
37
- export declare function generateTestTemplate(sourcePath: string, category: string, appFramework: string): string;