forge-cc 1.0.0 → 1.0.2

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