workflow-agent-cli 2.3.0 → 2.4.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.
@@ -136,6 +136,7 @@ async function runAllChecks(cwd, options = {}) {
136
136
  };
137
137
  let attempt = 0;
138
138
  let fixesApplied = 0;
139
+ const appliedFixes = [];
139
140
  const pendingFixes = [];
140
141
  while (attempt < maxRetries) {
141
142
  attempt++;
@@ -173,6 +174,12 @@ ${"\u2501".repeat(50)}`, "info");
173
174
  if (fixResult.success) {
174
175
  log(`\u2728 Auto-fix applied for ${check.displayName}`, "success");
175
176
  fixesApplied++;
177
+ appliedFixes.push({
178
+ checkName: check.name,
179
+ displayName: check.displayName,
180
+ command: formatFixCommand(check),
181
+ timestamp: /* @__PURE__ */ new Date()
182
+ });
176
183
  fixAppliedThisCycle = true;
177
184
  log(
178
185
  `
@@ -200,7 +207,8 @@ ${chalk.dim(errorPreview)}`, "error");
200
207
  success: false,
201
208
  results,
202
209
  totalAttempts: attempt,
203
- fixesApplied
210
+ fixesApplied,
211
+ appliedFixes
204
212
  };
205
213
  }
206
214
  } else {
@@ -228,7 +236,8 @@ ${chalk.dim(errorPreview)}`, "error");
228
236
  success: false,
229
237
  results,
230
238
  totalAttempts: attempt,
231
- fixesApplied
239
+ fixesApplied,
240
+ appliedFixes
232
241
  };
233
242
  }
234
243
  }
@@ -251,6 +260,7 @@ Run without --dry-run to apply fixes.`, "info");
251
260
  results,
252
261
  totalAttempts: attempt,
253
262
  fixesApplied: 0,
263
+ appliedFixes: [],
254
264
  pendingFixes
255
265
  };
256
266
  }
@@ -259,7 +269,8 @@ Run without --dry-run to apply fixes.`, "info");
259
269
  success: true,
260
270
  results,
261
271
  totalAttempts: attempt,
262
- fixesApplied
272
+ fixesApplied,
273
+ appliedFixes
263
274
  };
264
275
  }
265
276
  if (!fixAppliedThisCycle) {
@@ -267,7 +278,8 @@ Run without --dry-run to apply fixes.`, "info");
267
278
  success: false,
268
279
  results,
269
280
  totalAttempts: attempt,
270
- fixesApplied
281
+ fixesApplied,
282
+ appliedFixes
271
283
  };
272
284
  }
273
285
  }
@@ -277,7 +289,8 @@ Run without --dry-run to apply fixes.`, "info");
277
289
  success: false,
278
290
  results: [],
279
291
  totalAttempts: attempt,
280
- fixesApplied
292
+ fixesApplied,
293
+ appliedFixes
281
294
  };
282
295
  }
