workflow-agent-cli 2.23.0 → 2.23.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 (39) hide show
  1. package/README.md +15 -15
  2. package/dist/{auto-fix-7WAESKYO.js → auto-fix-WGRYEFLJ.js} +2 -2
  3. package/dist/{chunk-IWFUJ2DS.js → chunk-DWHIY7R4.js} +20 -9
  4. package/dist/chunk-DWHIY7R4.js.map +1 -0
  5. package/dist/{chunk-D36IFZUZ.js → chunk-EHRI6BI6.js} +15 -4
  6. package/dist/chunk-EHRI6BI6.js.map +1 -0
  7. package/dist/{chunk-M6RHIUSM.js → chunk-K42R54II.js} +147 -54
  8. package/dist/chunk-K42R54II.js.map +1 -0
  9. package/dist/{chunk-XGS2VFBP.js → chunk-MBRMT5ZG.js} +865 -18
  10. package/dist/chunk-MBRMT5ZG.js.map +1 -0
  11. package/dist/{chunk-YELUGXOM.js → chunk-NPJJZHJG.js} +1 -1
  12. package/dist/chunk-NPJJZHJG.js.map +1 -0
  13. package/dist/{chunk-UWJ2ZGEI.js → chunk-OH6TK27N.js} +3 -3
  14. package/dist/{chunk-ZLDJ2OGO.js → chunk-WK7D2AVV.js} +11 -3
  15. package/dist/{chunk-ZLDJ2OGO.js.map → chunk-WK7D2AVV.js.map} +1 -1
  16. package/dist/cli/index.js +771 -285
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/config/index.js +2 -2
  19. package/dist/index.d.ts +87 -56
  20. package/dist/index.js +26 -10
  21. package/dist/scripts/postinstall.js +1 -1
  22. package/dist/scripts/postinstall.js.map +1 -1
  23. package/dist/sync-HHQM3GKR.js +7 -0
  24. package/dist/validators/index.js +1 -1
  25. package/dist/verify-PA7R6FBJ.js +8 -0
  26. package/package.json +2 -2
  27. package/dist/chunk-3ADL5QDN.js +0 -396
  28. package/dist/chunk-3ADL5QDN.js.map +0 -1
  29. package/dist/chunk-D36IFZUZ.js.map +0 -1
  30. package/dist/chunk-IWFUJ2DS.js.map +0 -1
  31. package/dist/chunk-M6RHIUSM.js.map +0 -1
  32. package/dist/chunk-XGS2VFBP.js.map +0 -1
  33. package/dist/chunk-YELUGXOM.js.map +0 -1
  34. package/dist/sync-6T5TD4QS.js +0 -7
  35. package/dist/verify-TX6LFMI6.js +0 -8
  36. /package/dist/{auto-fix-7WAESKYO.js.map → auto-fix-WGRYEFLJ.js.map} +0 -0
  37. /package/dist/{chunk-UWJ2ZGEI.js.map → chunk-OH6TK27N.js.map} +0 -0
  38. /package/dist/{sync-6T5TD4QS.js.map → sync-HHQM3GKR.js.map} +0 -0
  39. /package/dist/{verify-TX6LFMI6.js.map → verify-PA7R6FBJ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/auto-setup.ts","../src/utils/git-repo.ts","../src/utils/check-runner.ts"],"sourcesContent":["/**\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-theme\"\n | \"shopify-hydrogen\"\n | \"wordpress\"\n | \"magento\"\n | \"woocommerce\"\n | \"unknown\";\n\n/**\n * Result of platform detection - may detect multiple platforms\n */\nexport interface PlatformDetectionResult {\n primary: FrameworkType;\n detected: FrameworkType[];\n}\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 * Returns the primary detected framework for backward compatibility\n */\nasync function detectFramework(projectPath: string): Promise<FrameworkType> {\n const result = await detectAllPlatforms(projectPath);\n return result.primary;\n}\n\n/**\n * Detect all platforms/frameworks in a project\n * Returns both primary and all detected platforms for multi-platform projects\n */\nexport async function detectAllPlatforms(\n projectPath: string,\n): Promise<PlatformDetectionResult> {\n const detected: FrameworkType[] = [];\n\n try {\n const pkgPath = join(projectPath, \"package.json\");\n const hasPkgJson = existsSync(pkgPath);\n\n let deps: Record<string, string> = {};\n let composerDeps: Record<string, string> = {};\n\n if (hasPkgJson) {\n const pkg = JSON.parse(await readFile(pkgPath, \"utf-8\"));\n deps = { ...pkg.dependencies, ...pkg.devDependencies };\n }\n\n // Check for composer.json (PHP projects)\n const composerPath = join(projectPath, \"composer.json\");\n if (existsSync(composerPath)) {\n try {\n const composer = JSON.parse(await readFile(composerPath, \"utf-8\"));\n composerDeps = { ...composer.require, ...composer[\"require-dev\"] };\n } catch {\n // Ignore composer parse errors\n }\n }\n\n // ========================================================================\n // Platform Detection (order matters - more specific first)\n // ========================================================================\n\n // Shopify Hydrogen detection (more specific, check first)\n if (\n deps[\"@shopify/hydrogen\"] ||\n deps[\"@shopify/remix-oxygen\"] ||\n existsSync(join(projectPath, \"hydrogen.config.ts\")) ||\n existsSync(join(projectPath, \"hydrogen.config.js\"))\n ) {\n detected.push(\"shopify-hydrogen\");\n }\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/theme\"] ||\n (await hasLiquidFiles(projectPath))\n ) {\n detected.push(\"shopify-theme\");\n }\n\n // WooCommerce detection (more specific WordPress, check first)\n const hasWooCommerce =\n Object.keys(composerDeps).some((dep) =>\n dep.toLowerCase().includes(\"woocommerce\"),\n ) || existsSync(join(projectPath, \"wp-content/plugins/woocommerce\"));\n\n // WordPress detection\n const isWordPress =\n existsSync(join(projectPath, \"wp-content\")) ||\n existsSync(join(projectPath, \"functions.php\")) ||\n (await hasWordPressThemeHeader(projectPath)) ||\n Object.keys(composerDeps).some(\n (dep) =>\n dep.includes(\"wordpress\") || dep.includes(\"johnpbloch/wordpress\"),\n );\n\n if (hasWooCommerce && isWordPress) {\n detected.push(\"woocommerce\");\n } else if (isWordPress) {\n detected.push(\"wordpress\");\n }\n\n // Magento detection\n if (\n existsSync(join(projectPath, \"app/etc/env.php\")) ||\n existsSync(join(projectPath, \"bin/magento\")) ||\n Object.keys(composerDeps).some((dep) => dep.startsWith(\"magento/\"))\n ) {\n detected.push(\"magento\");\n }\n\n // Standard JS/TS framework detection\n if (deps.next) detected.push(\"nextjs\");\n if (deps[\"@remix-run/react\"] && !detected.includes(\"shopify-hydrogen\")) {\n detected.push(\"remix\");\n }\n if (deps.nuxt) detected.push(\"nuxt\");\n if (deps.vue && !deps.nuxt) detected.push(\"vue\");\n if (deps.svelte || deps[\"@sveltejs/kit\"]) detected.push(\"svelte\");\n if (deps.react && !deps.next && !detected.includes(\"shopify-hydrogen\")) {\n detected.push(\"react\");\n }\n if (deps.hono) detected.push(\"hono\");\n if (deps.express) detected.push(\"express\");\n if (\n (deps[\"@types/node\"] || (hasPkgJson && existsSync(pkgPath))) &&\n detected.length === 0\n ) {\n detected.push(\"node\");\n }\n\n // Determine primary (first detected or unknown)\n const primary = detected.length > 0 ? detected[0] : \"unknown\";\n\n return { primary, detected };\n } catch {\n return { primary: \"unknown\", detected: [] };\n }\n}\n\n/**\n * Check if project has .liquid files (Shopify theme indicator)\n */\nasync function hasLiquidFiles(projectPath: string): Promise<boolean> {\n try {\n const { readdir } = await import(\"fs/promises\");\n const entries = await readdir(projectPath);\n return entries.some((entry) => entry.endsWith(\".liquid\"));\n } catch {\n return false;\n }\n}\n\n/**\n * Check if style.css has WordPress theme header\n */\nasync function hasWordPressThemeHeader(projectPath: string): Promise<boolean> {\n try {\n const stylePath = join(projectPath, \"style.css\");\n if (!existsSync(stylePath)) return false;\n const content = await readFile(stylePath, \"utf-8\");\n return content.includes(\"Theme Name:\");\n } catch {\n return false;\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","/**\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\";\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport * as p from \"@clack/prompts\";\nimport {\n detectAllPlatforms,\n type FrameworkType,\n type PlatformDetectionResult,\n} from \"./auto-setup.js\";\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 /** The npm script name this check depends on (e.g., \"typecheck\", \"lint\") */\n requiredScript?: string;\n /** Fallback command if the script doesn't exist (e.g., [\"tsc\", \"--noEmit\"]) */\n fallbackCommand?: string[];\n}\n\nexport interface CheckResult {\n check: CheckDefinition;\n success: boolean;\n output: string;\n error?: string;\n duration: number;\n /** Whether the check was skipped (e.g., no files found) */\n skipped?: boolean;\n /** Reason the check was skipped */\n skipReason?: string;\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 /** Whether to include platform-specific checks (default: true) */\n includePlatformChecks?: boolean;\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 requiredScript: \"typecheck\",\n fallbackCommand: [\"tsc\", \"--noEmit\"],\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 requiredScript: \"lint\",\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 requiredScript: \"format\",\n },\n {\n name: \"test\",\n displayName: \"Tests\",\n command: \"pnpm\",\n args: [\"test\"],\n canAutoFix: false, // Tests need manual/LLM fix\n requiredScript: \"test\",\n },\n {\n name: \"build\",\n displayName: \"Build\",\n command: \"pnpm\",\n args: [\"build\"],\n canAutoFix: false, // Build errors need manual/LLM fix\n requiredScript: \"build\",\n },\n];\n\n// ============================================================================\n// Platform-Specific Checks\n// ============================================================================\n\n/**\n * Platform types that have specific checks\n */\nexport type PlatformType =\n | \"shopify-theme\"\n | \"shopify-hydrogen\"\n | \"wordpress\"\n | \"magento\"\n | \"woocommerce\";\n\n/**\n * Platform CLI installation configuration\n */\nexport interface PlatformCLIConfig {\n /** The CLI command to check for */\n cli: string;\n /** Command to install the CLI */\n install: string;\n /** Whether this platform requires Composer (PHP package manager) */\n requiresComposer: boolean;\n /** Human-readable platform name */\n displayName: string;\n}\n\n/**\n * Platform check definition extending CheckDefinition\n */\nexport interface PlatformCheckDefinition extends CheckDefinition {\n /** The platform this check applies to */\n platform: PlatformType;\n}\n\n/**\n * CLI installation commands for each platform\n */\nexport const PLATFORM_CLI_INSTALL: Record<PlatformType, PlatformCLIConfig> = {\n \"shopify-theme\": {\n cli: \"shopify\",\n install: \"npm install -g @shopify/cli @shopify/theme\",\n requiresComposer: false,\n displayName: \"Shopify Theme\",\n },\n \"shopify-hydrogen\": {\n cli: \"shopify\",\n install: \"npm install -g @shopify/cli\",\n requiresComposer: false,\n displayName: \"Shopify Hydrogen\",\n },\n wordpress: {\n cli: \"phpcs\",\n install:\n \"composer global require squizlabs/php_codesniffer wp-coding-standards/wpcs && phpcs --config-set installed_paths $(composer global config home)/vendor/wp-coding-standards/wpcs\",\n requiresComposer: true,\n displayName: \"WordPress\",\n },\n magento: {\n cli: \"phpcs\",\n install:\n \"composer global require squizlabs/php_codesniffer magento/magento-coding-standard && phpcs --config-set installed_paths $(composer global config home)/vendor/magento/magento-coding-standard\",\n requiresComposer: true,\n displayName: \"Magento\",\n },\n woocommerce: {\n cli: \"phpcs\",\n install:\n \"composer global require squizlabs/php_codesniffer automattic/woocommerce-sniffs && phpcs --config-set installed_paths $(composer global config home)/vendor/automattic/woocommerce-sniffs\",\n requiresComposer: true,\n displayName: \"WooCommerce\",\n },\n};\n\n/**\n * Platform-specific quality checks\n */\nexport const PLATFORM_CHECKS: PlatformCheckDefinition[] = [\n {\n platform: \"shopify-theme\",\n name: \"shopify-theme-check\",\n displayName: \"Shopify Theme Check\",\n command: \"shopify\",\n args: [\"theme\", \"check\"],\n canAutoFix: false,\n },\n {\n platform: \"shopify-hydrogen\",\n name: \"shopify-hydrogen-check\",\n displayName: \"Shopify Hydrogen Check\",\n command: \"shopify\",\n args: [\"hydrogen\", \"check\"],\n canAutoFix: false,\n },\n {\n platform: \"wordpress\",\n name: \"wordpress-phpcs\",\n displayName: \"WordPress Coding Standards\",\n command: \"phpcs\",\n args: [\"--standard=WordPress\", \".\"],\n fixCommand: \"phpcbf\",\n fixArgs: [\"--standard=WordPress\", \".\"],\n canAutoFix: true,\n },\n {\n platform: \"magento\",\n name: \"magento-phpcs\",\n displayName: \"Magento Coding Standards\",\n command: \"phpcs\",\n args: [\"--standard=Magento2\", \".\"],\n fixCommand: \"phpcbf\",\n fixArgs: [\"--standard=Magento2\", \".\"],\n canAutoFix: true,\n },\n {\n platform: \"woocommerce\",\n name: \"woocommerce-phpcs\",\n displayName: \"WooCommerce Coding Standards\",\n command: \"phpcs\",\n args: [\"--standard=WooCommerce-Core\", \".\"],\n fixCommand: \"phpcbf\",\n fixArgs: [\"--standard=WooCommerce-Core\", \".\"],\n canAutoFix: true,\n },\n];\n\n/**\n * Get available scripts from the target project's package.json\n */\nexport function getAvailableScripts(cwd: string): Set<string> {\n const packageJsonPath = join(cwd, \"package.json\");\n\n if (!existsSync(packageJsonPath)) {\n return new Set();\n }\n\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n return new Set(Object.keys(packageJson.scripts || {}));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Check if a command exists in PATH\n */\nasync function commandExists(cmd: string): Promise<boolean> {\n try {\n await execa(\"which\", [cmd]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get applicable checks for the target project\n * Filters out checks for scripts that don't exist, uses fallbacks when available\n */\nexport async function getApplicableChecks(\n cwd: string,\n): Promise<CheckDefinition[]> {\n const availableScripts = getAvailableScripts(cwd);\n const applicableChecks: CheckDefinition[] = [];\n\n for (const check of QUALITY_CHECKS) {\n // If no required script, always include\n if (!check.requiredScript) {\n applicableChecks.push(check);\n continue;\n }\n\n // If the script exists in package.json, use the pnpm command\n if (availableScripts.has(check.requiredScript)) {\n applicableChecks.push(check);\n continue;\n }\n\n // If there's a fallback command and it exists, use that\n if (check.fallbackCommand && check.fallbackCommand.length > 0) {\n const fallbackCmd = check.fallbackCommand[0];\n if (await commandExists(fallbackCmd)) {\n applicableChecks.push({\n ...check,\n command: fallbackCmd,\n args: check.fallbackCommand.slice(1),\n });\n continue;\n }\n }\n\n // Script doesn't exist and no valid fallback - skip this check\n // (will be logged as skipped in runAllChecks)\n }\n\n return applicableChecks;\n}\n\n// ============================================================================\n// Platform Check Utilities\n// ============================================================================\n\n/**\n * Check if Composer is installed (required for PHP-based platforms)\n * If not installed, shows OS-specific installation instructions and exits\n */\nexport async function ensureComposer(): Promise<void> {\n const hasComposer = await commandExists(\"composer\");\n\n if (!hasComposer) {\n console.log(chalk.red(\"\\n❌ Composer is required but not installed.\\n\"));\n console.log(chalk.yellow(\"Please install Composer for your platform:\\n\"));\n\n // Detect OS and show relevant instructions\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n console.log(chalk.cyan(\" macOS (Homebrew):\"));\n console.log(chalk.dim(\" brew install composer\\n\"));\n } else if (platform === \"linux\") {\n console.log(chalk.cyan(\" Ubuntu/Debian:\"));\n console.log(chalk.dim(\" sudo apt install composer\\n\"));\n console.log(chalk.cyan(\" Fedora/CentOS:\"));\n console.log(chalk.dim(\" sudo dnf install composer\\n\"));\n console.log(chalk.cyan(\" Arch Linux:\"));\n console.log(chalk.dim(\" sudo pacman -S composer\\n\"));\n } else if (platform === \"win32\") {\n console.log(chalk.cyan(\" Windows (Scoop):\"));\n console.log(chalk.dim(\" scoop install composer\\n\"));\n console.log(chalk.cyan(\" Windows (Chocolatey):\"));\n console.log(chalk.dim(\" choco install composer\\n\"));\n }\n\n console.log(chalk.cyan(\" Or download from:\"));\n console.log(chalk.dim(\" https://getcomposer.org/download/\\n\"));\n\n process.exit(1);\n }\n}\n\n/**\n * Prompt user to choose a platform when multiple are detected\n */\nexport async function promptPlatformChoice(\n detected: FrameworkType[],\n): Promise<FrameworkType> {\n // Filter to only platform types we have checks for\n const platformTypes = detected.filter((d): d is PlatformType =>\n Object.keys(PLATFORM_CLI_INSTALL).includes(d),\n );\n\n if (platformTypes.length === 0) {\n return detected[0] || \"unknown\";\n }\n\n if (platformTypes.length === 1) {\n return platformTypes[0];\n }\n\n // Multiple platforms detected - ask user\n console.log(\n chalk.yellow(\"\\n🔍 Multiple platforms detected in this project:\\n\"),\n );\n\n const options = platformTypes.map((pt) => ({\n value: pt,\n label: PLATFORM_CLI_INSTALL[pt].displayName,\n }));\n\n const choice = await p.select({\n message: \"Which platform would you like to run checks for?\",\n options,\n });\n\n if (p.isCancel(choice)) {\n console.log(chalk.yellow(\"\\n⚠️ Platform check cancelled.\"));\n process.exit(0);\n }\n\n return choice as FrameworkType;\n}\n\n/**\n * Ensure the platform CLI is installed\n * If not, automatically installs it after showing the command\n */\nexport async function ensurePlatformCLI(platform: PlatformType): Promise<void> {\n const config = PLATFORM_CLI_INSTALL[platform];\n\n // Check Composer requirement first\n if (config.requiresComposer) {\n await ensureComposer();\n }\n\n // Check if CLI exists\n const hasCLI = await commandExists(config.cli);\n\n if (!hasCLI) {\n console.log(\n chalk.yellow(\n `\\n📦 ${config.displayName} CLI (${config.cli}) not found. Installing...\\n`,\n ),\n );\n console.log(chalk.dim(` Running: ${config.install}\\n`));\n\n try {\n // Run the install command\n await execa(\"sh\", [\"-c\", config.install], {\n stdio: \"inherit\",\n });\n\n // Verify installation\n const nowHasCLI = await commandExists(config.cli);\n if (!nowHasCLI) {\n console.log(\n chalk.red(\n `\\n❌ Failed to install ${config.cli}. Please install manually:\\n`,\n ),\n );\n console.log(chalk.dim(` ${config.install}\\n`));\n process.exit(1);\n }\n\n console.log(\n chalk.green(`\\n✅ ${config.displayName} CLI installed successfully.\\n`),\n );\n } catch (error) {\n console.log(chalk.red(`\\n❌ Failed to install ${config.cli}:\\n`));\n console.log(chalk.dim(` ${(error as Error).message}\\n`));\n console.log(chalk.yellow(\"Please install manually:\\n\"));\n console.log(chalk.dim(` ${config.install}\\n`));\n process.exit(1);\n }\n }\n}\n\n/**\n * Get platform-specific checks for the detected platform(s)\n * Handles multi-platform detection, user prompts, and CLI installation\n */\nexport async function getPlatformChecks(\n cwd: string,\n): Promise<PlatformCheckDefinition[]> {\n // Detect all platforms\n const detection: PlatformDetectionResult = await detectAllPlatforms(cwd);\n\n // Filter to platforms we have checks for\n const platformsWithChecks = detection.detected.filter(\n (d): d is PlatformType => Object.keys(PLATFORM_CLI_INSTALL).includes(d),\n );\n\n if (platformsWithChecks.length === 0) {\n return [];\n }\n\n // If multiple platforms, prompt user to choose\n let selectedPlatform: PlatformType;\n if (platformsWithChecks.length === 1) {\n selectedPlatform = platformsWithChecks[0];\n } else {\n const choice = await promptPlatformChoice(detection.detected);\n if (!Object.keys(PLATFORM_CLI_INSTALL).includes(choice)) {\n return [];\n }\n selectedPlatform = choice as PlatformType;\n }\n\n // Ensure CLI is installed\n await ensurePlatformCLI(selectedPlatform);\n\n // Return checks for the selected platform\n return PLATFORM_CHECKS.filter((check) => check.platform === selectedPlatform);\n}\n\n/**\n * Patterns that indicate a check should be skipped rather than failed.\n * These are non-error conditions where the tool exits non-zero but nothing is wrong.\n */\nexport const SKIPPABLE_ERROR_PATTERNS: Array<{\n pattern: RegExp;\n reason: string;\n}> = [\n {\n pattern: /No files matching the pattern .* were found/i,\n reason: \"No files found matching the lint pattern\",\n },\n {\n pattern: /No files matching .* were found/i,\n reason: \"No files found matching the pattern\",\n },\n {\n pattern: /No inputs were found in config file/i,\n reason: \"No TypeScript files found\",\n },\n {\n pattern: /No files matching the pattern .* are present/i,\n reason: \"No files present matching the pattern\",\n },\n];\n\n/**\n * Check if an error output matches a skippable error pattern.\n * @returns The skip reason if matched, undefined otherwise.\n */\nexport function isSkippableError(output: string): string | undefined {\n for (const { pattern, reason } of SKIPPABLE_ERROR_PATTERNS) {\n if (pattern.test(output)) {\n return reason;\n }\n }\n return undefined;\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 // Check if this is a skippable error (e.g., \"no files found\")\n const combinedOutput = result.all || result.stderr || \"\";\n const skipReason = isSkippableError(combinedOutput);\n\n if (skipReason) {\n return {\n check,\n success: true, // Treat as success since it's not a real failure\n output: result.all || \"\",\n duration,\n skipped: true,\n skipReason,\n };\n }\n\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<{\n success: boolean;\n output: string;\n skipped?: boolean;\n skipReason?: string;\n}> {\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 if (result.exitCode === 0) {\n return {\n success: true,\n output: result.all || \"\",\n };\n }\n\n // Check if this is a skippable error (e.g., \"no files found\")\n const combinedOutput = result.all || result.stderr || \"\";\n const skipReason = isSkippableError(combinedOutput);\n\n if (skipReason) {\n return {\n success: true, // Treat as success since it's not a real failure\n output: result.all || \"\",\n skipped: true,\n skipReason,\n };\n }\n\n return {\n success: false,\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 platform-specific checks after standard checks pass\n * Returns results for each platform check run\n */\nasync function runPlatformChecks(\n cwd: string,\n log: (message: string, type: ProgressType) => void,\n autoFix: boolean,\n dryRun: boolean,\n): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n try {\n const platformChecks = await getPlatformChecks(cwd);\n\n if (platformChecks.length === 0) {\n return results;\n }\n\n log(`\\n${\"━\".repeat(50)}`, \"info\");\n log(`🔧 Platform-Specific Checks`, \"info\");\n log(`${\"━\".repeat(50)}\\n`, \"info\");\n\n for (let i = 0; i < platformChecks.length; i++) {\n const check = platformChecks[i];\n const stepNum = i + 1;\n const totalSteps = platformChecks.length;\n\n log(\n `📋 Platform ${stepNum}/${totalSteps}: ${check.displayName}...`,\n \"info\",\n );\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 log(`❌ ${check.displayName} failed`, \"error\");\n\n // Try to auto-fix if possible\n if (autoFix && check.canAutoFix && check.fixCommand) {\n if (dryRun) {\n log(\n `🔧 [DRY-RUN] Would run: ${formatFixCommand(check)}`,\n \"warning\",\n );\n continue;\n }\n\n log(`🔧 Attempting auto-fix for ${check.displayName}...`, \"warning\");\n const fixResult = await applyFix(check, cwd);\n\n if (fixResult.success) {\n log(`✨ Auto-fix applied for ${check.displayName}`, \"success\");\n // Re-run the check after fix\n const reResult = await runCheck(check, cwd);\n results[results.length - 1] = reResult;\n\n if (reResult.success) {\n log(`✅ ${check.displayName} now passes`, \"success\");\n } else {\n log(`⚠️ ${check.displayName} still failing after fix`, \"error\");\n }\n } else {\n log(`⚠️ Auto-fix failed for ${check.displayName}`, \"error\");\n }\n } else if (!check.canAutoFix) {\n log(`⚠️ ${check.displayName} requires manual fix`, \"error\");\n }\n\n // Show error preview\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 }\n } catch (error) {\n // Platform check errors should not crash the entire verification\n log(`\\n⚠️ Platform check error: ${(error as Error).message}`, \"warning\");\n }\n\n return results;\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 includePlatformChecks = true,\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 // Get applicable checks for this project (filters out missing scripts)\n const applicableChecks = await getApplicableChecks(cwd);\n\n // Log skipped checks\n const skippedChecks = QUALITY_CHECKS.filter(\n (qc) => !applicableChecks.some((ac) => ac.name === qc.name),\n );\n if (skippedChecks.length > 0) {\n log(\n `\\n⏭️ Skipping checks (scripts not found): ${skippedChecks.map((c) => c.displayName).join(\", \")}`,\n \"warning\",\n );\n }\n\n if (applicableChecks.length === 0) {\n log(\n `\\n⚠️ No applicable checks found. Add scripts to package.json: typecheck, lint, format, test, build`,\n \"warning\",\n );\n return {\n success: true,\n results: [],\n totalAttempts: 0,\n fixesApplied: 0,\n appliedFixes: [],\n };\n }\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 < applicableChecks.length; i++) {\n const check = applicableChecks[i];\n const stepNum = i + 1;\n const totalSteps = applicableChecks.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 if (result.skipped) {\n log(\n `⏭️ ${check.displayName} skipped: ${result.skipReason} (${result.duration}ms)`,\n \"warning\",\n );\n } else {\n log(\n `✅ ${check.displayName} passed (${result.duration}ms)`,\n \"success\",\n );\n }\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 if (fixResult.skipped) {\n // The fix command also returned \"no files found\" - treat as skip\n log(\n `⏭️ ${check.displayName} skipped: ${fixResult.skipReason}`,\n \"warning\",\n );\n // Update the result to reflect it was skipped, not failed\n results[results.length - 1] = {\n ...results[results.length - 1],\n success: true,\n skipped: true,\n skipReason: fixResult.skipReason,\n };\n allPassed = true;\n // Continue to next check\n continue;\n }\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 // Run platform-specific checks if enabled\n if (includePlatformChecks) {\n const platformCheckResults = await runPlatformChecks(\n cwd,\n log,\n autoFix,\n dryRun,\n );\n\n if (platformCheckResults.length > 0) {\n const platformFailed = platformCheckResults.some((r) => !r.success);\n\n if (platformFailed) {\n return {\n success: false,\n results: [...results, ...platformCheckResults],\n totalAttempts: attempt,\n fixesApplied,\n appliedFixes,\n };\n }\n\n // Add platform results to overall results\n results.push(...platformCheckResults);\n }\n }\n\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"],"mappings":"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","names":["existsSync","readFile","join","execa","existsSync","join","readFile","isMonorepo","execa","execa","existsSync","join","join","existsSync","execa"]}
@@ -332,4 +332,4 @@ export {
332
332
  writeFixedConfig,
333
333
  autoFixConfigFile
334
334
  };
335
- //# sourceMappingURL=chunk-YELUGXOM.js.map
335
+ //# sourceMappingURL=chunk-NPJJZHJG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/auto-fix.ts","../src/config/schema.ts"],"sourcesContent":["/**\n * Configuration Auto-Fix Utilities\n *\n * Provides automatic resolution for common configuration validation errors\n * such as reserved scope names and short descriptions.\n */\n\nimport { writeFile, readFile } from \"fs/promises\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { z } from \"zod\";\nimport { WorkflowConfigSchema } from \"./schema.js\";\n\n// Suggested replacements for reserved names\nconst RESERVED_NAME_REPLACEMENTS: Record<string, string> = {\n init: \"setup\",\n create: \"add\",\n build: \"compile\",\n test: \"testing\",\n config: \"settings\",\n docs: \"documentation\",\n ci: \"pipeline\",\n deps: \"dependencies\",\n};\n\nexport interface ConfigValidationIssue {\n path: string;\n code: string;\n message: string;\n currentValue?: unknown;\n suggestedFix?: {\n description: string;\n newValue: unknown;\n };\n}\n\nexport interface ConfigLoadResult {\n config: z.infer<typeof WorkflowConfigSchema> | null;\n rawConfig: unknown;\n configPath: string | null;\n issues: ConfigValidationIssue[];\n valid: boolean;\n}\n\nexport interface AutoFixResult {\n fixed: boolean;\n changes: string[];\n newConfig: unknown;\n}\n\n/**\n * Analyze a Zod error and generate fix suggestions\n */\nexport function analyzeValidationError(\n error: z.ZodError,\n rawConfig: unknown,\n): ConfigValidationIssue[] {\n const issues: ConfigValidationIssue[] = [];\n\n for (const err of error.errors) {\n const pathStr = err.path.join(\".\");\n const issue: ConfigValidationIssue = {\n path: pathStr,\n code: err.code,\n message: err.message,\n currentValue: getValueAtPath(rawConfig, err.path),\n };\n\n // Generate fix suggestions based on error type\n if (\n err.path.includes(\"description\") &&\n err.message.includes(\"at least 10 characters\")\n ) {\n const currentValue = issue.currentValue as string;\n issue.suggestedFix = {\n description: \"Extend description to meet minimum length\",\n newValue: padDescription(currentValue),\n };\n } else if (\n err.path.includes(\"name\") &&\n err.message.includes(\"reserved word\")\n ) {\n const currentValue = issue.currentValue as string;\n const replacement =\n RESERVED_NAME_REPLACEMENTS[currentValue] || `${currentValue}-scope`;\n issue.suggestedFix = {\n description: `Rename from \"${currentValue}\" to \"${replacement}\"`,\n newValue: replacement,\n };\n } else if (err.code === \"too_small\" && err.path.includes(\"description\")) {\n const currentValue = (issue.currentValue as string) || \"\";\n issue.suggestedFix = {\n description: \"Extend description to meet minimum length\",\n newValue: padDescription(currentValue),\n };\n }\n\n issues.push(issue);\n }\n\n return issues;\n}\n\n/**\n * Apply auto-fixes to a raw configuration object\n */\nexport function applyAutoFixes(\n rawConfig: unknown,\n issues: ConfigValidationIssue[],\n): AutoFixResult {\n const changes: string[] = [];\n // Deep clone the config\n const newConfig = JSON.parse(JSON.stringify(rawConfig));\n\n for (const issue of issues) {\n if (issue.suggestedFix) {\n const path = issue.path.split(\".\");\n setValueAtPath(newConfig, path, issue.suggestedFix.newValue);\n changes.push(\n `${issue.path}: ${issue.suggestedFix.description} (${JSON.stringify(issue.currentValue)} → ${JSON.stringify(issue.suggestedFix.newValue)})`,\n );\n }\n }\n\n return {\n fixed: changes.length > 0,\n changes,\n newConfig,\n };\n}\n\n/**\n * Write fixed configuration back to file\n */\nexport async function writeFixedConfig(\n configPath: string,\n config: unknown,\n): Promise<void> {\n const content = JSON.stringify(config, null, 2);\n await writeFile(configPath, content, \"utf-8\");\n}\n\n/**\n * Attempt to auto-fix a configuration file\n */\nexport async function autoFixConfigFile(cwd: string = process.cwd()): Promise<{\n success: boolean;\n configPath: string | null;\n changes: string[];\n error?: string;\n}> {\n const configPaths = [\n \"workflow.config.json\",\n \".workflowrc.json\",\n \".workflowrc\",\n ];\n\n let configPath: string | null = null;\n for (const path of configPaths) {\n const fullPath = join(cwd, path);\n if (existsSync(fullPath)) {\n configPath = fullPath;\n break;\n }\n }\n\n if (!configPath) {\n return {\n success: false,\n configPath: null,\n changes: [],\n error: \"No JSON configuration file found to fix\",\n };\n }\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n const rawConfig = JSON.parse(content);\n\n // Try to validate\n const result = WorkflowConfigSchema.safeParse(rawConfig);\n\n if (result.success) {\n return {\n success: true,\n configPath,\n changes: [],\n };\n }\n\n // Analyze and fix issues\n const issues = analyzeValidationError(result.error, rawConfig);\n const fixResult = applyAutoFixes(rawConfig, issues);\n\n if (!fixResult.fixed) {\n return {\n success: false,\n configPath,\n changes: [],\n error: \"No automatic fixes available for the validation errors\",\n };\n }\n\n // Validate the fixed config\n const fixedResult = WorkflowConfigSchema.safeParse(fixResult.newConfig);\n if (!fixedResult.success) {\n return {\n success: false,\n configPath,\n changes: fixResult.changes,\n error: \"Auto-fix applied but configuration still has validation errors\",\n };\n }\n\n // Write the fixed config\n await writeFixedConfig(configPath, fixResult.newConfig);\n\n return {\n success: true,\n configPath,\n changes: fixResult.changes,\n };\n } catch (error) {\n return {\n success: false,\n configPath,\n changes: [],\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// Utility functions\n\nfunction padDescription(description: string): string {\n if (!description) {\n return \"Description for this scope\";\n }\n if (description.length >= 10) {\n return description;\n }\n // Pad with meaningful suffix based on what exists\n const suffixes = [\" changes\", \" updates\", \" work\", \" tasks\"];\n for (const suffix of suffixes) {\n if ((description + suffix).length >= 10) {\n return description + suffix;\n }\n }\n // Last resort: pad with generic text\n return description + \" related changes\";\n}\n\nfunction getValueAtPath(obj: unknown, path: (string | number)[]): unknown {\n let current: unknown = obj;\n for (const key of path) {\n if (current === null || current === undefined) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction setValueAtPath(obj: unknown, path: string[], value: unknown): void {\n let current: Record<string, unknown> = obj as Record<string, unknown>;\n for (let i = 0; i < path.length - 1; i++) {\n const key = path[i];\n if (current[key] === undefined) {\n current[key] = {};\n }\n current = current[key] as Record<string, unknown>;\n }\n current[path[path.length - 1]] = value;\n}\n","import { z } from \"zod\";\n\n// Reserved scope names that cannot be used\nconst RESERVED_SCOPE_NAMES = [\n \"init\",\n \"create\",\n \"build\",\n \"test\",\n \"config\",\n \"docs\",\n \"ci\",\n \"deps\",\n];\n\nexport const ScopeSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(32, \"Scope name must be 32 characters or less\")\n .regex(\n /^[a-z0-9-]+$/,\n \"Scope name must be lowercase alphanumeric with hyphens\",\n )\n .refine((name) => !RESERVED_SCOPE_NAMES.includes(name), {\n message: `Scope name cannot be a reserved word: ${RESERVED_SCOPE_NAMES.join(\", \")}`,\n }),\n description: z\n .string()\n .min(10, \"Scope description must be at least 10 characters\"),\n emoji: z.string().optional(),\n category: z\n .enum([\n \"auth\",\n \"features\",\n \"infrastructure\",\n \"documentation\",\n \"testing\",\n \"performance\",\n \"other\",\n ])\n .optional(),\n});\n\nexport const BranchTypeSchema = z.enum([\n \"feature\",\n \"bugfix\",\n \"hotfix\",\n \"chore\",\n \"refactor\",\n \"docs\",\n \"test\",\n \"release\",\n]);\n\nexport const ConventionalTypeSchema = z.enum([\n \"feat\",\n \"fix\",\n \"refactor\",\n \"chore\",\n \"docs\",\n \"test\",\n \"perf\",\n \"style\",\n \"ci\",\n \"build\",\n \"revert\",\n]);\n\nexport const EnforcementLevelSchema = z.enum([\n \"strict\",\n \"advisory\",\n \"learning\",\n]);\n\nexport const AnalyticsConfigSchema = z.object({\n enabled: z.boolean().default(false),\n shareAnonymous: z.boolean().default(false),\n});\n\nexport const CIConfigSchema = z.object({\n provider: z.enum([\"github\", \"gitlab\", \"azure\"]).default(\"github\"),\n nodeVersions: z.array(z.string()).optional(),\n defaultBranch: z.string().default(\"main\"),\n checks: z\n .array(z.enum([\"lint\", \"typecheck\", \"format\", \"build\", \"test\"]))\n .optional(),\n});\n\nexport const HooksConfigSchema = z.object({\n preCommit: z.array(z.string()).optional(),\n commitMsg: z.array(z.string()).optional(),\n prePush: z.array(z.string()).optional(),\n});\n\nexport const GuidelinesConfigSchema = z.object({\n mandatoryTemplates: z.array(z.string()).optional(),\n optionalTemplates: z.array(z.string()).optional(),\n customTemplatesDir: z.string().optional(),\n additionalMandatory: z.array(z.string()).optional(),\n optionalOverrides: z.array(z.string()).optional(),\n});\n\nexport const AdvisoryDepthSchema = z.enum([\n \"executive\",\n \"quick\",\n \"standard\",\n \"comprehensive\",\n]);\n\nexport const AdvisoryQuestionSchema = z.object({\n category: z.string(),\n question: z.string(),\n context: z.string().optional(),\n priority: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n});\n\nexport const AdvisoryConfigSchema = z.object({\n enabled: z.boolean().default(true),\n defaultDepth: AdvisoryDepthSchema.default(\"standard\"),\n outputDir: z.string().default(\"docs/advisory\"),\n customQuestions: z.array(AdvisoryQuestionSchema).optional(),\n riskThresholds: z\n .object({\n high: z.number().default(0.7),\n medium: z.number().default(0.4),\n low: z.number().default(0.2),\n })\n .optional(),\n categories: z\n .array(z.string())\n .default([\n \"Technology Decisions\",\n \"Package Utilization\",\n \"Platform Strategy\",\n \"Business Alignment\",\n \"Technical Debt\",\n \"Growth Opportunities\",\n ]),\n excludePatterns: z.array(z.string()).optional(),\n includeHealthMetrics: z.boolean().default(false),\n});\n\nexport const WorkflowConfigSchema = z.object({\n projectName: z.string().min(1),\n scopes: z.array(ScopeSchema).min(1),\n branchTypes: z.array(BranchTypeSchema).optional(),\n conventionalTypes: z.array(ConventionalTypeSchema).optional(),\n enforcement: EnforcementLevelSchema.default(\"strict\"),\n language: z.string().default(\"en\"),\n analytics: AnalyticsConfigSchema.optional(),\n adapter: z.string().optional(),\n syncRemote: z.string().optional(),\n ci: CIConfigSchema.optional(),\n hooks: HooksConfigSchema.optional(),\n guidelines: GuidelinesConfigSchema.optional(),\n advisory: AdvisoryConfigSchema.optional(),\n});\n\nexport type Scope = z.infer<typeof ScopeSchema>;\nexport type BranchType = z.infer<typeof BranchTypeSchema>;\nexport type ConventionalType = z.infer<typeof ConventionalTypeSchema>;\nexport type EnforcementLevel = z.infer<typeof EnforcementLevelSchema>;\nexport type AnalyticsConfig = z.infer<typeof AnalyticsConfigSchema>;\nexport type CIConfig = z.infer<typeof CIConfigSchema>;\nexport type HooksConfig = z.infer<typeof HooksConfigSchema>;\nexport type GuidelinesConfig = z.infer<typeof GuidelinesConfigSchema>;\nexport type AdvisoryDepth = z.infer<typeof AdvisoryDepthSchema>;\nexport type AdvisoryQuestion = z.infer<typeof AdvisoryQuestionSchema>;\nexport type AdvisoryConfig = z.infer<typeof AdvisoryConfigSchema>;\nexport type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>;\n\nexport const defaultBranchTypes: BranchType[] = [\n \"feature\",\n \"bugfix\",\n \"hotfix\",\n \"chore\",\n \"refactor\",\n \"docs\",\n \"test\",\n];\n\nexport const defaultConventionalTypes: ConventionalType[] = [\n \"feat\",\n \"fix\",\n \"refactor\",\n \"chore\",\n \"docs\",\n \"test\",\n \"perf\",\n \"style\",\n];\n\n/**\n * Validates scope definitions for duplicates, description quality, and category values\n * @param scopes Array of scope definitions to validate\n * @returns Object with validation result and error messages\n */\nexport function validateScopeDefinitions(scopes: Scope[]): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n const seenNames = new Set<string>();\n\n for (const scope of scopes) {\n // Check for duplicate names\n if (seenNames.has(scope.name)) {\n errors.push(`Duplicate scope name: \"${scope.name}\"`);\n }\n seenNames.add(scope.name);\n\n // Validate using schema (this will catch min length, reserved names, etc.)\n const result = ScopeSchema.safeParse(scope);\n if (!result.success) {\n result.error.errors.forEach((err) => {\n errors.push(`Scope \"${scope.name}\": ${err.message}`);\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n"],"mappings":";AAOA,SAAS,WAAW,gBAAgB;AACpC,SAAS,kBAAkB;AAC3B,SAAS,YAAY;;;ACTrB,SAAS,SAAS;AAGlB,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,MAAM,EACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,IAAI,0CAA0C,EAClD;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,CAAC,SAAS,CAAC,qBAAqB,SAAS,IAAI,GAAG;AAAA,IACtD,SAAS,yCAAyC,qBAAqB,KAAK,IAAI,CAAC;AAAA,EACnF,CAAC;AAAA,EACH,aAAa,EACV,OAAO,EACP,IAAI,IAAI,kDAAkD;AAAA,EAC7D,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,EACP,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS;AACd,CAAC;AAEM,IAAM,mBAAmB,EAAE,KAAK;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyB,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyB,EAAE,KAAK;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,SAAS,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AAC3C,CAAC;AAEM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,UAAU,EAAE,KAAK,CAAC,UAAU,UAAU,OAAO,CAAC,EAAE,QAAQ,QAAQ;AAAA,EAChE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC3C,eAAe,EAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,EACxC,QAAQ,EACL,MAAM,EAAE,KAAK,CAAC,QAAQ,aAAa,UAAU,SAAS,MAAM,CAAC,CAAC,EAC9D,SAAS;AACd,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACxC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACxC,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACjD,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAChD,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClD,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAClD,CAAC;AAEM,IAAM,sBAAsB,EAAE,KAAK;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,yBAAyB,EAAE,OAAO;AAAA,EAC7C,UAAU,EAAE,OAAO;AAAA,EACnB,UAAU,EAAE,OAAO;AAAA,EACnB,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,EAAE,SAAS;AACvD,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,cAAc,oBAAoB,QAAQ,UAAU;AAAA,EACpD,WAAW,EAAE,OAAO,EAAE,QAAQ,eAAe;AAAA,EAC7C,iBAAiB,EAAE,MAAM,sBAAsB,EAAE,SAAS;AAAA,EAC1D,gBAAgB,EACb,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC5B,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,IAC9B,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EAC7B,CAAC,EACA,SAAS;AAAA,EACZ,YAAY,EACT,MAAM,EAAE,OAAO,CAAC,EAChB,QAAQ;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAAA,EACH,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC9C,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,KAAK;AACjD,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,QAAQ,EAAE,MAAM,WAAW,EAAE,IAAI,CAAC;AAAA,EAClC,aAAa,EAAE,MAAM,gBAAgB,EAAE,SAAS;AAAA,EAChD,mBAAmB,EAAE,MAAM,sBAAsB,EAAE,SAAS;AAAA,EAC5D,aAAa,uBAAuB,QAAQ,QAAQ;AAAA,EACpD,UAAU,EAAE,OAAO,EAAE,QAAQ,IAAI;AAAA,EACjC,WAAW,sBAAsB,SAAS;AAAA,EAC1C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,IAAI,eAAe,SAAS;AAAA,EAC5B,OAAO,kBAAkB,SAAS;AAAA,EAClC,YAAY,uBAAuB,SAAS;AAAA,EAC5C,UAAU,qBAAqB,SAAS;AAC1C,CAAC;AAyCM,SAAS,yBAAyB,QAGvC;AACA,QAAM,SAAmB,CAAC;AAC1B,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,SAAS,QAAQ;AAE1B,QAAI,UAAU,IAAI,MAAM,IAAI,GAAG;AAC7B,aAAO,KAAK,0BAA0B,MAAM,IAAI,GAAG;AAAA,IACrD;AACA,cAAU,IAAI,MAAM,IAAI;AAGxB,UAAM,SAAS,YAAY,UAAU,KAAK;AAC1C,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,MAAM,OAAO,QAAQ,CAAC,QAAQ;AACnC,eAAO,KAAK,UAAU,MAAM,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AACF;;;ADlNA,IAAM,6BAAqD;AAAA,EACzD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AACR;AA8BO,SAAS,uBACd,OACA,WACyB;AACzB,QAAM,SAAkC,CAAC;AAEzC,aAAW,OAAO,MAAM,QAAQ;AAC9B,UAAM,UAAU,IAAI,KAAK,KAAK,GAAG;AACjC,UAAM,QAA+B;AAAA,MACnC,MAAM;AAAA,MACN,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb,cAAc,eAAe,WAAW,IAAI,IAAI;AAAA,IAClD;AAGA,QACE,IAAI,KAAK,SAAS,aAAa,KAC/B,IAAI,QAAQ,SAAS,wBAAwB,GAC7C;AACA,YAAM,eAAe,MAAM;AAC3B,YAAM,eAAe;AAAA,QACnB,aAAa;AAAA,QACb,UAAU,eAAe,YAAY;AAAA,MACvC;AAAA,IACF,WACE,IAAI,KAAK,SAAS,MAAM,KACxB,IAAI,QAAQ,SAAS,eAAe,GACpC;AACA,YAAM,eAAe,MAAM;AAC3B,YAAM,cACJ,2BAA2B,YAAY,KAAK,GAAG,YAAY;AAC7D,YAAM,eAAe;AAAA,QACnB,aAAa,gBAAgB,YAAY,SAAS,WAAW;AAAA,QAC7D,UAAU;AAAA,MACZ;AAAA,IACF,WAAW,IAAI,SAAS,eAAe,IAAI,KAAK,SAAS,aAAa,GAAG;AACvE,YAAM,eAAgB,MAAM,gBAA2B;AACvD,YAAM,eAAe;AAAA,QACnB,aAAa;AAAA,QACb,UAAU,eAAe,YAAY;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAKO,SAAS,eACd,WACA,QACe;AACf,QAAM,UAAoB,CAAC;AAE3B,QAAM,YAAY,KAAK,MAAM,KAAK,UAAU,SAAS,CAAC;AAEtD,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,cAAc;AACtB,YAAM,OAAO,MAAM,KAAK,MAAM,GAAG;AACjC,qBAAe,WAAW,MAAM,MAAM,aAAa,QAAQ;AAC3D,cAAQ;AAAA,QACN,GAAG,MAAM,IAAI,KAAK,MAAM,aAAa,WAAW,KAAK,KAAK,UAAU,MAAM,YAAY,CAAC,WAAM,KAAK,UAAU,MAAM,aAAa,QAAQ,CAAC;AAAA,MAC1I;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,QAAQ,SAAS;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,iBACpB,YACA,QACe;AACf,QAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AAC9C,QAAM,UAAU,YAAY,SAAS,OAAO;AAC9C;AAKA,eAAsB,kBAAkB,MAAc,QAAQ,IAAI,GAK/D;AACD,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,aAA4B;AAChC,aAAW,QAAQ,aAAa;AAC9B,UAAM,WAAW,KAAK,KAAK,IAAI;AAC/B,QAAI,WAAW,QAAQ,GAAG;AACxB,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,SAAS,CAAC;AAAA,MACV,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAClD,UAAM,YAAY,KAAK,MAAM,OAAO;AAGpC,UAAM,SAAS,qBAAqB,UAAU,SAAS;AAEvD,QAAI,OAAO,SAAS;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAGA,UAAM,SAAS,uBAAuB,OAAO,OAAO,SAAS;AAC7D,UAAM,YAAY,eAAe,WAAW,MAAM;AAElD,QAAI,CAAC,UAAU,OAAO;AACpB,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS,CAAC;AAAA,QACV,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,cAAc,qBAAqB,UAAU,UAAU,SAAS;AACtE,QAAI,CAAC,YAAY,SAAS;AACxB,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,SAAS,UAAU;AAAA,QACnB,OAAO;AAAA,MACT;AAAA,IACF;AAGA,UAAM,iBAAiB,YAAY,UAAU,SAAS;AAEtD,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,UAAU;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,SAAS,CAAC;AAAA,MACV,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAClD;AAAA,EACF;AACF;AAIA,SAAS,eAAe,aAA6B;AACnD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,MAAI,YAAY,UAAU,IAAI;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,YAAY,YAAY,SAAS,QAAQ;AAC3D,aAAW,UAAU,UAAU;AAC7B,SAAK,cAAc,QAAQ,UAAU,IAAI;AACvC,aAAO,cAAc;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,cAAc;AACvB;AAEA,SAAS,eAAe,KAAc,MAAoC;AACxE,MAAI,UAAmB;AACvB,aAAW,OAAO,MAAM;AACtB,QAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,aAAO;AAAA,IACT;AACA,cAAW,QAAoC,GAAG;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAc,MAAgB,OAAsB;AAC1E,MAAI,UAAmC;AACvC,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACxC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,GAAG,MAAM,QAAW;AAC9B,cAAQ,GAAG,IAAI,CAAC;AAAA,IAClB;AACA,cAAU,QAAQ,GAAG;AAAA,EACvB;AACA,UAAQ,KAAK,KAAK,SAAS,CAAC,CAAC,IAAI;AACnC;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  WorkflowConfigSchema
3
- } from "./chunk-YELUGXOM.js";
3
+ } from "./chunk-NPJJZHJG.js";
4
4
 