283
296
  async function hasUncommittedChanges(cwd) {
@@ -1422,4 +1435,4 @@ export {
1422
1435
  formatAuditReport,
1423
1436
  runAllSetups
1424
1437
  };
1425
- //# sourceMappingURL=chunk-YI3LBZ7I.js.map
1438
+ //# sourceMappingURL=chunk-WXXFUPYO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/check-runner.ts","../src/utils/auto-setup.ts","../src/utils/git-repo.ts"],"sourcesContent":["/**\n * Check Runner - Orchestrates quality checks with fix-and-revalidate pattern\n *\n * Pattern: Run check → If fails, fix → Re-run ALL checks from start\n * This ensures fixes don't introduce new issues in earlier checks.\n */\n\nimport { execa, type ExecaError } from \"execa\";\nimport chalk from \"chalk\";\n\nexport interface CheckDefinition {\n name: string;\n displayName: string;\n command: string;\n args: string[];\n fixCommand?: string;\n fixArgs?: string[];\n canAutoFix: boolean;\n}\n\nexport interface CheckResult {\n check: CheckDefinition;\n success: boolean;\n output: string;\n error?: string;\n duration: number;\n}\n\nexport interface AppliedFix {\n checkName: string;\n displayName: string;\n command: string;\n timestamp: Date;\n}\n\nexport interface RunAllChecksResult {\n success: boolean;\n results: CheckResult[];\n totalAttempts: number;\n fixesApplied: number;\n appliedFixes: AppliedFix[];\n pendingFixes?: Array<{ check: CheckDefinition; command: string }>;\n}\n\nexport type ProgressType = \"info\" | \"success\" | \"error\" | \"warning\";\n\nexport interface CheckRunnerOptions {\n maxRetries?: number;\n autoFix?: boolean;\n dryRun?: boolean;\n onProgress?: (message: string, type: ProgressType) => void;\n}\n\n/**\n * Standard quality checks in recommended order\n * Order: typecheck → lint → format → test → build\n * Type errors cascade, so we fix them first\n */\nexport const QUALITY_CHECKS: CheckDefinition[] = [\n {\n name: \"typecheck\",\n displayName: \"Type Check\",\n command: \"pnpm\",\n args: [\"typecheck\"],\n canAutoFix: false, // TypeScript errors need manual/LLM fix\n },\n {\n name: \"lint\",\n displayName: \"Lint\",\n command: \"pnpm\",\n args: [\"lint\"],\n fixCommand: \"pnpm\",\n fixArgs: [\"lint\", \"--fix\"],\n canAutoFix: true,\n },\n {\n name: \"format\",\n displayName: \"Format\",\n command: \"pnpm\",\n args: [\"format\", \"--check\"],\n fixCommand: \"pnpm\",\n fixArgs: [\"format\"],\n canAutoFix: true,\n },\n {\n name: \"test\",\n displayName: \"Tests\",\n command: \"pnpm\",\n args: [\"test\"],\n canAutoFix: false, // Tests need manual/LLM fix\n },\n {\n name: \"build\",\n displayName: \"Build\",\n command: \"pnpm\",\n args: [\"build\"],\n canAutoFix: false, // Build errors need manual/LLM fix\n },\n];\n\n/**\n * Run a single check\n */\nexport async function runCheck(\n check: CheckDefinition,\n cwd: string,\n): Promise<CheckResult> {\n const startTime = Date.now();\n\n try {\n const result = await execa(check.command, check.args, {\n cwd,\n reject: false,\n all: true,\n });\n\n const duration = Date.now() - startTime;\n\n if (result.exitCode === 0) {\n return {\n check,\n success: true,\n output: result.all || \"\",\n duration,\n };\n } else {\n return {\n check,\n success: false,\n output: result.all || \"\",\n error: result.stderr || result.all || \"Check failed\",\n duration,\n };\n }\n } catch (error) {\n const duration = Date.now() - startTime;\n const execaError = error as ExecaError;\n\n return {\n check,\n success: false,\n output: execaError.all?.toString() || execaError.message || \"\",\n error: execaError.message,\n duration,\n };\n }\n}\n\n/**\n * Apply fix for a check that supports auto-fix\n */\nexport async function applyFix(\n check: CheckDefinition,\n cwd: string,\n): Promise<{ success: boolean; output: string }> {\n if (!check.canAutoFix || !check.fixCommand) {\n return { success: false, output: \"Check does not support auto-fix\" };\n }\n\n try {\n const result = await execa(check.fixCommand, check.fixArgs || [], {\n cwd,\n reject: false,\n all: true,\n });\n\n return {\n success: result.exitCode === 0,\n output: result.all || \"\",\n };\n } catch (error) {\n const execaError = error as ExecaError;\n return {\n success: false,\n output: execaError.message,\n };\n }\n}\n\n/**\n * Format a fix command for display\n */\nfunction formatFixCommand(check: CheckDefinition): string {\n if (!check.fixCommand) return \"\";\n return `${check.fixCommand} ${(check.fixArgs || []).join(\" \")}`;\n}\n\n/**\n * Run all quality checks with fix-and-revalidate pattern\n *\n * When a check fails and can be auto-fixed:\n * 1. Apply the fix\n * 2. Re-run ALL checks from the beginning\n * 3. Repeat until all pass or max retries reached\n *\n * @param cwd - Working directory\n * @param options - Configuration options\n */\nexport async function runAllChecks(\n cwd: string,\n options: CheckRunnerOptions = {},\n): Promise<RunAllChecksResult> {\n const {\n maxRetries = 10,\n autoFix = true,\n dryRun = false,\n onProgress,\n } = options;\n\n const log = (message: string, type: ProgressType = \"info\") => {\n if (onProgress) {\n onProgress(message, type);\n } else {\n // Default console output with colors\n switch (type) {\n case \"success\":\n console.log(chalk.green(message));\n break;\n case \"error\":\n console.log(chalk.red(message));\n break;\n case \"warning\":\n console.log(chalk.yellow(message));\n break;\n default:\n console.log(message);\n }\n }\n };\n\n let attempt = 0;\n let fixesApplied = 0;\n const appliedFixes: AppliedFix[] = [];\n const pendingFixes: Array<{ check: CheckDefinition; command: string }> = [];\n\n while (attempt < maxRetries) {\n attempt++;\n\n log(`\\n${\"━\".repeat(50)}`, \"info\");\n log(`🔄 Validation Cycle ${attempt}/${maxRetries}`, \"info\");\n log(`${\"━\".repeat(50)}\\n`, \"info\");\n\n const results: CheckResult[] = [];\n let allPassed = true;\n let fixAppliedThisCycle = false;\n\n // Run each check in order\n for (let i = 0; i < QUALITY_CHECKS.length; i++) {\n const check = QUALITY_CHECKS[i];\n const stepNum = i + 1;\n const totalSteps = QUALITY_CHECKS.length;\n\n log(`📋 Step ${stepNum}/${totalSteps}: ${check.displayName}...`, \"info\");\n\n const result = await runCheck(check, cwd);\n results.push(result);\n\n if (result.success) {\n log(`✅ ${check.displayName} passed (${result.duration}ms)`, \"success\");\n } else {\n allPassed = false;\n log(`❌ ${check.displayName} failed`, \"error\");\n\n // Try to auto-fix if possible\n if (autoFix && check.canAutoFix && check.fixCommand) {\n if (dryRun) {\n // In dry-run mode, just record what would be fixed\n log(\n `🔧 [DRY-RUN] Would run: ${formatFixCommand(check)}`,\n \"warning\",\n );\n pendingFixes.push({ check, command: formatFixCommand(check) });\n\n // Continue to next check to show all issues\n continue;\n }\n\n log(`🔧 Attempting auto-fix for ${check.displayName}...`, \"warning\");\n\n const fixResult = await applyFix(check, cwd);\n\n if (fixResult.success) {\n log(`✨ Auto-fix applied for ${check.displayName}`, \"success\");\n fixesApplied++;\n appliedFixes.push({\n checkName: check.name,\n displayName: check.displayName,\n command: formatFixCommand(check),\n timestamp: new Date(),\n });\n fixAppliedThisCycle = true;\n\n // IMPORTANT: Re-run ALL checks from the beginning\n log(\n `\\n🔄 Fix applied - restarting all checks to verify...`,\n \"warning\",\n );\n break; // Exit the for loop to restart from the beginning\n } else {\n log(`⚠️ Auto-fix failed for ${check.displayName}`, \"error\");\n log(` Manual intervention required`, \"error\");\n\n // Show error details\n if (result.error) {\n const errorPreview = result.error.slice(0, 500);\n log(`\\n${chalk.dim(errorPreview)}`, \"error\");\n if (result.error.length > 500) {\n log(\n chalk.dim(\n `... (${result.error.length - 500} more characters)`,\n ),\n \"error\",\n );\n }\n }\n\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n } else {\n // Cannot auto-fix this check\n if (check.canAutoFix) {\n log(\n `⚠️ ${check.displayName} can be fixed with: ${formatFixCommand(check)}`,\n \"warning\",\n );\n } else {\n log(`⚠️ ${check.displayName} requires manual fix`, \"error\");\n }\n\n // Show error details\n if (result.error) {\n const errorPreview = result.error.slice(0, 500);\n log(`\\n${chalk.dim(errorPreview)}`, \"error\");\n if (result.error.length > 500) {\n log(\n chalk.dim(`... (${result.error.length - 500} more characters)`),\n \"error\",\n );\n }\n }\n\n if (!dryRun) {\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n }\n }\n }\n\n // Handle dry-run completion\n if (dryRun && pendingFixes.length > 0) {\n log(`\\n${\"━\".repeat(50)}`, \"info\");\n log(`📋 DRY-RUN SUMMARY`, \"info\");\n log(`${\"━\".repeat(50)}`, \"info\");\n log(`\\nThe following fixes would be applied:`, \"warning\");\n for (const fix of pendingFixes) {\n log(` • ${fix.check.displayName}: ${fix.command}`, \"info\");\n }\n log(`\\nRun without --dry-run to apply fixes.`, \"info\");\n\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied: 0,\n appliedFixes: [],\n pendingFixes,\n };\n }\n\n // If all checks passed, we're done!\n if (allPassed) {\n return {\n success: true,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n\n // If no fix was applied this cycle but we still failed, we're stuck\n if (!fixAppliedThisCycle) {\n return {\n success: false,\n results,\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n\n // Otherwise, continue to next cycle (fix was applied, need to re-verify)\n }\n\n // Max retries exceeded\n log(`\\n❌ Maximum retries (${maxRetries}) exceeded`, \"error\");\n\n return {\n success: false,\n results: [],\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n}\n\n/**\n * Check if there are uncommitted changes in git\n */\nexport async function hasUncommittedChanges(cwd: string): Promise<boolean> {\n try {\n const result = await execa(\"git\", [\"status\", \"--porcelain\"], { cwd });\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Stage all changes in git\n */\nexport async function stageAllChanges(cwd: string): Promise<boolean> {\n try {\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Auto-Setup Utilities\n *\n * Intelligent project setup that:\n * - Analyzes what a project has and needs\n * - Generates audit reports showing what will change\n * - MERGES with existing configs (improves, doesn't replace)\n * - Batches dependency installs for performance\n * - Supports monorepos with root + shared configs\n *\n * Works like a developer would: analyze first, then configure.\n */\n\nimport { existsSync } from \"fs\";\nimport { readFile, writeFile, mkdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport { execa } from \"execa\";\nimport {\n detectPackageManager,\n isMonorepo,\n getPackageScripts,\n type PackageManager,\n} from \"./git-repo.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProjectAnalysis {\n packageManager: PackageManager;\n isMonorepo: boolean;\n isTypeScript: boolean;\n framework: FrameworkType;\n existing: ExistingConfigs;\n scripts: ExistingScripts;\n setupPlans: SetupPlan[];\n}\n\nexport interface ExistingConfigs {\n typescript: boolean;\n eslint: boolean;\n eslintFlat: boolean;\n prettier: boolean;\n vitest: boolean;\n jest: boolean;\n husky: boolean;\n simpleGitHooks: boolean;\n githubActions: boolean;\n}\n\nexport interface ExistingScripts {\n build: boolean;\n test: boolean;\n lint: boolean;\n format: boolean;\n typecheck: boolean;\n verify: boolean;\n}\n\nexport interface SetupPlan {\n name: string;\n description: string;\n priority: \"high\" | \"medium\" | \"low\";\n changes: ConfigChange[];\n dependencies: string[];\n devDependencies: string[];\n}\n\nexport interface ConfigChange {\n type: \"add\" | \"modify\" | \"unchanged\";\n file: string;\n key?: string;\n oldValue?: unknown;\n newValue?: unknown;\n description: string;\n}\n\nexport interface SetupResult {\n success: boolean;\n name: string;\n message: string;\n filesCreated: string[];\n filesUpdated: string[];\n packagesInstalled: string[];\n}\n\nexport interface AuditReport {\n analysis: ProjectAnalysis;\n totalChanges: number;\n allDependencies: string[];\n allDevDependencies: string[];\n plans: SetupPlan[];\n}\n\nexport type FrameworkType =\n | \"nextjs\"\n | \"remix\"\n | \"react\"\n | \"vue\"\n | \"nuxt\"\n | \"svelte\"\n | \"node\"\n | \"express\"\n | \"hono\"\n | \"shopify\"\n | \"unknown\";\n\n// Package.json structure for type safety\ninterface PackageJson {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n \"simple-git-hooks\"?: Record<string, string>;\n \"lint-staged\"?: Record<string, string | string[]>;\n [key: string]: unknown;\n}\n\n// TSConfig structure\ninterface TSConfig {\n compilerOptions?: Record<string, unknown>;\n include?: string[];\n exclude?: string[];\n [key: string]: unknown;\n}\n\n// ============================================================================\n// Project Analysis\n// ============================================================================\n\n/**\n * Analyze a project to determine what setup is needed\n */\nexport async function analyzeProject(\n projectPath: string = process.cwd(),\n): Promise<ProjectAnalysis> {\n const packageManager = await detectPackageManager(projectPath);\n const mono = await isMonorepo(projectPath);\n const scripts = await getPackageScripts(projectPath);\n\n // Check for TypeScript\n const isTypeScript =\n existsSync(join(projectPath, \"tsconfig.json\")) ||\n existsSync(join(projectPath, \"src/index.ts\")) ||\n existsSync(join(projectPath, \"index.ts\"));\n\n // Detect framework\n const framework = await detectFramework(projectPath);\n\n // Check existing configs\n const existing: ExistingConfigs = {\n typescript: existsSync(join(projectPath, \"tsconfig.json\")),\n eslint:\n existsSync(join(projectPath, \"eslint.config.js\")) ||\n existsSync(join(projectPath, \"eslint.config.mjs\")) ||\n existsSync(join(projectPath, \".eslintrc.js\")) ||\n existsSync(join(projectPath, \".eslintrc.json\")) ||\n existsSync(join(projectPath, \".eslintrc\")),\n eslintFlat:\n existsSync(join(projectPath, \"eslint.config.js\")) ||\n existsSync(join(projectPath, \"eslint.config.mjs\")),\n prettier:\n existsSync(join(projectPath, \".prettierrc\")) ||\n existsSync(join(projectPath, \".prettierrc.json\")) ||\n existsSync(join(projectPath, \"prettier.config.js\")) ||\n existsSync(join(projectPath, \"prettier.config.mjs\")),\n vitest:\n existsSync(join(projectPath, \"vitest.config.ts\")) ||\n existsSync(join(projectPath, \"vitest.config.js\")),\n jest:\n existsSync(join(projectPath, \"jest.config.js\")) ||\n existsSync(join(projectPath, \"jest.config.ts\")),\n husky: existsSync(join(projectPath, \".husky\")),\n simpleGitHooks:\n existsSync(join(projectPath, \".git/hooks/pre-commit\")) ||\n (await hasSimpleGitHooksConfig(projectPath)),\n githubActions: existsSync(join(projectPath, \".github/workflows\")),\n };\n\n // Check existing scripts\n const existingScripts: ExistingScripts = {\n build: !!scripts.build,\n test: !!scripts.test,\n lint: !!scripts.lint,\n format: !!scripts.format,\n typecheck: !!scripts.typecheck,\n verify: !!scripts.verify,\n };\n\n // Generate setup plans\n const setupPlans = await generateSetupPlans(\n projectPath,\n packageManager,\n isTypeScript,\n framework,\n existing,\n existingScripts,\n mono,\n );\n\n return {\n packageManager,\n isMonorepo: mono,\n isTypeScript,\n framework,\n existing,\n scripts: existingScripts,\n setupPlans,\n };\n}\n\nasync function hasSimpleGitHooksConfig(projectPath: string): Promise<boolean> {\n try {\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) return false;\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n return !!pkg[\"simple-git-hooks\"];\n } catch {\n return false;\n }\n}\n\n/**\n * Detect the framework used in the project\n */\nasync function detectFramework(projectPath: string): Promise<FrameworkType> {\n try {\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) return \"unknown\";\n\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n // Shopify theme detection\n if (\n existsSync(join(projectPath, \"shopify.theme.toml\")) ||\n existsSync(join(projectPath, \"config/settings_schema.json\")) ||\n deps[\"@shopify/cli\"] ||\n deps[\"@shopify/theme\"]\n ) {\n return \"shopify\";\n }\n\n // Framework detection by dependencies\n if (deps.next) return \"nextjs\";\n if (deps[\"@remix-run/react\"]) return \"remix\";\n if (deps.nuxt) return \"nuxt\";\n if (deps.vue) return \"vue\";\n if (deps.svelte || deps[\"@sveltejs/kit\"]) return \"svelte\";\n if (deps.react && !deps.next) return \"react\";\n if (deps.hono) return \"hono\";\n if (deps.express) return \"express\";\n if (deps[\"@types/node\"] || pkg.type === \"module\") return \"node\";\n\n return \"unknown\";\n } catch {\n return \"unknown\";\n }\n}\n\n// ============================================================================\n// Setup Plan Generation\n// ============================================================================\n\nasync function generateSetupPlans(\n projectPath: string,\n packageManager: PackageManager,\n isTypeScript: boolean,\n framework: FrameworkType,\n existing: ExistingConfigs,\n scripts: ExistingScripts,\n isMonorepo: boolean,\n): Promise<SetupPlan[]> {\n const plans: SetupPlan[] = [];\n\n // TypeScript setup/improvement\n if (isTypeScript) {\n plans.push(\n await planTypeScriptSetup(\n projectPath,\n framework,\n existing.typescript,\n isMonorepo,\n ),\n );\n }\n\n // ESLint setup/improvement\n plans.push(\n await planESLintSetup(projectPath, isTypeScript, framework, existing),\n );\n\n // Prettier setup/improvement\n plans.push(await planPrettierSetup(projectPath, existing.prettier));\n\n // Testing setup\n plans.push(\n await planTestingSetup(projectPath, isTypeScript, framework, existing),\n );\n\n // Build configuration (for non-framework TS projects)\n if (isTypeScript && ![\"nextjs\", \"remix\", \"nuxt\"].includes(framework)) {\n plans.push(await planBuildSetup(projectPath, scripts.build));\n }\n\n // Scripts setup\n plans.push(\n await planScriptsSetup(projectPath, isTypeScript, framework, scripts),\n );\n\n // Pre-commit hooks\n plans.push(await planHooksSetup(projectPath, existing));\n\n // GitHub Actions CI\n plans.push(\n await planCISetup(\n projectPath,\n packageManager,\n isTypeScript,\n framework,\n existing.githubActions,\n isMonorepo,\n ),\n );\n\n return plans;\n}\n\n// ============================================================================\n// Individual Plan Generators\n// ============================================================================\n\nasync function planTypeScriptSetup(\n projectPath: string,\n _framework: FrameworkType,\n hasExisting: boolean,\n isMonorepo: boolean,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n // Check if typescript is installed\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n if (!allDeps.typescript) {\n devDeps.push(\"typescript\");\n }\n\n if (hasExisting) {\n // Audit existing config\n const tsconfig = await readTSConfig(join(projectPath, \"tsconfig.json\"));\n const opts = tsconfig.compilerOptions || {};\n\n // Recommend improvements\n if (!opts.strict) {\n changes.push({\n type: \"modify\",\n file: \"tsconfig.json\",\n key: \"compilerOptions.strict\",\n oldValue: opts.strict,\n newValue: true,\n description: \"Enable strict type checking\",\n });\n }\n if (!opts.skipLibCheck) {\n changes.push({\n type: \"modify\",\n file: \"tsconfig.json\",\n key: \"compilerOptions.skipLibCheck\",\n oldValue: opts.skipLibCheck,\n newValue: true,\n description:\n \"Skip type checking of declaration files for faster builds\",\n });\n }\n if (opts.target !== \"ES2022\" && opts.target !== \"ESNext\") {\n changes.push({\n type: \"modify\",\n file: \"tsconfig.json\",\n key: \"compilerOptions.target\",\n oldValue: opts.target,\n newValue: \"ES2022\",\n description: \"Use modern JavaScript target\",\n });\n }\n } else {\n changes.push({\n type: \"add\",\n file: isMonorepo ? \"tsconfig.base.json\" : \"tsconfig.json\",\n description: `Create TypeScript configuration${isMonorepo ? \" (shared base for monorepo)\" : \"\"}`,\n });\n }\n\n return {\n name: \"typescript\",\n description: hasExisting\n ? \"Improve TypeScript configuration\"\n : \"Set up TypeScript configuration\",\n priority: \"high\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planESLintSetup(\n projectPath: string,\n isTypeScript: boolean,\n framework: FrameworkType,\n existing: ExistingConfigs,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n\n // Core ESLint\n if (!allDeps.eslint) {\n devDeps.push(\"eslint\");\n }\n\n // TypeScript support\n if (isTypeScript) {\n if (!allDeps[\"@typescript-eslint/eslint-plugin\"]) {\n devDeps.push(\"@typescript-eslint/eslint-plugin\");\n }\n if (!allDeps[\"@typescript-eslint/parser\"]) {\n devDeps.push(\"@typescript-eslint/parser\");\n }\n if (!allDeps[\"typescript-eslint\"]) {\n devDeps.push(\"typescript-eslint\");\n }\n }\n\n // Framework-specific plugins\n if (framework === \"react\" || framework === \"nextjs\") {\n if (!allDeps[\"eslint-plugin-react\"]) devDeps.push(\"eslint-plugin-react\");\n if (!allDeps[\"eslint-plugin-react-hooks\"])\n devDeps.push(\"eslint-plugin-react-hooks\");\n }\n\n if (existing.eslint) {\n if (!existing.eslintFlat) {\n changes.push({\n type: \"modify\",\n file: \"eslint.config.mjs\",\n description: \"Migrate to ESLint 9 flat config format (recommended)\",\n });\n } else {\n changes.push({\n type: \"unchanged\",\n file: \"eslint.config.mjs\",\n description: \"ESLint flat config already exists\",\n });\n }\n } else {\n changes.push({\n type: \"add\",\n file: \"eslint.config.mjs\",\n description: \"Create ESLint configuration with TypeScript support\",\n });\n }\n\n return {\n name: \"eslint\",\n description: existing.eslint\n ? \"Audit ESLint configuration and dependencies\"\n : \"Set up ESLint for code linting\",\n priority: \"high\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planPrettierSetup(\n projectPath: string,\n hasExisting: boolean,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n\n if (!allDeps.prettier) {\n devDeps.push(\"prettier\");\n }\n\n if (hasExisting) {\n const prettierConfig = await readPrettierConfig(projectPath);\n // Check for recommended settings\n if (prettierConfig.printWidth === undefined) {\n changes.push({\n type: \"modify\",\n file: \".prettierrc\",\n key: \"printWidth\",\n newValue: 100,\n description: \"Add printWidth setting\",\n });\n }\n if (prettierConfig.trailingComma === undefined) {\n changes.push({\n type: \"modify\",\n file: \".prettierrc\",\n key: \"trailingComma\",\n newValue: \"es5\",\n description: \"Add trailing comma setting\",\n });\n }\n if (changes.length === 0) {\n changes.push({\n type: \"unchanged\",\n file: \".prettierrc\",\n description: \"Prettier configuration is complete\",\n });\n }\n } else {\n changes.push({\n type: \"add\",\n file: \".prettierrc\",\n description: \"Create Prettier configuration\",\n });\n changes.push({\n type: \"add\",\n file: \".prettierignore\",\n description: \"Create Prettier ignore file\",\n });\n }\n\n return {\n name: \"prettier\",\n description: hasExisting\n ? \"Audit Prettier configuration\"\n : \"Set up Prettier for code formatting\",\n priority: \"high\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planTestingSetup(\n projectPath: string,\n isTypeScript: boolean,\n framework: FrameworkType,\n existing: ExistingConfigs,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n\n // Respect existing Jest - don't force Vitest\n if (existing.jest) {\n changes.push({\n type: \"unchanged\",\n file: \"jest.config.*\",\n description: \"Jest configuration exists (preserving existing setup)\",\n });\n return {\n name: \"testing\",\n description: \"Jest testing already configured\",\n priority: \"high\",\n changes,\n dependencies: [],\n devDependencies: [],\n };\n }\n\n // Set up Vitest\n if (!allDeps.vitest) {\n devDeps.push(\"vitest\");\n }\n if (!allDeps[\"@vitest/coverage-v8\"]) {\n devDeps.push(\"@vitest/coverage-v8\");\n }\n\n // DOM testing for frontend frameworks\n if ([\"react\", \"nextjs\", \"vue\", \"nuxt\", \"svelte\"].includes(framework)) {\n if (!allDeps.jsdom) devDeps.push(\"jsdom\");\n if (framework === \"react\" || framework === \"nextjs\") {\n if (!allDeps[\"@testing-library/react\"])\n devDeps.push(\"@testing-library/react\");\n }\n }\n\n if (existing.vitest) {\n changes.push({\n type: \"unchanged\",\n file: `vitest.config.${isTypeScript ? \"ts\" : \"js\"}`,\n description: \"Vitest configuration already exists\",\n });\n } else {\n changes.push({\n type: \"add\",\n file: `vitest.config.${isTypeScript ? \"ts\" : \"js\"}`,\n description: \"Create Vitest configuration\",\n });\n }\n\n return {\n name: \"testing\",\n description: existing.vitest\n ? \"Audit Vitest dependencies\"\n : \"Set up Vitest for testing\",\n priority: \"high\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planBuildSetup(\n projectPath: string,\n hasBuildScript: boolean,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n\n if (hasBuildScript) {\n changes.push({\n type: \"unchanged\",\n file: \"package.json\",\n key: \"scripts.build\",\n description: \"Build script already configured\",\n });\n } else {\n if (!allDeps.tsup) {\n devDeps.push(\"tsup\");\n }\n changes.push({\n type: \"add\",\n file: \"tsup.config.ts\",\n description: \"Create tsup build configuration\",\n });\n }\n\n return {\n name: \"build\",\n description: hasBuildScript\n ? \"Build configuration exists\"\n : \"Set up tsup for TypeScript builds\",\n priority: \"medium\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planScriptsSetup(\n _projectPath: string,\n isTypeScript: boolean,\n _framework: FrameworkType,\n scripts: ExistingScripts,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const scriptsToAdd: Record<string, string> = {};\n\n if (!scripts.lint) {\n scriptsToAdd.lint = \"eslint src\";\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"scripts.lint\",\n newValue: \"eslint src\",\n description: \"Add lint script\",\n });\n }\n\n if (!scripts.format) {\n scriptsToAdd.format = 'prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"';\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"scripts.format\",\n newValue: scriptsToAdd.format,\n description: \"Add format script\",\n });\n }\n\n if (isTypeScript && !scripts.typecheck) {\n scriptsToAdd.typecheck = \"tsc --noEmit\";\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"scripts.typecheck\",\n newValue: \"tsc --noEmit\",\n description: \"Add typecheck script\",\n });\n }\n\n if (!scripts.test) {\n scriptsToAdd.test = \"vitest run\";\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"scripts.test\",\n newValue: \"vitest run\",\n description: \"Add test script\",\n });\n }\n\n if (!scripts.verify) {\n scriptsToAdd.verify = \"workflow-agent verify\";\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"scripts.verify\",\n newValue: \"workflow-agent verify\",\n description: \"Add verify script\",\n });\n }\n\n if (Object.keys(scriptsToAdd).length === 0) {\n changes.push({\n type: \"unchanged\",\n file: \"package.json\",\n description: \"All standard scripts already configured\",\n });\n }\n\n return {\n name: \"scripts\",\n description: \"Configure npm scripts\",\n priority: \"medium\",\n changes,\n dependencies: [],\n devDependencies: [],\n };\n}\n\nasync function planHooksSetup(\n projectPath: string,\n existing: ExistingConfigs,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n const devDeps: string[] = [];\n\n const pkg = await readPackageJson(projectPath);\n const deps = pkg.dependencies || {};\n const devDepsPkg = pkg.devDependencies || {};\n const allDeps = { ...deps, ...devDepsPkg };\n\n // Prefer simple-git-hooks over husky\n if (!allDeps[\"simple-git-hooks\"]) {\n devDeps.push(\"simple-git-hooks\");\n }\n if (!allDeps[\"lint-staged\"]) {\n devDeps.push(\"lint-staged\");\n }\n\n if (existing.husky || existing.simpleGitHooks) {\n changes.push({\n type: \"modify\",\n file: \"package.json\",\n key: \"simple-git-hooks\",\n description: \"Ensure pre-commit hook configuration\",\n });\n } else {\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"simple-git-hooks\",\n newValue: { \"pre-commit\": \"npx lint-staged\" },\n description: \"Add pre-commit hook configuration\",\n });\n changes.push({\n type: \"add\",\n file: \"package.json\",\n key: \"lint-staged\",\n description: \"Add lint-staged configuration\",\n });\n }\n\n return {\n name: \"hooks\",\n description:\n existing.husky || existing.simpleGitHooks\n ? \"Audit pre-commit hooks\"\n : \"Set up pre-commit hooks\",\n priority: \"medium\",\n changes,\n dependencies: [],\n devDependencies: devDeps,\n };\n}\n\nasync function planCISetup(\n projectPath: string,\n _packageManager: PackageManager,\n _isTypeScript: boolean,\n _framework: FrameworkType,\n hasExisting: boolean,\n _isMonorepo: boolean,\n): Promise<SetupPlan> {\n const changes: ConfigChange[] = [];\n\n if (hasExisting) {\n // Check if ci.yml exists specifically\n if (existsSync(join(projectPath, \".github/workflows/ci.yml\"))) {\n changes.push({\n type: \"unchanged\",\n file: \".github/workflows/ci.yml\",\n description: \"CI workflow already exists\",\n });\n } else {\n changes.push({\n type: \"add\",\n file: \".github/workflows/ci.yml\",\n description: \"Add CI workflow (other workflows exist)\",\n });\n }\n } else {\n changes.push({\n type: \"add\",\n file: \".github/workflows/ci.yml\",\n description: \"Create GitHub Actions CI workflow\",\n });\n }\n\n return {\n name: \"ci\",\n description: hasExisting\n ? \"Audit CI configuration\"\n : \"Set up GitHub Actions CI\",\n priority: \"low\",\n changes,\n dependencies: [],\n devDependencies: [],\n };\n}\n\n// ============================================================================\n// Audit Report Generation\n// ============================================================================\n\n/**\n * Generate a comprehensive audit report\n */\nexport async function generateAuditReport(\n projectPath: string = process.cwd(),\n): Promise<AuditReport> {\n const analysis = await analyzeProject(projectPath);\n\n // Collect all dependencies across plans\n const allDeps = new Set<string>();\n const allDevDeps = new Set<string>();\n\n for (const plan of analysis.setupPlans) {\n plan.dependencies.forEach((d) => allDeps.add(d));\n plan.devDependencies.forEach((d) => allDevDeps.add(d));\n }\n\n // Count total changes\n const totalChanges = analysis.setupPlans.reduce(\n (sum, plan) =>\n sum + plan.changes.filter((c) => c.type !== \"unchanged\").length,\n 0,\n );\n\n return {\n analysis,\n totalChanges,\n allDependencies: Array.from(allDeps),\n allDevDependencies: Array.from(allDevDeps),\n plans: analysis.setupPlans,\n };\n}\n\n/**\n * Format audit report for console display\n */\nexport function formatAuditReport(report: AuditReport): string {\n const lines: string[] = [];\n\n lines.push(\"📋 Auto-Setup Audit Report\\n\");\n lines.push(`Framework: ${report.analysis.framework}`);\n lines.push(`Package Manager: ${report.analysis.packageManager}`);\n lines.push(`TypeScript: ${report.analysis.isTypeScript ? \"Yes\" : \"No\"}`);\n lines.push(`Monorepo: ${report.analysis.isMonorepo ? \"Yes\" : \"No\"}\\n`);\n\n for (const plan of report.plans) {\n const hasChanges = plan.changes.some((c) => c.type !== \"unchanged\");\n const icon = hasChanges ? \"🔧\" : \"✓\";\n lines.push(\n `${icon} ${plan.name.charAt(0).toUpperCase() + plan.name.slice(1)}`,\n );\n\n for (const change of plan.changes) {\n const symbol =\n change.type === \"add\" ? \"+\" : change.type === \"modify\" ? \"~\" : \"=\";\n\n let line = ` ${symbol} ${change.description}`;\n if (\n change.key &&\n change.oldValue !== undefined &&\n change.newValue !== undefined\n ) {\n line += ` (${String(change.oldValue)} → ${String(change.newValue)})`;\n }\n lines.push(line);\n }\n\n if (plan.devDependencies.length > 0) {\n lines.push(` 📦 Install: ${plan.devDependencies.join(\", \")}`);\n }\n lines.push(\"\");\n }\n\n if (report.allDevDependencies.length > 0) {\n lines.push(\"Dependencies to install (batched):\");\n const pm = report.analysis.packageManager;\n const cmd =\n pm === \"npm\" ? \"npm install\" : pm === \"yarn\" ? \"yarn add\" : `${pm} add`;\n lines.push(` ${cmd} -D ${report.allDevDependencies.join(\" \")}`);\n lines.push(\"\");\n }\n\n lines.push(`Total changes: ${report.totalChanges}`);\n\n return lines.join(\"\\n\");\n}\n\n// ============================================================================\n// Setup Execution\n// ============================================================================\n\n/**\n * Execute all setup plans\n */\nexport async function runAllSetups(\n projectPath: string = process.cwd(),\n onProgress?: (step: string, status: \"start\" | \"done\" | \"error\") => void,\n): Promise<SetupResult[]> {\n const report = await generateAuditReport(projectPath);\n const results: SetupResult[] = [];\n const filesCreated: string[] = [];\n const filesUpdated: string[] = [];\n\n // Step 1: Batch install all dependencies\n if (report.allDevDependencies.length > 0) {\n onProgress?.(\"Installing dependencies\", \"start\");\n try {\n await installDependencies(\n projectPath,\n report.analysis.packageManager,\n report.allDevDependencies,\n );\n onProgress?.(\"Installing dependencies\", \"done\");\n } catch (error) {\n onProgress?.(\"Installing dependencies\", \"error\");\n results.push({\n success: false,\n name: \"dependencies\",\n message: `Failed to install: ${error instanceof Error ? error.message : String(error)}`,\n filesCreated: [],\n filesUpdated: [],\n packagesInstalled: [],\n });\n return results;\n }\n }\n\n // Step 2: Apply each setup\n for (const plan of report.plans) {\n const hasChanges = plan.changes.some((c) => c.type !== \"unchanged\");\n if (!hasChanges && plan.devDependencies.length === 0) continue;\n\n onProgress?.(`Setting up ${plan.name}`, \"start\");\n\n try {\n const result = await applySetupPlan(projectPath, plan, report.analysis);\n results.push(result);\n filesCreated.push(...result.filesCreated);\n filesUpdated.push(...result.filesUpdated);\n onProgress?.(`Setting up ${plan.name}`, \"done\");\n } catch (error) {\n onProgress?.(`Setting up ${plan.name}`, \"error\");\n results.push({\n success: false,\n name: plan.name,\n message: `Failed: ${error instanceof Error ? error.message : String(error)}`,\n filesCreated: [],\n filesUpdated: [],\n packagesInstalled: [],\n });\n }\n }\n\n // Step 3: Initialize git hooks\n onProgress?.(\"Initializing git hooks\", \"start\");\n try {\n await execa(\"npx\", [\"simple-git-hooks\"], {\n cwd: projectPath,\n stdio: \"pipe\",\n });\n onProgress?.(\"Initializing git hooks\", \"done\");\n } catch {\n // May fail if not in a git repo\n onProgress?.(\"Initializing git hooks\", \"error\");\n }\n\n return results;\n}\n\nasync function installDependencies(\n projectPath: string,\n packageManager: PackageManager,\n packages: string[],\n): Promise<void> {\n if (packages.length === 0) return;\n\n const commands: Record<PackageManager, { cmd: string; args: string[] }> = {\n npm: { cmd: \"npm\", args: [\"install\", \"--save-dev\"] },\n pnpm: { cmd: \"pnpm\", args: [\"add\", \"-D\"] },\n yarn: { cmd: \"yarn\", args: [\"add\", \"-D\"] },\n bun: { cmd: \"bun\", args: [\"add\", \"-D\"] },\n };\n\n const { cmd, args } = commands[packageManager];\n await execa(cmd, [...args, ...packages], {\n cwd: projectPath,\n stdio: \"pipe\",\n });\n}\n\nasync function applySetupPlan(\n projectPath: string,\n plan: SetupPlan,\n analysis: ProjectAnalysis,\n): Promise<SetupResult> {\n const filesCreated: string[] = [];\n const filesUpdated: string[] = [];\n\n switch (plan.name) {\n case \"typescript\":\n await applyTypeScriptSetup(\n projectPath,\n analysis,\n filesCreated,\n filesUpdated,\n );\n break;\n case \"eslint\":\n await applyESLintSetup(projectPath, analysis, filesCreated, filesUpdated);\n break;\n case \"prettier\":\n await applyPrettierSetup(projectPath, filesCreated, filesUpdated);\n break;\n case \"testing\":\n await applyTestingSetup(\n projectPath,\n analysis,\n filesCreated,\n filesUpdated,\n );\n break;\n case \"build\":\n await applyBuildSetup(projectPath, filesCreated, filesUpdated);\n break;\n case \"scripts\":\n await applyScriptsSetup(projectPath, analysis, filesUpdated);\n break;\n case \"hooks\":\n await applyHooksSetup(projectPath, filesUpdated);\n break;\n case \"ci\":\n await applyCISetup(projectPath, analysis, filesCreated, filesUpdated);\n break;\n }\n\n return {\n success: true,\n name: plan.name,\n message: `${plan.name} configured successfully`,\n filesCreated,\n filesUpdated,\n packagesInstalled: plan.devDependencies,\n };\n}\n\n// ============================================================================\n// Setup Application Functions\n// ============================================================================\n\nasync function applyTypeScriptSetup(\n projectPath: string,\n analysis: ProjectAnalysis,\n filesCreated: string[],\n filesUpdated: string[],\n): Promise<void> {\n const configName = analysis.isMonorepo\n ? \"tsconfig.base.json\"\n : \"tsconfig.json\";\n const configPath = join(projectPath, configName);\n\n let tsconfig: Record<string, unknown> = {};\n\n if (existsSync(configPath)) {\n tsconfig = await readJsonFile(configPath);\n filesUpdated.push(configName);\n } else {\n filesCreated.push(configName);\n }\n\n // Ensure compilerOptions\n if (!tsconfig.compilerOptions) {\n tsconfig.compilerOptions = {};\n }\n const opts = tsconfig.compilerOptions as Record<string, unknown>;\n\n // Apply improvements (merge with existing)\n const improvements: Record<string, unknown> = {\n target: opts.target || \"ES2022\",\n module: opts.module || \"ESNext\",\n moduleResolution: opts.moduleResolution || \"bundler\",\n esModuleInterop: opts.esModuleInterop ?? true,\n strict: opts.strict ?? true,\n skipLibCheck: opts.skipLibCheck ?? true,\n resolveJsonModule: opts.resolveJsonModule ?? true,\n isolatedModules: opts.isolatedModules ?? true,\n declaration: opts.declaration ?? true,\n declarationMap: opts.declarationMap ?? true,\n sourceMap: opts.sourceMap ?? true,\n };\n\n // Framework-specific options\n const frameworkOpts = getFrameworkTsOptions(analysis.framework);\n\n tsconfig.compilerOptions = { ...opts, ...improvements, ...frameworkOpts };\n\n // Ensure include/exclude\n if (!tsconfig.include) {\n tsconfig.include = [\"src/**/*\"];\n }\n if (!tsconfig.exclude) {\n tsconfig.exclude = [\"node_modules\", \"dist\", \"coverage\"];\n }\n\n await writeFile(configPath, JSON.stringify(tsconfig, null, 2) + \"\\n\");\n}\n\nfunction getFrameworkTsOptions(\n framework: FrameworkType,\n): Record<string, unknown> {\n switch (framework) {\n case \"nextjs\":\n return {\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n jsx: \"preserve\",\n incremental: true,\n plugins: [{ name: \"next\" }],\n };\n case \"react\":\n case \"remix\":\n return {\n lib: [\"dom\", \"dom.iterable\", \"esnext\"],\n jsx: \"react-jsx\",\n };\n case \"vue\":\n case \"nuxt\":\n return {\n lib: [\"esnext\", \"dom\"],\n jsx: \"preserve\",\n };\n default:\n return {};\n }\n}\n\nasync function applyESLintSetup(\n projectPath: string,\n analysis: ProjectAnalysis,\n filesCreated: string[],\n _filesUpdated: string[],\n): Promise<void> {\n // Only create new config if no flat config exists\n if (analysis.existing.eslintFlat) {\n return;\n }\n\n const configPath = join(projectPath, \"eslint.config.mjs\");\n const config = generateESLintFlatConfig(\n analysis.isTypeScript,\n analysis.framework,\n );\n\n await writeFile(configPath, config);\n filesCreated.push(\"eslint.config.mjs\");\n}\n\nfunction generateESLintFlatConfig(\n isTypeScript: boolean,\n framework: FrameworkType,\n): string {\n const imports: string[] = [];\n const configs: string[] = [];\n\n if (isTypeScript) {\n imports.push(`import tseslint from \"typescript-eslint\";`);\n }\n\n // Add react plugin import if needed\n if (framework === \"react\" || framework === \"nextjs\") {\n imports.push(`import react from \"eslint-plugin-react\";`);\n imports.push(`import reactHooks from \"eslint-plugin-react-hooks\";`);\n }\n\n // Base config\n if (isTypeScript) {\n configs.push(` ...tseslint.configs.recommended`);\n }\n\n configs.push(` {\n files: [\"**/*.${isTypeScript ? \"{ts,tsx}\" : \"{js,jsx}\"}\"],\n rules: {\n ${isTypeScript ? `\"@typescript-eslint/no-unused-vars\": [\"error\", { argsIgnorePattern: \"^_\" }],` : \"\"}\n \"no-console\": \"warn\",\n },\n }`);\n\n configs.push(` {\n ignores: [\"dist/\", \"node_modules/\", \"coverage/\", \".next/\", \"build/\"],\n }`);\n\n return `${imports.join(\"\\n\")}\n\nexport default [\n${configs.join(\",\\n\")}\n];\n`;\n}\n\nasync function applyPrettierSetup(\n projectPath: string,\n filesCreated: string[],\n filesUpdated: string[],\n): Promise<void> {\n const prettierPath = join(projectPath, \".prettierrc\");\n\n let config: Record<string, unknown> = {\n semi: true,\n singleQuote: false,\n tabWidth: 2,\n trailingComma: \"es5\",\n printWidth: 100,\n bracketSpacing: true,\n };\n\n if (existsSync(prettierPath)) {\n const existing = await readPrettierConfig(projectPath);\n config = { ...config, ...existing };\n filesUpdated.push(\".prettierrc\");\n } else {\n filesCreated.push(\".prettierrc\");\n }\n\n await writeFile(prettierPath, JSON.stringify(config, null, 2) + \"\\n\");\n\n // Create .prettierignore if it doesn't exist\n const ignorePath = join(projectPath, \".prettierignore\");\n if (!existsSync(ignorePath)) {\n const ignoreContent = `dist/\nnode_modules/\ncoverage/\n.next/\nbuild/\n*.min.js\npnpm-lock.yaml\npackage-lock.json\nyarn.lock\n`;\n await writeFile(ignorePath, ignoreContent);\n filesCreated.push(\".prettierignore\");\n }\n}\n\nasync function applyTestingSetup(\n projectPath: string,\n analysis: ProjectAnalysis,\n filesCreated: string[],\n _filesUpdated: string[],\n): Promise<void> {\n // Skip if jest exists or vitest already configured\n if (analysis.existing.jest || analysis.existing.vitest) {\n return;\n }\n\n const ext = analysis.isTypeScript ? \"ts\" : \"js\";\n const configPath = join(projectPath, `vitest.config.${ext}`);\n\n const environment = [\"react\", \"nextjs\", \"vue\", \"nuxt\", \"svelte\"].includes(\n analysis.framework,\n )\n ? \"jsdom\"\n : \"node\";\n\n const config = `import { defineConfig } from \"vitest/config\";\n\nexport default defineConfig({\n test: {\n globals: true,\n environment: \"${environment}\",\n coverage: {\n provider: \"v8\",\n reporter: [\"text\", \"json\", \"html\"],\n exclude: [\"node_modules/\", \"dist/\", \"**/*.test.${ext}\"],\n },\n include: [\"src/**/*.test.${ext}\", \"tests/**/*.test.${ext}\"],\n },\n});\n`;\n\n await writeFile(configPath, config);\n filesCreated.push(`vitest.config.${ext}`);\n}\n\nasync function applyBuildSetup(\n projectPath: string,\n filesCreated: string[],\n _filesUpdated: string[],\n): Promise<void> {\n const configPath = join(projectPath, \"tsup.config.ts\");\n\n if (existsSync(configPath)) {\n return;\n }\n\n const config = `import { defineConfig } from \"tsup\";\n\nexport default defineConfig({\n entry: [\"src/index.ts\"],\n format: [\"esm\"],\n dts: true,\n clean: true,\n sourcemap: true,\n});\n`;\n\n await writeFile(configPath, config);\n filesCreated.push(\"tsup.config.ts\");\n}\n\nasync function applyScriptsSetup(\n projectPath: string,\n analysis: ProjectAnalysis,\n filesUpdated: string[],\n): Promise<void> {\n const pkgPath = join(projectPath, \"package.json\");\n const pkg = await readPackageJson(projectPath);\n const scripts = pkg.scripts || {};\n\n // Add missing scripts (don't overwrite)\n const scriptsToAdd: Record<string, string> = {\n lint: \"eslint src\",\n \"lint:fix\": \"eslint src --fix\",\n format: 'prettier --write \"src/**/*.{ts,tsx,js,jsx,json}\"',\n \"format:check\": 'prettier --check \"src/**/*.{ts,tsx,js,jsx,json}\"',\n test: \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n verify: \"workflow-agent verify\",\n \"verify:fix\": \"workflow-agent verify --fix\",\n \"pre-commit\": \"workflow-agent verify --fix\",\n };\n\n if (analysis.isTypeScript) {\n scriptsToAdd.typecheck = \"tsc --noEmit\";\n }\n\n let added = false;\n for (const [name, cmd] of Object.entries(scriptsToAdd)) {\n if (!scripts[name]) {\n scripts[name] = cmd;\n added = true;\n }\n }\n\n if (added) {\n pkg.scripts = scripts;\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n filesUpdated.push(\"package.json\");\n }\n}\n\nasync function applyHooksSetup(\n projectPath: string,\n filesUpdated: string[],\n): Promise<void> {\n const pkgPath = join(projectPath, \"package.json\");\n const pkg = await readPackageJson(projectPath);\n\n // Add simple-git-hooks config\n if (!pkg[\"simple-git-hooks\"]) {\n pkg[\"simple-git-hooks\"] = {\n \"pre-commit\": \"npx lint-staged\",\n };\n }\n\n // Add lint-staged config\n if (!pkg[\"lint-staged\"]) {\n pkg[\"lint-staged\"] = {\n \"*.{ts,tsx,js,jsx}\": [\"eslint --fix\", \"prettier --write\"],\n \"*.{json,md,yml,yaml}\": [\"prettier --write\"],\n };\n }\n\n await writeFile(pkgPath, JSON.stringify(pkg, null, 2) + \"\\n\");\n filesUpdated.push(\"package.json\");\n}\n\nasync function applyCISetup(\n projectPath: string,\n analysis: ProjectAnalysis,\n filesCreated: string[],\n _filesUpdated: string[],\n): Promise<void> {\n const workflowsDir = join(projectPath, \".github/workflows\");\n await mkdir(workflowsDir, { recursive: true });\n\n const ciPath = join(workflowsDir, \"ci.yml\");\n\n if (existsSync(ciPath)) {\n return;\n }\n\n const workflow = generateCIWorkflow(\n analysis.packageManager,\n analysis.isTypeScript,\n analysis.framework,\n analysis.isMonorepo,\n );\n\n await writeFile(ciPath, workflow);\n filesCreated.push(\".github/workflows/ci.yml\");\n}\n\nfunction generateCIWorkflow(\n packageManager: PackageManager,\n isTypeScript: boolean,\n framework: FrameworkType,\n _isMonorepo: boolean,\n): string {\n const runCmd =\n packageManager === \"npm\"\n ? \"npm run\"\n : packageManager === \"yarn\"\n ? \"yarn\"\n : packageManager;\n const isPnpm = packageManager === \"pnpm\";\n\n return `name: CI\n\non:\n push:\n branches: [main, master]\n pull_request:\n branches: [main, master]\n\njobs:\n ci:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: \"20\"\n${\n isPnpm\n ? `\n - name: Install pnpm\n uses: pnpm/action-setup@v4\n with:\n version: 9\n`\n : \"\"\n}\n - name: Install dependencies\n run: ${packageManager} install\n\n${\n isTypeScript\n ? ` - name: Type check\n run: ${runCmd} typecheck\n\n`\n : \"\"\n} - name: Lint\n run: ${runCmd} lint\n\n - name: Format check\n run: ${runCmd} format:check || true\n\n - name: Test\n run: ${runCmd} test\n${\n isTypeScript && ![\"nextjs\", \"remix\", \"nuxt\"].includes(framework)\n ? `\n - name: Build\n run: ${runCmd} build\n`\n : \"\"\n}`;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nasync function readPackageJson(projectPath: string): Promise<PackageJson> {\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {};\n }\n return JSON.parse(await readFile(pkgPath, \"utf-8\")) as PackageJson;\n}\n\nasync function readTSConfig(filePath: string): Promise<TSConfig> {\n if (!existsSync(filePath)) {\n return {};\n }\n return JSON.parse(await readFile(filePath, \"utf-8\")) as TSConfig;\n}\n\nasync function readJsonFile(\n filePath: string,\n): Promise<Record<string, unknown>> {\n if (!existsSync(filePath)) {\n return {};\n }\n return JSON.parse(await readFile(filePath, \"utf-8\"));\n}\n\nasync function readPrettierConfig(\n projectPath: string,\n): Promise<Record<string, unknown>> {\n const files = [\".prettierrc\", \".prettierrc.json\", \"prettier.config.js\"];\n\n for (const file of files) {\n const filePath = join(projectPath, file);\n if (existsSync(filePath)) {\n if (file.endsWith(\".js\")) {\n return {}; // Can't easily read JS config\n }\n try {\n return JSON.parse(await readFile(filePath, \"utf-8\"));\n } catch {\n return {};\n }\n }\n }\n\n return {};\n}\n","/**\n * Git repository utilities for detecting repository info,\n * package manager, monorepo setup, and GitHub remote\n */\n\nimport { execa } from \"execa\";\nimport { existsSync } from \"fs\";\nimport { readFile } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport interface GitHubInfo {\n owner: string;\n repo: string;\n}\n\nexport interface RepoInfo {\n isGitRepo: boolean;\n remoteUrl: string | null;\n isGitHub: boolean;\n github: GitHubInfo | null;\n defaultBranch: string | null;\n}\n\nexport interface ProjectInfo {\n packageManager: PackageManager;\n isMonorepo: boolean;\n hasLintScript: boolean;\n hasTypecheckScript: boolean;\n hasFormatScript: boolean;\n hasTestScript: boolean;\n hasBuildScript: boolean;\n}\n\n/**\n * Check if the current directory is a git repository\n */\nexport async function isGitRepo(\n projectPath: string = process.cwd(),\n): Promise<boolean> {\n try {\n await execa(\"git\", [\"rev-parse\", \"--git-dir\"], { cwd: projectPath });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the git remote URL for origin\n */\nexport async function getGitRemoteUrl(\n projectPath: string = process.cwd(),\n): Promise<string | null> {\n try {\n const { stdout } = await execa(\"git\", [\"remote\", \"get-url\", \"origin\"], {\n cwd: projectPath,\n });\n return stdout.trim() || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if the remote URL is a GitHub repository\n */\nexport function isGitHubRemote(remoteUrl: string | null): boolean {\n if (!remoteUrl) return false;\n return remoteUrl.includes(\"github.com\");\n}\n\n/**\n * Parse GitHub owner and repo from remote URL\n * Supports both SSH (git@github.com:owner/repo.git) and HTTPS (https://github.com/owner/repo.git)\n */\nexport function parseGitHubUrl(remoteUrl: string | null): GitHubInfo | null {\n if (!remoteUrl || !isGitHubRemote(remoteUrl)) return null;\n\n // Match: git@github.com:owner/repo.git or https://github.com/owner/repo.git\n const match = remoteUrl.match(/github\\.com[:/]([^/]+)\\/([^/.]+)/);\n\n if (match) {\n return {\n owner: match[1],\n repo: match[2].replace(/\\.git$/, \"\"),\n };\n }\n\n return null;\n}\n\n/**\n * Get the default branch name\n */\nexport async function getDefaultBranch(\n projectPath: string = process.cwd(),\n): Promise<string | null> {\n try {\n // Try to get from remote\n const { stdout } = await execa(\n \"git\",\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n {\n cwd: projectPath,\n },\n );\n return stdout.trim().replace(\"refs/remotes/origin/\", \"\") || \"main\";\n } catch {\n // Fallback: try HEAD\n try {\n const { stdout } = await execa(\n \"git\",\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n {\n cwd: projectPath,\n },\n );\n return stdout.trim() || \"main\";\n } catch {\n return \"main\";\n }\n }\n}\n\n/**\n * Get comprehensive repository information\n */\nexport async function getRepoInfo(\n projectPath: string = process.cwd(),\n): Promise<RepoInfo> {\n const isRepo = await isGitRepo(projectPath);\n\n if (!isRepo) {\n return {\n isGitRepo: false,\n remoteUrl: null,\n isGitHub: false,\n github: null,\n defaultBranch: null,\n };\n }\n\n const remoteUrl = await getGitRemoteUrl(projectPath);\n const isGitHub = isGitHubRemote(remoteUrl);\n const github = parseGitHubUrl(remoteUrl);\n const defaultBranch = await getDefaultBranch(projectPath);\n\n return {\n isGitRepo: true,\n remoteUrl,\n isGitHub,\n github,\n defaultBranch,\n };\n}\n\n/**\n * Detect the package manager used in the project\n */\nexport async function detectPackageManager(\n projectPath: string = process.cwd(),\n): Promise<PackageManager> {\n // Check for lockfiles in order of preference\n if (existsSync(join(projectPath, \"pnpm-lock.yaml\"))) {\n return \"pnpm\";\n }\n if (existsSync(join(projectPath, \"yarn.lock\"))) {\n return \"yarn\";\n }\n if (existsSync(join(projectPath, \"bun.lockb\"))) {\n return \"bun\";\n }\n if (existsSync(join(projectPath, \"package-lock.json\"))) {\n return \"npm\";\n }\n\n // Check packageManager field in package.json\n try {\n const pkgPath = join(projectPath, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n if (pkg.packageManager) {\n if (pkg.packageManager.startsWith(\"pnpm\")) return \"pnpm\";\n if (pkg.packageManager.startsWith(\"yarn\")) return \"yarn\";\n if (pkg.packageManager.startsWith(\"bun\")) return \"bun\";\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Default to npm\n return \"npm\";\n}\n\n/**\n * Check if the project is a monorepo\n */\nexport async function isMonorepo(\n projectPath: string = process.cwd(),\n): Promise<boolean> {\n // Check for pnpm workspace\n if (existsSync(join(projectPath, \"pnpm-workspace.yaml\"))) {\n return true;\n }\n\n // Check for yarn/npm workspaces in package.json\n try {\n const pkgPath = join(projectPath, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n if (pkg.workspaces) {\n return true;\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n // Check for lerna.json\n if (existsSync(join(projectPath, \"lerna.json\"))) {\n return true;\n }\n\n // Check for nx.json\n if (existsSync(join(projectPath, \"nx.json\"))) {\n return true;\n }\n\n // Check for turbo.json\n if (existsSync(join(projectPath, \"turbo.json\"))) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Get available scripts from package.json\n */\nexport async function getPackageScripts(\n projectPath: string = process.cwd(),\n): Promise<Record<string, string>> {\n try {\n const pkgPath = join(projectPath, \"package.json\");\n if (!existsSync(pkgPath)) {\n return {};\n }\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n return pkg.scripts || {};\n } catch {\n return {};\n }\n}\n\n/**\n * Get comprehensive project information\n */\nexport async function getProjectInfo(\n projectPath: string = process.cwd(),\n): Promise<ProjectInfo> {\n const packageManager = await detectPackageManager(projectPath);\n const monorepo = await isMonorepo(projectPath);\n const scripts = await getPackageScripts(projectPath);\n\n return {\n packageManager,\n isMonorepo: monorepo,\n hasLintScript: \"lint\" in scripts,\n hasTypecheckScript: \"typecheck\" in scripts || \"type-check\" in scripts,\n hasFormatScript: \"format\" in scripts || \"format:check\" in scripts,\n hasTestScript: \"test\" in scripts,\n hasBuildScript: \"build\" in scripts,\n };\n}\n\n/**\n * Get the install command for a package manager\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case \"pnpm\":\n return \"pnpm install --frozen-lockfile\";\n case \"yarn\":\n return \"yarn install --frozen-lockfile\";\n case \"bun\":\n return \"bun install --frozen-lockfile\";\n case \"npm\":\n default:\n return \"npm ci\";\n }\n}\n\n/**\n * Get the run command for a package manager (handles monorepo -r flag for pnpm)\n */\nexport function getRunCommand(\n packageManager: PackageManager,\n script: string,\n isMonorepo: boolean = false,\n): string {\n switch (packageManager) {\n case \"pnpm\":\n return isMonorepo ? `pnpm -r run ${script}` : `pnpm run ${script}`;\n case \"yarn\":\n return isMonorepo\n ? `yarn workspaces run ${script}`\n : `yarn run ${script}`;\n case \"bun\":\n return `bun run ${script}`;\n case \"npm\":\n default:\n return isMonorepo\n ? `npm run ${script} --workspaces --if-present`\n : `npm run ${script}`;\n }\n}\n"],"mappings":"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","names":["existsSync","readFile","join","execa","execa","existsSync","join","readFile","isMonorepo","execa"]}