5
5
  // src/config/index.ts
6
6
  import { cosmiconfig } from "cosmiconfig";
@@ -54,7 +54,7 @@ async function loadConfigSafe(cwd = process.cwd()) {
54
54
  valid: true
55
55
  };
56
56
  }
57
- const { analyzeValidationError: analyzeValidationError2 } = await import("./auto-fix-7WAESKYO.js");
57
+ const { analyzeValidationError: analyzeValidationError2 } = await import("./auto-fix-WGRYEFLJ.js");
58
58
  const issues = analyzeValidationError2(validated.error, result.config);
59
59
  return {
60
60
  config: null,
@@ -95,4 +95,4 @@ export {
95
95
  loadConfigSafe,
96
96
  hasConfig
97
97
  };
98
- //# sourceMappingURL=chunk-UWJ2ZGEI.js.map
98
+ //# sourceMappingURL=chunk-OH6TK27N.js.map
@@ -109,7 +109,12 @@ async function findSimilarFiles(targetPath, projectRoot) {
109
109
  try {
110
110
  const matches = await fg(pattern, {
111
111
  cwd: projectRoot,
112
- ignore: ["**/node_modules/**", "**/.git/**", "**/dist/**", "**/build/**"],
112
+ ignore: [
113
+ "**/node_modules/**",
114
+ "**/.git/**",
115
+ "**/dist/**",
116
+ "**/build/**"
117
+ ],
113
118
  absolute: false,
114
119
  onlyFiles: true
115
120
  });
@@ -159,7 +164,10 @@ async function validateDocumentReferences(projectPath, options) {
159
164
  projectPath
160
165
  );
161
166
  if (!existsSync(resolvedPath)) {
162
- const suggestions = await findSimilarFiles(ref.targetPath, projectPath);
167
+ const suggestions = await findSimilarFiles(
168
+ ref.targetPath,
169
+ projectPath
170
+ );
163
171
  brokenReferences.push({
164
172
  ...ref,
165
173
  suggestions
@@ -383,4 +391,4 @@ export {
383
391
  validateCommitMessage,
384
392
  validatePRTitle
385
393
  };
386
- //# sourceMappingURL=chunk-ZLDJ2OGO.js.map
394
+ //# sourceMappingURL=chunk-WK7D2AVV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validators/index.ts","../src/validators/document-references.ts"],"sourcesContent":["import didYouMean from \"didyoumean2\";\nimport type { WorkflowConfig, BranchType, Scope } from \"../config/index.js\";\nimport { readdir } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n suggestion?: string;\n}\n\n// Export document reference validation\nexport {\n validateDocumentReferences,\n scanDocumentReferences,\n findSimilarFiles,\n applyReferenceFix,\n type DocumentReference,\n type BrokenReference,\n type DocumentValidationResult,\n} from \"./document-references.js\";\n\n// Cache for discovered custom scopes\nlet customScopesCache: Scope[] | null = null;\nlet cacheTimestamp: number = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Discovers custom scope packages in the workspace and node_modules\n * @param workspacePath Path to workspace root\n * @returns Array of discovered scopes\n */\nexport async function discoverCustomScopes(\n workspacePath: string = process.cwd(),\n): Promise<Scope[]> {\n // Check cache validity\n const now = Date.now();\n if (customScopesCache && now - cacheTimestamp < CACHE_TTL) {\n return customScopesCache;\n }\n\n const discoveredScopes: Scope[] = [];\n\n try {\n // Search for custom scope packages in workspace\n const workspaceLocations = [join(workspacePath, \"packages\"), workspacePath];\n\n for (const location of workspaceLocations) {\n try {\n const entries = await readdir(location, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith(\"scopes-\")) {\n const indexPath = join(location, entry.name, \"src\", \"index.ts\");\n try {\n const module = await import(indexPath);\n const scopes = module.scopes || module.default?.scopes;\n\n if (Array.isArray(scopes)) {\n discoveredScopes.push(...scopes);\n }\n } catch {\n // Silently skip packages that can't be loaded\n }\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n\n // Update cache\n customScopesCache = discoveredScopes;\n cacheTimestamp = now;\n } catch (error) {\n // Return empty array on error\n console.warn(\"Warning: Error discovering custom scopes:\", error);\n }\n\n return discoveredScopes;\n}\n\n/**\n * Invalidates the custom scopes cache (useful after config changes)\n */\nexport function invalidateCustomScopesCache(): void {\n customScopesCache = null;\n cacheTimestamp = 0;\n}\n\n/**\n * Gets all available scopes including custom discovered ones\n * @param config Workflow configuration\n * @param workspacePath Optional workspace path\n * @returns Combined array of scopes\n */\nexport async function getAllScopes(\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<Scope[]> {\n const configScopes = config.scopes;\n const customScopes = await discoverCustomScopes(workspacePath);\n\n // Merge and deduplicate by name\n const scopeMap = new Map<string, Scope>();\n\n // Config scopes take precedence\n for (const scope of configScopes) {\n scopeMap.set(scope.name, scope);\n }\n\n // Add custom scopes that don't conflict\n for (const scope of customScopes) {\n if (!scopeMap.has(scope.name)) {\n scopeMap.set(scope.name, scope);\n }\n }\n\n return Array.from(scopeMap.values());\n}\n\nexport async function validateBranchName(\n branchName: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n const branchTypes = config.branchTypes || [\n \"feature\",\n \"bugfix\",\n \"hotfix\",\n \"chore\",\n \"refactor\",\n \"docs\",\n \"test\",\n ];\n const allScopes = await getAllScopes(config, workspacePath);\n const scopes = allScopes.map((s) => s.name);\n\n // Expected format: <type>/<scope>/<description>\n const branchPattern = /^([a-z]+)\\/([a-z0-9-]+)\\/([a-z0-9-]+)$/;\n const match = branchName.match(branchPattern);\n\n if (!match) {\n return {\n valid: false,\n error: `Branch name must follow format: <type>/<scope>/<description> (e.g., feature/auth/add-login)`,\n suggestion: `Current: ${branchName}. All parts must be lowercase alphanumeric with hyphens.`,\n };\n }\n\n const [, type, scope, description] = match;\n\n // Validate type\n if (!branchTypes.includes(type as BranchType)) {\n const suggestion = didYouMean(type, branchTypes);\n return {\n valid: false,\n error: `Invalid branch type '${type}'. Must be one of: ${branchTypes.join(\", \")}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate scope\n if (!scopes.includes(scope)) {\n const suggestion = didYouMean(scope, scopes);\n const scopeList =\n scopes.slice(0, 5).join(\", \") + (scopes.length > 5 ? \"...\" : \"\");\n return {\n valid: false,\n error: `Invalid scope '${scope}'. Must be one of: ${scopeList}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate description (not empty, meaningful)\n if (description.length < 3) {\n return {\n valid: false,\n error: `Branch description '${description}' is too short (minimum 3 characters)`,\n };\n }\n\n return { valid: true };\n}\n\nexport async function validateCommitMessage(\n message: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n const conventionalTypes = config.conventionalTypes || [\n \"feat\",\n \"fix\",\n \"refactor\",\n \"chore\",\n \"docs\",\n \"test\",\n \"perf\",\n \"style\",\n ];\n const allScopes = await getAllScopes(config, workspacePath);\n const scopes = allScopes.map((s) => s.name);\n\n // Expected format: <type>(<scope>): <description>\n const commitPattern = /^([a-z]+)(?:\\(([a-z0-9-]+)\\))?: (.+)$/;\n const match = message.match(commitPattern);\n\n if (!match) {\n return {\n valid: false,\n error: `Commit message must follow conventional commits format: <type>(<scope>): <description>`,\n suggestion: `Example: feat(auth): add login validation`,\n };\n }\n\n const [, type, scope, description] = match;\n\n // Validate type\n if (!conventionalTypes.includes(type as any)) {\n const suggestion = didYouMean(type, conventionalTypes);\n return {\n valid: false,\n error: `Invalid commit type '${type}'. Must be one of: ${conventionalTypes.join(\", \")}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate scope (optional but recommended)\n if (scope && !scopes.includes(scope)) {\n const suggestion = didYouMean(scope, scopes);\n const scopeList =\n scopes.slice(0, 5).join(\", \") + (scopes.length > 5 ? \"...\" : \"\");\n return {\n valid: false,\n error: `Invalid scope '${scope}'. Must be one of: ${scopeList}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate description\n if (description.length < 10) {\n return {\n valid: false,\n error: `Commit description is too short (minimum 10 characters)`,\n suggestion: `Be more descriptive about what changed`,\n };\n }\n\n if (description[0] !== description[0].toLowerCase()) {\n return {\n valid: false,\n error: `Commit description must start with lowercase letter`,\n suggestion: `Change '${description}' to '${description[0].toLowerCase()}${description.slice(1)}'`,\n };\n }\n\n return { valid: true };\n}\n\nexport async function validatePRTitle(\n title: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n // PR titles follow same format as commit messages\n return validateCommitMessage(title, config, workspacePath);\n}\n","/**\n * Document reference validator for checking broken markdown links\n * and file references in documentation\n */\n\nimport { existsSync } from \"fs\";\nimport { readFile } from \"fs/promises\";\nimport { resolve, dirname } from \"path\";\nimport fg from \"fast-glob\";\n\nexport interface DocumentReference {\n /** Source file containing the reference */\n file: string;\n /** Line number (1-indexed) */\n line: number;\n /** Column position (1-indexed) */\n column: number;\n /** Original markdown link text (e.g., \"[text](path)\") */\n rawLink: string;\n /** Extracted target path */\n targetPath: string;\n /** Type of reference */\n type: \"link\" | \"image\" | \"reference\";\n}\n\nexport interface BrokenReference extends DocumentReference {\n /** Possible correct paths (from glob matching) */\n suggestions: string[];\n}\n\nexport interface DocumentValidationResult {\n valid: boolean;\n scannedFiles: number;\n totalReferences: number;\n brokenReferences: BrokenReference[];\n errors: string[];\n}\n\n/**\n * Regex patterns for detecting markdown links\n */\nconst LINK_PATTERNS = {\n // Inline links: [text](path)\n inline: /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n // Images: ![alt](path)\n image: /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g,\n // Reference-style: [text]: path\n reference: /^\\[([^\\]]+)\\]:\\s*(.+)$/gm,\n};\n\n/**\n * Check if a URL is external (http/https)\n */\nfunction isExternalUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n}\n\n/**\n * Check if a path is an anchor link (starts with #)\n */\nfunction isAnchorLink(path: string): boolean {\n return path.startsWith(\"#\");\n}\n\n/**\n * Resolve a relative path from a source file\n */\nfunction resolveReferencePath(\n sourcePath: string,\n targetPath: string,\n projectRoot: string,\n): string {\n // Remove any anchor fragments\n const pathWithoutAnchor = targetPath.split(\"#\")[0];\n if (!pathWithoutAnchor) return targetPath;\n\n const sourceDir = dirname(sourcePath);\n\n // If absolute path from project root, resolve from project root\n if (pathWithoutAnchor.startsWith(\"/\")) {\n return resolve(projectRoot, pathWithoutAnchor.slice(1));\n }\n\n // Otherwise resolve relative to source file\n return resolve(sourceDir, pathWithoutAnchor);\n}\n\n/**\n * Extract all document references from a markdown file\n */\nexport async function extractReferences(\n filePath: string,\n _projectRoot: string,\n): Promise<DocumentReference[]> {\n const content = await readFile(filePath, \"utf-8\");\n const references: DocumentReference[] = [];\n const lines = content.split(\"\\n\");\n\n // Process inline links [text](path)\n lines.forEach((line, index) => {\n let match;\n const inlineRegex = new RegExp(LINK_PATTERNS.inline);\n while ((match = inlineRegex.exec(line)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs and anchor-only links\n if (isExternalUrl(targetPath) || isAnchorLink(targetPath)) {\n continue;\n }\n\n references.push({\n file: filePath,\n line: index + 1,\n column: match.index + 1,\n rawLink: match[0],\n targetPath,\n type: \"link\",\n });\n }\n });\n\n // Process images ![alt](path)\n lines.forEach((line, index) => {\n let match;\n const imageRegex = new RegExp(LINK_PATTERNS.image);\n while ((match = imageRegex.exec(line)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs\n if (isExternalUrl(targetPath)) {\n continue;\n }\n\n references.push({\n file: filePath,\n line: index + 1,\n column: match.index + 1,\n rawLink: match[0],\n targetPath,\n type: \"image\",\n });\n }\n });\n\n // Process reference-style links [ref]: path\n let match;\n const referenceRegex = new RegExp(LINK_PATTERNS.reference);\n while ((match = referenceRegex.exec(content)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs and anchor-only links\n if (isExternalUrl(targetPath) || isAnchorLink(targetPath)) {\n continue;\n }\n\n // Find line number\n const beforeMatch = content.substring(0, match.index);\n const lineNumber = beforeMatch.split(\"\\n\").length;\n\n references.push({\n file: filePath,\n line: lineNumber,\n column: match.index - beforeMatch.lastIndexOf(\"\\n\"),\n rawLink: match[0],\n targetPath,\n type: \"reference\",\n });\n }\n\n return references;\n}\n\n/**\n * Find similar files using glob patterns\n */\nexport async function findSimilarFiles(\n targetPath: string,\n projectRoot: string,\n): Promise<string[]> {\n // Extract filename and extension\n const parts = targetPath.split(\"/\");\n const filename = parts[parts.length - 1];\n const basename = filename.split(\".\")[0];\n const ext = filename.includes(\".\") ? filename.split(\".\").pop() : \"\";\n\n // Try multiple glob patterns for finding similar files\n const patterns = [\n `**/${filename}`, // Exact filename match anywhere\n ext ? `**/${basename}*.${ext}` : `**/${basename}*`, // Similar basename\n ext ? `**/*${basename}*.${ext}` : `**/*${basename}*`, // Contains basename\n ];\n\n const foundFiles = new Set<string>();\n\n for (const pattern of patterns) {\n try {\n const matches = await fg(pattern, {\n cwd: projectRoot,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\", \"**/build/**\"],\n absolute: false,\n onlyFiles: true,\n });\n\n matches.forEach((file) => foundFiles.add(file));\n\n // Limit suggestions to 10 files\n if (foundFiles.size >= 10) break;\n } catch (error) {\n // Continue with next pattern\n }\n }\n\n return Array.from(foundFiles).slice(0, 10);\n}\n\n/**\n * Scan all markdown files in a project for references\n */\nexport async function scanDocumentReferences(\n projectPath: string,\n options?: { patterns?: string[]; ignore?: string[] },\n): Promise<DocumentReference[]> {\n const patterns = options?.patterns || [\"**/*.md\"];\n const ignore = options?.ignore || [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n ];\n\n const files = await fg(patterns, {\n cwd: projectPath,\n ignore,\n absolute: true,\n onlyFiles: true,\n });\n\n const allReferences: DocumentReference[] = [];\n\n for (const file of files) {\n try {\n const references = await extractReferences(file, projectPath);\n allReferences.push(...references);\n } catch (error) {\n // Skip files that can't be read\n continue;\n }\n }\n\n return allReferences;\n}\n\n/**\n * Validate document references and find broken links\n */\nexport async function validateDocumentReferences(\n projectPath: string,\n options?: { patterns?: string[]; ignore?: string[] },\n): Promise<DocumentValidationResult> {\n const errors: string[] = [];\n const brokenReferences: BrokenReference[] = [];\n\n try {\n // Scan all references\n const references = await scanDocumentReferences(projectPath, options);\n\n // Count unique files scanned\n const scannedFiles = new Set(references.map((ref) => ref.file)).size;\n\n // Check each reference\n for (const ref of references) {\n try {\n const resolvedPath = resolveReferencePath(\n ref.file,\n ref.targetPath,\n projectPath,\n );\n\n // Check if the file exists\n if (!existsSync(resolvedPath)) {\n // Find similar files for suggestions\n const suggestions = await findSimilarFiles(ref.targetPath, projectPath);\n\n brokenReferences.push({\n ...ref,\n suggestions,\n });\n }\n } catch (error) {\n // Path resolution error\n const suggestions = await findSimilarFiles(ref.targetPath, projectPath);\n brokenReferences.push({\n ...ref,\n suggestions,\n });\n }\n }\n\n return {\n valid: brokenReferences.length === 0,\n scannedFiles,\n totalReferences: references.length,\n brokenReferences,\n errors,\n };\n } catch (error) {\n errors.push(\n error instanceof Error ? error.message : \"Unknown error during validation\",\n );\n\n return {\n valid: false,\n scannedFiles: 0,\n totalReferences: 0,\n brokenReferences: [],\n errors,\n };\n }\n}\n\n/**\n * Apply a fix to a broken reference\n */\nexport async function applyReferenceFix(\n filePath: string,\n oldLink: string,\n newPath: string,\n): Promise<void> {\n const content = await readFile(filePath, \"utf-8\");\n\n // Replace the old link with the new path\n const updatedContent = content.replace(oldLink, (match) => {\n // Extract the link text and replace only the path part\n if (match.startsWith(\"![\")) {\n // Image: ![alt](oldPath) -> ![alt](newPath)\n return match.replace(/\\(([^)]+)\\)/, `(${newPath})`);\n } else if (match.startsWith(\"[\") && match.includes(\"](\")) {\n // Inline link: [text](oldPath) -> [text](newPath)\n return match.replace(/\\(([^)]+)\\)/, `(${newPath})`);\n } else {\n // Reference-style: [ref]: oldPath -> [ref]: newPath\n return match.replace(/:\\s*(.+)$/, `: ${newPath}`);\n }\n });\n\n const fs = await import(\"fs/promises\");\n await fs.writeFile(filePath, updatedContent, \"utf-8\");\n}\n"],"mappings":"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","names":["match"]}
1
+ {"version":3,"sources":["../src/validators/index.ts","../src/validators/document-references.ts"],"sourcesContent":["import didYouMean from \"didyoumean2\";\nimport type { WorkflowConfig, BranchType, Scope } from \"../config/index.js\";\nimport { readdir } from \"fs/promises\";\nimport { join } from \"path\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n suggestion?: string;\n}\n\n// Export document reference validation\nexport {\n validateDocumentReferences,\n scanDocumentReferences,\n findSimilarFiles,\n applyReferenceFix,\n type DocumentReference,\n type BrokenReference,\n type DocumentValidationResult,\n} from \"./document-references.js\";\n\n// Cache for discovered custom scopes\nlet customScopesCache: Scope[] | null = null;\nlet cacheTimestamp: number = 0;\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Discovers custom scope packages in the workspace and node_modules\n * @param workspacePath Path to workspace root\n * @returns Array of discovered scopes\n */\nexport async function discoverCustomScopes(\n workspacePath: string = process.cwd(),\n): Promise<Scope[]> {\n // Check cache validity\n const now = Date.now();\n if (customScopesCache && now - cacheTimestamp < CACHE_TTL) {\n return customScopesCache;\n }\n\n const discoveredScopes: Scope[] = [];\n\n try {\n // Search for custom scope packages in workspace\n const workspaceLocations = [join(workspacePath, \"packages\"), workspacePath];\n\n for (const location of workspaceLocations) {\n try {\n const entries = await readdir(location, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name.startsWith(\"scopes-\")) {\n const indexPath = join(location, entry.name, \"src\", \"index.ts\");\n try {\n const module = await import(indexPath);\n const scopes = module.scopes || module.default?.scopes;\n\n if (Array.isArray(scopes)) {\n discoveredScopes.push(...scopes);\n }\n } catch {\n // Silently skip packages that can't be loaded\n }\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n }\n\n // Update cache\n customScopesCache = discoveredScopes;\n cacheTimestamp = now;\n } catch (error) {\n // Return empty array on error\n console.warn(\"Warning: Error discovering custom scopes:\", error);\n }\n\n return discoveredScopes;\n}\n\n/**\n * Invalidates the custom scopes cache (useful after config changes)\n */\nexport function invalidateCustomScopesCache(): void {\n customScopesCache = null;\n cacheTimestamp = 0;\n}\n\n/**\n * Gets all available scopes including custom discovered ones\n * @param config Workflow configuration\n * @param workspacePath Optional workspace path\n * @returns Combined array of scopes\n */\nexport async function getAllScopes(\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<Scope[]> {\n const configScopes = config.scopes;\n const customScopes = await discoverCustomScopes(workspacePath);\n\n // Merge and deduplicate by name\n const scopeMap = new Map<string, Scope>();\n\n // Config scopes take precedence\n for (const scope of configScopes) {\n scopeMap.set(scope.name, scope);\n }\n\n // Add custom scopes that don't conflict\n for (const scope of customScopes) {\n if (!scopeMap.has(scope.name)) {\n scopeMap.set(scope.name, scope);\n }\n }\n\n return Array.from(scopeMap.values());\n}\n\nexport async function validateBranchName(\n branchName: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n const branchTypes = config.branchTypes || [\n \"feature\",\n \"bugfix\",\n \"hotfix\",\n \"chore\",\n \"refactor\",\n \"docs\",\n \"test\",\n ];\n const allScopes = await getAllScopes(config, workspacePath);\n const scopes = allScopes.map((s) => s.name);\n\n // Expected format: <type>/<scope>/<description>\n const branchPattern = /^([a-z]+)\\/([a-z0-9-]+)\\/([a-z0-9-]+)$/;\n const match = branchName.match(branchPattern);\n\n if (!match) {\n return {\n valid: false,\n error: `Branch name must follow format: <type>/<scope>/<description> (e.g., feature/auth/add-login)`,\n suggestion: `Current: ${branchName}. All parts must be lowercase alphanumeric with hyphens.`,\n };\n }\n\n const [, type, scope, description] = match;\n\n // Validate type\n if (!branchTypes.includes(type as BranchType)) {\n const suggestion = didYouMean(type, branchTypes);\n return {\n valid: false,\n error: `Invalid branch type '${type}'. Must be one of: ${branchTypes.join(\", \")}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate scope\n if (!scopes.includes(scope)) {\n const suggestion = didYouMean(scope, scopes);\n const scopeList =\n scopes.slice(0, 5).join(\", \") + (scopes.length > 5 ? \"...\" : \"\");\n return {\n valid: false,\n error: `Invalid scope '${scope}'. Must be one of: ${scopeList}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate description (not empty, meaningful)\n if (description.length < 3) {\n return {\n valid: false,\n error: `Branch description '${description}' is too short (minimum 3 characters)`,\n };\n }\n\n return { valid: true };\n}\n\nexport async function validateCommitMessage(\n message: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n const conventionalTypes = config.conventionalTypes || [\n \"feat\",\n \"fix\",\n \"refactor\",\n \"chore\",\n \"docs\",\n \"test\",\n \"perf\",\n \"style\",\n ];\n const allScopes = await getAllScopes(config, workspacePath);\n const scopes = allScopes.map((s) => s.name);\n\n // Expected format: <type>(<scope>): <description>\n const commitPattern = /^([a-z]+)(?:\\(([a-z0-9-]+)\\))?: (.+)$/;\n const match = message.match(commitPattern);\n\n if (!match) {\n return {\n valid: false,\n error: `Commit message must follow conventional commits format: <type>(<scope>): <description>`,\n suggestion: `Example: feat(auth): add login validation`,\n };\n }\n\n const [, type, scope, description] = match;\n\n // Validate type\n if (!conventionalTypes.includes(type as any)) {\n const suggestion = didYouMean(type, conventionalTypes);\n return {\n valid: false,\n error: `Invalid commit type '${type}'. Must be one of: ${conventionalTypes.join(\", \")}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate scope (optional but recommended)\n if (scope && !scopes.includes(scope)) {\n const suggestion = didYouMean(scope, scopes);\n const scopeList =\n scopes.slice(0, 5).join(\", \") + (scopes.length > 5 ? \"...\" : \"\");\n return {\n valid: false,\n error: `Invalid scope '${scope}'. Must be one of: ${scopeList}`,\n suggestion: suggestion ? `Did you mean '${suggestion}'?` : undefined,\n };\n }\n\n // Validate description\n if (description.length < 10) {\n return {\n valid: false,\n error: `Commit description is too short (minimum 10 characters)`,\n suggestion: `Be more descriptive about what changed`,\n };\n }\n\n if (description[0] !== description[0].toLowerCase()) {\n return {\n valid: false,\n error: `Commit description must start with lowercase letter`,\n suggestion: `Change '${description}' to '${description[0].toLowerCase()}${description.slice(1)}'`,\n };\n }\n\n return { valid: true };\n}\n\nexport async function validatePRTitle(\n title: string,\n config: WorkflowConfig,\n workspacePath?: string,\n): Promise<ValidationResult> {\n // PR titles follow same format as commit messages\n return validateCommitMessage(title, config, workspacePath);\n}\n","/**\n * Document reference validator for checking broken markdown links\n * and file references in documentation\n */\n\nimport { existsSync } from \"fs\";\nimport { readFile } from \"fs/promises\";\nimport { resolve, dirname } from \"path\";\nimport fg from \"fast-glob\";\n\nexport interface DocumentReference {\n /** Source file containing the reference */\n file: string;\n /** Line number (1-indexed) */\n line: number;\n /** Column position (1-indexed) */\n column: number;\n /** Original markdown link text (e.g., \"[text](path)\") */\n rawLink: string;\n /** Extracted target path */\n targetPath: string;\n /** Type of reference */\n type: \"link\" | \"image\" | \"reference\";\n}\n\nexport interface BrokenReference extends DocumentReference {\n /** Possible correct paths (from glob matching) */\n suggestions: string[];\n}\n\nexport interface DocumentValidationResult {\n valid: boolean;\n scannedFiles: number;\n totalReferences: number;\n brokenReferences: BrokenReference[];\n errors: string[];\n}\n\n/**\n * Regex patterns for detecting markdown links\n */\nconst LINK_PATTERNS = {\n // Inline links: [text](path)\n inline: /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n // Images: ![alt](path)\n image: /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g,\n // Reference-style: [text]: path\n reference: /^\\[([^\\]]+)\\]:\\s*(.+)$/gm,\n};\n\n/**\n * Check if a URL is external (http/https)\n */\nfunction isExternalUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n}\n\n/**\n * Check if a path is an anchor link (starts with #)\n */\nfunction isAnchorLink(path: string): boolean {\n return path.startsWith(\"#\");\n}\n\n/**\n * Resolve a relative path from a source file\n */\nfunction resolveReferencePath(\n sourcePath: string,\n targetPath: string,\n projectRoot: string,\n): string {\n // Remove any anchor fragments\n const pathWithoutAnchor = targetPath.split(\"#\")[0];\n if (!pathWithoutAnchor) return targetPath;\n\n const sourceDir = dirname(sourcePath);\n\n // If absolute path from project root, resolve from project root\n if (pathWithoutAnchor.startsWith(\"/\")) {\n return resolve(projectRoot, pathWithoutAnchor.slice(1));\n }\n\n // Otherwise resolve relative to source file\n return resolve(sourceDir, pathWithoutAnchor);\n}\n\n/**\n * Extract all document references from a markdown file\n */\nexport async function extractReferences(\n filePath: string,\n _projectRoot: string,\n): Promise<DocumentReference[]> {\n const content = await readFile(filePath, \"utf-8\");\n const references: DocumentReference[] = [];\n const lines = content.split(\"\\n\");\n\n // Process inline links [text](path)\n lines.forEach((line, index) => {\n let match;\n const inlineRegex = new RegExp(LINK_PATTERNS.inline);\n while ((match = inlineRegex.exec(line)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs and anchor-only links\n if (isExternalUrl(targetPath) || isAnchorLink(targetPath)) {\n continue;\n }\n\n references.push({\n file: filePath,\n line: index + 1,\n column: match.index + 1,\n rawLink: match[0],\n targetPath,\n type: \"link\",\n });\n }\n });\n\n // Process images ![alt](path)\n lines.forEach((line, index) => {\n let match;\n const imageRegex = new RegExp(LINK_PATTERNS.image);\n while ((match = imageRegex.exec(line)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs\n if (isExternalUrl(targetPath)) {\n continue;\n }\n\n references.push({\n file: filePath,\n line: index + 1,\n column: match.index + 1,\n rawLink: match[0],\n targetPath,\n type: \"image\",\n });\n }\n });\n\n // Process reference-style links [ref]: path\n let match;\n const referenceRegex = new RegExp(LINK_PATTERNS.reference);\n while ((match = referenceRegex.exec(content)) !== null) {\n const targetPath = match[2].trim();\n\n // Skip external URLs and anchor-only links\n if (isExternalUrl(targetPath) || isAnchorLink(targetPath)) {\n continue;\n }\n\n // Find line number\n const beforeMatch = content.substring(0, match.index);\n const lineNumber = beforeMatch.split(\"\\n\").length;\n\n references.push({\n file: filePath,\n line: lineNumber,\n column: match.index - beforeMatch.lastIndexOf(\"\\n\"),\n rawLink: match[0],\n targetPath,\n type: \"reference\",\n });\n }\n\n return references;\n}\n\n/**\n * Find similar files using glob patterns\n */\nexport async function findSimilarFiles(\n targetPath: string,\n projectRoot: string,\n): Promise<string[]> {\n // Extract filename and extension\n const parts = targetPath.split(\"/\");\n const filename = parts[parts.length - 1];\n const basename = filename.split(\".\")[0];\n const ext = filename.includes(\".\") ? filename.split(\".\").pop() : \"\";\n\n // Try multiple glob patterns for finding similar files\n const patterns = [\n `**/${filename}`, // Exact filename match anywhere\n ext ? `**/${basename}*.${ext}` : `**/${basename}*`, // Similar basename\n ext ? `**/*${basename}*.${ext}` : `**/*${basename}*`, // Contains basename\n ];\n\n const foundFiles = new Set<string>();\n\n for (const pattern of patterns) {\n try {\n const matches = await fg(pattern, {\n cwd: projectRoot,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n ],\n absolute: false,\n onlyFiles: true,\n });\n\n matches.forEach((file) => foundFiles.add(file));\n\n // Limit suggestions to 10 files\n if (foundFiles.size >= 10) break;\n } catch (error) {\n // Continue with next pattern\n }\n }\n\n return Array.from(foundFiles).slice(0, 10);\n}\n\n/**\n * Scan all markdown files in a project for references\n */\nexport async function scanDocumentReferences(\n projectPath: string,\n options?: { patterns?: string[]; ignore?: string[] },\n): Promise<DocumentReference[]> {\n const patterns = options?.patterns || [\"**/*.md\"];\n const ignore = options?.ignore || [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/dist/**\",\n \"**/build/**\",\n ];\n\n const files = await fg(patterns, {\n cwd: projectPath,\n ignore,\n absolute: true,\n onlyFiles: true,\n });\n\n const allReferences: DocumentReference[] = [];\n\n for (const file of files) {\n try {\n const references = await extractReferences(file, projectPath);\n allReferences.push(...references);\n } catch (error) {\n // Skip files that can't be read\n continue;\n }\n }\n\n return allReferences;\n}\n\n/**\n * Validate document references and find broken links\n */\nexport async function validateDocumentReferences(\n projectPath: string,\n options?: { patterns?: string[]; ignore?: string[] },\n): Promise<DocumentValidationResult> {\n const errors: string[] = [];\n const brokenReferences: BrokenReference[] = [];\n\n try {\n // Scan all references\n const references = await scanDocumentReferences(projectPath, options);\n\n // Count unique files scanned\n const scannedFiles = new Set(references.map((ref) => ref.file)).size;\n\n // Check each reference\n for (const ref of references) {\n try {\n const resolvedPath = resolveReferencePath(\n ref.file,\n ref.targetPath,\n projectPath,\n );\n\n // Check if the file exists\n if (!existsSync(resolvedPath)) {\n // Find similar files for suggestions\n const suggestions = await findSimilarFiles(\n ref.targetPath,\n projectPath,\n );\n\n brokenReferences.push({\n ...ref,\n suggestions,\n });\n }\n } catch (error) {\n // Path resolution error\n const suggestions = await findSimilarFiles(ref.targetPath, projectPath);\n brokenReferences.push({\n ...ref,\n suggestions,\n });\n }\n }\n\n return {\n valid: brokenReferences.length === 0,\n scannedFiles,\n totalReferences: references.length,\n brokenReferences,\n errors,\n };\n } catch (error) {\n errors.push(\n error instanceof Error\n ? error.message\n : \"Unknown error during validation\",\n );\n\n return {\n valid: false,\n scannedFiles: 0,\n totalReferences: 0,\n brokenReferences: [],\n errors,\n };\n }\n}\n\n/**\n * Apply a fix to a broken reference\n */\nexport async function applyReferenceFix(\n filePath: string,\n oldLink: string,\n newPath: string,\n): Promise<void> {\n const content = await readFile(filePath, \"utf-8\");\n\n // Replace the old link with the new path\n const updatedContent = content.replace(oldLink, (match) => {\n // Extract the link text and replace only the path part\n if (match.startsWith(\"![\")) {\n // Image: ![alt](oldPath) -> ![alt](newPath)\n return match.replace(/\\(([^)]+)\\)/, `(${newPath})`);\n } else if (match.startsWith(\"[\") && match.includes(\"](\")) {\n // Inline link: [text](oldPath) -> [text](newPath)\n return match.replace(/\\(([^)]+)\\)/, `(${newPath})`);\n } else {\n // Reference-style: [ref]: oldPath -> [ref]: newPath\n return match.replace(/:\\s*(.+)$/, `: ${newPath}`);\n }\n });\n\n const fs = await import(\"fs/promises\");\n await fs.writeFile(filePath, updatedContent, \"utf-8\");\n}\n"],"mappings":"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","names":["match"]}