@qazuor/claude-code-config 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.cjs +2426 -1792
- package/dist/bin.cjs.map +1 -1
- package/dist/bin.js +2426 -1792
- package/dist/bin.js.map +1 -1
- package/package.json +1 -1
package/dist/bin.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/lib/utils/fs.ts","../src/bin.ts","../src/cli/index.ts","../src/cli/commands/index.ts","../src/cli/commands/init.ts","../src/lib/bundles/resolver.ts","../src/constants/bundles.ts","../src/lib/ci-cd/index.ts","../src/lib/ci-cd/github-actions-generator.ts","../src/lib/utils/spinner.ts","../src/lib/code-style/index.ts","../src/lib/code-style/installer.ts","../src/constants/code-style-defaults.ts","../src/lib/utils/logger.ts","../src/lib/code-style/generator.ts","../src/lib/code-style/vscode-installer.ts","../src/lib/config/index.ts","../src/lib/config/reader.ts","../src/lib/config/writer.ts","../src/lib/config/global-defaults.ts","../src/lib/dependencies/index.ts","../src/lib/dependencies/checker.ts","../src/constants/dependencies.ts","../src/lib/git-hooks/index.ts","../src/lib/git-hooks/husky-installer.ts","../src/lib/hooks/index.ts","../src/lib/hooks/configurator.ts","../src/lib/mcp/index.ts","../src/lib/mcp/configurator.ts","../src/constants/mcp-servers.ts","../src/lib/modules/index.ts","../src/lib/modules/registry.ts","../src/lib/modules/resolver.ts","../src/lib/modules/installer.ts","../src/lib/npm/index.ts","../src/lib/npm/package-manager.ts","../src/constants/npm-dependencies.ts","../src/lib/permissions/index.ts","../src/lib/permissions/configurator.ts","../src/constants/permissions.ts","../src/lib/placeholders/index.ts","../src/lib/placeholders/replacer.ts","../src/constants/placeholders.ts","../src/lib/scaffold/claude-md-generator.ts","../src/lib/utils/paths.ts","../src/lib/scaffold/index.ts","../src/lib/scaffold/detector.ts","../src/lib/scaffold/generator.ts","../src/lib/utils/git.ts","../src/lib/templates/config-replacer.ts","../src/constants/template-placeholders.ts","../src/lib/utils/prompt-cancel.ts","../src/cli/prompts/bundle-select.ts","../src/lib/bundles/display.ts","../src/lib/bundles/validator.ts","../src/cli/prompts/ci-cd-config.ts","../src/cli/prompts/folder-preferences.ts","../src/constants/folder-preferences.ts","../src/cli/prompts/index.ts","../src/cli/prompts/project-info.ts","../src/cli/prompts/preferences.ts","../src/cli/prompts/scaffold.ts","../src/cli/prompts/item-select.ts","../src/cli/prompts/hook-config.ts","../src/cli/prompts/mcp-config.ts","../src/cli/prompts/permissions.ts","../src/cli/prompts/update.ts","../src/cli/prompts/confirm.ts","../src/cli/prompts/code-style.ts","../src/cli/prompts/template-config.ts","../src/cli/commands/list.ts","../src/cli/commands/add.ts","../src/cli/commands/remove.ts","../src/cli/commands/status.ts","../src/cli/commands/update.ts","../src/cli/commands/configure.ts","../src/lib/templates/scanner.ts","../src/lib/utils/banner.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Filesystem utility functions\n */\n\nimport path from 'node:path';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\n\n/**\n * Check if a path exists\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\n/**\n * Check if a path is a directory\n */\nexport async function isDirectory(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a file\n */\nexport async function isFile(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Read a JSON file\n */\nexport async function readJson<T = unknown>(filePath: string): Promise<T> {\n return fs.readJson(filePath);\n}\n\n/**\n * Write a JSON file\n */\nexport async function writeJson(\n filePath: string,\n data: unknown,\n options?: { spaces?: number }\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeJson(filePath, data, { spaces: options?.spaces ?? 2 });\n}\n\n/**\n * Read a text file\n */\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Write a text file\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Copy a file or directory\n */\nexport async function copy(\n src: string,\n dest: string,\n options?: { overwrite?: boolean }\n): Promise<void> {\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest, { overwrite: options?.overwrite ?? false });\n}\n\n/**\n * Copy a directory recursively\n */\nexport async function copyDir(\n src: string,\n dest: string,\n options?: { overwrite?: boolean; filter?: (src: string) => boolean }\n): Promise<void> {\n await fs.copy(src, dest, {\n overwrite: options?.overwrite ?? false,\n filter: options?.filter,\n });\n}\n\n/**\n * Create a directory (and parents if needed)\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Remove a file or directory\n */\nexport async function remove(filePath: string): Promise<void> {\n await fs.remove(filePath);\n}\n\n/**\n * List files matching a pattern\n */\nexport async function listFiles(\n pattern: string,\n options?: { cwd?: string; ignore?: string[] }\n): Promise<string[]> {\n return glob(pattern, {\n cwd: options?.cwd,\n ignore: options?.ignore,\n nodir: true,\n });\n}\n\n/**\n * List directories matching a pattern\n */\nexport async function listDirs(pattern: string, options?: { cwd?: string }): Promise<string[]> {\n const matches = await glob(pattern, {\n cwd: options?.cwd,\n });\n\n const dirs: string[] = [];\n for (const match of matches) {\n const fullPath = options?.cwd ? path.join(options.cwd, match) : match;\n if (await isDirectory(fullPath)) {\n dirs.push(match);\n }\n }\n\n return dirs;\n}\n\n/**\n * Get file info\n */\nexport async function getFileInfo(filePath: string): Promise<{\n exists: boolean;\n isFile: boolean;\n isDirectory: boolean;\n size: number;\n modified: Date;\n} | null> {\n try {\n const stat = await fs.stat(filePath);\n return {\n exists: true,\n isFile: stat.isFile(),\n isDirectory: stat.isDirectory(),\n size: stat.size,\n modified: stat.mtime,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Read all files in a directory recursively\n */\nexport async function readDirRecursive(\n dirPath: string,\n options?: { extensions?: string[] }\n): Promise<string[]> {\n const pattern = options?.extensions ? `**/*.{${options.extensions.join(',')}}` : '**/*';\n\n return glob(pattern, {\n cwd: dirPath,\n nodir: true,\n });\n}\n\n/**\n * Calculate hash of a file for comparison\n */\nexport async function getFileHash(filePath: string): Promise<string> {\n const crypto = await import('node:crypto');\n const content = await fs.readFile(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Compare two files\n */\nexport async function filesAreEqual(file1: string, file2: string): Promise<boolean> {\n try {\n const [hash1, hash2] = await Promise.all([getFileHash(file1), getFileHash(file2)]);\n return hash1 === hash2;\n } catch {\n return false;\n }\n}\n\n/**\n * Get relative path from base\n */\nexport function relativePath(from: string, to: string): string {\n return path.relative(from, to);\n}\n\n/**\n * Resolve path segments\n */\nexport function resolvePath(...segments: string[]): string {\n return path.resolve(...segments);\n}\n\n/**\n * Join path segments\n */\nexport function joinPath(...segments: string[]): string {\n return path.join(...segments);\n}\n\n/**\n * Get directory name\n */\nexport function dirname(filePath: string): string {\n return path.dirname(filePath);\n}\n\n/**\n * Get base name\n */\nexport function basename(filePath: string, ext?: string): string {\n return path.basename(filePath, ext);\n}\n\n/**\n * Get file extension\n */\nexport function extname(filePath: string): string {\n return path.extname(filePath);\n}\n\n/**\n * Backup a file or directory\n */\nexport async function backup(src: string, suffix = '.backup'): Promise<string> {\n const backupPath = `${src}${suffix}`;\n await copy(src, backupPath, { overwrite: true });\n return backupPath;\n}\n\n/**\n * Make a file executable (Unix only)\n */\nexport async function makeExecutable(filePath: string): Promise<void> {\n try {\n await fs.chmod(filePath, 0o755);\n } catch {\n // Ignore on Windows\n }\n}\n\n/**\n * Temporary directory utilities\n */\nexport async function createTempDir(prefix = 'claude-config-'): Promise<string> {\n const os = await import('node:os');\n const tempBase = os.tmpdir();\n const tempDir = path.join(tempBase, `${prefix}${Date.now()}`);\n await ensureDir(tempDir);\n return tempDir;\n}\n\nexport async function cleanTempDir(tempDir: string): Promise<void> {\n await remove(tempDir);\n}\n","#!/usr/bin/env node\n/**\n * CLI entry point for @qazuor/claude-code-config\n */\n\nimport { program } from './cli/index.js';\nimport { showBanner } from './lib/utils/banner.js';\nimport { setupGracefulCancellation } from './lib/utils/prompt-cancel.js';\n\n// Set up graceful cancellation handlers\nsetupGracefulCancellation();\n\n// Show banner on startup (only for init command or no args)\nconst args = process.argv.slice(2);\nconst showBannerCommands = ['init', 'help', '--help', '-h', ''];\nconst shouldShowBanner = args.length === 0 || showBannerCommands.includes(args[0] || '');\n\nif (shouldShowBanner) {\n showBanner();\n}\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\n\nimport {\n createAddCommand,\n createConfigureCommand,\n createInitCommand,\n createListCommand,\n createRemoveCommand,\n createStatusCommand,\n createUpdateCommand,\n} from './commands/index.js';\n\nconst VERSION = '0.1.0';\n\nexport const program = new Command()\n .name('qazuor-claude-config')\n .description('CLI tool to install and manage Claude Code configurations')\n .version(VERSION);\n\n// Register all commands\nprogram.addCommand(createInitCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createAddCommand());\nprogram.addCommand(createRemoveCommand());\nprogram.addCommand(createStatusCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createConfigureCommand());\n\nexport { VERSION };\n","/**\n * Commands exports\n */\n\nexport { createInitCommand } from './init.js';\nexport { createListCommand } from './list.js';\nexport { createAddCommand } from './add.js';\nexport { createRemoveCommand } from './remove.js';\nexport { createStatusCommand } from './status.js';\nexport { createUpdateCommand } from './update.js';\nexport { createConfigureCommand } from './configure.js';\n","/**\n * Init command - initialize Claude configuration\n */\n\nimport { Command } from 'commander';\nimport { resolveBundles } from '../../lib/bundles/resolver.js';\nimport { type CICDConfig, installCICDWithSpinner } from '../../lib/ci-cd/index.js';\nimport { installCodeStyle, showCodeStyleInstructions } from '../../lib/code-style/index.js';\nimport { installVSCodeConfig } from '../../lib/code-style/vscode-installer.js';\nimport { writeConfig } from '../../lib/config/index.js';\nimport {\n checkFeatureDependencies,\n formatDependencyReport,\n formatManualInstallInstructions,\n getRequiredFeatures,\n installDependencies,\n} from '../../lib/dependencies/index.js';\nimport {\n deriveHuskyConfigFromCodeStyle,\n installHuskyWithSpinner,\n} from '../../lib/git-hooks/index.js';\nimport { installHooks } from '../../lib/hooks/index.js';\nimport { installMcpServers } from '../../lib/mcp/index.js';\nimport { filterModules, loadRegistry } from '../../lib/modules/index.js';\nimport { installAllModules, installExtras } from '../../lib/modules/installer.js';\nimport {\n deriveToolSelectionFromCodeStyle,\n generatePackageJsonChanges,\n getInstallCommand,\n getSetupInstructions,\n readPackageJson,\n updatePackageJson,\n} from '../../lib/npm/index.js';\nimport { installPermissions, setCoAuthorSetting } from '../../lib/permissions/index.js';\nimport { replacePlaceholders, showReplacementReport } from '../../lib/placeholders/index.js';\nimport { generateClaudeMdWithSpinner } from '../../lib/scaffold/claude-md-generator.js';\nimport {\n detectProject,\n generateScaffoldWithProgress,\n getProjectDescription,\n getProjectName,\n hasExistingClaudeConfig,\n} from '../../lib/scaffold/index.js';\nimport { replaceTemplateConfigWithSpinner } from '../../lib/templates/config-replacer.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport {\n cleanup,\n confirm,\n setupGracefulCancellation,\n showCancelHint,\n} from '../../lib/utils/prompt-cancel.js';\nimport { spinner, withSpinner } from '../../lib/utils/spinner.js';\nimport type { BundleSelectionResult } from '../../types/bundles.js';\nimport type { ClaudeConfig } from '../../types/config.js';\nimport type { ModuleCategory, ModuleDefinition, ModuleRegistry } from '../../types/modules.js';\nimport type { DependencyGenerationConfig, ToolSelection } from '../../types/package-json.js';\nimport type { TemplateConfig } from '../../types/template-config.js';\nimport {\n promptBundleMode,\n promptQuickBundleSelection,\n showBundlesSummary,\n} from '../prompts/bundle-select.js';\nimport { promptCICDConfig } from '../prompts/ci-cd-config.js';\nimport { promptQuickFolderPreferences } from '../prompts/folder-preferences.js';\nimport {\n type SkippedMcpConfig,\n confirmFinalConfiguration,\n confirmProjectInfo,\n promptCodeStyleConfig,\n promptExistingProjectAction,\n promptHookConfig,\n promptMcpConfig,\n promptPermissionsConfig,\n promptPreferences,\n promptProjectInfo,\n promptScaffoldOptions,\n selectItemsFromCategory,\n showPostInstallInstructions,\n showSkippedMcpInstructions,\n} from '../prompts/index.js';\nimport {\n buildConfigContext,\n promptSaveGlobalDefaults,\n promptTemplateConfig,\n} from '../prompts/template-config.js';\n\n/** Extended config result that includes skipped MCP configurations */\ninterface ConfigBuildResult {\n config: ClaudeConfig;\n skippedMcpConfigs: SkippedMcpConfig[];\n templateConfig?: Partial<TemplateConfig>;\n cicdConfig?: CICDConfig;\n}\n\n// Package version (will be replaced at build time or read from package.json)\nconst VERSION = '0.1.0';\n\ninterface InitOptions {\n bundles?: string;\n template?: string;\n branch?: string;\n yes?: boolean;\n force?: boolean;\n dryRun?: boolean;\n claudeOnly?: boolean;\n noPlaceholders?: boolean;\n noMcp?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create init command\n */\nexport function createInitCommand(): Command {\n const cmd = new Command('init')\n .description('Initialize Claude configuration in a project')\n .argument('[path]', 'Project path (default: current directory)')\n .option(\n '-b, --bundles <ids>',\n 'Comma-separated bundle IDs to install (e.g., \"react-tanstack-stack,testing-complete\")'\n )\n .option('-t, --template <url>', 'Remote git repo for templates')\n .option('--branch <name>', 'Branch/tag for remote template')\n .option('-y, --yes', 'Accept defaults, skip prompts')\n .option('-f, --force', 'Overwrite existing .claude/')\n .option('--dry-run', 'Show what would happen without making changes')\n .option('--claude-only', 'Only Claude config, no project scaffold')\n .option('--no-placeholders', 'Skip placeholder replacement')\n .option('--no-mcp', 'Skip MCP configuration')\n .option('-v, --verbose', 'Detailed output')\n .action(runInit);\n\n return cmd;\n}\n\n/**\n * Run init command\n */\nasync function runInit(path: string | undefined, options: InitOptions): Promise<void> {\n const projectPath = resolvePath(path || '.');\n\n logger.configure({ verbose: options.verbose, silent: false });\n\n logger.title('@qazuor/claude-code-config');\n logger.info(`Initializing Claude configuration in ${colors.primary(projectPath)}`);\n\n // Setup graceful cancellation for interactive mode\n if (!options.yes) {\n setupGracefulCancellation();\n showCancelHint();\n }\n\n try {\n // Check for existing configuration\n if (await hasExistingClaudeConfig(projectPath)) {\n if (!options.force) {\n const action = await promptExistingProjectAction();\n if (action === 'skip') {\n logger.info('Keeping existing configuration');\n return;\n }\n if (action !== 'overwrite' && action !== 'merge') {\n return;\n }\n }\n }\n\n // Detect project\n const detection = await detectProject(projectPath);\n if (detection.detected) {\n logger.newline();\n logger.success(`Detected ${detection.projectType || 'Node.js'} project`);\n if (detection.suggestedBundles && detection.suggestedBundles.length > 0) {\n logger.info(`Suggested bundles: ${colors.primary(detection.suggestedBundles.join(', '))}`);\n }\n }\n\n // Get templates path (bundled with package)\n const templatesPath = getTemplatesPath();\n\n // Load module registry\n const registry = await withSpinner(\n 'Loading module registry...',\n () => loadRegistry(templatesPath),\n { silent: options.dryRun }\n );\n\n // Collect configuration through prompts or defaults\n const buildResult = options.yes\n ? await buildDefaultConfig(projectPath, detection, options)\n : await buildInteractiveConfig(projectPath, detection, registry, options);\n\n if (!buildResult) {\n logger.warn('Configuration cancelled');\n return;\n }\n\n const { config, skippedMcpConfigs, templateConfig, cicdConfig } = buildResult;\n\n // Store template config in main config\n if (templateConfig) {\n config.templateConfig = templateConfig;\n }\n\n // Show final summary and confirm\n if (!options.yes && !options.dryRun) {\n const confirmed = await confirmFinalConfiguration(config);\n if (!confirmed) {\n logger.warn('Configuration cancelled');\n return;\n }\n }\n\n if (options.dryRun) {\n logger.newline();\n logger.title('Dry Run - No changes made');\n showConfigSummary(config);\n return;\n }\n\n // Execute installation\n await executeInstallation(projectPath, config, registry, templatesPath, options, cicdConfig);\n\n // Apply template configuration (replace {{PLACEHOLDER}} patterns)\n if (templateConfig && !options.noPlaceholders) {\n const claudePath = joinPath(projectPath, '.claude');\n await replaceTemplateConfigWithSpinner(claudePath, templateConfig);\n\n // Offer to save as global defaults\n if (!options.yes) {\n await promptSaveGlobalDefaults(templateConfig);\n }\n }\n\n // Check dependencies\n const features = getRequiredFeatures({\n hooks: config.extras.hooks,\n mcp: config.mcp,\n });\n\n if (features.length > 0) {\n const depReport = await checkFeatureDependencies(features);\n if (depReport.missing.length > 0) {\n logger.section('System Dependencies', '🔧');\n logger.warn(`Found ${depReport.missing.length} missing system dependencies`);\n logger.newline();\n\n // Show what's missing\n for (const dep of depReport.missing) {\n logger.item(`${dep.name} - ${dep.description}`);\n }\n logger.newline();\n\n if (!options.yes) {\n const shouldInstall = await confirm({\n message: 'Would you like to try installing these dependencies now?',\n default: true,\n });\n\n if (shouldInstall) {\n logger.newline();\n const results = await installDependencies(depReport.missing, {\n onProgress: (dep, index, total) => {\n spinner.start(`Installing ${dep.name} (${index + 1}/${total})...`);\n },\n });\n\n const successful = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (successful.length > 0) {\n spinner.succeed(`Installed ${successful.length} dependencies successfully`);\n }\n\n if (failed.length > 0) {\n spinner.fail(`Failed to install ${failed.length} dependencies`);\n logger.newline();\n logger.warn('The following dependencies could not be installed automatically:');\n for (const result of failed) {\n logger.item(`${result.dep.name}: ${result.error}`);\n }\n\n // Show manual instructions for failed ones\n const failedReport = {\n ...depReport,\n missing: failed.map((r) => r.dep),\n };\n logger.newline();\n formatDependencyReport(failedReport);\n }\n } else {\n // User chose not to install - show manual instructions\n logger.newline();\n logger.info('You can install them later using the following commands:');\n const instructions = formatManualInstallInstructions(depReport);\n for (const line of instructions) {\n logger.raw(line);\n }\n }\n } else {\n // Non-interactive mode - just show the report\n formatDependencyReport(depReport);\n }\n }\n }\n\n // Show post-install instructions\n showPostInstallInstructions(config);\n\n // Show MCP configuration instructions for skipped fields\n if (skippedMcpConfigs.length > 0) {\n showSkippedMcpInstructions(skippedMcpConfigs, config.mcp.level);\n }\n\n // Cleanup after successful completion\n cleanup();\n } catch (error) {\n cleanup();\n spinner.fail();\n logger.error(`Initialization failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Build configuration with defaults (for --yes flag or --bundles flag)\n */\nasync function buildDefaultConfig(\n projectPath: string,\n detection: Awaited<ReturnType<typeof detectProject>>,\n options: InitOptions\n): Promise<ConfigBuildResult> {\n // Determine which bundles to use\n let bundleIds: string[] = [];\n\n if (options.bundles) {\n // Use bundles from command line\n bundleIds = options.bundles.split(',').map((id) => id.trim());\n } else if (detection.suggestedBundles && detection.suggestedBundles.length > 0) {\n // Use suggested bundles from detection\n bundleIds = detection.suggestedBundles;\n } else {\n // Default minimal bundles\n bundleIds = ['git-workflow', 'testing-minimal', 'quality-minimal'];\n }\n\n // Resolve bundles to modules\n const resolvedModules = resolveBundles(bundleIds);\n\n const projectName = (await getProjectName(projectPath)) || 'my-project';\n const projectDesc = (await getProjectDescription(projectPath)) || 'My project';\n\n // Determine extras based on selected bundles\n const hasPlanning = bundleIds.some((id) => id.includes('planning'));\n const hasTesting = bundleIds.some((id) => id.includes('testing'));\n\n const config: ClaudeConfig = {\n version: VERSION,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: {\n name: projectName,\n description: projectDesc,\n org: 'my-org',\n repo: projectName.toLowerCase().replace(/\\s+/g, '-'),\n entityType: 'item',\n entityTypePlural: 'items',\n },\n preferences: {\n language: 'en',\n responseLanguage: 'en',\n includeCoAuthor: true,\n },\n mcp: {\n level: 'project',\n servers: [],\n },\n modules: {\n agents: { selected: resolvedModules.agents, excluded: [] },\n skills: { selected: resolvedModules.skills, excluded: [] },\n commands: { selected: resolvedModules.commands, excluded: [] },\n docs: { selected: resolvedModules.docs, excluded: [] },\n },\n extras: {\n schemas: hasTesting,\n scripts: false,\n hooks: { enabled: false },\n sessions: hasPlanning,\n },\n scaffold: {\n type: options.claudeOnly ? 'claude-only' : 'claude-only',\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n selectedBundles: bundleIds,\n },\n };\n\n return {\n config,\n skippedMcpConfigs: [], // No MCP servers in default mode\n };\n}\n\n/**\n * Build configuration interactively\n */\nasync function buildInteractiveConfig(\n projectPath: string,\n detection: Awaited<ReturnType<typeof detectProject>>,\n registry: ModuleRegistry,\n options: InitOptions\n): Promise<ConfigBuildResult | null> {\n // Project info\n const projectName = await getProjectName(projectPath);\n const projectDesc = await getProjectDescription(projectPath);\n\n const projectInfo = await promptProjectInfo({\n defaults: {\n name: projectName,\n description: projectDesc || '',\n },\n });\n\n const confirmed = await confirmProjectInfo(projectInfo);\n if (!confirmed) {\n return buildInteractiveConfig(projectPath, detection, registry, options);\n }\n\n // Preferences (including package manager)\n const preferences = await promptPreferences({\n detectedPackageManager: detection.packageManager,\n });\n\n // Scaffold options\n const scaffoldOptions = await promptScaffoldOptions({\n existingProject: detection.detected,\n detectedType: detection.projectType,\n detectedPackageManager: detection.packageManager,\n });\n\n // Module selection using bundles\n const bundleSelection = await selectModulesWithBundles(registry, detection.suggestedBundles);\n\n // Determine extras based on selected bundles\n const hasPlanning = bundleSelection.selectedBundles.some((id) => id.includes('planning'));\n const hasTesting = bundleSelection.selectedBundles.some((id) => id.includes('testing'));\n\n // Hook configuration\n const hookConfig = await promptHookConfig({\n defaults: hasTesting ? { enabled: true } : undefined,\n });\n\n // MCP configuration\n let mcpConfig: ClaudeConfig['mcp'] = { level: 'project', servers: [] };\n let skippedMcpConfigs: SkippedMcpConfig[] = [];\n\n if (!options.noMcp) {\n const mcpResult = await promptMcpConfig();\n mcpConfig = mcpResult.config;\n skippedMcpConfigs = mcpResult.skippedConfigs;\n }\n\n // Permissions configuration\n const permissionsConfig = await promptPermissionsConfig();\n\n // Code style configuration\n const codeStyleConfig = await promptCodeStyleConfig();\n\n // CI/CD configuration\n const cicdConfig = await promptCICDConfig({\n packageManager: preferences.packageManager,\n });\n\n // Folder structure preferences (based on selected bundles)\n const folderPreferences = await promptQuickFolderPreferences({\n selectedBundles: bundleSelection.selectedBundles,\n technologies: detection.detectedTechnologies || [],\n });\n\n // Template configuration ({{PLACEHOLDER}} values)\n logger.newline();\n const configContext = await buildConfigContext(projectPath);\n const templateConfigResult = await promptTemplateConfig({\n context: configContext,\n mode: 'quick',\n });\n\n // Resolve bundles to modules\n const resolvedModules = resolveBundles(bundleSelection.selectedBundles);\n\n // Merge with additional individual modules\n const modules = {\n agents: [...new Set([...resolvedModules.agents, ...bundleSelection.additionalModules.agents])],\n skills: [...new Set([...resolvedModules.skills, ...bundleSelection.additionalModules.skills])],\n commands: [\n ...new Set([...resolvedModules.commands, ...bundleSelection.additionalModules.commands]),\n ],\n docs: [...new Set([...resolvedModules.docs, ...bundleSelection.additionalModules.docs])],\n };\n\n const config: ClaudeConfig = {\n version: VERSION,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: projectInfo,\n preferences,\n mcp: mcpConfig,\n modules: {\n agents: { selected: modules.agents, excluded: [] },\n skills: { selected: modules.skills, excluded: [] },\n commands: { selected: modules.commands, excluded: [] },\n docs: { selected: modules.docs, excluded: [] },\n },\n extras: {\n schemas: hasTesting,\n scripts: false,\n hooks: hookConfig,\n sessions: hasPlanning,\n codeStyle: codeStyleConfig,\n folderPreferences: folderPreferences || undefined,\n },\n scaffold: {\n type: scaffoldOptions.type,\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n permissions: permissionsConfig,\n selectedBundles: bundleSelection.selectedBundles,\n },\n };\n\n return {\n config,\n skippedMcpConfigs,\n templateConfig: templateConfigResult,\n cicdConfig,\n };\n}\n\n/**\n * Select modules using bundle system\n */\nasync function selectModulesWithBundles(\n registry: ModuleRegistry,\n suggestedBundles?: string[]\n): Promise<BundleSelectionResult> {\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n // Ask how to select modules\n const mode = await promptBundleMode();\n\n const result: BundleSelectionResult = {\n selectedBundles: [],\n additionalModules: {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n },\n };\n\n if (mode === 'bundles' || mode === 'both') {\n // Show suggested bundles if available\n if (suggestedBundles && suggestedBundles.length > 0) {\n logger.newline();\n logger.info(\n colors.muted(`Suggested bundles based on your project: ${suggestedBundles.join(', ')}`)\n );\n }\n\n // Quick bundle selection or full selection\n result.selectedBundles = await promptQuickBundleSelection();\n\n // Show summary\n if (result.selectedBundles.length > 0) {\n showBundlesSummary(result.selectedBundles);\n }\n }\n\n if (mode === 'individual' || mode === 'both') {\n // Get preselected from bundles\n const preselectedFromBundles = resolveBundles(result.selectedBundles);\n\n // Individual selection per category\n logger.newline();\n logger.subtitle('Individual Module Selection');\n\n for (const category of categories) {\n const preselected =\n mode === 'both'\n ? preselectedFromBundles[category as keyof typeof preselectedFromBundles]\n : [];\n\n const categoryResult = await selectItemsFromCategory(category, registry[category], {\n preselected,\n showDescriptions: true,\n });\n\n // Store additional modules (not from bundles)\n if (mode === 'both') {\n result.additionalModules[category] = categoryResult.selectedItems.filter(\n (id) => !preselected.includes(id)\n );\n } else {\n result.additionalModules[category] = categoryResult.selectedItems;\n }\n }\n }\n\n return result;\n}\n\n/**\n * Execute the installation\n */\nasync function executeInstallation(\n projectPath: string,\n config: ClaudeConfig,\n registry: ModuleRegistry,\n templatesPath: string,\n options: InitOptions,\n cicdConfig?: CICDConfig\n): Promise<void> {\n logger.newline();\n logger.title('Installing Configuration');\n\n // Generate scaffold if needed\n if (config.scaffold.type === 'full-project') {\n const scaffoldResult = await generateScaffoldWithProgress(projectPath, {\n type: config.scaffold.type,\n });\n config.scaffold.createdStructure = [\n ...scaffoldResult.createdDirs,\n ...scaffoldResult.createdFiles,\n ];\n }\n\n // Generate CLAUDE.md in project root\n const claudeMdResult = await generateClaudeMdWithSpinner(projectPath, config.project, {\n overwrite: options.force,\n templateConfig: config.templateConfig,\n claudeConfig: config,\n });\n if (claudeMdResult.error) {\n logger.warn(`CLAUDE.md generation warning: ${claudeMdResult.error}`);\n } else if (claudeMdResult.skipped) {\n logger.info('CLAUDE.md already exists, skipped');\n }\n\n // Resolve modules (tags -> actual module definitions)\n const modulesByCategory: Record<ModuleCategory, ModuleDefinition[]> = {\n agents: filterModules(registry, 'agents', config.modules.agents.selected),\n skills: filterModules(registry, 'skills', config.modules.skills.selected),\n commands: filterModules(registry, 'commands', config.modules.commands.selected),\n docs: filterModules(registry, 'docs', config.modules.docs.selected),\n };\n\n // Install modules\n const installResults = await installAllModules(modulesByCategory, {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n });\n\n // Update config with actual installed module IDs (not tags)\n config.modules.agents.selected = installResults.agents?.installed ?? [];\n config.modules.skills.selected = installResults.skills?.installed ?? [];\n config.modules.commands.selected = installResults.commands?.installed ?? [];\n config.modules.docs.selected = installResults.docs?.installed ?? [];\n\n // Install extras\n await installExtras(\n {\n schemas: config.extras.schemas,\n scripts: config.extras.scripts,\n hooks: config.extras.hooks.enabled,\n sessions: config.extras.sessions,\n },\n {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n }\n );\n\n // Replace placeholders\n if (!options.noPlaceholders) {\n const claudePath = joinPath(projectPath, '.claude');\n const report = await replacePlaceholders(claudePath, config.project);\n config.customizations.placeholdersReplaced = true;\n\n if (options.verbose) {\n showReplacementReport(report);\n }\n }\n\n // Install hooks\n if (config.extras.hooks.enabled) {\n const hookResult = await installHooks(projectPath, config.extras.hooks);\n if (hookResult.errors.length > 0) {\n logger.warn(`Hook installation warnings: ${hookResult.errors.join(', ')}`);\n }\n }\n\n // Install MCP servers\n if (config.mcp.servers.length > 0) {\n const mcpResult = await installMcpServers(projectPath, config.mcp);\n if (!mcpResult.success) {\n logger.warn(`MCP installation warnings: ${mcpResult.errors.join(', ')}`);\n }\n }\n\n // Install permissions\n const permissions = config.customizations.permissions;\n if (permissions) {\n await installPermissions(projectPath, permissions, 'project');\n }\n\n // Set co-author setting\n await setCoAuthorSetting(projectPath, config.preferences.includeCoAuthor, 'project');\n\n // Install code style configurations\n if (config.extras.codeStyle?.enabled) {\n const codeStyleResult = await installCodeStyle(projectPath, config.extras.codeStyle, {\n overwrite: options.force,\n });\n if (codeStyleResult.errors.length > 0) {\n logger.warn(`Code style installation warnings: ${codeStyleResult.errors.join(', ')}`);\n }\n\n // Install VSCode settings for code style tools\n const vscodeResult = await installVSCodeConfig(projectPath, config.extras.codeStyle, {\n overwrite: options.force,\n merge: !options.force, // Merge with existing settings if not forcing\n });\n if (vscodeResult.settings.error) {\n logger.warn(`VSCode settings warning: ${vscodeResult.settings.error}`);\n } else if (vscodeResult.settings.created || vscodeResult.settings.updated) {\n logger.info('VSCode settings configured for code style tools');\n }\n\n // Install Husky hooks if commitlint with husky integration is enabled\n const huskyConfig = deriveHuskyConfigFromCodeStyle(config.extras.codeStyle);\n if (huskyConfig) {\n const huskyResult = await installHuskyWithSpinner(projectPath, huskyConfig, {\n overwrite: options.force,\n });\n if (huskyResult.errors.length > 0) {\n logger.warn(`Husky installation warnings: ${huskyResult.errors.join(', ')}`);\n }\n }\n }\n\n // Install CI/CD workflows\n if (cicdConfig?.enabled) {\n const cicdResult = await installCICDWithSpinner(projectPath, cicdConfig, {\n overwrite: options.force,\n });\n if (cicdResult.errors.length > 0) {\n logger.warn(`CI/CD installation warnings: ${cicdResult.errors.join(', ')}`);\n }\n }\n\n // Write config\n await writeConfig(projectPath, config);\n\n logger.newline();\n logger.success('Configuration installed successfully!');\n\n // Show code style instructions if needed\n if (config.extras.codeStyle?.enabled) {\n showCodeStyleInstructions(config.extras.codeStyle);\n }\n\n // Update package.json with dependencies if code style tools are enabled\n if (config.extras.codeStyle?.enabled) {\n await handlePackageJsonUpdate(projectPath, config, options);\n }\n}\n\n/**\n * Handle package.json update with code style dependencies\n */\nasync function handlePackageJsonUpdate(\n projectPath: string,\n config: ClaudeConfig,\n options: InitOptions\n): Promise<void> {\n const codeStyle = config.extras.codeStyle;\n if (!codeStyle?.enabled) return;\n\n // Derive tool selection from code style config\n const toolSelection = deriveToolSelectionFromCodeStyle({\n biome: codeStyle.biome,\n prettier: codeStyle.prettier,\n commitlint: codeStyle.commitlint,\n });\n\n // Check if there are any tools selected\n const hasTools = toolSelection.linter || toolSelection.formatter || toolSelection.commitlint;\n if (!hasTools) return;\n\n // Generate package.json changes\n const packageManager = config.preferences.packageManager || 'pnpm';\n const depConfig: DependencyGenerationConfig = {\n tools: toolSelection as ToolSelection,\n packageManager,\n project: {\n name: config.project.name,\n description: config.project.description,\n author: config.project.author,\n repository:\n config.project.org && config.project.repo\n ? `https://github.com/${config.project.org}/${config.project.repo}`\n : undefined,\n },\n };\n\n const changes = generatePackageJsonChanges(depConfig);\n\n // Check if there are any changes to make\n const hasChanges =\n Object.keys(changes.scripts || {}).length > 0 ||\n Object.keys(changes.dependencies || {}).length > 0 ||\n Object.keys(changes.devDependencies || {}).length > 0;\n\n if (!hasChanges) return;\n\n // Show what would be added\n logger.newline();\n logger.section('Package.json Updates', '📦');\n\n // Check if package.json exists\n const existingPackageJson = await readPackageJson(projectPath);\n const packageJsonExists = existingPackageJson !== null;\n\n if (!packageJsonExists) {\n logger.info('No package.json found. A new one will be created.');\n }\n\n // Show proposed devDependencies\n if (changes.devDependencies && Object.keys(changes.devDependencies).length > 0) {\n logger.subtitle('Dev Dependencies to add:');\n for (const [name, version] of Object.entries(changes.devDependencies)) {\n logger.item(`${name}@${version}`);\n }\n }\n\n // Show proposed scripts\n if (changes.scripts && Object.keys(changes.scripts).length > 0) {\n logger.newline();\n logger.subtitle('Scripts to add:');\n for (const [name, command] of Object.entries(changes.scripts)) {\n logger.item(`${name}: ${command}`);\n }\n }\n\n // Ask user if they want to update package.json\n if (!options.yes) {\n logger.newline();\n const shouldUpdate = await confirm({\n message: packageJsonExists\n ? 'Would you like to update package.json with these changes?'\n : 'Would you like to create package.json with these settings?',\n default: true,\n });\n\n if (!shouldUpdate) {\n logger.info('Skipped package.json update. You can add these manually later.');\n showManualDependencyInstructions(changes, packageManager, toolSelection as ToolSelection);\n return;\n }\n }\n\n // Apply changes\n if (!options.dryRun) {\n const result = await updatePackageJson(projectPath, changes, {\n scriptsMerge: 'skip-existing',\n dependenciesMerge: 'skip-existing',\n createIfMissing: true,\n });\n\n if (result.success) {\n if (result.created) {\n logger.success('Created package.json');\n } else if (result.modified) {\n logger.success('Updated package.json');\n }\n\n // Show what was added/skipped\n if (result.addedDevDependencies.length > 0) {\n logger.info(`Added ${result.addedDevDependencies.length} dev dependencies`);\n }\n if (result.skippedDevDependencies.length > 0) {\n logger.info(\n `Skipped ${result.skippedDevDependencies.length} existing dependencies: ${result.skippedDevDependencies.join(', ')}`\n );\n }\n if (result.addedScripts.length > 0) {\n logger.info(`Added ${result.addedScripts.length} scripts`);\n }\n if (result.skippedScripts.length > 0) {\n logger.info(\n `Skipped ${result.skippedScripts.length} existing scripts: ${result.skippedScripts.join(', ')}`\n );\n }\n\n // Show install command\n logger.newline();\n logger.subtitle('Next Steps');\n logger.info('Run the following command to install dependencies:');\n logger.raw(` ${getInstallCommand(packageManager)}`);\n\n // Show setup instructions if any\n const setupInstructions = getSetupInstructions(toolSelection as ToolSelection);\n if (setupInstructions.length > 0) {\n logger.newline();\n logger.subtitle('Additional Setup');\n for (const instruction of setupInstructions) {\n logger.raw(` ${instruction}`);\n }\n }\n } else {\n logger.warn(`Failed to update package.json: ${result.error}`);\n showManualDependencyInstructions(changes, packageManager, toolSelection as ToolSelection);\n }\n } else {\n logger.info('Dry run - package.json would be updated with above changes');\n }\n}\n\n/**\n * Show manual instructions for adding dependencies\n */\nfunction showManualDependencyInstructions(\n changes: ReturnType<typeof generatePackageJsonChanges>,\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun',\n toolSelection: ToolSelection\n): void {\n logger.newline();\n logger.subtitle('Manual Installation');\n\n // Show install command for dependencies\n if (changes.devDependencies && Object.keys(changes.devDependencies).length > 0) {\n const pkgNames = Object.keys(changes.devDependencies).join(' ');\n let installCmd: string;\n switch (packageManager) {\n case 'npm':\n installCmd = `npm install -D ${pkgNames}`;\n break;\n case 'yarn':\n installCmd = `yarn add -D ${pkgNames}`;\n break;\n case 'pnpm':\n installCmd = `pnpm add -D ${pkgNames}`;\n break;\n case 'bun':\n installCmd = `bun add -D ${pkgNames}`;\n break;\n default:\n installCmd = `npm install -D ${pkgNames}`;\n }\n logger.info('Install dev dependencies:');\n logger.raw(` ${installCmd}`);\n }\n\n // Show scripts to add\n if (changes.scripts && Object.keys(changes.scripts).length > 0) {\n logger.newline();\n logger.info('Add these scripts to package.json:');\n for (const [name, command] of Object.entries(changes.scripts)) {\n logger.raw(` \"${name}\": \"${command}\"`);\n }\n }\n\n // Show setup instructions\n const setupInstructions = getSetupInstructions(toolSelection);\n if (setupInstructions.length > 0) {\n logger.newline();\n logger.subtitle('Additional Setup');\n for (const instruction of setupInstructions) {\n logger.raw(` ${instruction}`);\n }\n }\n}\n\n/**\n * Show config summary\n */\nfunction showConfigSummary(config: ClaudeConfig): void {\n logger.subtitle('Configuration');\n logger.keyValue('Project', config.project.name);\n logger.keyValue('Preset', 'custom');\n logger.keyValue('Agents', String(config.modules.agents.selected.length));\n logger.keyValue('Skills', String(config.modules.skills.selected.length));\n logger.keyValue('Commands', String(config.modules.commands.selected.length));\n logger.keyValue('Docs', String(config.modules.docs.selected.length));\n}\n","/**\n * Bundle resolver - resolves bundles to individual modules\n */\n\nimport {\n BUNDLE_CATEGORY_NAMES,\n getAllBundles,\n getBundleById,\n getBundlesGroupedByCategory,\n} from '../../constants/bundles.js';\nimport type {\n BundleDefinition,\n BundleSelectionResult,\n ResolvedBundle,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\n\n/**\n * Resolve a bundle to its constituent modules\n */\nexport function resolveBundle(bundle: BundleDefinition): ResolvedBundle {\n const modules: ResolvedBundle['modules'] = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n for (const moduleRef of bundle.modules) {\n switch (moduleRef.category) {\n case 'agents':\n modules.agents.push(moduleRef.id);\n break;\n case 'skills':\n modules.skills.push(moduleRef.id);\n break;\n case 'commands':\n modules.commands.push(moduleRef.id);\n break;\n case 'docs':\n modules.docs.push(moduleRef.id);\n break;\n }\n }\n\n return {\n bundle,\n modules,\n };\n}\n\n/**\n * Resolve multiple bundles to a combined module selection\n */\nexport function resolveBundles(bundleIds: string[]): ModuleSelectionResult {\n const result: ModuleSelectionResult = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n const seenModules = {\n agents: new Set<string>(),\n skills: new Set<string>(),\n commands: new Set<string>(),\n docs: new Set<string>(),\n };\n\n for (const bundleId of bundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle) continue;\n\n const resolved = resolveBundle(bundle);\n\n // Add modules without duplicates\n for (const id of resolved.modules.agents) {\n if (!seenModules.agents.has(id)) {\n seenModules.agents.add(id);\n result.agents.push(id);\n }\n }\n for (const id of resolved.modules.skills) {\n if (!seenModules.skills.has(id)) {\n seenModules.skills.add(id);\n result.skills.push(id);\n }\n }\n for (const id of resolved.modules.commands) {\n if (!seenModules.commands.has(id)) {\n seenModules.commands.add(id);\n result.commands.push(id);\n }\n }\n for (const id of resolved.modules.docs) {\n if (!seenModules.docs.has(id)) {\n seenModules.docs.add(id);\n result.docs.push(id);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Merge bundle selection with additional individual modules\n */\nexport function mergeBundleSelection(bundleResult: BundleSelectionResult): ModuleSelectionResult {\n // Start with resolved bundles\n const result = resolveBundles(bundleResult.selectedBundles);\n\n // Track what we have\n const seenModules = {\n agents: new Set(result.agents),\n skills: new Set(result.skills),\n commands: new Set(result.commands),\n docs: new Set(result.docs),\n };\n\n // Add additional modules without duplicates\n for (const id of bundleResult.additionalModules.agents) {\n if (!seenModules.agents.has(id)) {\n result.agents.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.skills) {\n if (!seenModules.skills.has(id)) {\n result.skills.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.commands) {\n if (!seenModules.commands.has(id)) {\n result.commands.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.docs) {\n if (!seenModules.docs.has(id)) {\n result.docs.push(id);\n }\n }\n\n return result;\n}\n\n/**\n * Find bundles that contain a specific module\n */\nexport function findBundlesContainingModule(\n moduleId: string,\n category: 'agents' | 'skills' | 'commands' | 'docs'\n): BundleDefinition[] {\n return getAllBundles().filter((bundle) =>\n bundle.modules.some((m) => m.id === moduleId && m.category === category)\n );\n}\n\n/**\n * Get suggested bundles based on selected modules\n */\nexport function getSuggestedBundles(selectedModules: ModuleSelectionResult): BundleDefinition[] {\n const allBundles = getAllBundles();\n const suggestions: BundleDefinition[] = [];\n\n for (const bundle of allBundles) {\n const resolved = resolveBundle(bundle);\n\n // Check overlap with selected modules\n let matchCount = 0;\n let totalInBundle = 0;\n\n for (const agentId of resolved.modules.agents) {\n totalInBundle++;\n if (selectedModules.agents.includes(agentId)) matchCount++;\n }\n for (const skillId of resolved.modules.skills) {\n totalInBundle++;\n if (selectedModules.skills.includes(skillId)) matchCount++;\n }\n for (const commandId of resolved.modules.commands) {\n totalInBundle++;\n if (selectedModules.commands.includes(commandId)) matchCount++;\n }\n for (const docId of resolved.modules.docs) {\n totalInBundle++;\n if (selectedModules.docs.includes(docId)) matchCount++;\n }\n\n // Suggest if at least 30% overlap but not 100%\n const overlapRatio = totalInBundle > 0 ? matchCount / totalInBundle : 0;\n if (overlapRatio >= 0.3 && overlapRatio < 1.0) {\n suggestions.push(bundle);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Format bundle for display (short version for list names)\n */\nexport function formatBundleForDisplay(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const parts: string[] = [];\n\n if (resolved.modules.agents.length > 0) {\n parts.push(`${resolved.modules.agents.length} agents`);\n }\n if (resolved.modules.skills.length > 0) {\n parts.push(`${resolved.modules.skills.length} skills`);\n }\n if (resolved.modules.commands.length > 0) {\n parts.push(`${resolved.modules.commands.length} commands`);\n }\n if (resolved.modules.docs.length > 0) {\n parts.push(`${resolved.modules.docs.length} docs`);\n }\n\n return `${bundle.name} (${parts.join(', ')})`;\n}\n\n/**\n * Format bundle description with full details for selection prompts\n * Shows detailed multiline info that appears when hovering over a choice\n */\nexport function formatBundleDetailedDescription(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const lines: string[] = [];\n\n // Main description\n lines.push(bundle.description);\n lines.push('');\n\n // Responsibilities (if available)\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push('📋 Responsibilities:');\n for (const resp of bundle.responsibilities.slice(0, 3)) {\n lines.push(` • ${resp}`);\n }\n if (bundle.responsibilities.length > 3) {\n lines.push(` • ...and ${bundle.responsibilities.length - 3} more`);\n }\n lines.push('');\n }\n\n // Use cases (if available and no responsibilities)\n if (bundle.useCases && bundle.useCases.length > 0 && !bundle.responsibilities?.length) {\n lines.push('🎯 Use cases:');\n for (const uc of bundle.useCases.slice(0, 2)) {\n lines.push(` • ${uc}`);\n }\n lines.push('');\n }\n\n // Modules breakdown\n lines.push('📦 Includes:');\n if (resolved.modules.agents.length > 0) {\n lines.push(\n ` 🤖 Agents (${resolved.modules.agents.length}): ${resolved.modules.agents.join(', ')}`\n );\n }\n if (resolved.modules.skills.length > 0) {\n lines.push(\n ` ⚡ Skills (${resolved.modules.skills.length}): ${resolved.modules.skills.join(', ')}`\n );\n }\n if (resolved.modules.commands.length > 0) {\n const cmds = resolved.modules.commands.map((c) => `/${c}`).join(', ');\n lines.push(` 💻 Commands (${resolved.modules.commands.length}): ${cmds}`);\n }\n if (resolved.modules.docs.length > 0) {\n const docsPreview = resolved.modules.docs.slice(0, 4);\n const more =\n resolved.modules.docs.length > 4 ? `, +${resolved.modules.docs.length - 4} more` : '';\n lines.push(` 📚 Docs (${resolved.modules.docs.length}): ${docsPreview.join(', ')}${more}`);\n }\n\n // Tech stack\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push('');\n lines.push(`🔧 Tech: ${bundle.techStack.join(', ')}`);\n }\n\n // Complexity indicator\n if (bundle.complexity) {\n const complexityLabel =\n bundle.complexity === 'minimal'\n ? '⚡ Minimal - Quick setup'\n : bundle.complexity === 'comprehensive'\n ? '🔥 Comprehensive - Full featured'\n : '⭐ Standard';\n lines.push(`📊 ${complexityLabel}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format bundle with rich multi-line description for display\n * Use this when you can show multiple lines\n */\nexport function formatBundleRichDescription(bundle: BundleDefinition): string[] {\n const resolved = resolveBundle(bundle);\n const lines: string[] = [];\n\n // Main description\n lines.push(bundle.description);\n\n // Responsibilities preview\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push('');\n lines.push('Responsibilities:');\n for (const resp of bundle.responsibilities.slice(0, 3)) {\n lines.push(` • ${resp}`);\n }\n if (bundle.responsibilities.length > 3) {\n lines.push(` • ...and ${bundle.responsibilities.length - 3} more`);\n }\n }\n\n // Use cases preview\n if (bundle.useCases && bundle.useCases.length > 0) {\n lines.push('');\n lines.push('Use cases:');\n for (const uc of bundle.useCases.slice(0, 2)) {\n lines.push(` • ${uc}`);\n }\n }\n\n // Modules breakdown\n lines.push('');\n lines.push('Includes:');\n if (resolved.modules.agents.length > 0) {\n lines.push(` 🤖 Agents: ${resolved.modules.agents.join(', ')}`);\n }\n if (resolved.modules.skills.length > 0) {\n lines.push(` ⚡ Skills: ${resolved.modules.skills.join(', ')}`);\n }\n if (resolved.modules.commands.length > 0) {\n lines.push(` 💻 Commands: /${resolved.modules.commands.join(', /')}`);\n }\n if (resolved.modules.docs.length > 0) {\n const docsPreview = resolved.modules.docs.slice(0, 5);\n const more =\n resolved.modules.docs.length > 5 ? `, +${resolved.modules.docs.length - 5} more` : '';\n lines.push(` 📚 Docs: ${docsPreview.join(', ')}${more}`);\n }\n\n // Tech stack\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push('');\n lines.push(`🔧 Tech: ${bundle.techStack.join(', ')}`);\n }\n\n return lines;\n}\n\n/**\n * Get bundle category display name\n */\nexport function getBundleCategoryName(category: string): string {\n return BUNDLE_CATEGORY_NAMES[category] ?? category;\n}\n\n/**\n * Export convenience access to constants\n */\nexport { getAllBundles, getBundleById, getBundlesGroupedByCategory, BUNDLE_CATEGORY_NAMES };\n","/**\n * Predefined bundles for grouping related modules\n */\n\nimport type { BundleDefinition } from '../types/bundles.js';\n\n/**\n * All available bundles\n */\nexport const BUNDLES: BundleDefinition[] = [\n // ===================\n // STACK BUNDLES\n // ===================\n {\n id: 'react-tanstack-stack',\n name: 'React + TanStack Stack',\n description: 'React with TanStack Router/Start for admin dashboards and SPAs',\n category: 'stack',\n longDescription:\n 'Complete stack for building React applications with TanStack Router and Start. Includes React component development, TanStack-specific patterns, and related testing/quality tools.',\n techStack: ['React', 'TanStack Start', 'TanStack Router', 'TanStack Query', 'TypeScript'],\n tags: ['react', 'tanstack', 'admin', 'spa'],\n complexity: 'comprehensive',\n responsibilities: [\n 'React component architecture and best practices',\n 'TanStack Router file-based routing patterns',\n 'Server state management with TanStack Query',\n 'Form handling with React Hook Form + Zod',\n 'UI components with Shadcn/Radix primitives',\n ],\n scope: 'Full frontend stack for React SPAs and admin dashboards',\n useCases: [\n 'Admin dashboards and internal tools',\n 'Complex single-page applications',\n 'Data-heavy applications with tables/forms',\n 'Projects using TanStack ecosystem',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'react-senior-dev',\n role: 'React Architecture',\n responsibilities: ['Component design', 'State management', 'Performance optimization'],\n },\n {\n id: 'tanstack-start-engineer',\n role: 'TanStack Specialist',\n responsibilities: ['Router setup', 'Query patterns', 'SSR configuration'],\n },\n {\n id: 'ux-ui-designer',\n role: 'UI/UX Design',\n responsibilities: ['Component styling', 'Accessibility', 'Design system'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'React Testing Library patterns' },\n { id: 'shadcn-specialist', purpose: 'Shadcn UI component usage' },\n { id: 'accessibility-audit', purpose: 'WCAG compliance' },\n { id: 'tanstack-query-patterns', purpose: 'Query/mutation patterns' },\n { id: 'react-hook-form-patterns', purpose: 'Form validation patterns' },\n { id: 'zustand-patterns', purpose: 'Client state management' },\n ],\n commands: [],\n docs: [{ id: 'design-standards', topic: 'UI/UX design standards' }],\n },\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'tanstack-start-engineer', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'zustand-patterns', category: 'skills', optional: true },\n { id: 'design-standards', category: 'docs', requiredBy: ['ux-ui-designer'], optional: true },\n ],\n },\n {\n id: 'astro-react-stack',\n name: 'Astro + React Stack',\n description: 'Astro with React islands for content-focused websites',\n category: 'stack',\n longDescription:\n 'Stack for building fast, content-focused websites with Astro and React components. Perfect for marketing sites, blogs, and documentation sites.',\n techStack: ['Astro', 'React', 'Tailwind CSS', 'MDX', 'TypeScript'],\n tags: ['astro', 'react', 'ssg', 'content'],\n complexity: 'standard',\n responsibilities: [\n 'Static site generation with Astro',\n 'Interactive React islands for dynamic content',\n 'SEO optimization and meta tags',\n 'Performance-first architecture',\n 'Content management with MDX',\n ],\n scope: 'Content-focused websites with selective interactivity',\n useCases: [\n 'Marketing and landing pages',\n 'Documentation sites',\n 'Blogs and content platforms',\n 'Portfolio websites',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'astro-engineer',\n role: 'Astro Specialist',\n responsibilities: ['Routing', 'Islands architecture', 'Build optimization'],\n },\n {\n id: 'react-senior-dev',\n role: 'React Components',\n responsibilities: ['Interactive components', 'Client hydration'],\n },\n {\n id: 'seo-ai-specialist',\n role: 'SEO Optimization',\n responsibilities: ['Meta tags', 'Structured data', 'Performance'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'Component testing' },\n { id: 'vercel-specialist', purpose: 'Deployment optimization' },\n { id: 'performance-audit', purpose: 'Core Web Vitals' },\n ],\n commands: [],\n docs: [],\n },\n modules: [\n { id: 'astro-engineer', category: 'agents' },\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'seo-ai-specialist', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'vercel-specialist', category: 'skills' },\n { id: 'performance-audit', category: 'skills' },\n ],\n },\n {\n id: 'nextjs-prisma-stack',\n name: 'Next.js + Prisma Stack',\n description: 'Full-stack Next.js with Prisma for modern web apps',\n category: 'stack',\n longDescription:\n 'Complete full-stack setup with Next.js App Router and Prisma ORM. Includes React components, Server Actions, and database patterns.',\n techStack: ['Next.js', 'React', 'Prisma', 'Tailwind CSS', 'TypeScript'],\n tags: ['nextjs', 'prisma', 'fullstack', 'react'],\n complexity: 'comprehensive',\n alternativeTo: ['react-tanstack-stack', 'astro-react-stack'],\n responsibilities: [\n 'Full-stack React with Next.js App Router',\n 'Database modeling with Prisma ORM',\n 'Server Actions and API routes',\n 'Authentication with NextAuth.js',\n 'Deployment on Vercel',\n ],\n scope: 'Complete full-stack web application development',\n useCases: [\n 'SaaS applications',\n 'E-commerce platforms',\n 'Full-stack web apps with auth',\n 'Projects needing SSR/SSG flexibility',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'nextjs-engineer',\n role: 'Next.js Specialist',\n responsibilities: ['App Router', 'Server Actions', 'Caching strategies'],\n },\n {\n id: 'react-senior-dev',\n role: 'React Components',\n responsibilities: ['Client components', 'State management'],\n },\n {\n id: 'prisma-engineer',\n role: 'Database',\n responsibilities: ['Schema design', 'Migrations', 'Query optimization'],\n },\n {\n id: 'ux-ui-designer',\n role: 'UI/UX',\n responsibilities: ['Design system', 'Responsive design'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'Next.js testing patterns' },\n { id: 'shadcn-specialist', purpose: 'UI components' },\n { id: 'vercel-specialist', purpose: 'Deployment' },\n { id: 'tanstack-query-patterns', purpose: 'Client data fetching' },\n { id: 'react-hook-form-patterns', purpose: 'Form handling' },\n { id: 'nextauth-patterns', purpose: 'Authentication' },\n ],\n commands: [],\n docs: [],\n },\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'vercel-specialist', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'nextauth-patterns', category: 'skills', optional: true },\n ],\n },\n {\n id: 'express-prisma-stack',\n name: 'Express + Prisma API Stack',\n description: 'Express backend with Prisma ORM',\n category: 'stack',\n longDescription:\n 'Backend stack using Express for APIs and Prisma for database access. Classic, well-documented stack for traditional REST APIs.',\n techStack: ['Express.js', 'Prisma', 'PostgreSQL', 'Zod', 'TypeScript'],\n tags: ['express', 'prisma', 'api', 'backend'],\n complexity: 'standard',\n alternativeTo: ['hono-drizzle-stack'],\n responsibilities: [\n 'RESTful API design with Express',\n 'Database access with Prisma ORM',\n 'Request validation with Zod',\n 'Error handling and logging',\n 'Authentication middleware',\n ],\n scope: 'Backend API development with traditional Express patterns',\n useCases: [\n 'REST APIs for mobile apps',\n 'Backend services for SPAs',\n 'Microservices',\n 'Projects needing Express ecosystem',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'express-engineer',\n role: 'Express Specialist',\n responsibilities: ['Route design', 'Middleware', 'Error handling'],\n },\n {\n id: 'prisma-engineer',\n role: 'Database',\n responsibilities: ['Schema', 'Migrations', 'Queries'],\n },\n {\n id: 'node-typescript-engineer',\n role: 'Node.js/TypeScript',\n responsibilities: ['Type safety', 'Build config', 'Shared packages'],\n },\n ],\n skills: [\n { id: 'api-app-testing', purpose: 'API testing with supertest' },\n { id: 'error-handling-patterns', purpose: 'Error middleware' },\n { id: 'security-testing', purpose: 'Security best practices' },\n ],\n commands: [],\n docs: [{ id: 'architecture-patterns', topic: 'API architecture patterns' }],\n },\n modules: [\n { id: 'express-engineer', category: 'agents' },\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'node-typescript-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'architecture-patterns', category: 'docs', optional: true },\n ],\n },\n {\n id: 'hono-drizzle-stack',\n name: 'Hono + Drizzle API Stack',\n description: 'Hono API framework with Drizzle ORM for type-safe backends',\n category: 'stack',\n longDescription:\n 'Complete backend stack using Hono for APIs and Drizzle for database access. Includes shared TypeScript packages, API testing, and quality tools.',\n techStack: ['Hono', 'Drizzle ORM', 'PostgreSQL', 'Zod', 'TypeScript'],\n tags: ['hono', 'drizzle', 'api', 'backend'],\n complexity: 'standard',\n alternativeTo: ['express-prisma-stack'],\n responsibilities: [\n 'High-performance APIs with Hono',\n 'Type-safe database queries with Drizzle',\n 'Schema validation with Zod',\n 'Edge-ready deployment',\n 'Monorepo-friendly architecture',\n ],\n scope: 'Modern, type-safe backend API development',\n useCases: [\n 'Edge/serverless APIs',\n 'Type-safe monorepo backends',\n 'High-performance REST APIs',\n 'Projects prioritizing type safety',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'hono-engineer',\n role: 'Hono Specialist',\n responsibilities: ['Route handlers', 'Middleware', 'OpenAPI integration'],\n },\n {\n id: 'db-drizzle-engineer',\n role: 'Drizzle Database',\n responsibilities: ['Schema design', 'Migrations', 'Type-safe queries'],\n },\n {\n id: 'node-typescript-engineer',\n role: 'TypeScript/Node',\n responsibilities: ['Type inference', 'Build setup', 'Shared types'],\n },\n ],\n skills: [\n { id: 'api-app-testing', purpose: 'Hono testing patterns' },\n { id: 'error-handling-patterns', purpose: 'Error middleware' },\n { id: 'security-testing', purpose: 'Security validation' },\n ],\n commands: [],\n docs: [{ id: 'architecture-patterns', topic: 'API architecture patterns' }],\n },\n modules: [\n { id: 'hono-engineer', category: 'agents' },\n { id: 'db-drizzle-engineer', category: 'agents' },\n { id: 'node-typescript-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'architecture-patterns', category: 'docs', optional: true },\n ],\n },\n\n // ===================\n // TESTING BUNDLES\n // ===================\n {\n id: 'testing-complete',\n name: 'Complete Testing Suite',\n description: 'All testing skills and QA tools for comprehensive test coverage',\n category: 'testing',\n longDescription:\n 'Everything you need for a robust testing strategy including TDD methodology, web testing, API testing, performance testing, and QA validation.',\n techStack: ['Vitest', 'Playwright', 'Testing Library', 'MSW'],\n tags: ['testing', 'tdd', 'qa', 'e2e'],\n complexity: 'comprehensive',\n responsibilities: [\n 'TDD workflow enforcement (Red-Green-Refactor)',\n 'Unit, integration, and E2E testing patterns',\n 'API testing with mocking and fixtures',\n 'Performance testing and benchmarking',\n 'QA validation and acceptance criteria',\n ],\n scope: 'Complete testing strategy from unit tests to E2E',\n useCases: [\n 'Projects requiring 90%+ test coverage',\n 'TDD-first development workflow',\n 'API-heavy applications needing thorough testing',\n 'Projects with QA validation requirements',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'qa-engineer',\n role: 'Quality Assurance',\n responsibilities: [\n 'Test planning and strategy',\n 'Acceptance criteria validation',\n 'Bug triage and reporting',\n ],\n },\n ],\n skills: [\n { id: 'tdd-methodology', purpose: 'TDD workflow and best practices' },\n { id: 'web-app-testing', purpose: 'Frontend testing patterns' },\n { id: 'api-app-testing', purpose: 'API and backend testing' },\n { id: 'performance-testing', purpose: 'Performance benchmarks' },\n { id: 'qa-criteria-validator', purpose: 'Acceptance validation' },\n ],\n commands: [{ id: 'run-tests', usage: '/run-tests --coverage' }],\n docs: [{ id: 'testing-standards', topic: 'Testing conventions and standards' }],\n },\n modules: [\n { id: 'qa-engineer', category: 'agents' },\n { id: 'tdd-methodology', category: 'skills' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'performance-testing', category: 'skills' },\n { id: 'qa-criteria-validator', category: 'skills' },\n { id: 'run-tests', category: 'commands' },\n // Doc required by QA agent and TDD skill\n { id: 'testing-standards', category: 'docs', requiredBy: ['qa-engineer', 'tdd-methodology'] },\n ],\n },\n {\n id: 'testing-minimal',\n name: 'Minimal Testing',\n description: 'Essential testing tools for TDD workflow',\n category: 'testing',\n longDescription: 'Core testing tools for TDD development without the full QA suite.',\n techStack: ['Vitest', 'Testing Library'],\n tags: ['testing', 'tdd', 'minimal'],\n complexity: 'minimal',\n responsibilities: [\n 'Basic TDD workflow support',\n 'Unit and integration testing',\n 'Test execution and reporting',\n ],\n scope: 'Essential testing for small to medium projects',\n useCases: [\n 'Small projects with basic testing needs',\n 'Quick prototypes needing some test coverage',\n 'Projects where full QA suite is overkill',\n ],\n moduleDetails: {\n agents: [],\n skills: [\n { id: 'tdd-methodology', purpose: 'TDD workflow basics' },\n { id: 'api-app-testing', purpose: 'API testing patterns' },\n ],\n commands: [{ id: 'run-tests', usage: '/run-tests' }],\n docs: [],\n },\n modules: [\n { id: 'tdd-methodology', category: 'skills' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'run-tests', category: 'commands' },\n ],\n },\n\n // ===================\n // QUALITY BUNDLES\n // ===================\n {\n id: 'quality-complete',\n name: 'Complete Quality Suite',\n description: 'Full quality assurance with security, performance, and accessibility audits',\n category: 'quality',\n longDescription:\n 'Comprehensive quality assurance bundle including all audit types, code review, and debugging tools.',\n tags: ['quality', 'audit', 'security', 'performance'],\n complexity: 'comprehensive',\n responsibilities: [\n 'Security vulnerability detection and prevention',\n 'Performance profiling and optimization guidance',\n 'Accessibility compliance (WCAG) validation',\n 'Code quality review and best practices',\n 'Bug investigation and debugging assistance',\n ],\n scope: 'Complete quality assurance across security, performance, and accessibility',\n useCases: [\n 'Enterprise applications with strict security requirements',\n 'Public-facing apps needing accessibility compliance',\n 'Performance-critical applications',\n 'Projects requiring comprehensive code reviews',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'qa-engineer',\n role: 'Quality Assurance Lead',\n responsibilities: [\n 'Test strategy and coverage',\n 'Acceptance criteria validation',\n 'Quality metrics tracking',\n ],\n },\n {\n id: 'debugger',\n role: 'Debug Specialist',\n responsibilities: ['Root cause analysis', 'Bug reproduction', 'Fix verification'],\n },\n ],\n skills: [\n { id: 'security-audit', purpose: 'OWASP vulnerability scanning' },\n { id: 'security-testing', purpose: 'Security test patterns' },\n { id: 'performance-audit', purpose: 'Performance bottleneck detection' },\n { id: 'performance-testing', purpose: 'Load and stress testing' },\n { id: 'accessibility-audit', purpose: 'WCAG compliance checking' },\n { id: 'qa-criteria-validator', purpose: 'Acceptance criteria validation' },\n ],\n commands: [\n { id: 'quality-check', usage: '/quality-check' },\n { id: 'code-check', usage: '/code-check src/' },\n { id: 'review-code', usage: '/review-code --thorough' },\n { id: 'review-security', usage: '/review-security' },\n { id: 'review-performance', usage: '/review-performance' },\n ],\n docs: [\n { id: 'code-standards', topic: 'Code quality standards' },\n { id: 'atomic-commits', topic: 'Atomic commit practices' },\n ],\n },\n modules: [\n { id: 'qa-engineer', category: 'agents' },\n { id: 'debugger', category: 'agents' },\n { id: 'security-audit', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'performance-audit', category: 'skills' },\n { id: 'performance-testing', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n { id: 'qa-criteria-validator', category: 'skills' },\n { id: 'quality-check', category: 'commands' },\n { id: 'code-check', category: 'commands' },\n { id: 'review-code', category: 'commands' },\n { id: 'review-security', category: 'commands' },\n { id: 'review-performance', category: 'commands' },\n // Docs required by agents\n { id: 'code-standards', category: 'docs', requiredBy: ['qa-engineer'] },\n { id: 'atomic-commits', category: 'docs', optional: true },\n ],\n },\n {\n id: 'quality-minimal',\n name: 'Minimal Quality',\n description: 'Essential quality checks for everyday development',\n category: 'quality',\n longDescription: 'Core quality tools without the full audit suite.',\n tags: ['quality', 'minimal'],\n complexity: 'minimal',\n responsibilities: [\n 'Basic code quality checks',\n 'Quick code reviews',\n 'Lint and format validation',\n ],\n scope: 'Essential quality checks for day-to-day development',\n useCases: [\n 'Small projects with basic quality needs',\n 'Quick PRs needing fast review',\n 'Projects where full audits are overkill',\n ],\n moduleDetails: {\n agents: [],\n skills: [],\n commands: [\n { id: 'quality-check', usage: '/quality-check' },\n { id: 'code-check', usage: '/code-check' },\n { id: 'review-code', usage: '/review-code' },\n ],\n docs: [],\n },\n modules: [\n { id: 'quality-check', category: 'commands' },\n { id: 'code-check', category: 'commands' },\n { id: 'review-code', category: 'commands' },\n ],\n },\n\n // ===================\n // DATABASE BUNDLES\n // ===================\n {\n id: 'drizzle-database',\n name: 'Drizzle Database',\n description: 'Drizzle ORM with type-safe database patterns',\n category: 'database',\n longDescription:\n 'Database development with Drizzle ORM including schema design, migrations, and data validation.',\n techStack: ['Drizzle ORM', 'PostgreSQL', 'SQLite', 'Zod'],\n tags: ['database', 'drizzle', 'orm'],\n alternativeTo: ['prisma-database', 'mongoose-database'],\n modules: [\n { id: 'db-drizzle-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n {\n id: 'prisma-database',\n name: 'Prisma Database',\n description: 'Prisma ORM with type-safe database patterns',\n category: 'database',\n longDescription:\n 'Database development with Prisma ORM including schema design, migrations, and data validation.',\n techStack: ['Prisma', 'PostgreSQL', 'MySQL', 'SQLite', 'MongoDB'],\n tags: ['database', 'prisma', 'orm'],\n alternativeTo: ['drizzle-database', 'mongoose-database'],\n modules: [\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n {\n id: 'mongoose-database',\n name: 'MongoDB + Mongoose',\n description: 'MongoDB with Mongoose ODM',\n category: 'database',\n longDescription:\n 'MongoDB development with Mongoose ODM including document schemas and aggregation pipelines.',\n techStack: ['Mongoose', 'MongoDB', 'TypeScript'],\n tags: ['database', 'mongodb', 'mongoose', 'nosql'],\n alternativeTo: ['drizzle-database', 'prisma-database'],\n modules: [\n { id: 'mongoose-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n\n // ===================\n // API BUNDLES\n // ===================\n {\n id: 'hono-api',\n name: 'Hono API',\n description: 'Hono framework for high-performance APIs',\n category: 'api',\n longDescription:\n 'API development with Hono framework including middleware, validation, and error handling.',\n techStack: ['Hono', 'Zod', 'TypeScript'],\n tags: ['api', 'hono', 'backend'],\n alternativeTo: ['express-api', 'fastify-api', 'nestjs-api'],\n modules: [\n { id: 'hono-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'express-api',\n name: 'Express API',\n description: 'Express.js framework for REST APIs',\n category: 'api',\n longDescription:\n 'API development with Express.js including middleware chains, validation, and error handling.',\n techStack: ['Express.js', 'Zod', 'TypeScript', 'Passport.js'],\n tags: ['api', 'express', 'backend'],\n alternativeTo: ['hono-api', 'fastify-api', 'nestjs-api'],\n modules: [\n { id: 'express-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'fastify-api',\n name: 'Fastify API',\n description: 'Fastify framework for high-performance APIs',\n category: 'api',\n longDescription:\n 'High-performance API development with Fastify plugin architecture and schema validation.',\n techStack: ['Fastify', 'TypeBox', 'TypeScript', 'Pino'],\n tags: ['api', 'fastify', 'backend', 'performance'],\n alternativeTo: ['hono-api', 'express-api', 'nestjs-api'],\n modules: [\n { id: 'fastify-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'nestjs-api',\n name: 'NestJS API',\n description: 'NestJS framework for enterprise APIs',\n category: 'api',\n longDescription:\n 'Enterprise API development with NestJS dependency injection and modular architecture.',\n techStack: ['NestJS', 'TypeScript', 'class-validator', 'TypeORM'],\n tags: ['api', 'nestjs', 'backend', 'enterprise'],\n alternativeTo: ['hono-api', 'express-api', 'fastify-api'],\n modules: [\n { id: 'nestjs-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n\n // ===================\n // FRONTEND BUNDLES\n // ===================\n {\n id: 'react-ui',\n name: 'React UI Development',\n description: 'React component development with Shadcn UI',\n category: 'frontend',\n longDescription:\n 'React component development bundle with Shadcn UI, accessibility, and design system tools.',\n techStack: ['React', 'Shadcn UI', 'Tailwind CSS', 'Radix UI'],\n tags: ['react', 'ui', 'components'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'brand-guidelines', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n ],\n },\n {\n id: 'react-forms',\n name: 'React Forms',\n description: 'React Hook Form with Zod validation',\n category: 'frontend',\n longDescription:\n 'Form handling patterns with React Hook Form and Zod validation. Includes Shadcn form integration.',\n techStack: ['React Hook Form', 'Zod', 'React', 'TypeScript'],\n tags: ['react', 'forms', 'validation'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n ],\n },\n {\n id: 'react-state-zustand',\n name: 'React State (Zustand)',\n description: 'Zustand for lightweight state management',\n category: 'frontend',\n longDescription:\n 'State management with Zustand including slices, persist middleware, and TanStack Query integration.',\n techStack: ['Zustand', 'TanStack Query', 'React', 'TypeScript'],\n tags: ['react', 'state', 'zustand'],\n alternativeTo: ['react-state-redux'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'zustand-patterns', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n ],\n },\n {\n id: 'react-state-redux',\n name: 'React State (Redux)',\n description: 'Redux Toolkit for complex state management',\n category: 'frontend',\n longDescription:\n 'State management with Redux Toolkit including RTK Query, async thunks, and enterprise patterns.',\n techStack: ['Redux Toolkit', 'RTK Query', 'React', 'TypeScript'],\n tags: ['react', 'state', 'redux'],\n alternativeTo: ['react-state-zustand'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'redux-toolkit-patterns', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills', optional: true },\n ],\n },\n {\n id: 'nextjs-auth',\n name: 'Next.js Authentication',\n description: 'NextAuth.js authentication for Next.js apps',\n category: 'frontend',\n longDescription:\n 'Authentication patterns with NextAuth.js including OAuth providers, credentials, sessions, and RBAC.',\n techStack: ['NextAuth.js', 'Auth.js', 'Next.js', 'Prisma'],\n tags: ['nextjs', 'auth', 'oauth'],\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'nextauth-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n ],\n },\n {\n id: 'nextjs-i18n',\n name: 'Next.js Internationalization',\n description: 'Multi-language support for Next.js apps',\n category: 'frontend',\n longDescription:\n 'Internationalization with next-intl including locale routing, translations, and formatting.',\n techStack: ['next-intl', 'Next.js', 'React', 'TypeScript'],\n tags: ['nextjs', 'i18n', 'internationalization'],\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'i18n-specialist', category: 'agents', optional: true },\n { id: 'i18n-patterns', category: 'skills' },\n ],\n },\n\n // ===================\n // WORKFLOW BUNDLES\n // ===================\n {\n id: 'planning-complete',\n name: 'Complete Planning Workflow',\n description: 'Full planning workflow with PDR, tech analysis, and task tracking',\n category: 'workflow',\n longDescription:\n 'Complete planning workflow bundle including product definition, technical analysis, task breakdown, and sync to issue trackers.',\n tags: ['planning', 'workflow', 'pdr'],\n complexity: 'comprehensive',\n responsibilities: [\n 'Feature planning from requirements to implementation tasks',\n 'Technical analysis and architecture decision documentation',\n 'Task breakdown with atomic task methodology',\n 'Integration with issue trackers (GitHub, Linear)',\n ],\n scope: 'End-to-end planning workflow for features, refactors, and epics',\n useCases: [\n 'Starting a new feature from scratch',\n 'Planning a major refactor or migration',\n 'Breaking down epics into manageable tasks',\n 'Documenting technical decisions (ADRs)',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'product-functional',\n role: 'Product Requirements',\n responsibilities: [\n 'Create PDR documents',\n 'Define acceptance criteria',\n 'User story mapping',\n ],\n },\n {\n id: 'product-technical',\n role: 'Technical Analysis',\n responsibilities: ['Architecture decisions', 'Tech stack evaluation', 'Risk assessment'],\n },\n {\n id: 'tech-lead',\n role: 'Coordination & Task Breakdown',\n responsibilities: ['Task atomization', 'Workflow selection', 'Team coordination'],\n },\n ],\n skills: [],\n commands: [\n { id: 'start-feature-plan', usage: '/start-feature-plan \"User authentication\"' },\n { id: 'start-refactor-plan', usage: '/start-refactor-plan \"Database optimization\"' },\n { id: 'sync-planning', usage: '/sync-planning' },\n ],\n docs: [\n { id: 'decision-tree', topic: 'Workflow selection guide' },\n { id: 'phase-1-planning', topic: 'Planning phase methodology' },\n { id: 'phase-2-implementation', topic: 'Implementation phase guide' },\n { id: 'phase-3-validation', topic: 'Validation and QA phase' },\n { id: 'phase-4-finalization', topic: 'Closing and documentation' },\n { id: 'pdr-template', topic: 'Product Definition Record template' },\n { id: 'tech-analysis-template', topic: 'Technical analysis template' },\n { id: 'todos-template', topic: 'Task tracking template' },\n ],\n },\n modules: [\n { id: 'product-functional', category: 'agents' },\n { id: 'product-technical', category: 'agents' },\n { id: 'tech-lead', category: 'agents' },\n { id: 'start-feature-plan', category: 'commands' },\n { id: 'start-refactor-plan', category: 'commands' },\n { id: 'sync-planning', category: 'commands' },\n // Required docs - needed for agents to work properly\n { id: 'decision-tree', category: 'docs', requiredBy: ['tech-lead'] },\n {\n id: 'phase-1-planning',\n category: 'docs',\n requiredBy: ['product-functional', 'product-technical'],\n },\n { id: 'phase-2-implementation', category: 'docs', requiredBy: ['tech-lead'] },\n { id: 'phase-3-validation', category: 'docs' },\n { id: 'phase-4-finalization', category: 'docs' },\n { id: 'pdr-template', category: 'docs', requiredBy: ['product-functional'] },\n { id: 'tech-analysis-template', category: 'docs', requiredBy: ['product-technical'] },\n { id: 'todos-template', category: 'docs', requiredBy: ['tech-lead'] },\n ],\n },\n {\n id: 'documentation-complete',\n name: 'Complete Documentation',\n description: 'All documentation standards, templates, and writing tools',\n category: 'workflow',\n longDescription:\n 'Everything for comprehensive documentation including standards, templates, diagrams, and writing guidelines.',\n tags: ['documentation', 'writing', 'standards'],\n complexity: 'standard',\n responsibilities: [\n 'Technical documentation writing',\n 'API documentation generation',\n 'Architecture diagram creation',\n 'Markdown formatting and standards',\n 'Glossary and terminology management',\n ],\n scope: 'Complete documentation workflow for technical projects',\n useCases: [\n 'Creating and maintaining project documentation',\n 'Writing API and SDK documentation',\n 'Creating architecture diagrams',\n 'Standardizing documentation across team',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'tech-writer',\n role: 'Technical Writer',\n responsibilities: ['Documentation structure', 'Content writing', 'Style consistency'],\n },\n ],\n skills: [\n { id: 'documentation-writer', purpose: 'Documentation best practices' },\n { id: 'mermaid-diagram-specialist', purpose: 'Diagram creation' },\n ],\n commands: [\n { id: 'update-docs', usage: '/update-docs' },\n { id: 'markdown-format', usage: '/markdown-format' },\n ],\n docs: [\n { id: 'documentation-standards', topic: 'Documentation conventions' },\n { id: 'workflow-diagrams', topic: 'Diagram templates' },\n { id: 'glossary', topic: 'Project terminology' },\n ],\n },\n modules: [\n { id: 'tech-writer', category: 'agents' },\n { id: 'documentation-writer', category: 'skills' },\n { id: 'mermaid-diagram-specialist', category: 'skills' },\n { id: 'update-docs', category: 'commands' },\n { id: 'markdown-format', category: 'commands' },\n { id: 'documentation-standards', category: 'docs', requiredBy: ['tech-writer'] },\n { id: 'workflow-diagrams', category: 'docs', optional: true },\n { id: 'glossary', category: 'docs', optional: true },\n ],\n },\n {\n id: 'git-workflow',\n name: 'Git Workflow',\n description: 'Git commit conventions and atomic commit practices',\n category: 'workflow',\n longDescription: 'Git workflow tools including conventional commits and atomic commit helpers.',\n tags: ['git', 'commits', 'workflow'],\n complexity: 'minimal',\n responsibilities: [\n 'Conventional commit message formatting',\n 'Atomic commit enforcement',\n 'Commit message generation',\n ],\n scope: 'Git commit workflow and conventions',\n useCases: [\n 'Enforcing commit message standards',\n 'Generating semantic commit messages',\n 'Following atomic commit practices',\n ],\n moduleDetails: {\n agents: [],\n skills: [{ id: 'git-commit-helper', purpose: 'Commit message patterns' }],\n commands: [{ id: 'commit', usage: '/commit' }],\n docs: [{ id: 'atomic-commits', topic: 'Atomic commit guidelines' }],\n },\n modules: [\n { id: 'git-commit-helper', category: 'skills' },\n { id: 'commit', category: 'commands' },\n { id: 'atomic-commits', category: 'docs', optional: true },\n ],\n },\n {\n id: 'cicd-github-actions',\n name: 'GitHub Actions CI/CD',\n description: 'GitHub Actions workflows for CI/CD automation',\n category: 'workflow',\n longDescription:\n 'Complete CI/CD setup with GitHub Actions including testing, quality checks, security scanning, and deployment workflows.',\n techStack: ['GitHub Actions', 'Node.js', 'PNPM'],\n tags: ['cicd', 'github', 'automation', 'devops'],\n complexity: 'standard',\n responsibilities: [\n 'Continuous Integration workflows',\n 'Automated testing on PRs',\n 'Code quality checks',\n 'Security scanning',\n 'Deployment automation',\n ],\n scope: 'CI/CD pipeline automation with GitHub Actions',\n useCases: [\n 'Automating test runs on PRs',\n 'Automated deployments to staging/production',\n 'Code quality gates',\n 'Security vulnerability scanning',\n ],\n moduleDetails: {\n agents: [],\n skills: [{ id: 'github-actions-specialist', purpose: 'GitHub Actions workflow patterns' }],\n commands: [],\n docs: [{ id: 'cicd-workflows', topic: 'CI/CD workflow documentation' }],\n },\n modules: [\n { id: 'github-actions-specialist', category: 'skills', optional: true },\n { id: 'cicd-workflows', category: 'docs', optional: true },\n ],\n },\n];\n\n/**\n * Get all bundles\n */\nexport function getAllBundles(): BundleDefinition[] {\n return BUNDLES;\n}\n\n/**\n * Get bundles by category\n */\nexport function getBundlesByCategory(category: string): BundleDefinition[] {\n return BUNDLES.filter((b) => b.category === category);\n}\n\n/**\n * Get bundle by ID\n */\nexport function getBundleById(id: string): BundleDefinition | undefined {\n return BUNDLES.find((b) => b.id === id);\n}\n\n/**\n * Get bundles grouped by category\n */\nexport function getBundlesGroupedByCategory(): Record<string, BundleDefinition[]> {\n const grouped: Record<string, BundleDefinition[]> = {};\n\n for (const bundle of BUNDLES) {\n if (!grouped[bundle.category]) {\n grouped[bundle.category] = [];\n }\n grouped[bundle.category].push(bundle);\n }\n\n return grouped;\n}\n\n/**\n * Category display names\n */\nexport const BUNDLE_CATEGORY_NAMES: Record<string, string> = {\n stack: 'Tech Stacks',\n testing: 'Testing',\n quality: 'Quality Assurance',\n database: 'Database',\n api: 'API Frameworks',\n frontend: 'Frontend',\n workflow: 'Workflows',\n cicd: 'CI/CD & DevOps',\n};\n","/**\n * CI/CD module - GitHub Actions and related CI/CD utilities\n */\n\nexport {\n getDefaultCICDConfig,\n installCICD,\n installCICDWithSpinner,\n type CICDConfig,\n type CICDInstallResult,\n} from './github-actions-generator.js';\n","/**\n * GitHub Actions workflow generator\n */\n\nimport type { PackageManager } from '../../types/scaffold.js';\nimport { ensureDir, joinPath, pathExists, writeFile } from '../utils/fs.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface CICDConfig {\n /** Enable CI/CD configuration */\n enabled: boolean;\n /** CI provider */\n provider: 'github-actions';\n /** Enable CI workflow (lint, test, build) */\n ci: boolean;\n /** Enable CD workflow (deploy) */\n cd: boolean;\n /** Package manager to use */\n packageManager: PackageManager;\n /** Node.js version */\n nodeVersion: string;\n /** Enable caching */\n enableCaching: boolean;\n /** Run tests */\n runTests: boolean;\n /** Run linting */\n runLint: boolean;\n /** Run typecheck */\n runTypecheck: boolean;\n /** Run build */\n runBuild: boolean;\n}\n\nexport interface CICDInstallResult {\n /** Files that were created */\n created: string[];\n /** Files that were skipped */\n skipped: string[];\n /** Errors encountered */\n errors: string[];\n}\n\n/**\n * Get package manager install command\n */\nfunction getInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'npm':\n return 'npm ci';\n case 'yarn':\n return 'yarn install --frozen-lockfile';\n case 'pnpm':\n return 'pnpm install --frozen-lockfile';\n case 'bun':\n return 'bun install --frozen-lockfile';\n default:\n return 'npm ci';\n }\n}\n\n/**\n * Get package manager run command\n */\nfunction getRunCommand(packageManager: PackageManager, script: string): string {\n switch (packageManager) {\n case 'npm':\n return `npm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n default:\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get cache configuration for package manager\n */\nfunction getCacheConfig(packageManager: PackageManager): { path: string; key: string } {\n switch (packageManager) {\n case 'npm':\n return {\n path: '~/.npm',\n key: \"npm-${{ hashFiles('**/package-lock.json') }}\",\n };\n case 'yarn':\n return {\n path: '.yarn/cache',\n key: \"yarn-${{ hashFiles('**/yarn.lock') }}\",\n };\n case 'pnpm':\n return {\n path: '~/.local/share/pnpm/store',\n key: \"pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}\",\n };\n case 'bun':\n return {\n path: '~/.bun/install/cache',\n key: \"bun-${{ hashFiles('**/bun.lockb') }}\",\n };\n default:\n return {\n path: '~/.npm',\n key: \"npm-${{ hashFiles('**/package-lock.json') }}\",\n };\n }\n}\n\n/**\n * Generate CI workflow content\n */\nfunction generateCIWorkflow(config: CICDConfig): string {\n const { packageManager, nodeVersion, enableCaching, runTests, runLint, runTypecheck, runBuild } =\n config;\n\n const cache = getCacheConfig(packageManager);\n const installCmd = getInstallCommand(packageManager);\n\n const steps: string[] = [];\n\n // Checkout\n steps.push(` - name: Checkout\n uses: actions/checkout@v4`);\n\n // Setup pnpm if needed\n if (packageManager === 'pnpm') {\n steps.push(`\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: latest`);\n }\n\n // Setup Bun if needed\n if (packageManager === 'bun') {\n steps.push(`\n - name: Setup Bun\n uses: oven-sh/setup-bun@v2\n with:\n bun-version: latest`);\n }\n\n // Setup Node.js\n if (packageManager !== 'bun') {\n steps.push(`\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '${nodeVersion}'${\n enableCaching\n ? `\n cache: '${packageManager}'`\n : ''\n }`);\n }\n\n // Cache (if not using built-in node cache)\n if (enableCaching && packageManager === 'bun') {\n steps.push(`\n - name: Cache dependencies\n uses: actions/cache@v4\n with:\n path: ${cache.path}\n key: ${cache.key}`);\n }\n\n // Install dependencies\n steps.push(`\n - name: Install dependencies\n run: ${installCmd}`);\n\n // Lint\n if (runLint) {\n steps.push(`\n - name: Lint\n run: ${getRunCommand(packageManager, 'lint')}`);\n }\n\n // Typecheck\n if (runTypecheck) {\n steps.push(`\n - name: Type check\n run: ${getRunCommand(packageManager, 'typecheck')}`);\n }\n\n // Test\n if (runTests) {\n steps.push(`\n - name: Run tests\n run: ${getRunCommand(packageManager, 'test')}`);\n }\n\n // Build\n if (runBuild) {\n steps.push(`\n - name: Build\n run: ${getRunCommand(packageManager, 'build')}`);\n }\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${steps.join('\\n')}\n`;\n}\n\n/**\n * Generate Release workflow content\n */\nfunction generateReleaseWorkflow(config: CICDConfig): string {\n const { packageManager, nodeVersion } = config;\n const installCmd = getInstallCommand(packageManager);\n\n let setupSteps = '';\n if (packageManager === 'pnpm') {\n setupSteps = `\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: latest\n`;\n }\n\n return `name: Release\n\non:\n push:\n tags:\n - 'v*'\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n${setupSteps}\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '${nodeVersion}'\n cache: '${packageManager}'\n registry-url: 'https://registry.npmjs.org'\n\n - name: Install dependencies\n run: ${installCmd}\n\n - name: Build\n run: ${getRunCommand(packageManager, 'build')}\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v1\n with:\n generate_release_notes: true\n`;\n}\n\n/**\n * Install CI/CD workflows\n */\nexport async function installCICD(\n projectPath: string,\n config: CICDConfig,\n options?: { overwrite?: boolean }\n): Promise<CICDInstallResult> {\n const result: CICDInstallResult = {\n created: [],\n skipped: [],\n errors: [],\n };\n\n if (!config.enabled) {\n return result;\n }\n\n const workflowsDir = joinPath(projectPath, '.github', 'workflows');\n\n try {\n // Ensure workflows directory exists\n await ensureDir(workflowsDir);\n\n // Install CI workflow\n if (config.ci) {\n const ciPath = joinPath(workflowsDir, 'ci.yml');\n if (!(await pathExists(ciPath)) || options?.overwrite) {\n const content = generateCIWorkflow(config);\n await writeFile(ciPath, content);\n result.created.push('ci.yml');\n } else {\n result.skipped.push('ci.yml');\n }\n }\n\n // Install CD/Release workflow\n if (config.cd) {\n const releasePath = joinPath(workflowsDir, 'release.yml');\n if (!(await pathExists(releasePath)) || options?.overwrite) {\n const content = generateReleaseWorkflow(config);\n await writeFile(releasePath, content);\n result.created.push('release.yml');\n } else {\n result.skipped.push('release.yml');\n }\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error));\n }\n\n return result;\n}\n\n/**\n * Install CI/CD with spinner\n */\nexport async function installCICDWithSpinner(\n projectPath: string,\n config: CICDConfig,\n options?: { overwrite?: boolean }\n): Promise<CICDInstallResult> {\n return withSpinner(\n 'Installing GitHub Actions workflows...',\n () => installCICD(projectPath, config, options),\n {\n successText: 'Installed GitHub Actions workflows',\n }\n );\n}\n\n/**\n * Get default CI/CD configuration\n */\nexport function getDefaultCICDConfig(packageManager: PackageManager): CICDConfig {\n return {\n enabled: true,\n provider: 'github-actions',\n ci: true,\n cd: false,\n packageManager,\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n}\n","/**\n * Spinner utility for progress indication\n */\n\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\ninterface SpinnerOptions {\n text?: string;\n color?: 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray';\n}\n\nclass SpinnerManager {\n private spinner: Ora | null = null;\n private silent = false;\n\n configure(options: { silent?: boolean }): void {\n if (options.silent !== undefined) this.silent = options.silent;\n }\n\n /**\n * Start a spinner with a message\n */\n start(text: string, options?: SpinnerOptions): Ora | null {\n if (this.silent) return null;\n\n // Stop any existing spinner\n this.stop();\n\n this.spinner = ora({\n text,\n color: options?.color || 'cyan',\n spinner: 'dots',\n }).start();\n\n return this.spinner;\n }\n\n /**\n * Update spinner text\n */\n text(text: string): void {\n if (this.spinner) {\n this.spinner.text = text;\n }\n }\n\n /**\n * Stop spinner with success message\n */\n succeed(text?: string): void {\n if (this.spinner) {\n this.spinner.succeed(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with failure message\n */\n fail(text?: string): void {\n if (this.spinner) {\n this.spinner.fail(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with warning message\n */\n warn(text?: string): void {\n if (this.spinner) {\n this.spinner.warn(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with info message\n */\n info(text?: string): void {\n if (this.spinner) {\n this.spinner.info(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner without message\n */\n stop(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n }\n }\n\n /**\n * Check if spinner is running\n */\n isRunning(): boolean {\n return this.spinner?.isSpinning ?? false;\n }\n}\n\n// Export singleton instance\nexport const spinner = new SpinnerManager();\n\n/**\n * Execute an async operation with a spinner\n */\nexport async function withSpinner<T>(\n text: string,\n operation: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n silent?: boolean;\n }\n): Promise<T> {\n if (options?.silent) {\n return operation();\n }\n\n spinner.start(text);\n\n try {\n const result = await operation();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(options?.failText || `${text} - ${pc.red(errorMessage)}`);\n throw error;\n }\n}\n\n/**\n * Create a progress indicator for multiple steps\n */\nexport function createProgressTracker(totalSteps: number, options?: { silent?: boolean }) {\n let currentStep = 0;\n\n return {\n next(stepText: string): void {\n currentStep++;\n if (!options?.silent) {\n spinner.start(`[${currentStep}/${totalSteps}] ${stepText}`);\n }\n },\n\n complete(text?: string): void {\n if (!options?.silent) {\n spinner.succeed(text || `[${currentStep}/${totalSteps}] Done`);\n }\n },\n\n fail(text?: string): void {\n if (!options?.silent) {\n spinner.fail(text);\n }\n },\n\n get current(): number {\n return currentStep;\n },\n\n get total(): number {\n return totalSteps;\n },\n };\n}\n","/**\n * Code style module exports\n */\n\nexport {\n installCodeStyle,\n getCodeStyleDependencies,\n showCodeStyleInstructions,\n} from './installer.js';\n\nexport {\n generateVSCodeExtensions,\n generateVSCodeSettings,\n installVSCodeConfig,\n installVSCodeExtensions,\n installVSCodeSettings,\n type VSCodeInstallResult,\n type VSCodeSettings,\n} from './vscode-installer.js';\n","/**\n * Code style configuration installer\n */\n\nimport path from 'node:path';\nimport fse from 'fs-extra';\nimport {\n DEFAULT_BIOME_OPTIONS,\n DEFAULT_COMMITLINT_OPTIONS,\n DEFAULT_EDITORCONFIG_OPTIONS,\n DEFAULT_PRETTIER_OPTIONS,\n} from '../../constants/code-style-defaults.js';\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { logger } from '../utils/logger.js';\nimport { spinner } from '../utils/spinner.js';\nimport {\n generateBiomeConfig,\n generateCommitlintConfig,\n generateEditorConfig,\n generatePrettierConfig,\n generatePrettierIgnore,\n} from './generator.js';\n\ninterface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nconst CODE_STYLE_FILES: Record<string, string> = {\n editorconfig: '.editorconfig',\n commitlint: 'commitlint.config.js',\n biome: 'biome.json',\n prettier: '.prettierrc',\n};\n\nconst PRETTIER_IGNORE = '.prettierignore';\n\n/**\n * Install code style configuration files\n * Generates files based on user options, or copies templates as fallback\n */\nexport async function installCodeStyle(\n targetPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean }\n): Promise<InstallResult> {\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n if (!config.enabled) {\n return result;\n }\n\n spinner.start('Installing code style configurations...');\n\n // Install EditorConfig\n if (config.editorconfig) {\n const filename = CODE_STYLE_FILES.editorconfig;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const editorconfigOptions = config.editorconfigOptions ?? DEFAULT_EDITORCONFIG_OPTIONS;\n const content = generateEditorConfig(editorconfigOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`editorconfig: ${errorMsg}`);\n }\n }\n\n // Install Biome\n if (config.biome) {\n const filename = CODE_STYLE_FILES.biome;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const biomeOptions = config.biomeOptions ?? DEFAULT_BIOME_OPTIONS;\n const content = generateBiomeConfig(biomeOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`biome: ${errorMsg}`);\n }\n }\n\n // Install Prettier\n if (config.prettier) {\n const filename = CODE_STYLE_FILES.prettier;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const prettierOptions = config.prettierOptions ?? DEFAULT_PRETTIER_OPTIONS;\n const content = generatePrettierConfig(prettierOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n\n // Also install .prettierignore\n const ignoreDest = path.join(targetPath, PRETTIER_IGNORE);\n if (!(await fse.pathExists(ignoreDest)) || options?.overwrite) {\n const ignoreContent = generatePrettierIgnore();\n await fse.writeFile(ignoreDest, ignoreContent, 'utf-8');\n result.installed.push(PRETTIER_IGNORE);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`prettier: ${errorMsg}`);\n }\n }\n\n // Install Commitlint\n if (config.commitlint) {\n const filename = CODE_STYLE_FILES.commitlint;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const commitlintOptions = config.commitlintOptions ?? DEFAULT_COMMITLINT_OPTIONS;\n const content = generateCommitlintConfig(commitlintOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`commitlint: ${errorMsg}`);\n }\n }\n\n if (result.errors.length > 0) {\n spinner.fail('Code style installation completed with errors');\n } else if (result.installed.length > 0) {\n spinner.succeed(`Installed ${result.installed.length} code style config(s)`);\n } else {\n spinner.stop();\n logger.info('No code style configs to install (all skipped)');\n }\n\n return result;\n}\n\n/**\n * Get dependencies needed for the code style tools\n */\nexport function getCodeStyleDependencies(config: CodeStyleConfig): {\n devDependencies: string[];\n instructions: string[];\n} {\n const devDependencies: string[] = [];\n const instructions: string[] = [];\n\n if (config.commitlint) {\n devDependencies.push('@commitlint/cli', '@commitlint/config-conventional');\n\n const huskyEnabled = config.commitlintOptions?.huskyIntegration ?? true;\n if (huskyEnabled) {\n instructions.push(\n 'For commitlint with git hooks, install Husky:',\n ' pnpm add -D husky',\n ' npx husky init',\n ' echo \"npx --no -- commitlint --edit \\\\${1}\" > .husky/commit-msg'\n );\n }\n }\n\n if (config.biome) {\n devDependencies.push('@biomejs/biome');\n instructions.push(\n 'Add Biome scripts to package.json:',\n ' \"lint\": \"biome check .\",',\n ' \"lint:fix\": \"biome check --write .\",',\n ' \"format\": \"biome format --write .\"'\n );\n }\n\n if (config.prettier) {\n devDependencies.push('prettier');\n instructions.push(\n 'Add Prettier scripts to package.json:',\n ' \"format\": \"prettier --write .\",',\n ' \"format:check\": \"prettier --check .\"'\n );\n }\n\n return { devDependencies, instructions };\n}\n\n/**\n * Show installation instructions for code style tools\n */\nexport function showCodeStyleInstructions(config: CodeStyleConfig): void {\n if (!config.enabled) return;\n\n const { devDependencies, instructions } = getCodeStyleDependencies(config);\n\n if (devDependencies.length > 0) {\n logger.newline();\n logger.subtitle('Code Style Dependencies');\n logger.info('Install the following dev dependencies:');\n logger.newline();\n logger.raw(` pnpm add -D ${devDependencies.join(' ')}`);\n logger.newline();\n\n if (instructions.length > 0) {\n logger.subtitle('Additional Setup');\n for (const instruction of instructions) {\n logger.raw(` ${instruction}`);\n }\n }\n }\n}\n","/**\n * Default values for code style configurations\n */\n\nimport type {\n BiomeFormatterOptions,\n BiomeLinterOptions,\n BiomeOptions,\n CommitlintOptions,\n EditorConfigOptions,\n PrettierOptions,\n} from '../types/config.js';\n\n/**\n * Default EditorConfig options\n */\nexport const DEFAULT_EDITORCONFIG_OPTIONS: EditorConfigOptions = {\n indentStyle: 'space',\n indentSize: 2,\n endOfLine: 'lf',\n insertFinalNewline: true,\n trimTrailingWhitespace: true,\n charset: 'utf-8',\n maxLineLength: 100,\n};\n\n/**\n * Default Biome formatter options\n */\nexport const DEFAULT_BIOME_FORMATTER_OPTIONS: BiomeFormatterOptions = {\n indentStyle: 'space',\n indentWidth: 2,\n lineWidth: 100,\n quoteStyle: 'single',\n semicolons: 'always',\n trailingCommas: 'all',\n quoteProperties: 'asNeeded',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParentheses: 'always',\n};\n\n/**\n * Default Biome linter options\n */\nexport const DEFAULT_BIOME_LINTER_OPTIONS: BiomeLinterOptions = {\n recommended: true,\n correctness: true,\n suspicious: true,\n style: true,\n complexity: true,\n security: true,\n performance: true,\n a11y: true,\n};\n\n/**\n * Default Biome options\n */\nexport const DEFAULT_BIOME_OPTIONS: BiomeOptions = {\n formatter: DEFAULT_BIOME_FORMATTER_OPTIONS,\n linter: DEFAULT_BIOME_LINTER_OPTIONS,\n organizeImports: true,\n ignorePatterns: ['node_modules', 'dist', 'build', '.next', '.nuxt', 'coverage'],\n};\n\n/**\n * Default Prettier options\n */\nexport const DEFAULT_PRETTIER_OPTIONS: PrettierOptions = {\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: true,\n jsxSingleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParens: 'always',\n endOfLine: 'lf',\n proseWrap: 'preserve',\n htmlWhitespaceSensitivity: 'css',\n singleAttributePerLine: false,\n};\n\n/**\n * Default commit types for conventional commits\n */\nexport const DEFAULT_COMMIT_TYPES = [\n 'feat',\n 'fix',\n 'docs',\n 'style',\n 'refactor',\n 'perf',\n 'test',\n 'build',\n 'ci',\n 'chore',\n 'revert',\n];\n\n/**\n * Default Commitlint options\n */\nexport const DEFAULT_COMMITLINT_OPTIONS: CommitlintOptions = {\n extends: ['@commitlint/config-conventional'],\n types: DEFAULT_COMMIT_TYPES,\n scopes: [], // Empty = any scope allowed\n headerMaxLength: 100,\n scopeRequired: false,\n bodyRequired: false,\n bodyMaxLineLength: 100,\n huskyIntegration: true,\n};\n\n/**\n * Style presets for quick selection\n */\nexport type CodeStylePreset = 'standard' | 'airbnb' | 'google' | 'minimal' | 'custom';\n\nexport interface CodeStylePresetConfig {\n name: string;\n description: string;\n editorconfig: EditorConfigOptions;\n biome?: BiomeFormatterOptions;\n prettier?: PrettierOptions;\n}\n\nexport const CODE_STYLE_PRESETS: Record<CodeStylePreset, CodeStylePresetConfig> = {\n standard: {\n name: 'Standard',\n description: '2 spaces, single quotes, semicolons, LF line endings',\n editorconfig: DEFAULT_EDITORCONFIG_OPTIONS,\n biome: DEFAULT_BIOME_FORMATTER_OPTIONS,\n prettier: DEFAULT_PRETTIER_OPTIONS,\n },\n airbnb: {\n name: 'Airbnb',\n description: '2 spaces, single quotes, semicolons, trailing commas',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n maxLineLength: 100,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n trailingCommas: 'all',\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n trailingComma: 'all',\n },\n },\n google: {\n name: 'Google',\n description: '2 spaces, single quotes, semicolons, 80 char lines',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n maxLineLength: 80,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n lineWidth: 80,\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n printWidth: 80,\n },\n },\n minimal: {\n name: 'Minimal',\n description: '2 spaces, double quotes, no semicolons',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n quoteStyle: 'double',\n semicolons: 'asNeeded',\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n singleQuote: false,\n semi: false,\n },\n },\n custom: {\n name: 'Custom',\n description: 'Configure each option manually',\n editorconfig: DEFAULT_EDITORCONFIG_OPTIONS,\n biome: DEFAULT_BIOME_FORMATTER_OPTIONS,\n prettier: DEFAULT_PRETTIER_OPTIONS,\n },\n};\n","/**\n * Logger utility with colored output\n */\n\nimport chalk from 'chalk';\n\nexport type LogLevel = 'debug' | 'info' | 'success' | 'warn' | 'error';\n\ninterface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n}\n\nconst SYMBOLS = {\n info: chalk.blue('ℹ'),\n success: chalk.green('✔'),\n warn: chalk.yellow('⚠'),\n error: chalk.red('✖'),\n debug: chalk.gray('●'),\n arrow: chalk.cyan('→'),\n bullet: chalk.dim('•'),\n};\n\nclass Logger {\n private verbose = false;\n private silent = false;\n\n configure(options: LoggerOptions): void {\n if (options.verbose !== undefined) this.verbose = options.verbose;\n if (options.silent !== undefined) this.silent = options.silent;\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n if (this.silent && level !== 'error') return;\n if (level === 'debug' && !this.verbose) return;\n\n const prefix = SYMBOLS[level];\n const formattedMessage = args.length > 0 ? `${message} ${args.join(' ')}` : message;\n\n switch (level) {\n case 'error':\n console.error(`${prefix} ${chalk.red(formattedMessage)}`);\n break;\n case 'warn':\n console.warn(`${prefix} ${chalk.yellow(formattedMessage)}`);\n break;\n case 'success':\n console.log(`${prefix} ${chalk.green(formattedMessage)}`);\n break;\n case 'debug':\n console.log(`${prefix} ${chalk.gray(formattedMessage)}`);\n break;\n default:\n console.log(`${prefix} ${formattedMessage}`);\n }\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.log('debug', message, ...args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.log('info', message, ...args);\n }\n\n success(message: string, ...args: unknown[]): void {\n this.log('success', message, ...args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.log('warn', message, ...args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.log('error', message, ...args);\n }\n\n /**\n * Print a blank line\n */\n newline(): void {\n if (!this.silent) console.log();\n }\n\n /**\n * Print a title/header\n */\n title(text: string): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(chalk.cyan(text)));\n console.log(chalk.dim('─'.repeat(Math.min(text.length + 4, 60))));\n }\n\n /**\n * Print a subtitle\n */\n subtitle(text: string): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(text));\n }\n\n /**\n * Print a large section header for major transitions\n * Creates a visually prominent divider between configuration sections\n */\n section(text: string, icon?: string): void {\n if (this.silent) return;\n const displayIcon = icon || '◆';\n const width = 60;\n const border = '═'.repeat(width);\n const innerWidth = width - 4;\n const paddedText = text.length > innerWidth ? text.slice(0, innerWidth) : text;\n const leftPad = Math.floor((innerWidth - paddedText.length) / 2);\n const rightPad = innerWidth - paddedText.length - leftPad;\n\n console.log();\n console.log(chalk.cyan(`╔${border}╗`));\n console.log(chalk.cyan('║') + ' '.repeat(width) + chalk.cyan('║'));\n console.log(\n `${\n chalk.cyan('║') + ' '.repeat(leftPad + 1) + chalk.hex('#FED330')(displayIcon)\n } ${chalk.bold.white(paddedText)}${' '.repeat(rightPad + 1)}${chalk.cyan('║')}`\n );\n console.log(chalk.cyan('║') + ' '.repeat(width) + chalk.cyan('║'));\n console.log(chalk.cyan(`╚${border}╝`));\n console.log();\n }\n\n /**\n * Print a step in a process\n */\n step(stepNumber: number, totalSteps: number, message: string): void {\n if (this.silent) return;\n const progress = chalk.dim(`[${stepNumber}/${totalSteps}]`);\n console.log(`${progress} ${message}`);\n }\n\n /**\n * Print a list item\n */\n item(text: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${SYMBOLS.bullet} ${text}`);\n }\n\n /**\n * Print a key-value pair\n */\n keyValue(key: string, value: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${chalk.dim(`${key}:`)} ${value}`);\n }\n\n /**\n * Print an arrow item (for showing changes/actions)\n */\n arrow(text: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${SYMBOLS.arrow} ${text}`);\n }\n\n /**\n * Print a boxed message\n */\n box(title: string, content: string[]): void {\n if (this.silent) return;\n const maxLength = Math.max(title.length, ...content.map((line) => line.length));\n const width = Math.min(maxLength + 4, 70);\n const border = '─'.repeat(width - 2);\n\n console.log();\n console.log(chalk.cyan(`┌${border}┐`));\n console.log(chalk.cyan('│') + chalk.bold(` ${title.padEnd(width - 3)}`) + chalk.cyan('│'));\n console.log(chalk.cyan(`├${border}┤`));\n for (const line of content) {\n console.log(`${chalk.cyan('│')} ${line.padEnd(width - 3)}${chalk.cyan('│')}`);\n }\n console.log(chalk.cyan(`└${border}┘`));\n console.log();\n }\n\n /**\n * Print a table\n */\n table(headers: string[], rows: string[][]): void {\n if (this.silent) return;\n\n // Calculate column widths\n const colWidths = headers.map((h, i) => {\n const maxRowWidth = Math.max(...rows.map((r) => (r[i] || '').length));\n return Math.max(h.length, maxRowWidth);\n });\n\n // Print header\n const headerRow = headers.map((h, i) => chalk.bold(h.padEnd(colWidths[i]))).join(' ');\n console.log(headerRow);\n console.log(chalk.dim(colWidths.map((w) => '─'.repeat(w)).join(' ')));\n\n // Print rows\n for (const row of rows) {\n const rowStr = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');\n console.log(rowStr);\n }\n }\n\n /**\n * Print a colored status\n */\n status(label: string, status: 'success' | 'error' | 'warn' | 'pending' | 'skip'): void {\n if (this.silent) return;\n const statusColors = {\n success: chalk.green('✔ done'),\n error: chalk.red('✖ failed'),\n warn: chalk.yellow('⚠ warning'),\n pending: chalk.blue('◯ pending'),\n skip: chalk.dim('○ skipped'),\n };\n console.log(` ${label}: ${statusColors[status]}`);\n }\n\n /**\n * Print instructions\n */\n instructions(title: string, steps: string[]): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(chalk.cyan(title)));\n console.log();\n steps.forEach((step, index) => {\n console.log(` ${chalk.dim(`${index + 1}.`)} ${step}`);\n });\n console.log();\n }\n\n /**\n * Print a dimmed note\n */\n note(text: string): void {\n if (this.silent) return;\n console.log(chalk.dim(` ${text}`));\n }\n\n /**\n * Print raw text without formatting\n */\n raw(text: string): void {\n if (this.silent) return;\n console.log(text);\n }\n}\n\n// Export singleton instance\nexport const logger = new Logger();\n\n// Export color utilities for direct use\nexport const colors = {\n primary: chalk.cyan,\n secondary: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n muted: chalk.dim,\n bold: chalk.bold,\n underline: chalk.underline,\n};\n","/**\n * Code style configuration file generators\n * Generates configuration files based on user options\n */\n\nimport type {\n BiomeOptions,\n CommitlintOptions,\n EditorConfigOptions,\n PrettierOptions,\n} from '../../types/config.js';\n\n/**\n * Generate .editorconfig content\n */\nexport function generateEditorConfig(options: EditorConfigOptions): string {\n const indent = options.indentStyle === 'tab' ? 'indent_style = tab' : 'indent_style = space';\n const indentSize =\n options.indentStyle === 'tab'\n ? `tab_width = ${options.indentSize}`\n : `indent_size = ${options.indentSize}`;\n\n const maxLine =\n options.maxLineLength === 'off' ? '' : `max_line_length = ${options.maxLineLength}`;\n\n return `# EditorConfig - https://editorconfig.org\nroot = true\n\n[*]\n${indent}\n${indentSize}\nend_of_line = ${options.endOfLine}\ncharset = ${options.charset}\ntrim_trailing_whitespace = ${options.trimTrailingWhitespace}\ninsert_final_newline = ${options.insertFinalNewline}\n${maxLine}\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{yml,yaml}]\nindent_size = 2\n\n[Makefile]\nindent_style = tab\n`.trim();\n}\n\n/**\n * Generate biome.json content\n */\nexport function generateBiomeConfig(options: BiomeOptions): string {\n const config = {\n $schema: 'https://biomejs.dev/schemas/1.9.4/schema.json',\n vcs: {\n enabled: true,\n clientKind: 'git',\n useIgnoreFile: true,\n },\n files: {\n ignoreUnknown: true,\n ignore: options.ignorePatterns,\n },\n formatter: {\n enabled: true,\n indentStyle: options.formatter.indentStyle,\n indentWidth: options.formatter.indentWidth,\n lineWidth: options.formatter.lineWidth,\n },\n organizeImports: {\n enabled: options.organizeImports,\n },\n linter: {\n enabled: true,\n rules: {\n recommended: options.linter.recommended,\n correctness: options.linter.correctness ? { recommended: true } : { recommended: false },\n suspicious: options.linter.suspicious ? { recommended: true } : { recommended: false },\n style: options.linter.style ? { recommended: true } : { recommended: false },\n complexity: options.linter.complexity ? { recommended: true } : { recommended: false },\n security: options.linter.security ? { recommended: true } : { recommended: false },\n performance: options.linter.performance ? { recommended: true } : { recommended: false },\n a11y: options.linter.a11y ? { recommended: true } : { recommended: false },\n },\n },\n javascript: {\n formatter: {\n quoteStyle: options.formatter.quoteStyle,\n semicolons: options.formatter.semicolons,\n trailingCommas: options.formatter.trailingCommas,\n quoteProperties: options.formatter.quoteProperties,\n bracketSpacing: options.formatter.bracketSpacing,\n bracketSameLine: options.formatter.bracketSameLine,\n arrowParentheses: options.formatter.arrowParentheses,\n },\n },\n json: {\n formatter: {\n indentStyle: options.formatter.indentStyle,\n indentWidth: options.formatter.indentWidth,\n lineWidth: options.formatter.lineWidth,\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate .prettierrc content\n */\nexport function generatePrettierConfig(options: PrettierOptions): string {\n const config = {\n printWidth: options.printWidth,\n tabWidth: options.tabWidth,\n useTabs: options.useTabs,\n semi: options.semi,\n singleQuote: options.singleQuote,\n jsxSingleQuote: options.jsxSingleQuote,\n trailingComma: options.trailingComma,\n bracketSpacing: options.bracketSpacing,\n bracketSameLine: options.bracketSameLine,\n arrowParens: options.arrowParens,\n endOfLine: options.endOfLine,\n proseWrap: options.proseWrap,\n htmlWhitespaceSensitivity: options.htmlWhitespaceSensitivity,\n singleAttributePerLine: options.singleAttributePerLine,\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate .prettierignore content\n */\nexport function generatePrettierIgnore(): string {\n return `# Dependencies\nnode_modules/\n.pnpm-store/\n\n# Build outputs\ndist/\nbuild/\n.next/\n.nuxt/\n.output/\nout/\n\n# Cache\n.cache/\n.turbo/\n*.tsbuildinfo\n\n# Coverage\ncoverage/\n\n# IDE\n.idea/\n.vscode/\n\n# Misc\n*.min.js\n*.min.css\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\n`;\n}\n\n/**\n * Generate commitlint.config.js content\n */\nexport function generateCommitlintConfig(options: CommitlintOptions): string {\n const extendsArray = options.extends.map((e) => `'${e}'`).join(', ');\n const typesArray = options.types.map((t) => `'${t}'`).join(', ');\n\n let scopeConfig = '';\n if (options.scopes.length > 0) {\n const scopesArray = options.scopes.map((s) => `'${s}'`).join(', ');\n scopeConfig = `\n 'scope-enum': [2, 'always', [${scopesArray}]],`;\n }\n\n const scopeRequired = options.scopeRequired\n ? `\n 'scope-empty': [2, 'never'],`\n : '';\n\n const bodyRequired = options.bodyRequired\n ? `\n 'body-empty': [2, 'never'],`\n : '';\n\n return `/** @type {import('@commitlint/types').UserConfig} */\nexport default {\n extends: [${extendsArray}],\n rules: {\n 'type-enum': [2, 'always', [${typesArray}]],\n 'header-max-length': [2, 'always', ${options.headerMaxLength}],\n 'body-max-line-length': [2, 'always', ${options.bodyMaxLineLength}],${scopeConfig}${scopeRequired}${bodyRequired}\n },\n};\n`;\n}\n\n/**\n * Generate Husky commit-msg hook content\n */\nexport function generateHuskyCommitMsgHook(): string {\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx --no -- commitlint --edit \"\\${1}\"\n`;\n}\n","/**\n * VSCode settings.json generator for code style tools\n */\n\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface VSCodeSettings {\n [key: string]: unknown;\n}\n\nexport interface VSCodeInstallResult {\n /** Whether settings file was created */\n created: boolean;\n /** Whether settings file was updated */\n updated: boolean;\n /** Whether settings file was skipped */\n skipped: boolean;\n /** Path to the file */\n path: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Generate VSCode settings for code style tools\n */\nexport function generateVSCodeSettings(config: CodeStyleConfig): VSCodeSettings {\n const settings: VSCodeSettings = {};\n\n if (config.biome) {\n // Set Biome as the default formatter\n settings['editor.defaultFormatter'] = 'biomejs.biome';\n settings['editor.formatOnSave'] = true;\n\n // Language-specific settings for Biome\n settings['[javascript]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[javascriptreact]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[typescript]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[typescriptreact]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[json]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[jsonc]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n\n // Disable ESLint if using Biome for linting\n settings['eslint.enable'] = false;\n\n // Biome extension settings\n settings['biome.enabled'] = true;\n settings['biome.lintOnSave'] = true;\n }\n\n if (config.prettier && !config.biome) {\n // Set Prettier as the default formatter (only if Biome is not enabled)\n settings['editor.defaultFormatter'] = 'esbenp.prettier-vscode';\n settings['editor.formatOnSave'] = true;\n\n // Language-specific settings for Prettier\n settings['[javascript]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[javascriptreact]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[typescript]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[typescriptreact]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[json]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[markdown]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n }\n\n // EditorConfig is automatically picked up by VSCode with the extension\n if (config.editorconfig) {\n settings['editor.detectIndentation'] = false;\n }\n\n return settings;\n}\n\n/**\n * Generate VSCode extensions recommendations\n */\nexport function generateVSCodeExtensions(config: CodeStyleConfig): { recommendations: string[] } {\n const recommendations: string[] = [];\n\n if (config.biome) {\n recommendations.push('biomejs.biome');\n }\n\n if (config.prettier && !config.biome) {\n recommendations.push('esbenp.prettier-vscode');\n }\n\n if (config.editorconfig) {\n recommendations.push('EditorConfig.EditorConfig');\n }\n\n // Always recommend these for TypeScript projects\n recommendations.push('dbaeumer.vscode-eslint'); // In case they want to use it later\n\n return { recommendations };\n}\n\n/**\n * Install VSCode settings.json\n */\nexport async function installVSCodeSettings(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<VSCodeInstallResult> {\n if (!config.enabled) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: '',\n };\n }\n\n const vscodeDir = joinPath(projectPath, '.vscode');\n const settingsPath = joinPath(vscodeDir, 'settings.json');\n\n try {\n // Generate new settings\n const newSettings = generateVSCodeSettings(config);\n\n // Check if file exists\n const exists = await pathExists(settingsPath);\n\n if (exists) {\n if (options?.merge) {\n // Merge with existing settings\n const existingContent = await readFile(settingsPath);\n let existingSettings: VSCodeSettings = {};\n try {\n existingSettings = JSON.parse(existingContent);\n } catch {\n logger.warn('Could not parse existing settings.json, will overwrite');\n }\n\n const mergedSettings = { ...existingSettings, ...newSettings };\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2));\n\n return {\n created: false,\n updated: true,\n skipped: false,\n path: settingsPath,\n };\n }\n\n if (!options?.overwrite) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: settingsPath,\n };\n }\n }\n\n // Ensure .vscode directory exists\n await ensureDir(vscodeDir);\n\n // Write settings file\n await writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n\n return {\n created: !exists,\n updated: exists,\n skipped: false,\n path: settingsPath,\n };\n } catch (error) {\n return {\n created: false,\n updated: false,\n skipped: false,\n path: settingsPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Install VSCode extensions.json\n */\nexport async function installVSCodeExtensions(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<VSCodeInstallResult> {\n if (!config.enabled) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: '',\n };\n }\n\n const vscodeDir = joinPath(projectPath, '.vscode');\n const extensionsPath = joinPath(vscodeDir, 'extensions.json');\n\n try {\n // Generate extensions\n const newExtensions = generateVSCodeExtensions(config);\n\n // Check if file exists\n const exists = await pathExists(extensionsPath);\n\n if (exists) {\n if (options?.merge) {\n // Merge with existing extensions\n const existingContent = await readFile(extensionsPath);\n let existingExtensions: { recommendations: string[] } = { recommendations: [] };\n try {\n existingExtensions = JSON.parse(existingContent);\n } catch {\n logger.warn('Could not parse existing extensions.json, will overwrite');\n }\n\n const mergedRecommendations = [\n ...new Set([\n ...(existingExtensions.recommendations || []),\n ...newExtensions.recommendations,\n ]),\n ];\n await writeFile(\n extensionsPath,\n JSON.stringify({ recommendations: mergedRecommendations }, null, 2)\n );\n\n return {\n created: false,\n updated: true,\n skipped: false,\n path: extensionsPath,\n };\n }\n\n if (!options?.overwrite) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: extensionsPath,\n };\n }\n }\n\n // Ensure .vscode directory exists\n await ensureDir(vscodeDir);\n\n // Write extensions file\n await writeFile(extensionsPath, JSON.stringify(newExtensions, null, 2));\n\n return {\n created: !exists,\n updated: exists,\n skipped: false,\n path: extensionsPath,\n };\n } catch (error) {\n return {\n created: false,\n updated: false,\n skipped: false,\n path: extensionsPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Install all VSCode configuration files\n */\nexport async function installVSCodeConfig(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<{\n settings: VSCodeInstallResult;\n extensions: VSCodeInstallResult;\n}> {\n const [settingsResult, extensionsResult] = await Promise.all([\n installVSCodeSettings(projectPath, config, options),\n installVSCodeExtensions(projectPath, config, options),\n ]);\n\n return {\n settings: settingsResult,\n extensions: extensionsResult,\n };\n}\n","/**\n * Config exports\n */\n\n// Reader\nexport {\n readConfig,\n hasConfig,\n hasClaudeDir,\n getConfigPath,\n getClaudeDirPath,\n readPartialConfig,\n getInstalledModulesFromConfig,\n getConfigVersion,\n needsMigration,\n} from './reader.js';\n\n// Writer\nexport {\n writeConfig,\n updateConfig,\n mergeConfig,\n createDefaultConfig,\n addModulesToConfig,\n removeModulesFromConfig,\n updateMcpConfig,\n updateExtrasConfig,\n} from './writer.js';\n\n// Global Defaults\nexport {\n getGlobalDefaultsPath,\n readGlobalDefaults,\n writeGlobalDefaults,\n updateGlobalDefaults,\n mergeWithGlobalDefaults,\n hasGlobalDefaults,\n clearGlobalDefaults,\n getGlobalTemplateConfig,\n formatGlobalDefaults,\n} from './global-defaults.js';\n","/**\n * Configuration reader - reads Claude config files\n */\n\nimport type { ClaudeConfig, PartialClaudeConfig } from '../../types/config.js';\nimport { joinPath, pathExists, readJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst CONFIG_FILE = 'config.json';\nconst CLAUDE_DIR = '.claude';\n\n/**\n * Read Claude configuration from a project\n */\nexport async function readConfig(projectPath: string): Promise<ClaudeConfig | null> {\n const configPath = joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n\n if (!(await pathExists(configPath))) {\n return null;\n }\n\n try {\n return await readJson<ClaudeConfig>(configPath);\n } catch (error) {\n logger.debug(`Failed to read config: ${error}`);\n return null;\n }\n}\n\n/**\n * Check if a Claude configuration exists\n */\nexport async function hasConfig(projectPath: string): Promise<boolean> {\n const configPath = joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n return pathExists(configPath);\n}\n\n/**\n * Check if Claude directory exists\n */\nexport async function hasClaudeDir(projectPath: string): Promise<boolean> {\n const claudePath = joinPath(projectPath, CLAUDE_DIR);\n return pathExists(claudePath);\n}\n\n/**\n * Get config file path\n */\nexport function getConfigPath(projectPath: string): string {\n return joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n}\n\n/**\n * Get Claude directory path\n */\nexport function getClaudeDirPath(projectPath: string): string {\n return joinPath(projectPath, CLAUDE_DIR);\n}\n\n/**\n * Read partial config (for updates/merges)\n */\nexport async function readPartialConfig(projectPath: string): Promise<PartialClaudeConfig | null> {\n return readConfig(projectPath) as Promise<PartialClaudeConfig | null>;\n}\n\n/**\n * Get installed module IDs from config\n */\nexport function getInstalledModulesFromConfig(config: ClaudeConfig): Record<string, string[]> {\n return {\n agents: config.modules.agents.selected,\n skills: config.modules.skills.selected,\n commands: config.modules.commands.selected,\n docs: config.modules.docs.selected,\n };\n}\n\n/**\n * Get config version\n */\nexport function getConfigVersion(config: ClaudeConfig): string {\n return config.version;\n}\n\n/**\n * Check if config needs migration\n */\nexport function needsMigration(config: ClaudeConfig, currentVersion: string): boolean {\n const configVersion = config.version;\n\n // Simple semver comparison\n const [configMajor, configMinor] = configVersion.split('.').map(Number);\n const [currentMajor, currentMinor] = currentVersion.split('.').map(Number);\n\n return configMajor < currentMajor || (configMajor === currentMajor && configMinor < currentMinor);\n}\n","/**\n * Configuration writer - writes Claude config files\n */\n\nimport type { ClaudeConfig, PartialClaudeConfig } from '../../types/config.js';\nimport { backup, ensureDir, joinPath, pathExists, writeJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { readConfig } from './reader.js';\n\nconst CONFIG_FILE = 'config.json';\nconst CLAUDE_DIR = '.claude';\n\n/**\n * Write Claude configuration\n */\nexport async function writeConfig(\n projectPath: string,\n config: ClaudeConfig,\n options?: { backup?: boolean }\n): Promise<void> {\n const claudePath = joinPath(projectPath, CLAUDE_DIR);\n const configPath = joinPath(claudePath, CONFIG_FILE);\n\n // Create .claude directory if needed\n await ensureDir(claudePath);\n\n // Backup existing config if requested\n if (options?.backup && (await pathExists(configPath))) {\n const backupPath = await backup(configPath, `.backup.${Date.now()}`);\n logger.debug(`Config backed up to: ${backupPath}`);\n }\n\n // Write config\n await writeJson(configPath, config, { spaces: 2 });\n logger.debug(`Config written to: ${configPath}`);\n}\n\n/**\n * Update existing configuration (merge)\n */\nexport async function updateConfig(\n projectPath: string,\n updates: PartialClaudeConfig\n): Promise<ClaudeConfig | null> {\n const existing = await readConfig(projectPath);\n\n if (!existing) {\n logger.warn('No existing config to update');\n return null;\n }\n\n const updated = mergeConfig(existing, updates);\n updated.customizations.lastUpdated = new Date().toISOString();\n\n await writeConfig(projectPath, updated);\n return updated;\n}\n\n/**\n * Merge partial config into existing config\n */\nexport function mergeConfig(existing: ClaudeConfig, updates: PartialClaudeConfig): ClaudeConfig {\n return {\n version: updates.version || existing.version,\n templateSource: updates.templateSource || existing.templateSource,\n project: {\n ...existing.project,\n ...updates.project,\n },\n preferences: {\n ...existing.preferences,\n ...updates.preferences,\n },\n mcp: updates.mcp || existing.mcp,\n modules: {\n agents: updates.modules?.agents || existing.modules.agents,\n skills: updates.modules?.skills || existing.modules.skills,\n commands: updates.modules?.commands || existing.modules.commands,\n docs: updates.modules?.docs || existing.modules.docs,\n },\n extras: {\n ...existing.extras,\n ...updates.extras,\n hooks: updates.extras?.hooks || existing.extras.hooks,\n },\n scaffold: updates.scaffold || existing.scaffold,\n customizations: {\n ...existing.customizations,\n ...updates.customizations,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Create a default configuration\n */\nexport function createDefaultConfig(options: {\n version: string;\n projectInfo: ClaudeConfig['project'];\n preferences: ClaudeConfig['preferences'];\n}): ClaudeConfig {\n return {\n version: options.version,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: options.projectInfo,\n preferences: options.preferences,\n mcp: {\n level: 'project',\n servers: [],\n },\n modules: {\n agents: { selected: [], excluded: [] },\n skills: { selected: [], excluded: [] },\n commands: { selected: [], excluded: [] },\n docs: { selected: [], excluded: [] },\n },\n extras: {\n schemas: false,\n scripts: false,\n hooks: { enabled: false },\n sessions: false,\n },\n scaffold: {\n type: 'claude-only',\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n },\n };\n}\n\n/**\n * Add selected modules to config\n */\nexport function addModulesToConfig(\n config: ClaudeConfig,\n category: keyof ClaudeConfig['modules'],\n moduleIds: string[]\n): ClaudeConfig {\n const existing = new Set(config.modules[category].selected);\n\n for (const id of moduleIds) {\n existing.add(id);\n }\n\n return {\n ...config,\n modules: {\n ...config.modules,\n [category]: {\n ...config.modules[category],\n selected: Array.from(existing),\n },\n },\n };\n}\n\n/**\n * Remove modules from config\n */\nexport function removeModulesFromConfig(\n config: ClaudeConfig,\n category: keyof ClaudeConfig['modules'],\n moduleIds: string[]\n): ClaudeConfig {\n const toRemove = new Set(moduleIds);\n const remaining = config.modules[category].selected.filter((id) => !toRemove.has(id));\n\n return {\n ...config,\n modules: {\n ...config.modules,\n [category]: {\n ...config.modules[category],\n selected: remaining,\n excluded: [...config.modules[category].excluded, ...moduleIds],\n },\n },\n };\n}\n\n/**\n * Update MCP configuration\n */\nexport function updateMcpConfig(config: ClaudeConfig, mcp: ClaudeConfig['mcp']): ClaudeConfig {\n return {\n ...config,\n mcp,\n };\n}\n\n/**\n * Update extras configuration\n */\nexport function updateExtrasConfig(\n config: ClaudeConfig,\n extras: Partial<ClaudeConfig['extras']>\n): ClaudeConfig {\n return {\n ...config,\n extras: {\n ...config.extras,\n ...extras,\n },\n };\n}\n","/**\n * Global defaults management\n *\n * Manages global defaults stored in ~/.claude/defaults.json\n * These defaults are used as fallbacks for new projects.\n */\n\nimport * as fs from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport * as path from 'node:path';\nimport type { GlobalDefaults, TemplateConfig } from '../../types/template-config.js';\n\n/**\n * Get the path to the global defaults file\n */\nexport function getGlobalDefaultsPath(): string {\n return path.join(homedir(), '.claude', 'defaults.json');\n}\n\n/**\n * Ensure the ~/.claude directory exists\n */\nasync function ensureClaudeDir(): Promise<void> {\n const claudeDir = path.join(homedir(), '.claude');\n try {\n await fs.mkdir(claudeDir, { recursive: true });\n } catch {\n // Directory exists or can't be created\n }\n}\n\n/**\n * Read global defaults from ~/.claude/defaults.json\n */\nexport async function readGlobalDefaults(): Promise<GlobalDefaults> {\n const defaultsPath = getGlobalDefaultsPath();\n\n try {\n const content = await fs.readFile(defaultsPath, 'utf-8');\n return JSON.parse(content) as GlobalDefaults;\n } catch {\n // File doesn't exist or is invalid\n return {};\n }\n}\n\n/**\n * Write global defaults to ~/.claude/defaults.json\n */\nexport async function writeGlobalDefaults(defaults: GlobalDefaults): Promise<void> {\n await ensureClaudeDir();\n const defaultsPath = getGlobalDefaultsPath();\n\n const dataToWrite: GlobalDefaults = {\n ...defaults,\n lastUpdated: new Date().toISOString(),\n };\n\n await fs.writeFile(defaultsPath, JSON.stringify(dataToWrite, null, 2), 'utf-8');\n}\n\n/**\n * Update global defaults with new template config\n */\nexport async function updateGlobalDefaults(templateConfig: Partial<TemplateConfig>): Promise<void> {\n const existing = await readGlobalDefaults();\n\n const updated: GlobalDefaults = {\n ...existing,\n templateConfig: mergeTemplateConfigs(existing.templateConfig || {}, templateConfig),\n lastUpdated: new Date().toISOString(),\n };\n\n await writeGlobalDefaults(updated);\n}\n\n/**\n * Merge two template configs, with source taking precedence\n */\nfunction mergeTemplateConfigs(\n target: Partial<TemplateConfig>,\n source: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n return {\n commands: { ...target.commands, ...source.commands },\n paths: { ...target.paths, ...source.paths },\n targets: { ...target.targets, ...source.targets },\n tracking: { ...target.tracking, ...source.tracking },\n techStack: { ...target.techStack, ...source.techStack },\n environment: { ...target.environment, ...source.environment },\n brand: { ...target.brand, ...source.brand },\n };\n}\n\n/**\n * Merge detected values with global defaults\n * Priority: detected > global > hardcoded defaults\n */\nexport function mergeWithGlobalDefaults(\n detected: Partial<TemplateConfig>,\n globalDefaults: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n return {\n commands: {\n ...globalDefaults.commands,\n ...filterUndefined(detected.commands || {}),\n },\n paths: {\n ...globalDefaults.paths,\n ...filterUndefined(detected.paths || {}),\n },\n targets: {\n ...globalDefaults.targets,\n ...filterUndefined(detected.targets || {}),\n },\n tracking: {\n ...globalDefaults.tracking,\n ...filterUndefined(detected.tracking || {}),\n },\n techStack: {\n ...globalDefaults.techStack,\n ...filterUndefined(detected.techStack || {}),\n },\n environment: {\n ...globalDefaults.environment,\n ...filterUndefined(detected.environment || {}),\n },\n brand: {\n ...globalDefaults.brand,\n ...filterUndefined(detected.brand || {}),\n },\n };\n}\n\n/**\n * Filter out undefined values from an object\n */\nfunction filterUndefined<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Check if global defaults exist\n */\nexport async function hasGlobalDefaults(): Promise<boolean> {\n try {\n const defaults = await readGlobalDefaults();\n return defaults.templateConfig !== undefined && Object.keys(defaults.templateConfig).length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Clear global defaults\n */\nexport async function clearGlobalDefaults(): Promise<void> {\n const defaultsPath = getGlobalDefaultsPath();\n try {\n await fs.unlink(defaultsPath);\n } catch {\n // File doesn't exist\n }\n}\n\n/**\n * Get template config from global defaults\n */\nexport async function getGlobalTemplateConfig(): Promise<Partial<TemplateConfig>> {\n const defaults = await readGlobalDefaults();\n return defaults.templateConfig || {};\n}\n\n/**\n * Format global defaults for display\n */\nexport function formatGlobalDefaults(defaults: GlobalDefaults): string {\n const lines: string[] = [];\n\n lines.push('Global Defaults');\n lines.push('─'.repeat(40));\n\n if (defaults.lastUpdated) {\n lines.push(`Last updated: ${new Date(defaults.lastUpdated).toLocaleString()}`);\n lines.push('');\n }\n\n if (!defaults.templateConfig || Object.keys(defaults.templateConfig).length === 0) {\n lines.push('No template configuration saved');\n return lines.join('\\n');\n }\n\n const config = defaults.templateConfig;\n\n if (config.commands && Object.keys(config.commands).length > 0) {\n lines.push('Commands:');\n for (const [key, value] of Object.entries(config.commands)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.paths && Object.keys(config.paths).length > 0) {\n lines.push('Paths:');\n for (const [key, value] of Object.entries(config.paths)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.targets && Object.keys(config.targets).length > 0) {\n lines.push('Targets:');\n for (const [key, value] of Object.entries(config.targets)) {\n if (value !== undefined) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.tracking && Object.keys(config.tracking).length > 0) {\n lines.push('Tracking:');\n for (const [key, value] of Object.entries(config.tracking)) {\n if (value !== undefined) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.techStack && Object.keys(config.techStack).length > 0) {\n lines.push('Tech Stack:');\n for (const [key, value] of Object.entries(config.techStack)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.environment && Object.keys(config.environment).length > 0) {\n lines.push('Environment:');\n for (const [key, value] of Object.entries(config.environment)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.brand && Object.keys(config.brand).length > 0) {\n lines.push('Brand:');\n for (const [key, value] of Object.entries(config.brand)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Dependencies exports\n */\n\nexport {\n getCurrentPlatform,\n checkDependency,\n checkAllDependencies,\n checkFeatureDependencies,\n getInstallInstructions,\n formatDependencyReport,\n getRequiredFeatures,\n installDependency,\n installDependencies,\n formatManualInstallInstructions,\n type DependencyInstallResult,\n} from './checker.js';\n","/**\n * Dependency checker - checks system dependencies\n */\n\nimport { exec } from 'node:child_process';\nimport * as os from 'node:os';\nimport { promisify } from 'node:util';\nimport { DEPENDENCIES, getDependenciesForFeature } from '../../constants/dependencies.js';\nimport type {\n DependencyCheckResult,\n DependencyInfo,\n DependencyReport,\n Platform,\n} from '../../types/dependencies.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Get current platform\n */\nexport function getCurrentPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'win32':\n return 'windows';\n default:\n return 'linux';\n }\n}\n\n/**\n * Check if a single dependency is installed\n */\nexport async function checkDependency(dep: DependencyInfo): Promise<DependencyCheckResult> {\n try {\n const { stdout } = await execAsync(dep.checkCommand);\n const version = extractVersion(stdout);\n\n return {\n id: dep.id,\n installed: true,\n version,\n };\n } catch (error) {\n return {\n id: dep.id,\n installed: false,\n error: error instanceof Error ? error.message : 'Check failed',\n };\n }\n}\n\n/**\n * Extract version from command output\n */\nfunction extractVersion(output: string): string | undefined {\n // Common version patterns\n const patterns = [\n /(\\d+\\.\\d+\\.\\d+)/, // 1.2.3\n /v(\\d+\\.\\d+\\.\\d+)/, // v1.2.3\n /version\\s+(\\d+\\.\\d+\\.\\d+)/i, // version 1.2.3\n ];\n\n for (const pattern of patterns) {\n const match = output.match(pattern);\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Check all dependencies\n */\nexport async function checkAllDependencies(): Promise<DependencyReport> {\n const platform = getCurrentPlatform();\n const checked: DependencyCheckResult[] = [];\n const missing: DependencyInfo[] = [];\n const instructions = new Map<string, NonNullable<DependencyInfo['platforms'][Platform]>>();\n\n for (const dep of DEPENDENCIES) {\n const result = await checkDependency(dep);\n checked.push(result);\n\n if (!result.installed) {\n missing.push(dep);\n\n const platformInstructions = dep.platforms[platform];\n if (platformInstructions) {\n instructions.set(dep.id, platformInstructions);\n }\n }\n }\n\n return {\n checked,\n missing,\n instructions,\n };\n}\n\n/**\n * Check dependencies for specific features\n */\nexport async function checkFeatureDependencies(features: string[]): Promise<DependencyReport> {\n const platform = getCurrentPlatform();\n const checked: DependencyCheckResult[] = [];\n const missing: DependencyInfo[] = [];\n const instructions = new Map<string, NonNullable<DependencyInfo['platforms'][Platform]>>();\n\n // Get unique dependencies for all features\n const deps = new Set<DependencyInfo>();\n for (const feature of features) {\n const featureDeps = getDependenciesForFeature(feature);\n for (const dep of featureDeps) {\n deps.add(dep);\n }\n }\n\n for (const dep of deps) {\n const result = await checkDependency(dep);\n checked.push(result);\n\n if (!result.installed) {\n missing.push(dep);\n\n const platformInstructions = dep.platforms[platform];\n if (platformInstructions) {\n instructions.set(dep.id, platformInstructions);\n }\n }\n }\n\n return {\n checked,\n missing,\n instructions,\n };\n}\n\n/**\n * Get installation instructions for a dependency\n */\nexport function getInstallInstructions(dep: DependencyInfo, platform?: Platform): string[] {\n const targetPlatform = platform || getCurrentPlatform();\n const instructions = dep.platforms[targetPlatform];\n\n if (!instructions) {\n return [`No installation instructions available for ${targetPlatform}`];\n }\n\n return instructions.commands;\n}\n\n/**\n * Format dependency report for display\n */\nexport function formatDependencyReport(report: DependencyReport): void {\n if (report.missing.length === 0) {\n logger.success('All dependencies are installed');\n return;\n }\n\n logger.warn(`Missing ${report.missing.length} dependencies:`);\n logger.newline();\n\n for (const dep of report.missing) {\n logger.subtitle(dep.name);\n logger.note(dep.description);\n logger.note(`Required for: ${dep.requiredFor.join(', ')}`);\n\n const instructions = report.instructions.get(dep.id);\n if (instructions) {\n logger.newline();\n logger.info('Installation:');\n for (const cmd of instructions.commands) {\n logger.raw(` ${cmd}`);\n }\n if (instructions.notes) {\n logger.note(instructions.notes);\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Get required features based on configuration\n */\nexport function getRequiredFeatures(config: {\n hooks?: { enabled?: boolean; notification?: { audio?: boolean; desktop?: boolean } };\n mcp?: { servers?: Array<{ serverId: string }> };\n}): string[] {\n const features: string[] = [];\n\n if (config.hooks?.enabled) {\n features.push('hooks');\n\n if (config.hooks.notification?.audio) {\n features.push('hook:notification:audio');\n }\n if (config.hooks.notification?.desktop) {\n features.push('hook:notification:desktop');\n }\n }\n\n if (config.mcp?.servers && config.mcp.servers.length > 0) {\n features.push('mcp-servers');\n }\n\n return features;\n}\n\n/**\n * Result of dependency installation attempt\n */\nexport interface DependencyInstallResult {\n dep: DependencyInfo;\n success: boolean;\n error?: string;\n}\n\n/**\n * Try to install a single dependency\n */\nexport async function installDependency(dep: DependencyInfo): Promise<DependencyInstallResult> {\n const platform = getCurrentPlatform();\n const platformInstructions = dep.platforms[platform];\n\n if (!platformInstructions) {\n return {\n dep,\n success: false,\n error: `No installation instructions for ${platform}`,\n };\n }\n\n // Get the first install command (usually the most common method)\n const installCommand = platformInstructions.commands[0];\n if (!installCommand) {\n return {\n dep,\n success: false,\n error: 'No install command available',\n };\n }\n\n try {\n await execAsync(installCommand, { timeout: 120000 }); // 2 min timeout\n\n // Verify installation\n const checkResult = await checkDependency(dep);\n if (checkResult.installed) {\n return { dep, success: true };\n }\n\n return {\n dep,\n success: false,\n error: 'Installation completed but dependency not found',\n };\n } catch (error) {\n return {\n dep,\n success: false,\n error: error instanceof Error ? error.message : 'Installation failed',\n };\n }\n}\n\n/**\n * Install multiple dependencies\n */\nexport async function installDependencies(\n deps: DependencyInfo[],\n options?: {\n onProgress?: (dep: DependencyInfo, index: number, total: number) => void;\n }\n): Promise<DependencyInstallResult[]> {\n const results: DependencyInstallResult[] = [];\n\n for (let i = 0; i < deps.length; i++) {\n const dep = deps[i];\n if (options?.onProgress) {\n options.onProgress(dep, i, deps.length);\n }\n\n const result = await installDependency(dep);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Format installation instructions for manual installation\n */\nexport function formatManualInstallInstructions(report: DependencyReport): string[] {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('To install the missing dependencies manually, run the following commands:');\n lines.push('');\n\n for (const dep of report.missing) {\n const instructions = report.instructions.get(dep.id);\n if (instructions) {\n lines.push(`# ${dep.name}`);\n for (const cmd of instructions.commands) {\n lines.push(cmd);\n }\n lines.push('');\n }\n }\n\n return lines;\n}\n","/**\n * System dependency definitions\n */\n\nimport type { DependencyInfo } from '../types/dependencies.js';\n\n/**\n * System dependencies required for various features\n */\nexport const DEPENDENCIES: DependencyInfo[] = [\n {\n id: 'piper-tts',\n name: 'Piper TTS',\n description: 'Text-to-speech for audio notifications',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v piper',\n platforms: {\n linux: {\n commands: [\n 'pip install piper-tts',\n 'mkdir -p ~/.local/share/piper/voices',\n 'wget -O ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx',\n 'wget -O ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx.json',\n ],\n notes: 'Requires Python 3.9+ and pip',\n links: ['https://github.com/rhasspy/piper'],\n },\n macos: {\n commands: [\n 'pip3 install piper-tts',\n 'mkdir -p ~/.local/share/piper/voices',\n '# Download voice files from https://github.com/rhasspy/piper/releases',\n ],\n notes: 'May need to install portaudio: brew install portaudio',\n links: ['https://github.com/rhasspy/piper'],\n },\n },\n },\n {\n id: 'notify-send',\n name: 'libnotify',\n description: 'Desktop notifications for Linux',\n requiredFor: ['hook:notification:desktop'],\n checkCommand: 'command -v notify-send',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install libnotify-bin',\n '# Fedora:',\n 'sudo dnf install libnotify',\n '# Arch:',\n 'sudo pacman -S libnotify',\n ],\n },\n },\n },\n {\n id: 'terminal-notifier',\n name: 'terminal-notifier',\n description: 'Desktop notifications for macOS',\n requiredFor: ['hook:notification:desktop'],\n checkCommand: 'command -v terminal-notifier',\n platforms: {\n macos: {\n commands: ['brew install terminal-notifier'],\n links: ['https://github.com/julienXX/terminal-notifier'],\n },\n },\n },\n {\n id: 'jq',\n name: 'jq',\n description: 'JSON processor for hook scripts',\n requiredFor: ['hooks'],\n checkCommand: 'command -v jq',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install jq',\n '# Fedora:',\n 'sudo dnf install jq',\n '# Arch:',\n 'sudo pacman -S jq',\n ],\n },\n macos: {\n commands: ['brew install jq'],\n },\n windows: {\n commands: ['choco install jq', '# Or: winget install jqlang.jq'],\n },\n },\n },\n {\n id: 'aplay',\n name: 'ALSA Utils',\n description: 'Audio playback for Linux',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v aplay',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install alsa-utils',\n '# Fedora:',\n 'sudo dnf install alsa-utils',\n '# Arch:',\n 'sudo pacman -S alsa-utils',\n ],\n },\n },\n },\n {\n id: 'afplay',\n name: 'afplay',\n description: 'Audio playback for macOS (built-in)',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v afplay',\n platforms: {\n macos: {\n commands: ['# Built-in on macOS, no installation needed'],\n notes: 'afplay is included with macOS by default',\n },\n },\n },\n {\n id: 'git',\n name: 'Git',\n description: 'Version control system',\n requiredFor: ['version-control', 'remote-templates'],\n checkCommand: 'git --version',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install git',\n '# Fedora:',\n 'sudo dnf install git',\n '# Arch:',\n 'sudo pacman -S git',\n ],\n },\n macos: {\n commands: ['brew install git', '# Or: xcode-select --install'],\n },\n windows: {\n commands: ['choco install git', '# Or: winget install Git.Git'],\n links: ['https://git-scm.com/download/win'],\n },\n },\n },\n {\n id: 'node',\n name: 'Node.js',\n description: 'JavaScript runtime',\n requiredFor: ['cli', 'mcp-servers'],\n checkCommand: 'node --version',\n platforms: {\n linux: {\n commands: [\n '# Using nvm (recommended):',\n 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash',\n 'nvm install --lts',\n '# Or using package manager:',\n 'sudo apt install nodejs npm',\n ],\n links: ['https://nodejs.org/', 'https://github.com/nvm-sh/nvm'],\n },\n macos: {\n commands: [\n '# Using nvm (recommended):',\n 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash',\n 'nvm install --lts',\n '# Or using Homebrew:',\n 'brew install node',\n ],\n links: ['https://nodejs.org/', 'https://github.com/nvm-sh/nvm'],\n },\n windows: {\n commands: ['choco install nodejs-lts', '# Or: winget install OpenJS.NodeJS.LTS'],\n links: ['https://nodejs.org/'],\n },\n },\n },\n];\n\n/**\n * Get dependency by ID\n */\nexport function getDependency(id: string): DependencyInfo | undefined {\n return DEPENDENCIES.find((d) => d.id === id);\n}\n\n/**\n * Get dependencies required for a feature\n */\nexport function getDependenciesForFeature(feature: string): DependencyInfo[] {\n return DEPENDENCIES.filter((d) => d.requiredFor.includes(feature));\n}\n\n/**\n * Get all dependency IDs\n */\nexport function getDependencyIds(): string[] {\n return DEPENDENCIES.map((d) => d.id);\n}\n","/**\n * Git hooks module - Husky and related git hook utilities\n */\n\nexport {\n deriveHuskyConfigFromCodeStyle,\n getHuskyDependencies,\n getHuskySetupInstructions,\n getLintStagedConfig,\n installHusky,\n installHuskyWithSpinner,\n type HuskyConfig,\n type HuskyInstallResult,\n} from './husky-installer.js';\n","/**\n * Husky installer - creates git hooks for commit linting and other automation\n */\n\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, makeExecutable, pathExists, writeFile } from '../utils/fs.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface HuskyConfig {\n /** Enable commitlint hook */\n commitlint: boolean;\n /** Enable pre-commit hook for linting */\n preCommit: boolean;\n /** Linter command for pre-commit */\n lintCommand?: string;\n /** Enable pre-push hook */\n prePush: boolean;\n /** Test command for pre-push */\n testCommand?: string;\n}\n\nexport interface HuskyInstallResult {\n /** Files that were created */\n created: string[];\n /** Files that were skipped */\n skipped: string[];\n /** Errors encountered */\n errors: string[];\n /** Whether husky directory was initialized */\n initialized: boolean;\n}\n\n/**\n * Generate commit-msg hook content\n */\nfunction generateCommitMsgHook(): string {\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx --no -- commitlint --edit \"\\${1}\"\n`;\n}\n\n/**\n * Generate pre-commit hook content\n */\nfunction generatePreCommitHook(lintCommand?: string): string {\n const command = lintCommand || 'pnpm lint-staged';\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n${command}\n`;\n}\n\n/**\n * Generate pre-push hook content\n */\nfunction generatePrePushHook(testCommand?: string): string {\n const command = testCommand || 'pnpm test';\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n${command}\n`;\n}\n\n/**\n * Generate husky.sh helper script\n */\nfunction generateHuskyScript(): string {\n return `#!/usr/bin/env sh\nif [ -z \"$husky_skip_init\" ]; then\n debug () {\n if [ \"$HUSKY_DEBUG\" = \"1\" ]; then\n echo \"husky (debug) - $1\"\n fi\n }\n\n readonly hook_name=\"\\$(basename -- \"$0\")\"\n debug \"starting $hook_name...\"\n\n if [ \"$HUSKY\" = \"0\" ]; then\n debug \"HUSKY env variable is set to 0, skipping hook\"\n exit 0\n fi\n\n if [ -f ~/.huskyrc ]; then\n debug \"sourcing ~/.huskyrc\"\n . ~/.huskyrc\n fi\n\n readonly husky_skip_init=1\n export husky_skip_init\n sh -e \"$0\" \"$@\"\n exitCode=\"$?\"\n\n if [ $exitCode != 0 ]; then\n echo \"husky - $hook_name hook exited with code $exitCode (error)\"\n fi\n\n if [ $exitCode = 127 ]; then\n echo \"husky - command not found in PATH=$PATH\"\n fi\n\n exit $exitCode\nfi\n`;\n}\n\n/**\n * Generate .gitignore for husky directory\n */\nfunction generateHuskyGitignore(): string {\n return `_\n`;\n}\n\n/**\n * Install Husky hooks\n */\nexport async function installHusky(\n projectPath: string,\n config: HuskyConfig,\n options?: { overwrite?: boolean }\n): Promise<HuskyInstallResult> {\n const result: HuskyInstallResult = {\n created: [],\n skipped: [],\n errors: [],\n initialized: false,\n };\n\n const huskyDir = joinPath(projectPath, '.husky');\n const huskyInternalDir = joinPath(huskyDir, '_');\n\n try {\n // Create .husky directory\n await ensureDir(huskyDir);\n await ensureDir(huskyInternalDir);\n result.initialized = true;\n\n // Create internal husky.sh script\n const huskyScriptPath = joinPath(huskyInternalDir, 'husky.sh');\n if (!(await pathExists(huskyScriptPath)) || options?.overwrite) {\n await writeFile(huskyScriptPath, generateHuskyScript());\n await makeExecutable(huskyScriptPath);\n result.created.push('_/husky.sh');\n } else {\n result.skipped.push('_/husky.sh');\n }\n\n // Create .gitignore in husky internal directory\n const gitignorePath = joinPath(huskyInternalDir, '.gitignore');\n if (!(await pathExists(gitignorePath)) || options?.overwrite) {\n await writeFile(gitignorePath, generateHuskyGitignore());\n result.created.push('_/.gitignore');\n }\n\n // Create commit-msg hook\n if (config.commitlint) {\n const commitMsgPath = joinPath(huskyDir, 'commit-msg');\n if (!(await pathExists(commitMsgPath)) || options?.overwrite) {\n await writeFile(commitMsgPath, generateCommitMsgHook());\n await makeExecutable(commitMsgPath);\n result.created.push('commit-msg');\n } else {\n result.skipped.push('commit-msg');\n }\n }\n\n // Create pre-commit hook\n if (config.preCommit) {\n const preCommitPath = joinPath(huskyDir, 'pre-commit');\n if (!(await pathExists(preCommitPath)) || options?.overwrite) {\n await writeFile(preCommitPath, generatePreCommitHook(config.lintCommand));\n await makeExecutable(preCommitPath);\n result.created.push('pre-commit');\n } else {\n result.skipped.push('pre-commit');\n }\n }\n\n // Create pre-push hook\n if (config.prePush) {\n const prePushPath = joinPath(huskyDir, 'pre-push');\n if (!(await pathExists(prePushPath)) || options?.overwrite) {\n await writeFile(prePushPath, generatePrePushHook(config.testCommand));\n await makeExecutable(prePushPath);\n result.created.push('pre-push');\n } else {\n result.skipped.push('pre-push');\n }\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error));\n }\n\n return result;\n}\n\n/**\n * Install Husky with spinner\n */\nexport async function installHuskyWithSpinner(\n projectPath: string,\n config: HuskyConfig,\n options?: { overwrite?: boolean }\n): Promise<HuskyInstallResult> {\n return withSpinner(\n 'Installing Husky hooks...',\n () => installHusky(projectPath, config, options),\n {\n successText: 'Installed Husky hooks',\n }\n );\n}\n\n/**\n * Derive Husky config from code style config\n */\nexport function deriveHuskyConfigFromCodeStyle(codeStyle: CodeStyleConfig): HuskyConfig | null {\n if (!codeStyle.enabled) {\n return null;\n }\n\n // Only install husky if commitlint with husky integration is enabled\n const commitlintEnabled = codeStyle.commitlint && codeStyle.commitlintOptions?.huskyIntegration;\n\n if (!commitlintEnabled) {\n return null;\n }\n\n // Determine lint command based on tools\n let lintCommand: string | undefined;\n if (codeStyle.biome) {\n lintCommand = 'pnpm biome check --staged';\n } else if (codeStyle.prettier) {\n lintCommand = 'pnpm lint-staged';\n }\n\n return {\n commitlint: true,\n preCommit: !!lintCommand,\n lintCommand,\n prePush: false, // Don't run tests on push by default\n };\n}\n\n/**\n * Get lint-staged configuration for package.json\n */\nexport function getLintStagedConfig(\n codeStyle: CodeStyleConfig\n): Record<string, string | string[]> | null {\n if (!codeStyle.enabled) {\n return null;\n }\n\n const config: Record<string, string | string[]> = {};\n\n if (codeStyle.biome) {\n config['*.{js,jsx,ts,tsx,json}'] = ['biome check --write --no-errors-on-unmatched'];\n } else if (codeStyle.prettier) {\n config['*.{js,jsx,ts,tsx,json,md,css,scss}'] = ['prettier --write'];\n }\n\n if (Object.keys(config).length === 0) {\n return null;\n }\n\n return config;\n}\n\n/**\n * Get Husky dependencies for package.json\n */\nexport function getHuskyDependencies(): string[] {\n return ['husky'];\n}\n\n/**\n * Get Husky setup instructions\n */\nexport function getHuskySetupInstructions(): string[] {\n return ['Run `pnpm exec husky init` to initialize Husky (or hooks were pre-configured)'];\n}\n","/**\n * Hooks exports\n */\n\nexport { installHooks, getHooksStatus } from './configurator.js';\n","/**\n * Hook configurator - generates and installs hook scripts\n */\n\nimport type { HookConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, makeExecutable, pathExists, writeFile } from '../utils/fs.js';\n\nconst HOOKS_DIR = '.claude/hooks';\n\n/**\n * Generate hook scripts based on configuration\n */\nexport async function installHooks(\n projectPath: string,\n config: HookConfig\n): Promise<{ installed: string[]; errors: string[] }> {\n const installed: string[] = [];\n const errors: string[] = [];\n\n if (!config.enabled) {\n return { installed, errors };\n }\n\n const hooksDir = joinPath(projectPath, HOOKS_DIR);\n await ensureDir(hooksDir);\n\n // Install notification hook\n if (config.notification) {\n try {\n const script = generateNotificationHook(config.notification);\n const scriptPath = joinPath(hooksDir, 'notification.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('notification.sh');\n } catch (error) {\n errors.push(`notification hook: ${error}`);\n }\n }\n\n // Install stop hook\n if (config.stop) {\n try {\n const script = generateStopHook(config.stop);\n const scriptPath = joinPath(hooksDir, 'stop.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('stop.sh');\n } catch (error) {\n errors.push(`stop hook: ${error}`);\n }\n }\n\n // Install subagent stop hook\n if (config.subagentStop) {\n try {\n const script = generateSubagentStopHook(config.subagentStop);\n const scriptPath = joinPath(hooksDir, 'subagent-stop.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('subagent-stop.sh');\n } catch (error) {\n errors.push(`subagent-stop hook: ${error}`);\n }\n }\n\n return { installed, errors };\n}\n\n/**\n * Generate notification hook script\n */\nfunction generateNotificationHook(config: HookConfig['notification']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code notification hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n 'MESSAGE=\"${1:-Claude needs your attention}\"',\n '',\n ];\n\n // Desktop notification\n if (config.desktop) {\n lines.push(\n '# Desktop notification',\n 'if command -v notify-send &> /dev/null; then',\n ' notify-send \"Claude Code\" \"$MESSAGE\" --icon=dialog-information',\n 'elif command -v terminal-notifier &> /dev/null; then',\n ' terminal-notifier -title \"Claude Code\" -message \"$MESSAGE\"',\n 'elif command -v osascript &> /dev/null; then',\n ' osascript -e \"display notification \\\\\"$MESSAGE\\\\\" with title \\\\\"Claude Code\\\\\"\"',\n 'fi',\n ''\n );\n }\n\n // Audio notification\n if (config.audio) {\n lines.push(\n '# Audio notification (text-to-speech)',\n 'if command -v piper &> /dev/null; then',\n ' echo \"$MESSAGE\" | piper --model ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw - 2>/dev/null',\n 'elif command -v say &> /dev/null; then',\n ' say \"$MESSAGE\"',\n 'elif command -v espeak &> /dev/null; then',\n ' espeak \"$MESSAGE\"',\n 'fi',\n ''\n );\n }\n\n // Custom command\n if (config.customCommand) {\n lines.push('# Custom notification command', `${config.customCommand} \"$MESSAGE\"`, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate stop hook script\n */\nfunction generateStopHook(config: HookConfig['stop']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code stop hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n ];\n\n if (config.beep) {\n lines.push(\n '# Play beep sound',\n 'if command -v aplay &> /dev/null; then',\n ' # Generate a beep using speaker-test or beep command',\n ' ( speaker-test -t sine -f 1000 -l 1 ) &>/dev/null & pid=$!; sleep 0.2; kill -9 $pid &>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay /System/Library/Sounds/Glass.aiff',\n 'elif command -v powershell.exe &> /dev/null; then',\n ' powershell.exe -c \"[console]::beep(1000,200)\"',\n 'else',\n ' printf \"\\\\a\"',\n 'fi',\n ''\n );\n } else if (config.customSound) {\n lines.push(\n '# Play custom sound',\n `SOUND_FILE=\"${config.customSound}\"`,\n 'if command -v aplay &> /dev/null; then',\n ' aplay \"$SOUND_FILE\" 2>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay \"$SOUND_FILE\"',\n 'elif command -v paplay &> /dev/null; then',\n ' paplay \"$SOUND_FILE\"',\n 'fi',\n ''\n );\n } else if (config.customCommand) {\n lines.push('# Custom stop command', config.customCommand, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate subagent stop hook script\n */\nfunction generateSubagentStopHook(config: HookConfig['subagentStop']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code subagent stop hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n ];\n\n if (config.beep) {\n lines.push(\n '# Play short beep',\n 'if command -v aplay &> /dev/null; then',\n ' ( speaker-test -t sine -f 800 -l 1 ) &>/dev/null & pid=$!; sleep 0.1; kill -9 $pid &>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay /System/Library/Sounds/Pop.aiff',\n 'else',\n ' printf \"\\\\a\"',\n 'fi',\n ''\n );\n } else if (config.customSound) {\n lines.push(\n '# Play custom sound',\n `SOUND_FILE=\"${config.customSound}\"`,\n 'if command -v aplay &> /dev/null; then',\n ' aplay \"$SOUND_FILE\" 2>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay \"$SOUND_FILE\"',\n 'fi',\n ''\n );\n } else if (config.customCommand) {\n lines.push('# Custom subagent stop command', config.customCommand, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Get hooks status\n */\nexport async function getHooksStatus(projectPath: string): Promise<{\n enabled: boolean;\n hooks: Array<{ name: string; exists: boolean; executable: boolean }>;\n}> {\n const hooksDir = joinPath(projectPath, HOOKS_DIR);\n const hookFiles = ['notification.sh', 'stop.sh', 'subagent-stop.sh'];\n const hooks: Array<{ name: string; exists: boolean; executable: boolean }> = [];\n\n for (const file of hookFiles) {\n const filePath = joinPath(hooksDir, file);\n const exists = await pathExists(filePath);\n\n let executable = false;\n if (exists) {\n try {\n const fs = await import('node:fs/promises');\n const stats = await fs.stat(filePath);\n executable = (stats.mode & 0o111) !== 0;\n } catch {\n // Ignore\n }\n }\n\n hooks.push({ name: file, exists, executable });\n }\n\n return {\n enabled: hooks.some((h) => h.exists),\n hooks,\n };\n}\n","/**\n * MCP exports\n */\n\nexport {\n installMcpServers,\n getInstalledMcpServers,\n removeMcpServer,\n getAvailableMcpServers,\n validateMcpConfig,\n} from './configurator.js';\n","/**\n * MCP configurator - generates MCP server configuration\n */\n\nimport * as os from 'node:os';\nimport { MCP_SERVERS, getMcpServer } from '../../constants/mcp-servers.js';\nimport type { McpConfig } from '../../types/config.js';\nimport type { McpInstallation, McpServerDefinition } from '../../types/mcp.js';\nimport { ensureDir, joinPath, pathExists, readJson, writeJson } from '../utils/fs.js';\n\nconst PROJECT_SETTINGS_FILE = '.claude/settings.local.json';\nconst USER_SETTINGS_FILE = '.claude/settings.json';\n\ninterface SettingsJson {\n mcpServers?: Record<string, McpServerEntry>;\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n [key: string]: unknown;\n}\n\ninterface McpServerEntry {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * Install MCP servers configuration\n */\nexport async function installMcpServers(\n projectPath: string,\n config: McpConfig\n): Promise<{ success: boolean; path: string; errors: string[] }> {\n const errors: string[] = [];\n\n if (config.servers.length === 0) {\n return { success: true, path: '', errors };\n }\n\n // Determine settings file path\n const settingsPath =\n config.level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n // Ensure directory exists\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n // Read existing settings or create new\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start with empty settings\n }\n }\n\n // Initialize mcpServers if needed\n if (!settings.mcpServers) {\n settings.mcpServers = {};\n }\n\n // Add server configurations\n for (const installation of config.servers) {\n try {\n const entry = generateServerEntry(installation);\n if (entry) {\n settings.mcpServers[installation.serverId] = entry;\n }\n } catch (error) {\n errors.push(`${installation.serverId}: ${error}`);\n }\n }\n\n // Write settings\n await writeJson(settingsPath, settings, { spaces: 2 });\n\n return { success: errors.length === 0, path: settingsPath, errors };\n } catch (error) {\n return {\n success: false,\n path: settingsPath,\n errors: [`Failed to write settings: ${error}`],\n };\n }\n}\n\n/**\n * Generate MCP server entry for settings.json\n */\nfunction generateServerEntry(installation: McpInstallation): McpServerEntry | null {\n const serverDef = getMcpServer(installation.serverId);\n\n // For known servers, use the package name\n const packageName = serverDef?.package || (installation.config.package as string);\n\n if (!packageName) {\n return null;\n }\n\n const entry: McpServerEntry = {\n command: 'npx',\n args: ['-y', packageName],\n };\n\n // Add environment variables from config\n const env: Record<string, string> = {};\n\n if (serverDef?.configFields) {\n for (const field of serverDef.configFields) {\n const value = installation.config[field.name];\n if (value !== undefined && field.envVar) {\n env[field.envVar] = String(value);\n }\n }\n }\n\n // Add any additional config as env vars\n for (const [key, value] of Object.entries(installation.config)) {\n if (key === 'package') continue;\n\n // Convert config key to env var format if not already an env var\n const envKey = key.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n if (!env[envKey] && value !== undefined) {\n env[envKey] = String(value);\n }\n }\n\n if (Object.keys(env).length > 0) {\n entry.env = env;\n }\n\n return entry;\n}\n\n/**\n * Get currently installed MCP servers\n */\nexport async function getInstalledMcpServers(\n projectPath: string\n): Promise<{ project: string[]; user: string[] }> {\n const result = { project: [] as string[], user: [] as string[] };\n\n // Check project settings\n const projectSettings = joinPath(projectPath, PROJECT_SETTINGS_FILE);\n if (await pathExists(projectSettings)) {\n try {\n const settings = await readJson<SettingsJson>(projectSettings);\n result.project = Object.keys(settings.mcpServers || {});\n } catch {\n // Ignore\n }\n }\n\n // Check user settings\n const userSettings = joinPath(os.homedir(), USER_SETTINGS_FILE);\n if (await pathExists(userSettings)) {\n try {\n const settings = await readJson<SettingsJson>(userSettings);\n result.user = Object.keys(settings.mcpServers || {});\n } catch {\n // Ignore\n }\n }\n\n return result;\n}\n\n/**\n * Remove MCP server from configuration\n */\nexport async function removeMcpServer(\n projectPath: string,\n serverId: string,\n level: 'user' | 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n if (!(await pathExists(settingsPath))) {\n return false;\n }\n\n try {\n const settings = await readJson<SettingsJson>(settingsPath);\n\n if (!settings.mcpServers || !settings.mcpServers[serverId]) {\n return false;\n }\n\n delete settings.mcpServers[serverId];\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available MCP servers (grouped by category)\n */\nexport function getAvailableMcpServers(): Record<string, McpServerDefinition[]> {\n const grouped: Record<string, McpServerDefinition[]> = {};\n\n for (const server of MCP_SERVERS) {\n if (!grouped[server.category]) {\n grouped[server.category] = [];\n }\n grouped[server.category].push(server);\n }\n\n return grouped;\n}\n\n/**\n * Validate MCP server configuration\n */\nexport function validateMcpConfig(installation: McpInstallation): {\n valid: boolean;\n missing: string[];\n} {\n const serverDef = getMcpServer(installation.serverId);\n\n if (!serverDef) {\n // Custom server - just check it has a package\n return {\n valid: !!installation.config.package,\n missing: installation.config.package ? [] : ['package'],\n };\n }\n\n const missing: string[] = [];\n\n if (serverDef.requiresConfig && serverDef.configFields) {\n for (const field of serverDef.configFields) {\n if (field.required && !installation.config[field.name]) {\n missing.push(field.name);\n }\n }\n }\n\n return {\n valid: missing.length === 0,\n missing,\n };\n}\n","/**\n * MCP Server definitions\n * Only includes verified, real npm packages\n */\n\nimport type { McpServerDefinition } from '../types/mcp.js';\n\n/**\n * Available MCP servers - all packages verified to exist on npm\n */\nexport const MCP_SERVERS: McpServerDefinition[] = [\n // ============================================\n // DOCUMENTATION & AI TOOLS\n // ============================================\n {\n id: 'context7',\n name: 'Context7',\n description: 'Up-to-date documentation lookup for libraries and frameworks',\n package: '@upstash/context7-mcp',\n category: 'documentation',\n requiresConfig: false,\n installInstructions:\n 'API keys provide higher rate limits. Get one at https://context7.com/dashboard',\n },\n {\n id: 'perplexity',\n name: 'Perplexity',\n description: 'Web search without leaving the MCP ecosystem via Sonar API',\n package: '@chatmcp/server-perplexity-ask',\n category: 'search',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Perplexity/Sonar API Key',\n envVar: 'PERPLEXITY_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://www.perplexity.ai/settings/api',\n },\n {\n id: 'sequential-thinking',\n name: 'Sequential Thinking',\n description: 'Dynamic problem-solving through structured thinking process',\n package: '@modelcontextprotocol/server-sequential-thinking',\n category: 'ai',\n requiresConfig: false,\n installInstructions: 'Helps break down complex problems into manageable steps.',\n },\n\n // ============================================\n // TESTING & BROWSER AUTOMATION\n // ============================================\n {\n id: 'puppeteer',\n name: 'Puppeteer',\n description: 'Headless Chrome automation for testing and scraping',\n package: '@modelcontextprotocol/server-puppeteer',\n category: 'testing',\n requiresConfig: false,\n },\n {\n id: 'playwright',\n name: 'Playwright',\n description: 'Browser automation via accessibility snapshots, not screenshots',\n package: '@playwright/mcp',\n category: 'testing',\n requiresConfig: false,\n installInstructions: 'Requires Node.js 18+. Supports Chrome, Firefox, WebKit.',\n },\n {\n id: 'chrome-devtools',\n name: 'Chrome DevTools',\n description: 'Control and inspect live Chrome browser with DevTools Protocol',\n package: 'chrome-devtools-mcp',\n category: 'testing',\n requiresConfig: false,\n installInstructions:\n 'Requires Chrome installed. For Claude Code: claude mcp add chrome-devtools npx chrome-devtools-mcp@latest',\n },\n\n // ============================================\n // VERSION CONTROL\n // ============================================\n {\n id: 'github',\n name: 'GitHub',\n description: 'GitHub API integration (issues, PRs, repos, file operations)',\n package: '@modelcontextprotocol/server-github',\n category: 'version-control',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: false,\n description: 'GitHub Personal Access Token',\n envVar: 'GITHUB_TOKEN',\n },\n ],\n installInstructions:\n 'Create a Personal Access Token at https://github.com/settings/tokens with repo scope.',\n },\n {\n id: 'gitlab',\n name: 'GitLab',\n description: 'GitLab API for project management, issues, and merge requests',\n package: '@modelcontextprotocol/server-gitlab',\n category: 'version-control',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: true,\n description: 'GitLab Personal Access Token',\n envVar: 'GITLAB_PERSONAL_ACCESS_TOKEN',\n },\n {\n name: 'apiUrl',\n type: 'string',\n required: false,\n description: 'GitLab API URL (default: https://gitlab.com/api/v4)',\n envVar: 'GITLAB_API_URL',\n default: 'https://gitlab.com/api/v4',\n },\n ],\n installInstructions:\n 'Create PAT at GitLab User Settings > Access Tokens with api, read_repository, write_repository scopes.',\n },\n\n // ============================================\n // DATABASES\n // ============================================\n {\n id: 'postgres',\n name: 'PostgreSQL',\n description: 'Read-only PostgreSQL database access with schema inspection',\n package: '@modelcontextprotocol/server-postgres',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'connectionString',\n type: 'string',\n required: false,\n description: 'PostgreSQL connection string',\n envVar: 'DATABASE_URL',\n },\n ],\n installInstructions: 'Connection string format: postgresql://user:password@host:port/database',\n },\n {\n id: 'mysql',\n name: 'MySQL',\n description: 'Read-only MySQL/MariaDB database access',\n package: '@modelcontextprotocol/server-mysql',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'connectionString',\n type: 'string',\n required: true,\n description: 'MySQL connection URL',\n envVar: 'MYSQL_URL',\n },\n ],\n installInstructions: 'Connection format: mysql://user:password@host:port/database',\n },\n {\n id: 'neon',\n name: 'Neon',\n description: 'Neon serverless PostgreSQL with branch management',\n package: '@neondatabase/mcp-server-neon',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Neon API Key',\n envVar: 'NEON_API_KEY',\n },\n ],\n installInstructions: 'Get your API key from https://console.neon.tech/app/settings/api-keys',\n },\n {\n id: 'sqlite',\n name: 'SQLite',\n description: 'SQLite database interaction and business intelligence',\n package: '@modelcontextprotocol/server-sqlite',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'dbPath',\n type: 'string',\n required: false,\n description: 'Path to SQLite database file',\n default: './data.db',\n },\n ],\n },\n {\n id: 'supabase',\n name: 'Supabase',\n description: 'Supabase projects, database, Edge Functions, and type generation',\n package: '@supabase/mcp-server-supabase',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'accessToken',\n type: 'string',\n required: false,\n description: 'Supabase Personal Access Token',\n envVar: 'SUPABASE_ACCESS_TOKEN',\n },\n ],\n installInstructions: 'Get your access token from https://supabase.com/dashboard/account/tokens',\n },\n\n // ============================================\n // CACHE & KEY-VALUE STORES\n // ============================================\n {\n id: 'redis',\n name: 'Redis',\n description: 'Redis key-value store operations (set, get, delete, list)',\n package: '@modelcontextprotocol/server-redis',\n category: 'cache',\n requiresConfig: true,\n configFields: [\n {\n name: 'url',\n type: 'string',\n required: false,\n description: 'Redis connection URL',\n envVar: 'REDIS_URL',\n default: 'redis://localhost:6379',\n },\n ],\n installInstructions:\n 'Pass Redis URL as argument: npx @modelcontextprotocol/server-redis redis://localhost:6379',\n },\n {\n id: 'upstash',\n name: 'Upstash',\n description: 'Upstash Redis database management and commands',\n package: '@upstash/mcp-server',\n category: 'cache',\n requiresConfig: true,\n configFields: [\n {\n name: 'email',\n type: 'string',\n required: false,\n description: 'Upstash account email',\n envVar: 'UPSTASH_EMAIL',\n },\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Upstash API Key',\n envVar: 'UPSTASH_API_KEY',\n },\n ],\n installInstructions: 'Get credentials from https://console.upstash.com',\n },\n\n // ============================================\n // DEPLOYMENT & INFRASTRUCTURE\n // ============================================\n {\n id: 'cloudflare',\n name: 'Cloudflare',\n description: 'Cloudflare Workers, D1, KV, R2, and DNS management',\n package: '@cloudflare/mcp-server-cloudflare',\n category: 'deployment',\n requiresConfig: true,\n configFields: [\n {\n name: 'accountId',\n type: 'string',\n required: false,\n description: 'Cloudflare Account ID',\n envVar: 'CLOUDFLARE_ACCOUNT_ID',\n },\n ],\n installInstructions: 'Run: npx @cloudflare/mcp-server-cloudflare init',\n },\n {\n id: 'vercel',\n name: 'Vercel',\n description: 'Vercel deployments, DNS records, and project management',\n package: 'vercel-mcp',\n category: 'deployment',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Vercel API Key',\n envVar: 'VERCEL_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://vercel.com/account/tokens',\n },\n {\n id: 'filesystem',\n name: 'Filesystem',\n description: 'Secure file operations with configurable access controls',\n package: '@modelcontextprotocol/server-filesystem',\n category: 'infrastructure',\n requiresConfig: false,\n },\n {\n id: 'memory',\n name: 'Memory',\n description: 'Knowledge graph-based persistent memory system',\n package: '@modelcontextprotocol/server-memory',\n category: 'infrastructure',\n requiresConfig: false,\n installInstructions: 'Memory is stored in memory.jsonl in the server directory by default.',\n },\n\n // ============================================\n // PROJECT MANAGEMENT & PRODUCTIVITY\n // ============================================\n {\n id: 'notion',\n name: 'Notion',\n description: 'Official Notion API for pages, databases, and workspace',\n package: '@notionhq/notion-mcp-server',\n category: 'project-mgmt',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: true,\n description: 'Notion Integration Token',\n envVar: 'NOTION_TOKEN',\n },\n ],\n installInstructions:\n 'Create integration at https://www.notion.so/profile/integrations and share pages with it.',\n },\n {\n id: 'obsidian',\n name: 'Obsidian',\n description: 'Read and search Obsidian vaults and Markdown directories',\n package: 'mcp-obsidian',\n category: 'project-mgmt',\n requiresConfig: true,\n configFields: [\n {\n name: 'vaultPath',\n type: 'string',\n required: true,\n description: 'Path to Obsidian vault',\n },\n ],\n installInstructions: 'Works with any Markdown directory. Point to your vault path.',\n },\n {\n id: 'n8n',\n name: 'n8n',\n description: 'n8n workflow automation node documentation and management',\n package: 'n8n-mcp',\n category: 'project-mgmt',\n requiresConfig: false,\n installInstructions: 'Provides access to 543 n8n nodes documentation.',\n },\n\n // ============================================\n // MONITORING & OBSERVABILITY\n // ============================================\n {\n id: 'sentry',\n name: 'Sentry',\n description: 'Query Sentry errors, issues, and project information',\n package: '@sentry/mcp-server',\n category: 'monitoring',\n requiresConfig: true,\n configFields: [\n {\n name: 'authToken',\n type: 'string',\n required: false,\n description: 'Sentry Auth Token',\n envVar: 'SENTRY_AUTH_TOKEN',\n },\n ],\n installInstructions:\n 'For Claude Code: claude mcp add --transport http sentry https://mcp.sentry.dev/mcp',\n },\n\n // ============================================\n // COMMUNICATION\n // ============================================\n {\n id: 'slack',\n name: 'Slack',\n description: 'Slack messaging, channels, and workspace interaction',\n package: '@modelcontextprotocol/server-slack',\n category: 'communication',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: false,\n description: 'Slack Bot Token (xoxb-...)',\n envVar: 'SLACK_BOT_TOKEN',\n },\n ],\n installInstructions:\n 'Create a Slack app at https://api.slack.com/apps and install to your workspace.',\n },\n\n // ============================================\n // DESIGN\n // ============================================\n {\n id: 'figma',\n name: 'Figma',\n description: 'Figma layout information for AI coding agents',\n package: 'figma-developer-mcp',\n category: 'design',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Figma Personal Access Token',\n envVar: 'FIGMA_API_KEY',\n },\n ],\n installInstructions: 'Create token at https://www.figma.com/developers/api#access-tokens',\n },\n {\n id: 'shadcn',\n name: 'shadcn/ui',\n description: 'shadcn/ui component docs, installation, and code generation',\n package: '@heilgar/shadcn-ui-mcp-server',\n category: 'ui-library',\n requiresConfig: false,\n installInstructions: 'Supports npm, pnpm, yarn, and bun package managers.',\n },\n {\n id: 'magic-ui',\n name: '21st.dev Magic',\n description: 'AI-driven UI component generation through natural language',\n package: '@21st-dev/magic',\n category: 'ui-library',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: '21st.dev Magic API Key',\n envVar: 'TWENTYFIRST_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://21st.dev/magic/console',\n },\n\n // ============================================\n // PAYMENTS\n // ============================================\n {\n id: 'stripe',\n name: 'Stripe',\n description: 'Stripe payments API with MCP support via Agent Toolkit',\n package: '@stripe/agent-toolkit',\n category: 'payments',\n requiresConfig: true,\n configFields: [\n {\n name: 'secretKey',\n type: 'string',\n required: false,\n description: 'Stripe Secret Key',\n envVar: 'STRIPE_SECRET_KEY',\n },\n ],\n installInstructions:\n 'Get API keys at https://dashboard.stripe.com/apikeys. Run: npx -y @stripe/mcp --tools=all --api-key=YOUR_KEY',\n },\n {\n id: 'mercadopago',\n name: 'Mercado Pago',\n description: 'Mercado Pago payments, refunds, and customer management',\n package: 'mercado-pago-mcp',\n category: 'payments',\n requiresConfig: true,\n configFields: [\n {\n name: 'accessToken',\n type: 'string',\n required: true,\n description: 'Mercado Pago Access Token',\n envVar: 'MERCADOPAGO_ACCESS_TOKEN',\n },\n {\n name: 'environment',\n type: 'string',\n required: false,\n description: 'Environment (sandbox or production)',\n default: 'sandbox',\n },\n ],\n installInstructions: 'Get credentials at https://www.mercadopago.com/developers/panel/app',\n },\n\n // ============================================\n // SEARCH\n // ============================================\n {\n id: 'brave-search',\n name: 'Brave Search',\n description: 'Web and local search using Brave Search API',\n package: '@modelcontextprotocol/server-brave-search',\n category: 'search',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Brave Search API Key',\n envVar: 'BRAVE_API_KEY',\n },\n ],\n installInstructions: 'Get an API key at https://brave.com/search/api/',\n },\n];\n\n/**\n * Get MCP server by ID\n */\nexport function getMcpServer(id: string): McpServerDefinition | undefined {\n return MCP_SERVERS.find((s) => s.id === id);\n}\n\n/**\n * Get MCP servers by category\n */\nexport function getMcpServersByCategory(\n category: McpServerDefinition['category']\n): McpServerDefinition[] {\n return MCP_SERVERS.filter((s) => s.category === category);\n}\n\n/**\n * Get all MCP server IDs\n */\nexport function getMcpServerIds(): string[] {\n return MCP_SERVERS.map((s) => s.id);\n}\n","/**\n * Modules exports\n */\n\n// Registry\nexport {\n loadRegistry,\n getModule,\n getAllModules,\n getModulesByTag,\n filterModules,\n getModuleIds,\n validateModuleIds,\n} from './registry.js';\n\n// Resolver\nexport {\n resolveModules,\n resolveAllModules,\n getDependents,\n checkRemovalImpact,\n getSuggestedModules,\n sortByDependencies,\n type ResolvedModule,\n type ResolutionResult,\n} from './resolver.js';\n\n// Installer\nexport {\n installModules,\n installAllModules,\n uninstallModule,\n isModuleInstalled,\n getInstalledModules,\n installExtras,\n removeConfigRequiredFromFrontmatter,\n type InstallOptions,\n type InstallResult,\n} from './installer.js';\n","/**\n * Module registry - reads and manages module definitions from templates\n */\n\nimport type {\n ModuleCategory,\n ModuleDefinition,\n ModuleRegistry,\n RegistryFile,\n} from '../../types/modules.js';\nimport { joinPath, listDirs, pathExists, readJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst REGISTRY_FILE = '_registry.json';\n\n/**\n * Load module registry from a templates directory\n */\nexport async function loadRegistry(templatesPath: string): Promise<ModuleRegistry> {\n const registry: ModuleRegistry = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const categoryPath = joinPath(templatesPath, category);\n\n if (!(await pathExists(categoryPath))) {\n logger.debug(`Category path not found: ${categoryPath}`);\n continue;\n }\n\n const modules = await loadCategoryModules(categoryPath, category);\n registry[category] = modules;\n }\n\n return registry;\n}\n\n/**\n * Load modules for a specific category\n */\nasync function loadCategoryModules(\n categoryPath: string,\n category: ModuleCategory\n): Promise<ModuleDefinition[]> {\n const registryPath = joinPath(categoryPath, REGISTRY_FILE);\n\n // Try to load from _registry.json first\n if (await pathExists(registryPath)) {\n try {\n const registryFile = await readJson<RegistryFile>(registryPath);\n return registryFile.modules.map((item) => ({\n id: item.id,\n name: item.name,\n description: item.description || '',\n category,\n file: item.file,\n dependencies: item.dependencies || [],\n tags: item.tags || [],\n }));\n } catch (error) {\n logger.debug(`Failed to load registry from ${registryPath}: ${error}`);\n }\n }\n\n // Fallback: scan directory for .md files\n return scanCategoryDirectory(categoryPath, category);\n}\n\n/**\n * Scan directory for module files when no registry exists\n */\nasync function scanCategoryDirectory(\n categoryPath: string,\n category: ModuleCategory\n): Promise<ModuleDefinition[]> {\n const modules: ModuleDefinition[] = [];\n\n // Get subdirectories (groups like 'engineering', 'quality', etc.)\n const subdirs = await listDirs('*', { cwd: categoryPath });\n\n for (const subdir of subdirs) {\n if (subdir.startsWith('_')) continue; // Skip special directories\n\n const subdirPath = joinPath(categoryPath, subdir);\n const files = await scanForModuleFiles(subdirPath);\n\n for (const file of files) {\n const id = file.replace('.md', '');\n modules.push({\n id,\n name: formatName(id),\n description: '',\n category,\n file: `${subdir}/${file}`,\n dependencies: [],\n tags: [subdir],\n });\n }\n }\n\n // Also scan root of category\n const rootFiles = await scanForModuleFiles(categoryPath);\n for (const file of rootFiles) {\n if (file === REGISTRY_FILE) continue;\n\n const id = file.replace('.md', '');\n modules.push({\n id,\n name: formatName(id),\n description: '',\n category,\n file,\n dependencies: [],\n tags: [],\n });\n }\n\n return modules;\n}\n\n/**\n * Scan a directory for module files (.md)\n */\nasync function scanForModuleFiles(dirPath: string): Promise<string[]> {\n const { glob } = await import('glob');\n const files = await glob('*.md', { cwd: dirPath });\n return files.filter((f) => !f.startsWith('_') && f !== 'README.md');\n}\n\n/**\n * Format ID to display name\n */\nfunction formatName(id: string): string {\n return id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Get module by ID from registry\n */\nexport function getModule(\n registry: ModuleRegistry,\n category: ModuleCategory,\n id: string\n): ModuleDefinition | undefined {\n return registry[category].find((m) => m.id === id);\n}\n\n/**\n * Get all modules from registry\n */\nexport function getAllModules(registry: ModuleRegistry): ModuleDefinition[] {\n return [...registry.agents, ...registry.skills, ...registry.commands, ...registry.docs];\n}\n\n/**\n * Get modules by tag\n */\nexport function getModulesByTag(\n registry: ModuleRegistry,\n category: ModuleCategory,\n tag: string\n): ModuleDefinition[] {\n return registry[category].filter((m) => m.tags?.includes(tag));\n}\n\n/**\n * Filter modules by IDs or tags\n * Presets use tags (e.g., 'core', 'quality'), so we match both IDs and tags\n */\nexport function filterModules(\n registry: ModuleRegistry,\n category: ModuleCategory,\n idsOrTags: string[]\n): ModuleDefinition[] {\n const filterSet = new Set(idsOrTags);\n return registry[category].filter((m) => {\n // Match by ID\n if (filterSet.has(m.id)) return true;\n // Match by any tag\n if (m.tags?.some((tag) => filterSet.has(tag))) return true;\n return false;\n });\n}\n\n/**\n * Get module IDs for a category\n */\nexport function getModuleIds(registry: ModuleRegistry, category: ModuleCategory): string[] {\n return registry[category].map((m) => m.id);\n}\n\n/**\n * Validate that all requested modules exist\n */\nexport function validateModuleIds(\n registry: ModuleRegistry,\n category: ModuleCategory,\n ids: string[]\n): { valid: string[]; invalid: string[] } {\n const available = new Set(getModuleIds(registry, category));\n const valid: string[] = [];\n const invalid: string[] = [];\n\n for (const id of ids) {\n if (available.has(id)) {\n valid.push(id);\n } else {\n invalid.push(id);\n }\n }\n\n return { valid, invalid };\n}\n","/**\n * Module resolver - resolves module dependencies and order\n */\n\nimport type { ModuleCategory, ModuleDefinition, ModuleRegistry } from '../../types/modules.js';\nimport { getAllModules, getModule } from './registry.js';\n\nexport interface ResolvedModule extends ModuleDefinition {\n resolvedDependencies: string[];\n installOrder: number;\n}\n\nexport interface ResolutionResult {\n resolved: ResolvedModule[];\n unresolved: string[];\n circular: string[];\n}\n\n/**\n * Resolve dependencies for selected modules\n */\nexport function resolveModules(\n registry: ModuleRegistry,\n category: ModuleCategory,\n selectedIds: string[]\n): ResolutionResult {\n const resolved: Map<string, ResolvedModule> = new Map();\n const unresolved: string[] = [];\n const circular: string[] = [];\n const visiting = new Set<string>();\n let order = 0;\n\n function visit(id: string): boolean {\n if (resolved.has(id)) return true;\n\n if (visiting.has(id)) {\n circular.push(id);\n return false;\n }\n\n const module = getModule(registry, category, id);\n if (!module) {\n unresolved.push(id);\n return false;\n }\n\n visiting.add(id);\n\n // Resolve dependencies first\n const resolvedDeps: string[] = [];\n for (const depId of module.dependencies || []) {\n if (visit(depId)) {\n resolvedDeps.push(depId);\n }\n }\n\n visiting.delete(id);\n\n // Add this module\n resolved.set(id, {\n ...module,\n resolvedDependencies: resolvedDeps,\n installOrder: order++,\n });\n\n return true;\n }\n\n // Visit all selected modules\n for (const id of selectedIds) {\n visit(id);\n }\n\n return {\n resolved: Array.from(resolved.values()).sort((a, b) => a.installOrder - b.installOrder),\n unresolved,\n circular,\n };\n}\n\n/**\n * Resolve all dependencies for a set of modules across all categories\n */\nexport function resolveAllModules(\n registry: ModuleRegistry,\n selection: Record<ModuleCategory, string[]>\n): Record<ModuleCategory, ResolutionResult> {\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n const results: Record<ModuleCategory, ResolutionResult> = {} as Record<\n ModuleCategory,\n ResolutionResult\n >;\n\n for (const category of categories) {\n results[category] = resolveModules(registry, category, selection[category] || []);\n }\n\n return results;\n}\n\n/**\n * Get modules that depend on a given module\n */\nexport function getDependents(\n registry: ModuleRegistry,\n category: ModuleCategory,\n moduleId: string\n): ModuleDefinition[] {\n return registry[category].filter((m) => m.dependencies?.includes(moduleId));\n}\n\n/**\n * Check if removing a module would break dependencies\n */\nexport function checkRemovalImpact(\n registry: ModuleRegistry,\n category: ModuleCategory,\n moduleId: string,\n installedIds: string[]\n): { canRemove: boolean; blockedBy: string[] } {\n const dependents = getDependents(registry, category, moduleId);\n const blockedBy = dependents.filter((d) => installedIds.includes(d.id)).map((d) => d.id);\n\n return {\n canRemove: blockedBy.length === 0,\n blockedBy,\n };\n}\n\n/**\n * Get suggested modules based on installed ones\n */\nexport function getSuggestedModules(\n registry: ModuleRegistry,\n installedModules: Record<ModuleCategory, string[]>\n): ModuleDefinition[] {\n const suggestions: ModuleDefinition[] = [];\n const allInstalled = new Set<string>();\n\n // Collect all installed module IDs\n for (const ids of Object.values(installedModules)) {\n for (const id of ids) {\n allInstalled.add(id);\n }\n }\n\n // Find modules with tags that match installed modules\n const allModules = getAllModules(registry);\n const installedTags = new Set<string>();\n\n for (const module of allModules) {\n if (allInstalled.has(module.id)) {\n for (const tag of module.tags || []) {\n installedTags.add(tag);\n }\n }\n }\n\n // Suggest modules with matching tags that aren't installed\n for (const module of allModules) {\n if (allInstalled.has(module.id)) continue;\n\n const hasMatchingTag = (module.tags || []).some((tag) => installedTags.has(tag));\n if (hasMatchingTag) {\n suggestions.push(module);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Sort modules by install order (dependencies first)\n */\nexport function sortByDependencies(modules: ModuleDefinition[]): ModuleDefinition[] {\n const sorted: ModuleDefinition[] = [];\n const visited = new Set<string>();\n const moduleMap = new Map(modules.map((m) => [m.id, m]));\n\n function visit(module: ModuleDefinition): void {\n if (visited.has(module.id)) return;\n visited.add(module.id);\n\n // Visit dependencies first\n for (const depId of module.dependencies || []) {\n const dep = moduleMap.get(depId);\n if (dep) {\n visit(dep);\n }\n }\n\n sorted.push(module);\n }\n\n for (const module of modules) {\n visit(module);\n }\n\n return sorted;\n}\n","/**\n * Module installer - copies and configures module files\n */\n\nimport type { ModuleCategory, ModuleDefinition } from '../../types/modules.js';\nimport {\n copy,\n dirname,\n ensureDir,\n joinPath,\n pathExists,\n readFile,\n writeFile,\n} from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Remove config_required section from YAML frontmatter in markdown files\n * This cleans up template files after installation\n */\nexport function removeConfigRequiredFromFrontmatter(content: string): string {\n // Match YAML frontmatter (starts with ---, ends with ---)\n const frontmatterRegex = /^---\\n([\\s\\S]*?)\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n return content;\n }\n\n const frontmatter = match[1];\n\n // Remove config_required section from frontmatter\n // It can be multi-line with indented items like:\n // config_required:\n // - KEY: \"description\"\n // - KEY2: \"description2\"\n // The regex needs to match the key and all following indented lines\n const configRequiredRegex = /config_required:\\s*\\n(?:\\s+-\\s+[^\\n]+\\n?)*/g;\n const cleanedFrontmatter = frontmatter.replace(configRequiredRegex, '').trim();\n\n // Reconstruct the file\n const restOfFile = content.slice(match[0].length);\n\n // If frontmatter is now empty except for required fields, keep it minimal\n if (cleanedFrontmatter.trim() === '') {\n return restOfFile.trim();\n }\n\n return `---\\n${cleanedFrontmatter}\\n---${restOfFile}`;\n}\n\n/**\n * Process a module file after copying to clean up config_required\n */\nasync function processModuleFile(filePath: string): Promise<void> {\n // Only process markdown files\n if (!filePath.endsWith('.md')) {\n return;\n }\n\n try {\n const content = await readFile(filePath);\n const cleanedContent = removeConfigRequiredFromFrontmatter(content);\n\n // Only write if content changed\n if (cleanedContent !== content) {\n await writeFile(filePath, cleanedContent);\n logger.debug(`Cleaned config_required from: ${filePath}`);\n }\n } catch (error) {\n logger.debug(`Failed to process module file ${filePath}: ${error}`);\n }\n}\n\nexport interface InstallOptions {\n templatesPath: string;\n targetPath: string;\n overwrite?: boolean;\n dryRun?: boolean;\n}\n\nexport interface InstallResult {\n success: boolean;\n installed: string[];\n skipped: string[];\n failed: Array<{ id: string; error: string }>;\n}\n\n/**\n * Install modules for a category\n */\nexport async function installModules(\n category: ModuleCategory,\n modules: ModuleDefinition[],\n options: InstallOptions\n): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const categorySourcePath = joinPath(options.templatesPath, category);\n const categoryTargetPath = joinPath(options.targetPath, '.claude', category);\n\n // Ensure target directory exists\n if (!options.dryRun) {\n await ensureDir(categoryTargetPath);\n }\n\n for (const module of modules) {\n try {\n const sourcePath = joinPath(categorySourcePath, module.file);\n const targetPath = joinPath(categoryTargetPath, module.file);\n\n // Check if source exists\n if (!(await pathExists(sourcePath))) {\n result.failed.push({ id: module.id, error: `Source file not found: ${sourcePath}` });\n result.success = false;\n continue;\n }\n\n // Check if target exists\n const targetExists = await pathExists(targetPath);\n if (targetExists && !options.overwrite) {\n result.skipped.push(module.id);\n continue;\n }\n\n if (options.dryRun) {\n logger.debug(`Would install: ${module.id} -> ${targetPath}`);\n result.installed.push(module.id);\n continue;\n }\n\n // Ensure target directory exists\n await ensureDir(dirname(targetPath));\n\n // Copy file\n await copy(sourcePath, targetPath, { overwrite: options.overwrite });\n\n // Process the file to clean up config_required\n await processModuleFile(targetPath);\n\n result.installed.push(module.id);\n\n logger.debug(`Installed: ${module.id}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failed.push({ id: module.id, error: errorMessage });\n result.success = false;\n }\n }\n\n return result;\n}\n\n/**\n * Install README file for a category\n */\nasync function installCategoryReadme(\n category: ModuleCategory,\n options: InstallOptions\n): Promise<void> {\n const sourceReadme = joinPath(options.templatesPath, category, 'README.md');\n const targetReadme = joinPath(options.targetPath, '.claude', category, 'README.md');\n\n // Check if source README exists\n if (!(await pathExists(sourceReadme))) {\n logger.debug(`No README found for category: ${category}`);\n return;\n }\n\n // Check if target exists\n const targetExists = await pathExists(targetReadme);\n if (targetExists && !options.overwrite) {\n logger.debug(`README already exists for ${category}, skipping`);\n return;\n }\n\n if (options.dryRun) {\n logger.debug(`Would install README for ${category}`);\n return;\n }\n\n try {\n await copy(sourceReadme, targetReadme, { overwrite: options.overwrite });\n logger.debug(`Installed README for ${category}`);\n } catch (error) {\n logger.debug(`Failed to install README for ${category}: ${error}`);\n }\n}\n\n/**\n * Install all modules with progress tracking\n */\nexport async function installAllModules(\n modulesByCategory: Record<ModuleCategory, ModuleDefinition[]>,\n options: InstallOptions\n): Promise<Record<ModuleCategory, InstallResult>> {\n const results: Record<ModuleCategory, InstallResult> = {} as Record<\n ModuleCategory,\n InstallResult\n >;\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const modules = modulesByCategory[category] || [];\n if (modules.length === 0) {\n results[category] = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n continue;\n }\n\n results[category] = await withSpinner(\n `Installing ${category} (${modules.length} modules)...`,\n () => installModules(category, modules, options),\n {\n successText: `Installed ${modules.length} ${category}`,\n silent: options.dryRun,\n }\n );\n\n // Install README for this category\n await installCategoryReadme(category, options);\n }\n\n return results;\n}\n\n/**\n * Uninstall a module\n */\nexport async function uninstallModule(\n category: ModuleCategory,\n moduleId: string,\n targetPath: string\n): Promise<{ success: boolean; error?: string }> {\n const { remove } = await import('../utils/fs.js');\n\n try {\n const modulePath = joinPath(targetPath, '.claude', category, `${moduleId}.md`);\n\n if (!(await pathExists(modulePath))) {\n return { success: false, error: 'Module file not found' };\n }\n\n await remove(modulePath);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Check if a module is installed\n */\nexport async function isModuleInstalled(\n category: ModuleCategory,\n moduleId: string,\n targetPath: string\n): Promise<boolean> {\n // Try common file patterns\n const patterns = [\n joinPath(targetPath, '.claude', category, `${moduleId}.md`),\n joinPath(targetPath, '.claude', category, '**', `${moduleId}.md`),\n ];\n\n for (const pattern of patterns) {\n if (await pathExists(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get installed modules for a category\n */\nexport async function getInstalledModules(\n category: ModuleCategory,\n targetPath: string\n): Promise<string[]> {\n const { listFiles } = await import('../utils/fs.js');\n\n const categoryPath = joinPath(targetPath, '.claude', category);\n if (!(await pathExists(categoryPath))) {\n return [];\n }\n\n const files = await listFiles('**/*.md', { cwd: categoryPath });\n return files\n .filter((f) => !f.startsWith('_') && f !== 'README.md')\n .map((f) => {\n const parts = f.replace(/\\.md$/, '').split('/');\n return parts[parts.length - 1] ?? '';\n })\n .filter(Boolean);\n}\n\n/**\n * Copy extra files (schemas, scripts, hooks, sessions)\n */\nexport async function installExtras(\n extras: { schemas?: boolean; scripts?: boolean; hooks?: boolean; sessions?: boolean },\n options: InstallOptions\n): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const extraDirs = [\n { name: 'schemas', enabled: extras.schemas },\n { name: 'scripts', enabled: extras.scripts },\n { name: 'hooks', enabled: extras.hooks },\n { name: 'sessions', enabled: extras.sessions },\n ];\n\n for (const { name, enabled } of extraDirs) {\n if (!enabled) continue;\n\n const sourcePath = joinPath(options.templatesPath, name);\n const targetPath = joinPath(options.targetPath, '.claude', name);\n\n if (!(await pathExists(sourcePath))) {\n logger.debug(`Extra directory not found: ${sourcePath}`);\n continue;\n }\n\n try {\n if (options.dryRun) {\n logger.debug(`Would copy: ${name} -> ${targetPath}`);\n result.installed.push(name);\n continue;\n }\n\n const targetExists = await pathExists(targetPath);\n if (targetExists && !options.overwrite) {\n result.skipped.push(name);\n continue;\n }\n\n await copy(sourcePath, targetPath, { overwrite: options.overwrite });\n result.installed.push(name);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failed.push({ id: name, error: errorMessage });\n result.success = false;\n }\n }\n\n return result;\n}\n","/**\n * NPM package.json management module\n */\n\nexport {\n readPackageJson,\n writePackageJson,\n createMinimalPackageJson,\n generatePackageJsonChanges,\n updatePackageJson,\n getInstallCommand,\n formatPackageManagerField,\n deriveToolSelectionFromCodeStyle,\n getSetupInstructions,\n} from './package-manager.js';\n","/**\n * Package.json management utilities\n */\n\nimport {\n COMMITLINT_DEPENDENCIES,\n HUSKY_DEPENDENCIES,\n TYPESCRIPT_DEPENDENCIES,\n getFormatterDependencies,\n getLinterDependencies,\n getTestRunnerDependencies,\n mergeToolDependencies,\n} from '../../constants/npm-dependencies.js';\nimport type {\n DependencyGenerationConfig,\n PackageJson,\n PackageJsonChanges,\n PackageJsonUpdateOptions,\n PackageJsonUpdateResult,\n ToolSelection,\n} from '../../types/package-json.js';\nimport type { PackageManager } from '../../types/scaffold.js';\nimport { joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Read package.json from a directory\n */\nexport async function readPackageJson(projectPath: string): Promise<PackageJson | null> {\n const packageJsonPath = joinPath(projectPath, 'package.json');\n\n if (!(await pathExists(packageJsonPath))) {\n return null;\n }\n\n try {\n const content = await readFile(packageJsonPath);\n return JSON.parse(content) as PackageJson;\n } catch (error) {\n logger.debug(`Failed to parse package.json: ${error}`);\n return null;\n }\n}\n\n/**\n * Write package.json to a directory\n */\nexport async function writePackageJson(\n projectPath: string,\n packageJson: PackageJson\n): Promise<void> {\n const packageJsonPath = joinPath(projectPath, 'package.json');\n const content = `${JSON.stringify(packageJson, null, 2)}\\n`;\n await writeFile(packageJsonPath, content);\n}\n\n/**\n * Create a minimal package.json\n */\nexport function createMinimalPackageJson(options: {\n name?: string;\n description?: string;\n version?: string;\n type?: 'module' | 'commonjs';\n author?: string;\n license?: string;\n}): PackageJson {\n return {\n name: options.name || 'my-project',\n version: options.version || '0.0.1',\n description: options.description || '',\n type: options.type || 'module',\n scripts: {},\n dependencies: {},\n devDependencies: {},\n ...(options.author ? { author: options.author } : {}),\n ...(options.license ? { license: options.license } : {}),\n };\n}\n\n/**\n * Generate package.json changes based on tool selection\n */\nexport function generatePackageJsonChanges(config: DependencyGenerationConfig): PackageJsonChanges {\n const { tools, project } = config;\n const changes: PackageJsonChanges = {\n scripts: {},\n dependencies: {},\n devDependencies: {},\n };\n\n // Collect all tool dependencies\n const toolDeps = mergeToolDependencies(\n tools.linter && tools.linter !== 'none' ? getLinterDependencies(tools.linter) : undefined,\n tools.formatter && tools.formatter !== 'none'\n ? getFormatterDependencies(tools.formatter)\n : undefined,\n tools.testRunner && tools.testRunner !== 'none'\n ? getTestRunnerDependencies(tools.testRunner)\n : undefined,\n tools.commitlint ? COMMITLINT_DEPENDENCIES : undefined,\n tools.husky ? HUSKY_DEPENDENCIES : undefined,\n tools.typescript ? TYPESCRIPT_DEPENDENCIES : undefined\n );\n\n // Add packages to changes\n for (const pkg of toolDeps.packages) {\n if (pkg.isDev) {\n if (changes.devDependencies) {\n changes.devDependencies[pkg.name] = pkg.version;\n }\n } else {\n if (changes.dependencies) {\n changes.dependencies[pkg.name] = pkg.version;\n }\n }\n }\n\n // Add scripts to changes\n for (const script of toolDeps.scripts) {\n if (changes.scripts) {\n changes.scripts[script.name] = script.command;\n }\n }\n\n // Add metadata if provided\n if (project) {\n changes.metadata = {\n name: project.name,\n description: project.description,\n author: project.author,\n license: project.license,\n repository: project.repository,\n };\n }\n\n return changes;\n}\n\n/**\n * Apply changes to package.json\n */\nexport async function updatePackageJson(\n projectPath: string,\n changes: PackageJsonChanges,\n options: PackageJsonUpdateOptions = {}\n): Promise<PackageJsonUpdateResult> {\n const {\n scriptsMerge = 'skip-existing',\n dependenciesMerge = 'skip-existing',\n createIfMissing = true,\n backup = false,\n dryRun = false,\n } = options;\n\n const result: PackageJsonUpdateResult = {\n success: false,\n path: joinPath(projectPath, 'package.json'),\n created: false,\n modified: false,\n addedScripts: [],\n skippedScripts: [],\n addedDependencies: [],\n skippedDependencies: [],\n addedDevDependencies: [],\n skippedDevDependencies: [],\n };\n\n try {\n let packageJson = await readPackageJson(projectPath);\n\n // Create if missing\n if (!packageJson) {\n if (!createIfMissing) {\n result.error = 'package.json not found and createIfMissing is false';\n return result;\n }\n packageJson = createMinimalPackageJson({\n name: changes.metadata?.name,\n description: changes.metadata?.description,\n author: typeof changes.metadata?.author === 'string' ? changes.metadata.author : undefined,\n license: changes.metadata?.license,\n });\n result.created = true;\n }\n\n // Backup if requested\n if (backup && !dryRun && !result.created) {\n const backupPath = joinPath(projectPath, 'package.json.backup');\n await writeFile(backupPath, JSON.stringify(packageJson, null, 2));\n }\n\n // Apply metadata changes\n if (changes.metadata) {\n if (changes.metadata.name && !packageJson.name) {\n packageJson.name = changes.metadata.name;\n result.modified = true;\n }\n if (changes.metadata.description && !packageJson.description) {\n packageJson.description = changes.metadata.description;\n result.modified = true;\n }\n if (changes.metadata.author && !packageJson.author) {\n packageJson.author = changes.metadata.author;\n result.modified = true;\n }\n if (changes.metadata.license && !packageJson.license) {\n packageJson.license = changes.metadata.license;\n result.modified = true;\n }\n if (changes.metadata.repository && !packageJson.repository) {\n packageJson.repository = changes.metadata.repository;\n result.modified = true;\n }\n if (changes.metadata.type && !packageJson.type) {\n packageJson.type = changes.metadata.type;\n result.modified = true;\n }\n if (changes.metadata.engines && !packageJson.engines) {\n packageJson.engines = changes.metadata.engines;\n result.modified = true;\n }\n if (changes.metadata.packageManager && !packageJson.packageManager) {\n packageJson.packageManager = changes.metadata.packageManager;\n result.modified = true;\n }\n }\n\n // Apply scripts\n if (changes.scripts) {\n packageJson.scripts = packageJson.scripts || {};\n for (const [name, command] of Object.entries(changes.scripts)) {\n const exists = name in packageJson.scripts;\n if (exists) {\n if (scriptsMerge === 'skip-existing') {\n result.skippedScripts.push(name);\n continue;\n }\n if (scriptsMerge === 'replace') {\n // Only add new ones, don't touch existing\n result.skippedScripts.push(name);\n continue;\n }\n }\n packageJson.scripts[name] = command;\n result.addedScripts.push(name);\n result.modified = true;\n }\n }\n\n // Apply dependencies\n if (changes.dependencies) {\n packageJson.dependencies = packageJson.dependencies || {};\n for (const [name, version] of Object.entries(changes.dependencies)) {\n const exists = name in packageJson.dependencies;\n if (exists) {\n if (dependenciesMerge === 'skip-existing') {\n result.skippedDependencies.push(name);\n continue;\n }\n if (dependenciesMerge === 'replace') {\n result.skippedDependencies.push(name);\n continue;\n }\n }\n packageJson.dependencies[name] = version;\n result.addedDependencies.push(name);\n result.modified = true;\n }\n }\n\n // Apply devDependencies\n if (changes.devDependencies) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n for (const [name, version] of Object.entries(changes.devDependencies)) {\n const exists = name in packageJson.devDependencies;\n if (exists) {\n if (dependenciesMerge === 'skip-existing') {\n result.skippedDevDependencies.push(name);\n continue;\n }\n if (dependenciesMerge === 'replace') {\n result.skippedDevDependencies.push(name);\n continue;\n }\n }\n packageJson.devDependencies[name] = version;\n result.addedDevDependencies.push(name);\n result.modified = true;\n }\n }\n\n // Write changes\n if (!dryRun && (result.created || result.modified)) {\n await writePackageJson(projectPath, packageJson);\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n return result;\n }\n}\n\n/**\n * Get install command for the package manager\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'npm':\n return 'npm install';\n case 'yarn':\n return 'yarn';\n case 'pnpm':\n return 'pnpm install';\n case 'bun':\n return 'bun install';\n default:\n return 'npm install';\n }\n}\n\n/**\n * Format package manager string for package.json\n */\nexport function formatPackageManagerField(\n packageManager: PackageManager,\n version?: string\n): string {\n const versions: Record<PackageManager, string> = {\n npm: version || '10.0.0',\n yarn: version || '4.0.0',\n pnpm: version || '9.0.0',\n bun: version || '1.0.0',\n };\n return `${packageManager}@${versions[packageManager]}`;\n}\n\n/**\n * Derive tool selection from code style config\n */\nexport function deriveToolSelectionFromCodeStyle(codeStyle: {\n biome?: boolean;\n prettier?: boolean;\n commitlint?: boolean;\n}): Partial<ToolSelection> {\n const selection: Partial<ToolSelection> = {};\n\n if (codeStyle.biome) {\n selection.linter = 'biome';\n selection.formatter = 'biome';\n }\n\n if (codeStyle.prettier) {\n // If both biome and prettier are enabled, prettier takes formatter role\n selection.formatter = 'prettier';\n }\n\n if (codeStyle.commitlint) {\n selection.commitlint = true;\n selection.husky = true; // Commitlint typically needs husky\n }\n\n return selection;\n}\n\n/**\n * Get setup instructions for tools\n */\nexport function getSetupInstructions(tools: ToolSelection): string[] {\n const instructions: string[] = [];\n\n const toolDeps = mergeToolDependencies(\n tools.linter && tools.linter !== 'none' ? getLinterDependencies(tools.linter) : undefined,\n tools.formatter && tools.formatter !== 'none'\n ? getFormatterDependencies(tools.formatter)\n : undefined,\n tools.testRunner && tools.testRunner !== 'none'\n ? getTestRunnerDependencies(tools.testRunner)\n : undefined,\n tools.commitlint ? COMMITLINT_DEPENDENCIES : undefined,\n tools.husky ? HUSKY_DEPENDENCIES : undefined,\n tools.typescript ? TYPESCRIPT_DEPENDENCIES : undefined\n );\n\n if (toolDeps.setupInstructions) {\n instructions.push(...toolDeps.setupInstructions);\n }\n\n return instructions;\n}\n","/**\n * NPM dependencies configuration for code style and development tools\n */\n\n/**\n * NPM package definition\n */\nexport interface NpmPackage {\n /** Package name */\n name: string;\n /** Recommended version (semver range) */\n version: string;\n /** Whether it's a dev dependency */\n isDev: boolean;\n /** Description of what it does */\n description: string;\n}\n\n/**\n * Scripts definition for package.json\n */\nexport interface PackageScript {\n /** Script name */\n name: string;\n /** Script command */\n command: string;\n /** Description of what it does */\n description: string;\n}\n\n/**\n * Tool configuration with its dependencies and scripts\n */\nexport interface ToolDependencies {\n /** Packages required for this tool */\n packages: NpmPackage[];\n /** Scripts to add to package.json */\n scripts: PackageScript[];\n /** Additional setup instructions */\n setupInstructions?: string[];\n}\n\n/**\n * Linter dependencies\n */\nexport const LINTER_DEPENDENCIES: Record<string, ToolDependencies> = {\n biome: {\n packages: [\n {\n name: '@biomejs/biome',\n version: '^1.9.0',\n isDev: true,\n description: 'Fast linter and formatter',\n },\n ],\n scripts: [\n { name: 'lint', command: 'biome check .', description: 'Run linter' },\n { name: 'lint:fix', command: 'biome check --write .', description: 'Fix linting issues' },\n ],\n },\n eslint: {\n packages: [\n { name: 'eslint', version: '^9.0.0', isDev: true, description: 'JavaScript linter' },\n {\n name: 'typescript-eslint',\n version: '^8.0.0',\n isDev: true,\n description: 'TypeScript ESLint parser and plugin',\n },\n { name: 'globals', version: '^15.0.0', isDev: true, description: 'ESLint globals' },\n ],\n scripts: [\n { name: 'lint', command: 'eslint .', description: 'Run linter' },\n { name: 'lint:fix', command: 'eslint . --fix', description: 'Fix linting issues' },\n ],\n },\n oxlint: {\n packages: [\n { name: 'oxlint', version: '^0.10.0', isDev: true, description: 'Oxidation Compiler linter' },\n ],\n scripts: [{ name: 'lint', command: 'oxlint .', description: 'Run linter' }],\n },\n};\n\n/**\n * Formatter dependencies\n */\nexport const FORMATTER_DEPENDENCIES: Record<string, ToolDependencies> = {\n biome: {\n packages: [\n // Biome package is shared with linter, will be deduplicated\n {\n name: '@biomejs/biome',\n version: '^1.9.0',\n isDev: true,\n description: 'Fast linter and formatter',\n },\n ],\n scripts: [\n { name: 'format', command: 'biome format --write .', description: 'Format code' },\n { name: 'format:check', command: 'biome format .', description: 'Check formatting' },\n ],\n },\n prettier: {\n packages: [{ name: 'prettier', version: '^3.0.0', isDev: true, description: 'Code formatter' }],\n scripts: [\n { name: 'format', command: 'prettier --write .', description: 'Format code' },\n { name: 'format:check', command: 'prettier --check .', description: 'Check formatting' },\n ],\n },\n};\n\n/**\n * Test runner dependencies\n */\nexport const TEST_RUNNER_DEPENDENCIES: Record<string, ToolDependencies> = {\n vitest: {\n packages: [\n {\n name: 'vitest',\n version: '^2.0.0',\n isDev: true,\n description: 'Vite-native testing framework',\n },\n {\n name: '@vitest/coverage-v8',\n version: '^2.0.0',\n isDev: true,\n description: 'V8 coverage provider for Vitest',\n },\n ],\n scripts: [\n { name: 'test', command: 'vitest', description: 'Run tests in watch mode' },\n { name: 'test:run', command: 'vitest run', description: 'Run tests once' },\n {\n name: 'test:coverage',\n command: 'vitest run --coverage',\n description: 'Run tests with coverage',\n },\n ],\n },\n jest: {\n packages: [\n {\n name: 'jest',\n version: '^29.0.0',\n isDev: true,\n description: 'JavaScript testing framework',\n },\n {\n name: '@types/jest',\n version: '^29.0.0',\n isDev: true,\n description: 'Jest type definitions',\n },\n {\n name: 'ts-jest',\n version: '^29.0.0',\n isDev: true,\n description: 'TypeScript preprocessor for Jest',\n },\n ],\n scripts: [\n { name: 'test', command: 'jest', description: 'Run tests' },\n { name: 'test:watch', command: 'jest --watch', description: 'Run tests in watch mode' },\n { name: 'test:coverage', command: 'jest --coverage', description: 'Run tests with coverage' },\n ],\n setupInstructions: ['Create jest.config.js with ts-jest preset'],\n },\n playwright: {\n packages: [\n {\n name: '@playwright/test',\n version: '^1.45.0',\n isDev: true,\n description: 'Playwright Test framework',\n },\n ],\n scripts: [\n { name: 'test:e2e', command: 'playwright test', description: 'Run E2E tests' },\n {\n name: 'test:e2e:ui',\n command: 'playwright test --ui',\n description: 'Run E2E tests with UI',\n },\n ],\n setupInstructions: ['Run `npx playwright install` to install browsers'],\n },\n};\n\n/**\n * Commitlint dependencies\n */\nexport const COMMITLINT_DEPENDENCIES: ToolDependencies = {\n packages: [\n {\n name: '@commitlint/cli',\n version: '^19.0.0',\n isDev: true,\n description: 'Commit message linter',\n },\n {\n name: '@commitlint/config-conventional',\n version: '^19.0.0',\n isDev: true,\n description: 'Conventional commits config',\n },\n ],\n scripts: [],\n setupInstructions: [\n 'For git hooks integration, install Husky:',\n ' pnpm add -D husky',\n ' npx husky init',\n ' echo \"npx --no -- commitlint --edit ${1}\" > .husky/commit-msg',\n ],\n};\n\n/**\n * Husky dependencies\n */\nexport const HUSKY_DEPENDENCIES: ToolDependencies = {\n packages: [{ name: 'husky', version: '^9.0.0', isDev: true, description: 'Git hooks manager' }],\n scripts: [{ name: 'prepare', command: 'husky', description: 'Install git hooks' }],\n};\n\n/**\n * TypeScript dependencies\n */\nexport const TYPESCRIPT_DEPENDENCIES: ToolDependencies = {\n packages: [\n { name: 'typescript', version: '^5.5.0', isDev: true, description: 'TypeScript compiler' },\n {\n name: '@types/node',\n version: '^22.0.0',\n isDev: true,\n description: 'Node.js type definitions',\n },\n ],\n scripts: [\n { name: 'typecheck', command: 'tsc --noEmit', description: 'Type check without emitting' },\n { name: 'build', command: 'tsc', description: 'Compile TypeScript' },\n ],\n};\n\n/**\n * Get dependencies for a linter\n */\nexport function getLinterDependencies(linter: string): ToolDependencies | undefined {\n return LINTER_DEPENDENCIES[linter];\n}\n\n/**\n * Get dependencies for a formatter\n */\nexport function getFormatterDependencies(formatter: string): ToolDependencies | undefined {\n return FORMATTER_DEPENDENCIES[formatter];\n}\n\n/**\n * Get dependencies for a test runner\n */\nexport function getTestRunnerDependencies(testRunner: string): ToolDependencies | undefined {\n return TEST_RUNNER_DEPENDENCIES[testRunner];\n}\n\n/**\n * Merge multiple tool dependencies, deduplicating packages\n */\nexport function mergeToolDependencies(\n ...tools: (ToolDependencies | undefined)[]\n): ToolDependencies {\n const packageMap = new Map<string, NpmPackage>();\n const scriptMap = new Map<string, PackageScript>();\n const allInstructions: string[] = [];\n\n for (const tool of tools) {\n if (!tool) continue;\n\n // Add packages (deduplicate by name)\n for (const pkg of tool.packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, pkg);\n }\n }\n\n // Add scripts (deduplicate by name, later ones win)\n for (const script of tool.scripts) {\n scriptMap.set(script.name, script);\n }\n\n // Add setup instructions\n if (tool.setupInstructions) {\n allInstructions.push(...tool.setupInstructions);\n }\n }\n\n return {\n packages: Array.from(packageMap.values()),\n scripts: Array.from(scriptMap.values()),\n setupInstructions: allInstructions.length > 0 ? allInstructions : undefined,\n };\n}\n\n/**\n * Format packages as install command\n */\nexport function formatInstallCommand(\n packages: NpmPackage[],\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun' = 'pnpm'\n): string {\n const devPackages = packages.filter((p) => p.isDev);\n const prodPackages = packages.filter((p) => !p.isDev);\n\n const commands: string[] = [];\n\n if (devPackages.length > 0) {\n const pkgNames = devPackages.map((p) => p.name).join(' ');\n switch (packageManager) {\n case 'npm':\n commands.push(`npm install -D ${pkgNames}`);\n break;\n case 'yarn':\n commands.push(`yarn add -D ${pkgNames}`);\n break;\n case 'pnpm':\n commands.push(`pnpm add -D ${pkgNames}`);\n break;\n case 'bun':\n commands.push(`bun add -D ${pkgNames}`);\n break;\n }\n }\n\n if (prodPackages.length > 0) {\n const pkgNames = prodPackages.map((p) => p.name).join(' ');\n switch (packageManager) {\n case 'npm':\n commands.push(`npm install ${pkgNames}`);\n break;\n case 'yarn':\n commands.push(`yarn add ${pkgNames}`);\n break;\n case 'pnpm':\n commands.push(`pnpm add ${pkgNames}`);\n break;\n case 'bun':\n commands.push(`bun add ${pkgNames}`);\n break;\n }\n }\n\n return commands.join('\\n');\n}\n","/**\n * Permissions exports\n */\n\nexport {\n installPermissions,\n getCurrentPermissions,\n setCoAuthorSetting,\n mergePermissions,\n resetPermissionsToPreset,\n analyzePermissions,\n} from './configurator.js';\n","/**\n * Permissions configurator - generates Claude Code permission settings\n */\n\nimport * as os from 'node:os';\nimport {\n PERMISSION_PRESETS,\n generateAllowRules,\n generateDenyRules,\n} from '../../constants/permissions.js';\nimport type { PermissionsConfig } from '../../types/permissions.js';\nimport { ensureDir, joinPath, pathExists, readJson, writeJson } from '../utils/fs.js';\n\nconst PROJECT_SETTINGS_FILE = '.claude/settings.local.json';\nconst USER_SETTINGS_FILE = '.claude/settings.json';\n\ninterface SettingsJson {\n mcpServers?: Record<string, unknown>;\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n includeCoAuthoredBy?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Install permissions configuration\n */\nexport async function installPermissions(\n projectPath: string,\n config: PermissionsConfig,\n level: 'user' | 'project' = 'project'\n): Promise<{ success: boolean; path: string; errors: string[] }> {\n const errors: string[] = [];\n\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n // Ensure directory exists\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n // Read existing settings or create new\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start with empty settings\n }\n }\n\n // Generate permission rules\n const allowRules = generateAllowRules(config);\n const denyRules = generateDenyRules(config);\n\n // Set permissions\n settings.permissions = {\n allow: allowRules,\n deny: denyRules,\n };\n\n // Write settings\n await writeJson(settingsPath, settings, { spaces: 2 });\n\n return { success: true, path: settingsPath, errors };\n } catch (error) {\n return {\n success: false,\n path: settingsPath,\n errors: [`Failed to write permissions: ${error}`],\n };\n }\n}\n\n/**\n * Get current permissions from settings\n */\nexport async function getCurrentPermissions(\n projectPath: string\n): Promise<{ project: SettingsJson['permissions']; user: SettingsJson['permissions'] }> {\n const result = {\n project: undefined as SettingsJson['permissions'],\n user: undefined as SettingsJson['permissions'],\n };\n\n // Check project settings\n const projectSettings = joinPath(projectPath, PROJECT_SETTINGS_FILE);\n if (await pathExists(projectSettings)) {\n try {\n const settings = await readJson<SettingsJson>(projectSettings);\n result.project = settings.permissions;\n } catch {\n // Ignore\n }\n }\n\n // Check user settings\n const userSettings = joinPath(os.homedir(), USER_SETTINGS_FILE);\n if (await pathExists(userSettings)) {\n try {\n const settings = await readJson<SettingsJson>(userSettings);\n result.user = settings.permissions;\n } catch {\n // Ignore\n }\n }\n\n return result;\n}\n\n/**\n * Set co-author setting\n */\nexport async function setCoAuthorSetting(\n projectPath: string,\n includeCoAuthor: boolean,\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start fresh\n }\n }\n\n settings.includeCoAuthoredBy = includeCoAuthor;\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Merge permissions with existing settings\n */\nexport async function mergePermissions(\n projectPath: string,\n additionalAllow: string[],\n additionalDeny: string[],\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n settings = await readJson<SettingsJson>(settingsPath);\n }\n\n const existingAllow = settings.permissions?.allow || [];\n const existingDeny = settings.permissions?.deny || [];\n\n settings.permissions = {\n allow: [...new Set([...existingAllow, ...additionalAllow])],\n deny: [...new Set([...existingDeny, ...additionalDeny])],\n };\n\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reset permissions to a preset\n */\nexport async function resetPermissionsToPreset(\n projectPath: string,\n preset: keyof typeof PERMISSION_PRESETS,\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const presetConfig = PERMISSION_PRESETS[preset];\n\n const config: PermissionsConfig = {\n preset,\n files: presetConfig.files,\n git: presetConfig.git,\n bash: presetConfig.bash,\n web: presetConfig.web,\n custom: { allow: [], deny: [] },\n };\n\n const result = await installPermissions(projectPath, config, level);\n return result.success;\n}\n\n/**\n * Analyze current permissions and suggest improvements\n */\nexport function analyzePermissions(config: PermissionsConfig): {\n warnings: string[];\n suggestions: string[];\n} {\n const warnings: string[] = [];\n const suggestions: string[] = [];\n\n // Check for dangerous permissions\n if (config.bash.arbitrary) {\n warnings.push('Arbitrary bash commands are allowed - this gives Claude full shell access');\n }\n\n if (config.git.push) {\n warnings.push('Git push is allowed - Claude can push changes to remote repositories');\n }\n\n if (config.files.writeOther) {\n warnings.push('Writing to non-code files is allowed - includes CSS, HTML, SQL, etc.');\n }\n\n // Suggestions based on common patterns\n if (config.bash.testing && !config.bash.packageManager) {\n suggestions.push('Consider enabling package manager for installing test dependencies');\n }\n\n if (config.files.writeCode && !config.files.editTool) {\n suggestions.push('Consider enabling Edit tool for more efficient code modifications');\n }\n\n if (!config.git.readOnly) {\n suggestions.push('Git read operations are disabled - Claude cannot show diffs or status');\n }\n\n return { warnings, suggestions };\n}\n","/**\n * Permission preset definitions\n */\n\nimport type {\n BashPermissions,\n FilePermissions,\n GitPermissions,\n PermissionPreset,\n PermissionsConfig,\n WebPermissions,\n} from '../types/permissions.js';\n\n/**\n * Default file permissions\n */\nconst DEFAULT_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: true,\n writeConfig: true,\n writeMarkdown: true,\n writeOther: false,\n editTool: true,\n};\n\n/**\n * Trust file permissions\n */\nconst TRUST_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: true,\n writeConfig: true,\n writeMarkdown: true,\n writeOther: true,\n editTool: true,\n};\n\n/**\n * Restrictive file permissions\n */\nconst RESTRICTIVE_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: false,\n writeConfig: false,\n writeMarkdown: true,\n writeOther: false,\n editTool: false,\n};\n\n/**\n * Default git permissions\n */\nconst DEFAULT_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: false,\n commit: false,\n push: false,\n branching: false,\n};\n\n/**\n * Trust git permissions\n */\nconst TRUST_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: true,\n commit: true,\n push: false,\n branching: true,\n};\n\n/**\n * Restrictive git permissions\n */\nconst RESTRICTIVE_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: false,\n commit: false,\n push: false,\n branching: false,\n};\n\n/**\n * Default bash permissions\n */\nconst DEFAULT_BASH_PERMISSIONS: BashPermissions = {\n packageManager: true,\n testing: true,\n building: true,\n docker: false,\n arbitrary: false,\n};\n\n/**\n * Trust bash permissions\n */\nconst TRUST_BASH_PERMISSIONS: BashPermissions = {\n packageManager: true,\n testing: true,\n building: true,\n docker: true,\n arbitrary: true,\n};\n\n/**\n * Restrictive bash permissions\n */\nconst RESTRICTIVE_BASH_PERMISSIONS: BashPermissions = {\n packageManager: false,\n testing: false,\n building: false,\n docker: false,\n arbitrary: false,\n};\n\n/**\n * Default web permissions\n */\nconst DEFAULT_WEB_PERMISSIONS: WebPermissions = {\n fetch: true,\n search: true,\n};\n\n/**\n * All permission presets\n */\nexport const PERMISSION_PRESETS: Record<\n PermissionPreset,\n Omit<PermissionsConfig, 'preset' | 'custom'>\n> = {\n default: {\n files: DEFAULT_FILE_PERMISSIONS,\n git: DEFAULT_GIT_PERMISSIONS,\n bash: DEFAULT_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n trust: {\n files: TRUST_FILE_PERMISSIONS,\n git: TRUST_GIT_PERMISSIONS,\n bash: TRUST_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n restrictive: {\n files: RESTRICTIVE_FILE_PERMISSIONS,\n git: RESTRICTIVE_GIT_PERMISSIONS,\n bash: RESTRICTIVE_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n custom: {\n files: DEFAULT_FILE_PERMISSIONS,\n git: DEFAULT_GIT_PERMISSIONS,\n bash: DEFAULT_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n};\n\n/**\n * Default deny rules (always applied)\n */\nexport const DEFAULT_DENY_RULES: string[] = [\n // Directories\n 'Write(node_modules/**)',\n 'Write(.git/**)',\n 'Write(dist/**)',\n 'Write(build/**)',\n 'Write(.next/**)',\n 'Write(.nuxt/**)',\n 'Write(.output/**)',\n\n // System files\n 'Write(/etc/**)',\n 'Write(/usr/**)',\n 'Write(/bin/**)',\n 'Write(/sbin/**)',\n 'Write(/var/**)',\n 'Write(/tmp/**)',\n\n // Dangerous commands\n 'Bash(rm -rf /)',\n 'Bash(sudo *)',\n 'Bash(chmod 777 *)',\n 'Bash(curl * | bash)',\n 'Bash(wget * | bash)',\n\n // Sensitive files\n 'Write(.env)',\n 'Write(.env.*)',\n 'Write(**/secrets/**)',\n 'Write(**/credentials/**)',\n 'Read(.env)',\n 'Read(.env.*)',\n];\n\n/**\n * Get permissions for a preset\n */\nexport function getPresetPermissions(\n preset: PermissionPreset\n): Omit<PermissionsConfig, 'preset' | 'custom'> {\n return PERMISSION_PRESETS[preset];\n}\n\n/**\n * Generate allow rules from permissions config\n */\nexport function generateAllowRules(config: PermissionsConfig): string[] {\n const rules: string[] = [];\n\n // File permissions\n if (config.files.readAll) {\n rules.push(\n 'Read(**/*)',\n 'Glob(**/*)',\n 'Grep(**/*)',\n 'LS(**/*)',\n 'TodoRead',\n 'WebFetch',\n 'WebSearch'\n );\n }\n if (config.files.writeCode) {\n rules.push(\n 'Write(**/*.ts)',\n 'Write(**/*.tsx)',\n 'Write(**/*.js)',\n 'Write(**/*.jsx)',\n 'Write(**/*.mts)',\n 'Write(**/*.mjs)',\n 'Write(**/*.vue)',\n 'Write(**/*.svelte)'\n );\n }\n if (config.files.writeConfig) {\n rules.push(\n 'Write(**/*.json)',\n 'Write(**/*.yaml)',\n 'Write(**/*.yml)',\n 'Write(**/*.toml)',\n 'Write(**/*.xml)',\n 'Write(**/.env.example)',\n 'Write(**/.gitignore)',\n 'Write(**/.npmrc)',\n 'Write(**/.nvmrc)'\n );\n }\n if (config.files.writeMarkdown) {\n rules.push('Write(**/*.md)', 'Write(**/*.mdx)');\n }\n if (config.files.writeOther) {\n rules.push(\n 'Write(**/*.css)',\n 'Write(**/*.scss)',\n 'Write(**/*.less)',\n 'Write(**/*.html)',\n 'Write(**/*.sql)',\n 'Write(**/*.graphql)',\n 'Write(**/*.prisma)'\n );\n }\n if (config.files.editTool) {\n rules.push('Edit(**/*)', 'MultiEdit(**/*)', 'NotebookEdit(**/*)', 'TodoWrite');\n }\n\n // Git permissions\n if (config.git.readOnly) {\n rules.push(\n 'Bash(git status*)',\n 'Bash(git diff*)',\n 'Bash(git log*)',\n 'Bash(git show*)',\n 'Bash(git branch*)'\n );\n }\n if (config.git.staging) {\n rules.push('Bash(git add*)');\n }\n if (config.git.commit) {\n rules.push('Bash(git commit*)');\n }\n if (config.git.push) {\n rules.push('Bash(git push*)');\n }\n if (config.git.branching) {\n rules.push('Bash(git checkout*)', 'Bash(git branch*)', 'Bash(git merge*)', 'Bash(git rebase*)');\n }\n\n // Bash permissions\n if (config.bash.packageManager) {\n rules.push(\n 'Bash(pnpm *)',\n 'Bash(npm *)',\n 'Bash(yarn *)',\n 'Bash(bun *)',\n 'Bash(npx *)',\n 'Bash(bunx *)'\n );\n }\n if (config.bash.testing) {\n rules.push(\n 'Bash(vitest*)',\n 'Bash(jest*)',\n 'Bash(playwright*)',\n 'Bash(cypress*)',\n 'Bash(pnpm test*)',\n 'Bash(npm test*)',\n 'Bash(pnpm run test*)',\n 'Bash(npm run test*)'\n );\n }\n if (config.bash.building) {\n rules.push(\n 'Bash(pnpm build*)',\n 'Bash(npm run build*)',\n 'Bash(pnpm run build*)',\n 'Bash(tsc*)',\n 'Bash(tsup*)',\n 'Bash(vite build*)',\n 'Bash(next build*)',\n 'Bash(astro build*)'\n );\n }\n if (config.bash.docker) {\n rules.push('Bash(docker *)', 'Bash(docker-compose *)');\n }\n if (config.bash.arbitrary) {\n rules.push('Bash(*)');\n }\n\n // Web permissions\n if (config.web.fetch) {\n rules.push('WebFetch');\n }\n if (config.web.search) {\n rules.push('WebSearch');\n }\n\n // Add custom allow rules\n if (config.custom?.allow) {\n rules.push(...config.custom.allow);\n }\n\n return [...new Set(rules)]; // Remove duplicates\n}\n\n/**\n * Generate deny rules from permissions config\n */\nexport function generateDenyRules(config: PermissionsConfig): string[] {\n const rules = [...DEFAULT_DENY_RULES];\n\n // Add custom deny rules\n if (config.custom?.deny) {\n rules.push(...config.custom.deny);\n }\n\n return [...new Set(rules)]; // Remove duplicates\n}\n\n/**\n * Preset descriptions for UI\n */\nexport const PRESET_DESCRIPTIONS: Record<PermissionPreset, { name: string; description: string }> =\n {\n default: {\n name: 'Default',\n description:\n 'Balanced permissions - read all, write code/config/docs, basic git, package manager & testing',\n },\n trust: {\n name: 'Trust',\n description:\n 'Extended permissions - full file access, git staging/commit/branching, docker, arbitrary bash',\n },\n restrictive: {\n name: 'Restrictive',\n description:\n 'Minimal permissions - read only, markdown writing, no git operations, no bash commands',\n },\n custom: {\n name: 'Custom',\n description: 'Configure each permission individually',\n },\n };\n","/**\n * Placeholders exports\n */\n\nexport {\n replaceInFile,\n replaceInDirectory,\n replacePlaceholders,\n showReplacementReport,\n} from './replacer.js';\n","/**\n * Placeholder replacer - finds and replaces placeholders in files\n */\n\nimport { PLACEHOLDERS, applyTransform } from '../../constants/placeholders.js';\nimport type { ProjectInfo } from '../../types/config.js';\nimport type {\n PlaceholderDefinition,\n PlaceholderReplacement,\n PlaceholderReport,\n} from '../../types/placeholders.js';\nimport { joinPath, listFiles, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Replace placeholders in a single file\n */\nexport async function replaceInFile(\n filePath: string,\n projectInfo: ProjectInfo,\n placeholders: PlaceholderDefinition[] = PLACEHOLDERS\n): Promise<PlaceholderReplacement[]> {\n const replacements: PlaceholderReplacement[] = [];\n let content = await readFile(filePath);\n let modified = false;\n\n for (const placeholder of placeholders) {\n const value = projectInfo[placeholder.configKey];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const transformedValue = applyTransform(String(value), placeholder.transform);\n const pattern = placeholder.pattern;\n\n if (pattern instanceof RegExp) {\n const matches = content.matchAll(new RegExp(pattern.source, 'g'));\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n\n if (pattern.test(content)) {\n content = content.replace(pattern, transformedValue);\n modified = true;\n }\n } else {\n // String pattern\n const regex = new RegExp(escapeRegex(pattern), 'g');\n const matches = content.matchAll(regex);\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n\n if (content.includes(pattern)) {\n content = content.replace(regex, transformedValue);\n modified = true;\n }\n }\n }\n\n if (modified) {\n await writeFile(filePath, content);\n }\n\n return replacements;\n}\n\n/**\n * Replace placeholders in all files in a directory\n */\nexport async function replaceInDirectory(\n dirPath: string,\n projectInfo: ProjectInfo,\n options?: {\n extensions?: string[];\n exclude?: string[];\n dryRun?: boolean;\n }\n): Promise<PlaceholderReport> {\n const extensions = options?.extensions || ['md', 'json', 'yaml', 'yml', 'ts', 'js', 'tsx', 'jsx'];\n const exclude = options?.exclude || ['node_modules', '.git', 'dist', 'build'];\n\n const pattern = `**/*.{${extensions.join(',')}}`;\n const files = await listFiles(pattern, {\n cwd: dirPath,\n ignore: exclude.map((e) => `**/${e}/**`),\n });\n\n const report: PlaceholderReport = {\n totalFiles: files.length,\n filesModified: 0,\n replacements: [],\n unreplacedPlaceholders: [],\n };\n\n for (const file of files) {\n const filePath = joinPath(dirPath, file);\n\n try {\n const replacements = options?.dryRun\n ? await scanFile(filePath, projectInfo)\n : await replaceInFile(filePath, projectInfo);\n\n if (replacements.length > 0) {\n report.filesModified++;\n report.replacements.push(...replacements);\n }\n } catch (error) {\n logger.debug(`Failed to process ${file}: ${error}`);\n }\n }\n\n // Find unreplaced placeholders\n report.unreplacedPlaceholders = findUnreplacedPlaceholders(projectInfo);\n\n return report;\n}\n\n/**\n * Scan file for placeholders without replacing\n */\nasync function scanFile(\n filePath: string,\n projectInfo: ProjectInfo\n): Promise<PlaceholderReplacement[]> {\n const replacements: PlaceholderReplacement[] = [];\n const content = await readFile(filePath);\n\n for (const placeholder of PLACEHOLDERS) {\n const value = projectInfo[placeholder.configKey];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const transformedValue = applyTransform(String(value), placeholder.transform);\n const pattern = placeholder.pattern;\n\n const regex =\n pattern instanceof RegExp\n ? new RegExp(pattern.source, 'g')\n : new RegExp(escapeRegex(pattern), 'g');\n\n const matches = content.matchAll(regex);\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n }\n\n return replacements;\n}\n\n/**\n * Replace placeholders with spinner\n */\nexport async function replacePlaceholders(\n dirPath: string,\n projectInfo: ProjectInfo,\n options?: {\n extensions?: string[];\n exclude?: string[];\n dryRun?: boolean;\n silent?: boolean;\n }\n): Promise<PlaceholderReport> {\n return withSpinner(\n 'Replacing placeholders...',\n () => replaceInDirectory(dirPath, projectInfo, options),\n {\n successText: 'Placeholders replaced',\n silent: options?.silent || options?.dryRun,\n }\n );\n}\n\n/**\n * Find placeholders that couldn't be replaced due to missing values\n */\nfunction findUnreplacedPlaceholders(projectInfo: ProjectInfo): string[] {\n const unreplaced: string[] = [];\n\n for (const placeholder of PLACEHOLDERS) {\n if (!placeholder.required) continue;\n\n const value = projectInfo[placeholder.configKey];\n if (value === undefined || value === null || value === '') {\n const patternStr =\n placeholder.pattern instanceof RegExp ? placeholder.pattern.source : placeholder.pattern;\n unreplaced.push(patternStr);\n }\n }\n\n return unreplaced;\n}\n\n/**\n * Get line number from string index\n */\nfunction getLineNumber(content: string, index: number): number {\n return content.slice(0, index).split('\\n').length;\n}\n\n/**\n * Escape regex special characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Show replacement report\n */\nexport function showReplacementReport(report: PlaceholderReport): void {\n logger.newline();\n logger.subtitle('Placeholder Replacement Report');\n logger.keyValue('Files scanned', String(report.totalFiles));\n logger.keyValue('Files modified', String(report.filesModified));\n logger.keyValue('Replacements', String(report.replacements.length));\n\n if (report.unreplacedPlaceholders.length > 0) {\n logger.newline();\n logger.warn('Unreplaced placeholders (missing values):');\n for (const p of report.unreplacedPlaceholders) {\n logger.item(p);\n }\n }\n}\n","/**\n * Placeholder definitions for template processing\n */\n\nimport type { PlaceholderDefinition } from '../types/placeholders.js';\n\n/**\n * All placeholder patterns that can be replaced in templates\n */\nexport const PLACEHOLDERS: PlaceholderDefinition[] = [\n // Project info placeholders\n {\n pattern: /\\[Project Name\\]/g,\n configKey: 'name',\n transform: 'none',\n description: 'Project name',\n example: 'My Awesome Project',\n required: true,\n },\n {\n pattern: /\\[project-name\\]/g,\n configKey: 'name',\n transform: 'lowercase',\n description: 'Project name in lowercase with dashes',\n example: 'my-awesome-project',\n required: true,\n },\n {\n pattern: /\\[PROJECT_NAME\\]/g,\n configKey: 'name',\n transform: 'uppercase',\n description: 'Project name in uppercase with underscores',\n example: 'MY_AWESOME_PROJECT',\n required: true,\n },\n {\n pattern: /\\[Project Description\\]/g,\n configKey: 'description',\n transform: 'none',\n description: 'Project description',\n example: 'A powerful CLI tool for managing configurations',\n required: true,\n },\n {\n pattern: /your-org/g,\n configKey: 'org',\n transform: 'lowercase',\n description: 'GitHub organization or username',\n example: 'acme-corp',\n required: true,\n },\n {\n pattern: /your-repo/g,\n configKey: 'repo',\n transform: 'lowercase',\n description: 'Repository name',\n example: 'my-project',\n required: true,\n },\n {\n pattern: /example\\.com/g,\n configKey: 'domain',\n transform: 'lowercase',\n description: 'Project domain',\n example: 'myproject.com',\n required: false,\n },\n\n // Entity placeholders\n {\n pattern: /\\[Entity\\]/g,\n configKey: 'entityType',\n transform: 'capitalize',\n description: 'Primary entity type (capitalized)',\n example: 'Product',\n required: true,\n },\n {\n pattern: /\\[entity\\]/g,\n configKey: 'entityType',\n transform: 'lowercase',\n description: 'Primary entity type (lowercase)',\n example: 'product',\n required: true,\n },\n {\n pattern: /\\[Entities\\]/g,\n configKey: 'entityTypePlural',\n transform: 'capitalize',\n description: 'Primary entity type plural (capitalized)',\n example: 'Products',\n required: true,\n },\n {\n pattern: /\\[entities\\]/g,\n configKey: 'entityTypePlural',\n transform: 'lowercase',\n description: 'Primary entity type plural (lowercase)',\n example: 'products',\n required: true,\n },\n\n // Location placeholders\n {\n pattern: /\\[City Name\\]/g,\n configKey: 'location',\n transform: 'capitalize',\n description: 'City or location name',\n example: 'San Francisco',\n required: false,\n },\n {\n pattern: /\\[Your Region\\/Product\\]/g,\n configKey: 'location',\n transform: 'none',\n description: 'Region or product area',\n example: 'Bay Area',\n required: false,\n },\n {\n pattern: /\\[Your product\\/service tagline here\\]/g,\n configKey: 'description',\n transform: 'none',\n description: 'Product tagline',\n example: 'The best way to manage your projects',\n required: false,\n },\n];\n\n/**\n * Get placeholder by pattern string\n */\nexport function getPlaceholder(pattern: string): PlaceholderDefinition | undefined {\n return PLACEHOLDERS.find((p) => {\n if (p.pattern instanceof RegExp) {\n return p.pattern.source === pattern || p.pattern.source === new RegExp(pattern).source;\n }\n return p.pattern === pattern;\n });\n}\n\n/**\n * Get all required placeholders\n */\nexport function getRequiredPlaceholders(): PlaceholderDefinition[] {\n return PLACEHOLDERS.filter((p) => p.required);\n}\n\n/**\n * Get all optional placeholders\n */\nexport function getOptionalPlaceholders(): PlaceholderDefinition[] {\n return PLACEHOLDERS.filter((p) => !p.required);\n}\n\n/**\n * Apply transformation to a value\n */\nexport function applyTransform(\n value: string,\n transform: PlaceholderDefinition['transform']\n): string {\n switch (transform) {\n case 'lowercase':\n return value.toLowerCase().replace(/\\s+/g, '-');\n case 'uppercase':\n return value.toUpperCase().replace(/\\s+/g, '_');\n case 'capitalize':\n return value\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n case 'pluralize':\n // Simple pluralization rules\n if (value.endsWith('y')) {\n return `${value.slice(0, -1)}ies`;\n }\n if (\n value.endsWith('s') ||\n value.endsWith('x') ||\n value.endsWith('ch') ||\n value.endsWith('sh')\n ) {\n return `${value}es`;\n }\n return `${value}s`;\n default:\n return value;\n }\n}\n","/**\n * CLAUDE.md generator - creates the main Claude instructions file in project root\n */\n\nimport type { ClaudeConfig, ProjectInfo } from '../../types/config.js';\nimport type {\n TemplateConfig,\n TemplateConfigCommands,\n TemplateConfigTechStack,\n} from '../../types/template-config.js';\nimport { joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { getTemplatesPath } from '../utils/paths.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface ClaudeMdOptions {\n /** Whether to overwrite existing file */\n overwrite?: boolean;\n /** Custom template content (optional) */\n customTemplate?: string;\n /** Template configuration with tech stack info */\n templateConfig?: Partial<TemplateConfig>;\n /** Full claude config for additional context */\n claudeConfig?: ClaudeConfig;\n}\n\nexport interface ClaudeMdResult {\n /** Whether file was created */\n created: boolean;\n /** Whether file was skipped (already exists) */\n skipped: boolean;\n /** Path to the file */\n path: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Generate CLAUDE.md file in project root\n */\nexport async function generateClaudeMd(\n projectPath: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): Promise<ClaudeMdResult> {\n const claudeMdPath = joinPath(projectPath, 'CLAUDE.md');\n\n // Check if file exists\n const exists = await pathExists(claudeMdPath);\n if (exists && !options?.overwrite) {\n return {\n created: false,\n skipped: true,\n path: claudeMdPath,\n };\n }\n\n try {\n // Get template content\n let template: string;\n if (options?.customTemplate) {\n template = options.customTemplate;\n } else {\n const templatePath = joinPath(getTemplatesPath(), 'CLAUDE.md.template');\n if (await pathExists(templatePath)) {\n template = await readFile(templatePath);\n } else {\n // Fallback to minimal template\n template = getMinimalTemplate();\n }\n }\n\n // Process template with all available data\n const content = processTemplate(template, projectInfo, options);\n\n // Write file\n await writeFile(claudeMdPath, content);\n\n return {\n created: true,\n skipped: false,\n path: claudeMdPath,\n };\n } catch (error) {\n return {\n created: false,\n skipped: false,\n path: claudeMdPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Generate CLAUDE.md with spinner\n */\nexport async function generateClaudeMdWithSpinner(\n projectPath: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): Promise<ClaudeMdResult> {\n return withSpinner(\n 'Generating CLAUDE.md...',\n () => generateClaudeMd(projectPath, projectInfo, options),\n {\n successText: 'Created CLAUDE.md',\n }\n );\n}\n\n/**\n * Process template with all available data\n */\nfunction processTemplate(\n template: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): string {\n let content = template;\n const techStack = options?.templateConfig?.techStack;\n const commands = options?.templateConfig?.commands;\n const targets = options?.templateConfig?.targets;\n const preferences = options?.claudeConfig?.preferences;\n\n // Basic project info replacements\n content = content\n .replace(/\\{\\{PROJECT_NAME\\}\\}/g, projectInfo.name)\n .replace(/\\{\\{PROJECT_DESCRIPTION\\}\\}/g, projectInfo.description)\n .replace(/\\{\\{ORG\\}\\}/g, projectInfo.org)\n .replace(/\\{\\{REPO\\}\\}/g, projectInfo.repo)\n .replace(/\\{\\{ENTITY_TYPE\\}\\}/g, projectInfo.entityType)\n .replace(/\\{\\{ENTITY_TYPE_PLURAL\\}\\}/g, projectInfo.entityTypePlural)\n .replace(/\\{\\{LOCATION\\}\\}/g, projectInfo.location || '');\n\n // Package manager\n const packageManager = preferences?.packageManager || 'pnpm';\n content = content.replace(/\\{\\{PACKAGE_MANAGER\\}\\}/g, packageManager);\n\n // Coverage target\n const coverageTarget = targets && 'coverage' in targets ? String(targets.coverage) : '90';\n content = content.replace(/\\{\\{COVERAGE_TARGET\\}\\}/g, coverageTarget);\n\n // Domain handling with conditional\n if (projectInfo.domain) {\n content = content\n .replace(/\\{\\{#if DOMAIN\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '')\n .replace(/\\{\\{DOMAIN\\}\\}/g, projectInfo.domain);\n } else {\n // Remove domain section if not provided\n content = content.replace(/\\{\\{#if DOMAIN\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Generate tech stack section\n if (techStack && Object.keys(techStack).length > 0) {\n const techStackContent = generateTechStackSection(techStack);\n content = content\n .replace(/\\{\\{#if TECH_STACK\\}\\}/g, '')\n .replace(/\\{\\{TECH_STACK\\}\\}\\n\\{\\{else\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, techStackContent);\n } else {\n // Use default tech stack section\n content = content\n .replace(/\\{\\{#if TECH_STACK\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Generate commands section\n if (commands && Object.keys(commands).length > 0) {\n const commandsContent = generateCommandsSection(commands, packageManager);\n content = content\n .replace(/\\{\\{#if COMMANDS\\}\\}/g, '')\n .replace(/\\{\\{COMMANDS\\}\\}\\n\\{\\{else\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, commandsContent);\n } else {\n // Use default commands section\n content = content\n .replace(/\\{\\{#if COMMANDS\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Handle project structure conditional (use default for now)\n content = content\n .replace(/\\{\\{#if PROJECT_STRUCTURE\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n\n return content;\n}\n\n/**\n * Generate tech stack section content\n */\nfunction generateTechStackSection(techStack: TemplateConfigTechStack): string {\n const lines: string[] = [];\n\n // Frontend\n if (techStack.frontendFramework && techStack.frontendFramework !== 'None') {\n lines.push('**Frontend:**');\n lines.push(`- Framework: ${techStack.frontendFramework}`);\n if (techStack.stateManagement && techStack.stateManagement !== 'None') {\n lines.push(`- State: ${techStack.stateManagement}`);\n }\n lines.push('');\n }\n\n // Backend\n if (techStack.apiFramework && techStack.apiFramework !== 'None') {\n lines.push('**Backend:**');\n lines.push(`- API: ${techStack.apiFramework}`);\n if (techStack.validationLibrary && techStack.validationLibrary !== 'None') {\n lines.push(`- Validation: ${techStack.validationLibrary}`);\n }\n lines.push('');\n }\n\n // Database\n if (techStack.databaseOrm && techStack.databaseOrm !== 'None') {\n lines.push('**Database:**');\n lines.push(`- ORM: ${techStack.databaseOrm}`);\n lines.push('');\n }\n\n // Auth\n if (techStack.authPattern && techStack.authPattern !== 'None') {\n lines.push('**Authentication:**');\n lines.push(`- Provider: ${techStack.authPattern}`);\n lines.push('');\n }\n\n // Testing\n if (techStack.testFramework && techStack.testFramework !== 'None') {\n lines.push('**Testing:**');\n lines.push(`- Framework: ${techStack.testFramework}`);\n lines.push('');\n }\n\n // Bundler\n if (techStack.bundler && techStack.bundler !== 'None') {\n lines.push('**Build:**');\n lines.push(`- Bundler: ${techStack.bundler}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate commands section content\n */\nfunction generateCommandsSection(commands: TemplateConfigCommands, packageManager: string): string {\n const lines: string[] = ['```bash'];\n\n // Development commands\n lines.push('# Development');\n lines.push(`${packageManager} dev # Start development server`);\n lines.push('');\n\n // Testing commands\n lines.push('# Testing');\n if (commands.test) {\n lines.push(`${commands.test} # Run tests`);\n } else {\n lines.push(`${packageManager} test # Run tests`);\n }\n if (commands.coverage) {\n lines.push(`${commands.coverage} # Run tests with coverage`);\n } else {\n lines.push(`${packageManager} test:coverage # Run tests with coverage`);\n }\n lines.push('');\n\n // Quality commands\n lines.push('# Quality');\n if (commands.lint) {\n lines.push(`${commands.lint} # Run linter`);\n } else {\n lines.push(`${packageManager} lint # Run linter`);\n }\n if (commands.typecheck) {\n lines.push(`${commands.typecheck} # Type checking`);\n } else {\n lines.push(`${packageManager} typecheck # Type checking`);\n }\n\n // Build command\n if (commands.build) {\n lines.push('');\n lines.push('# Build');\n lines.push(`${commands.build} # Build for production`);\n }\n\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Get minimal fallback template\n */\nfunction getMinimalTemplate(): string {\n return `# CLAUDE.md\n\n## Project Overview\n\n**{{PROJECT_NAME}}** - {{PROJECT_DESCRIPTION}}\n\n## Repository\n\n- **GitHub:** https://github.com/{{ORG}}/{{REPO}}\n\n## Quick Commands\n\n\\`\\`\\`bash\n{{PACKAGE_MANAGER}} dev # Start development\n{{PACKAGE_MANAGER}} test # Run tests\n{{PACKAGE_MANAGER}} lint # Run linter\n{{PACKAGE_MANAGER}} build # Build project\n\\`\\`\\`\n\n## Claude Configuration\n\nThis project uses \\`@qazuor/claude-code-config\\` for AI-assisted development.\n\nSee \\`.claude/docs/quick-start.md\\` for getting started.\n\n---\n\n*Generated by [@qazuor/claude-code-config](https://github.com/qazuor/claude-code-config)*\n`;\n}\n","/**\n * Package path utilities\n * Handles resolving paths relative to the installed package\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the root directory of the installed package\n * Works both in development (src/) and when bundled (dist/)\n */\nexport function getPackageRoot(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let currentDir = path.dirname(currentFilePath);\n\n // Walk up the directory tree until we find package.json\n // This works for both:\n // - Development: src/lib/utils/paths.ts -> walk up to find package.json\n // - Production: dist/bin.js -> walk up to find package.json\n while (currentDir !== path.dirname(currentDir)) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n\n // Fallback: should not reach here in normal usage\n throw new Error('Could not find package root (no package.json found in parent directories)');\n}\n\n/**\n * Get the templates directory path\n * Templates are bundled with the package at package-root/templates/\n */\nexport function getTemplatesPath(): string {\n return path.join(getPackageRoot(), 'templates');\n}\n","/**\n * Scaffold exports\n */\n\n// Detector\nexport {\n detectProject,\n getProjectName,\n getProjectDescription,\n hasExistingClaudeConfig,\n} from './detector.js';\n\n// Generator\nexport {\n generateScaffold,\n generateScaffoldWithProgress,\n} from './generator.js';\n\n// CLAUDE.md generator\nexport {\n generateClaudeMd,\n generateClaudeMdWithSpinner,\n type ClaudeMdOptions,\n type ClaudeMdResult,\n} from './claude-md-generator.js';\n","/**\n * Project detector - detects existing project type and configuration\n */\n\nimport type {\n DetectionSignal,\n PackageManager,\n ProjectDetectionResult,\n ProjectType,\n} from '../../types/scaffold.js';\nimport { joinPath, pathExists, readJson } from '../utils/fs.js';\n\ninterface PackageJson {\n name?: string;\n description?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n workspaces?: string[] | { packages: string[] };\n}\n\n/**\n * Detect project type and configuration\n */\nexport async function detectProject(projectPath: string): Promise<ProjectDetectionResult> {\n const signals: DetectionSignal[] = [];\n\n // Check for package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n const hasPackageJson = await pathExists(packageJsonPath);\n\n if (!hasPackageJson) {\n return {\n detected: false,\n confidence: 'low',\n signals: [{ file: 'package.json', exists: false, indicates: 'not a Node.js project' }],\n };\n }\n\n signals.push({ file: 'package.json', exists: true, indicates: 'Node.js project' });\n\n // Read package.json\n const packageJson = await readJson<PackageJson>(packageJsonPath).catch(() => ({}) as PackageJson);\n\n // Detect package manager\n const packageManager = await detectPackageManager(projectPath);\n if (packageManager) {\n signals.push({\n file: `${packageManager}-lock`,\n exists: true,\n indicates: `${packageManager} package manager`,\n });\n }\n\n // Detect project type\n const typeResult = await detectProjectType(projectPath, packageJson);\n const projectType = typeResult.type;\n signals.push(...typeResult.signals);\n\n // Determine confidence\n const confidence: 'high' | 'medium' | 'low' =\n projectType && packageManager ? 'high' : projectType || packageManager ? 'medium' : 'low';\n\n // Suggest bundles based on project type\n const suggestedBundles = suggestBundles(projectType, packageJson);\n\n return {\n detected: true,\n projectType,\n packageManager,\n suggestedBundles,\n confidence,\n signals,\n };\n}\n\n/**\n * Detect package manager\n */\nasync function detectPackageManager(projectPath: string): Promise<PackageManager | undefined> {\n const lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'bun.lockb', manager: 'bun' },\n ];\n\n for (const { file, manager } of lockFiles) {\n if (await pathExists(joinPath(projectPath, file))) {\n return manager;\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect project type from configuration files\n */\nasync function detectProjectType(\n projectPath: string,\n packageJson: PackageJson\n): Promise<{ type: ProjectType | undefined; signals: DetectionSignal[] }> {\n const signals: DetectionSignal[] = [];\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n // Check for monorepo\n if (\n (await pathExists(joinPath(projectPath, 'turbo.json'))) ||\n (await pathExists(joinPath(projectPath, 'pnpm-workspace.yaml'))) ||\n packageJson.workspaces\n ) {\n signals.push({ file: 'turbo.json/pnpm-workspace.yaml', exists: true, indicates: 'monorepo' });\n return { type: 'monorepo', signals };\n }\n\n // Check for Astro\n if (\n (await pathExists(joinPath(projectPath, 'astro.config.mjs'))) ||\n (await pathExists(joinPath(projectPath, 'astro.config.ts'))) ||\n deps.astro\n ) {\n signals.push({ file: 'astro.config.*', exists: true, indicates: 'Astro project' });\n return { type: 'astro', signals };\n }\n\n // Check for Next.js\n if (\n (await pathExists(joinPath(projectPath, 'next.config.js'))) ||\n (await pathExists(joinPath(projectPath, 'next.config.mjs'))) ||\n (await pathExists(joinPath(projectPath, 'next.config.ts'))) ||\n deps.next\n ) {\n signals.push({ file: 'next.config.*', exists: true, indicates: 'Next.js project' });\n return { type: 'nextjs', signals };\n }\n\n // Check for Vite + React\n if (\n ((await pathExists(joinPath(projectPath, 'vite.config.ts'))) ||\n (await pathExists(joinPath(projectPath, 'vite.config.js')))) &&\n (deps.react || deps['react-dom'])\n ) {\n signals.push({ file: 'vite.config.*', exists: true, indicates: 'Vite project' });\n signals.push({ file: 'react dependency', exists: true, indicates: 'React project' });\n return { type: 'vite-react', signals };\n }\n\n // Check for Hono\n if (deps.hono) {\n signals.push({ file: 'hono dependency', exists: true, indicates: 'Hono API project' });\n return { type: 'hono', signals };\n }\n\n // Default to Node.js\n if (deps.typescript || (await pathExists(joinPath(projectPath, 'tsconfig.json')))) {\n signals.push({ file: 'tsconfig.json', exists: true, indicates: 'TypeScript project' });\n return { type: 'node', signals };\n }\n\n return { type: 'node', signals };\n}\n\n/**\n * Suggest bundles based on project type and dependencies\n */\nfunction suggestBundles(projectType: ProjectType | undefined, packageJson: PackageJson): string[] {\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n const suggestedBundles: string[] = [];\n\n // Detect backend framework\n const hasHono = deps.hono || deps['@hono/node-server'];\n const hasExpress = deps.express;\n const hasFastify = deps.fastify;\n const hasNestjs = deps['@nestjs/core'];\n\n // Detect database ORM\n const hasDrizzle = deps.drizzle || deps['drizzle-orm'];\n const hasPrisma = deps.prisma || deps['@prisma/client'];\n const hasMongoose = deps.mongoose;\n\n // Detect frontend framework\n const hasReact = deps.react;\n const hasTanstack = deps['@tanstack/react-router'] || deps['@tanstack/start'];\n\n // Stack bundles based on detected technologies\n switch (projectType) {\n case 'astro':\n suggestedBundles.push('astro-react-stack');\n break;\n\n case 'nextjs':\n if (hasPrisma) {\n suggestedBundles.push('nextjs-prisma-stack');\n } else {\n // Just React + TanStack for Next.js without Prisma\n suggestedBundles.push('react-tanstack-stack');\n }\n break;\n\n case 'vite-react':\n suggestedBundles.push('react-tanstack-stack');\n break;\n\n case 'hono':\n if (hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else if (hasPrisma) {\n suggestedBundles.push('hono-api');\n suggestedBundles.push('prisma-database');\n } else {\n suggestedBundles.push('hono-api');\n }\n break;\n\n case 'monorepo':\n // For monorepos, suggest based on detected technologies\n if (hasReact && hasTanstack) {\n suggestedBundles.push('react-tanstack-stack');\n }\n if (hasHono && hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else if (hasHono) {\n suggestedBundles.push('hono-api');\n }\n break;\n\n case 'node':\n // Detect API framework\n if (hasHono) {\n if (hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else {\n suggestedBundles.push('hono-api');\n }\n } else if (hasExpress) {\n if (hasPrisma) {\n suggestedBundles.push('express-prisma-stack');\n } else {\n suggestedBundles.push('express-api');\n }\n } else if (hasFastify) {\n suggestedBundles.push('fastify-api');\n } else if (hasNestjs) {\n suggestedBundles.push('nestjs-api');\n }\n break;\n }\n\n // Add database bundle if ORM detected but not in a stack\n if (hasDrizzle && !suggestedBundles.some((b) => b.includes('drizzle'))) {\n suggestedBundles.push('drizzle-database');\n }\n if (hasPrisma && !suggestedBundles.some((b) => b.includes('prisma'))) {\n suggestedBundles.push('prisma-database');\n }\n if (hasMongoose) {\n suggestedBundles.push('mongoose-database');\n }\n\n // Always suggest minimal testing and quality\n if (suggestedBundles.length > 0) {\n suggestedBundles.push('testing-minimal');\n suggestedBundles.push('quality-minimal');\n }\n\n // Add git workflow for all projects\n suggestedBundles.push('git-workflow');\n\n return suggestedBundles;\n}\n\n/**\n * Get project name from package.json or directory\n */\nexport async function getProjectName(projectPath: string): Promise<string | undefined> {\n try {\n const packageJson = await readJson<PackageJson>(joinPath(projectPath, 'package.json'));\n return packageJson.name;\n } catch {\n // Return directory name\n const parts = projectPath.split('/');\n return parts[parts.length - 1];\n }\n}\n\n/**\n * Get project description from package.json\n */\nexport async function getProjectDescription(projectPath: string): Promise<string | undefined> {\n try {\n const packageJson = await readJson<PackageJson>(joinPath(projectPath, 'package.json'));\n return packageJson.description;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if project has existing Claude configuration\n */\nexport async function hasExistingClaudeConfig(projectPath: string): Promise<boolean> {\n return pathExists(joinPath(projectPath, '.claude'));\n}\n","/**\n * Project scaffold generator - creates project structure\n */\n\nimport type {\n PackageManager,\n ProjectType,\n ScaffoldOptions,\n ScaffoldResult,\n} from '../../types/scaffold.js';\nimport { ensureDir, joinPath, pathExists, writeFile, writeJson } from '../utils/fs.js';\nimport { initRepo } from '../utils/git.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Generate project scaffold\n */\nexport async function generateScaffold(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const result: ScaffoldResult = {\n createdFiles: [],\n createdDirs: [],\n instructions: [],\n };\n\n // Create base .claude directory\n const claudeDir = joinPath(projectPath, '.claude');\n await ensureDir(claudeDir);\n result.createdDirs.push('.claude');\n\n // Create subdirectories\n const subdirs = ['agents', 'commands', 'skills', 'docs'];\n for (const dir of subdirs) {\n await ensureDir(joinPath(claudeDir, dir));\n result.createdDirs.push(`.claude/${dir}`);\n }\n\n // If claude-only, we're done with structure\n if (options.type === 'claude-only') {\n return result;\n }\n\n // Full project scaffold\n if (options.projectType) {\n const projectResult = await generateProjectStructure(projectPath, options);\n result.createdFiles.push(...projectResult.createdFiles);\n result.createdDirs.push(...projectResult.createdDirs);\n result.instructions.push(...projectResult.instructions);\n }\n\n // Init git if requested\n if (options.initGit) {\n const gitExists = await pathExists(joinPath(projectPath, '.git'));\n if (!gitExists) {\n await initRepo(projectPath);\n result.createdDirs.push('.git');\n }\n }\n\n // Create README\n if (options.createReadme) {\n const readmePath = joinPath(projectPath, 'README.md');\n if (!(await pathExists(readmePath))) {\n await writeFile(readmePath, generateReadme(options));\n result.createdFiles.push('README.md');\n }\n }\n\n // Create .gitignore\n if (options.createGitignore) {\n const gitignorePath = joinPath(projectPath, '.gitignore');\n if (!(await pathExists(gitignorePath))) {\n await writeFile(gitignorePath, generateGitignore(options.projectType));\n result.createdFiles.push('.gitignore');\n }\n }\n\n return result;\n}\n\n/**\n * Generate project-specific structure\n */\nasync function generateProjectStructure(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const result: ScaffoldResult = {\n createdFiles: [],\n createdDirs: [],\n instructions: [],\n };\n\n const packageManager = options.packageManager || 'pnpm';\n\n switch (options.projectType) {\n case 'node':\n await generateNodeProject(projectPath, packageManager, result);\n break;\n\n case 'monorepo':\n await generateMonorepoProject(projectPath, packageManager, result);\n break;\n\n case 'hono':\n await generateHonoProject(projectPath, packageManager, result);\n break;\n\n // For framework projects, just provide instructions\n case 'astro':\n case 'nextjs':\n case 'vite-react':\n result.instructions.push(\n `Run: ${packageManager} create ${options.projectType === 'astro' ? 'astro@latest' : options.projectType === 'nextjs' ? 'next-app@latest' : 'vite@latest'}`\n );\n break;\n }\n\n return result;\n}\n\n/**\n * Generate basic Node.js TypeScript project\n */\nasync function generateNodeProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create src directory\n await ensureDir(joinPath(projectPath, 'src'));\n result.createdDirs.push('src');\n\n // Create test directory\n await ensureDir(joinPath(projectPath, 'test'));\n result.createdDirs.push('test');\n\n // Create package.json if it doesn't exist\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-project',\n version: '0.1.0',\n type: 'module',\n scripts: {\n build: 'tsc',\n dev: 'tsx watch src/index.ts',\n test: 'vitest',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n devDependencies: {\n typescript: '^5.0.0',\n tsx: '^4.0.0',\n vitest: '^2.0.0',\n '@biomejs/biome': '^1.9.0',\n '@types/node': '^22.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create tsconfig.json\n const tsconfigPath = joinPath(projectPath, 'tsconfig.json');\n if (!(await pathExists(tsconfigPath))) {\n await writeJson(tsconfigPath, {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: 'dist',\n rootDir: 'src',\n declaration: true,\n },\n include: ['src'],\n exclude: ['node_modules', 'dist'],\n });\n result.createdFiles.push('tsconfig.json');\n }\n\n // Create src/index.ts\n const indexPath = joinPath(projectPath, 'src/index.ts');\n if (!(await pathExists(indexPath))) {\n await writeFile(indexPath, `// Entry point\\nconsole.log('Hello, World!');\\n`);\n result.createdFiles.push('src/index.ts');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push(`Start development: ${packageManager} dev`);\n}\n\n/**\n * Generate monorepo structure\n */\nasync function generateMonorepoProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create directories\n const dirs = ['apps', 'packages', 'packages/shared'];\n for (const dir of dirs) {\n await ensureDir(joinPath(projectPath, dir));\n result.createdDirs.push(dir);\n }\n\n // Create package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-monorepo',\n private: true,\n scripts: {\n build: 'turbo build',\n dev: 'turbo dev',\n lint: 'turbo lint',\n test: 'turbo test',\n },\n devDependencies: {\n turbo: '^2.0.0',\n typescript: '^5.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create pnpm-workspace.yaml\n if (packageManager === 'pnpm') {\n const workspacePath = joinPath(projectPath, 'pnpm-workspace.yaml');\n if (!(await pathExists(workspacePath))) {\n await writeFile(workspacePath, 'packages:\\n - \"apps/*\"\\n - \"packages/*\"\\n');\n result.createdFiles.push('pnpm-workspace.yaml');\n }\n }\n\n // Create turbo.json\n const turboPath = joinPath(projectPath, 'turbo.json');\n if (!(await pathExists(turboPath))) {\n await writeJson(turboPath, {\n $schema: 'https://turbo.build/schema.json',\n tasks: {\n build: {\n dependsOn: ['^build'],\n outputs: ['dist/**'],\n },\n dev: {\n cache: false,\n persistent: true,\n },\n lint: {},\n test: {},\n },\n });\n result.createdFiles.push('turbo.json');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push('Create apps and packages in their respective directories');\n}\n\n/**\n * Generate Hono API project\n */\nasync function generateHonoProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create directories\n const dirs = ['src', 'src/routes', 'test'];\n for (const dir of dirs) {\n await ensureDir(joinPath(projectPath, dir));\n result.createdDirs.push(dir);\n }\n\n // Create package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-api',\n version: '0.1.0',\n type: 'module',\n scripts: {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n test: 'vitest',\n },\n dependencies: {\n hono: '^4.0.0',\n '@hono/node-server': '^1.0.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n tsx: '^4.0.0',\n vitest: '^2.0.0',\n '@types/node': '^22.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create src/index.ts\n const indexPath = joinPath(projectPath, 'src/index.ts');\n if (!(await pathExists(indexPath))) {\n await writeFile(\n indexPath,\n `import { Hono } from 'hono';\nimport { serve } from '@hono/node-server';\n\nconst app = new Hono();\n\napp.get('/', (c) => c.json({ message: 'Hello, World!' }));\n\nconst port = 3000;\nconsole.log(\\`Server running on http://localhost:\\${port}\\`);\n\nserve({ fetch: app.fetch, port });\n`\n );\n result.createdFiles.push('src/index.ts');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push(`Start server: ${packageManager} dev`);\n}\n\n/**\n * Generate README content\n */\nfunction generateReadme(options: ScaffoldOptions): string {\n return `# My Project\n\n## Description\n\nAdd your project description here.\n\n## Getting Started\n\n\\`\\`\\`bash\n${options.packageManager || 'pnpm'} install\n${options.packageManager || 'pnpm'} dev\n\\`\\`\\`\n\n## License\n\nMIT\n`;\n}\n\n/**\n * Generate .gitignore content\n */\nfunction generateGitignore(_projectType?: ProjectType): string {\n const common = `# Dependencies\nnode_modules/\n\n# Build outputs\ndist/\nbuild/\n.next/\n.nuxt/\n.output/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# Turbo\n.turbo/\n`;\n\n return common;\n}\n\n/**\n * Generate scaffold with progress\n */\nexport async function generateScaffoldWithProgress(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n return withSpinner(\n 'Generating project structure...',\n () => generateScaffold(projectPath, options),\n { successText: 'Project structure created' }\n );\n}\n","/**\n * Git utility functions\n */\n\nimport { type SimpleGit, type SimpleGitOptions, simpleGit } from 'simple-git';\nimport { pathExists } from './fs.js';\n\n/**\n * Create a git instance for a directory\n */\nexport function createGit(baseDir: string): SimpleGit {\n const options: Partial<SimpleGitOptions> = {\n baseDir,\n binary: 'git',\n maxConcurrentProcesses: 6,\n };\n return simpleGit(options);\n}\n\n/**\n * Check if a directory is a git repository\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git = createGit(dir);\n await git.status();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if git is installed\n */\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n const git = simpleGit();\n await git.version();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize a git repository\n */\nexport async function initRepo(dir: string): Promise<void> {\n const git = createGit(dir);\n await git.init();\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n url: string,\n dest: string,\n options?: {\n branch?: string;\n depth?: number;\n }\n): Promise<void> {\n const git = simpleGit();\n const cloneOptions: string[] = [];\n\n if (options?.branch) {\n cloneOptions.push('--branch', options.branch);\n }\n if (options?.depth) {\n cloneOptions.push('--depth', String(options.depth));\n }\n\n await git.clone(url, dest, cloneOptions);\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(dir: string): Promise<string> {\n const git = createGit(dir);\n const branch = await git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n}\n\n/**\n * Get list of remote branches\n */\nexport async function getRemoteBranches(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const result = await git.branch(['-r']);\n return result.all.map((b) => b.replace('origin/', ''));\n}\n\n/**\n * Get list of tags\n */\nexport async function getTags(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const result = await git.tags();\n return result.all;\n}\n\n/**\n * Fetch from remote\n */\nexport async function fetch(dir: string, options?: { tags?: boolean }): Promise<void> {\n const git = createGit(dir);\n const fetchOptions = options?.tags ? ['--tags'] : [];\n await git.fetch(fetchOptions);\n}\n\n/**\n * Pull from remote\n */\nexport async function pull(dir: string, remote = 'origin', branch?: string): Promise<void> {\n const git = createGit(dir);\n await git.pull(remote, branch);\n}\n\n/**\n * Checkout a branch or tag\n */\nexport async function checkout(dir: string, ref: string): Promise<void> {\n const git = createGit(dir);\n await git.checkout(ref);\n}\n\n/**\n * Get the remote URL\n */\nexport async function getRemoteUrl(dir: string, remote = 'origin'): Promise<string | null> {\n try {\n const git = createGit(dir);\n const remotes = await git.getRemotes(true);\n const remoteInfo = remotes.find((r) => r.name === remote);\n return remoteInfo?.refs.fetch || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get latest commit hash\n */\nexport async function getLatestCommit(dir: string): Promise<string> {\n const git = createGit(dir);\n const log = await git.log({ maxCount: 1 });\n return log.latest?.hash || '';\n}\n\n/**\n * Get list of changed files\n */\nexport async function getChangedFiles(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const status = await git.status();\n return [\n ...status.modified,\n ...status.created,\n ...status.deleted,\n ...status.renamed.map((r) => r.to),\n ];\n}\n\n/**\n * Check if there are uncommitted changes\n */\nexport async function hasUncommittedChanges(dir: string): Promise<boolean> {\n const git = createGit(dir);\n const status = await git.status();\n return !status.isClean();\n}\n\n/**\n * Parse a git URL to extract owner and repo\n */\nexport function parseGitUrl(url: string): { owner: string; repo: string } | null {\n // Handle various git URL formats:\n // https://github.com/owner/repo.git\n // git@github.com:owner/repo.git\n // https://github.com/owner/repo\n\n const httpsMatch = url.match(/https?:\\/\\/[^/]+\\/([^/]+)\\/([^/.]+)(\\.git)?/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/git@[^:]+:([^/]+)\\/([^/.]+)(\\.git)?/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return null;\n}\n\n/**\n * Check if a remote URL is valid (can be accessed)\n */\nexport async function isValidRemoteUrl(url: string): Promise<boolean> {\n try {\n const git = simpleGit();\n await git.listRemote([url]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get repository info from a directory\n */\nexport async function getRepoInfo(dir: string): Promise<{\n isRepo: boolean;\n branch?: string;\n remoteUrl?: string;\n hasChanges?: boolean;\n owner?: string;\n repo?: string;\n} | null> {\n if (!(await isGitRepo(dir))) {\n return { isRepo: false };\n }\n\n try {\n const [branch, remoteUrl, hasChanges] = await Promise.all([\n getCurrentBranch(dir),\n getRemoteUrl(dir),\n hasUncommittedChanges(dir),\n ]);\n\n const parsed = remoteUrl ? parseGitUrl(remoteUrl) : null;\n\n return {\n isRepo: true,\n branch,\n remoteUrl: remoteUrl || undefined,\n hasChanges,\n owner: parsed?.owner,\n repo: parsed?.repo,\n };\n } catch {\n return { isRepo: true };\n }\n}\n\n/**\n * Clone or update a repository for templates\n */\nexport async function cloneOrUpdateRepo(\n url: string,\n dest: string,\n options?: {\n branch?: string;\n forceUpdate?: boolean;\n }\n): Promise<{ cloned: boolean; updated: boolean }> {\n const exists = await pathExists(dest);\n\n if (!exists) {\n await cloneRepo(url, dest, { branch: options?.branch, depth: 1 });\n return { cloned: true, updated: false };\n }\n\n if (await isGitRepo(dest)) {\n if (options?.forceUpdate) {\n await fetch(dest, { tags: true });\n if (options?.branch) {\n await checkout(dest, options.branch);\n }\n await pull(dest);\n return { cloned: false, updated: true };\n }\n }\n\n return { cloned: false, updated: false };\n}\n","/**\n * Template configuration replacer\n *\n * Replaces {{PLACEHOLDER}} patterns in template files\n * with configured values from TemplateConfig.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport type {\n TemplateConfig,\n TemplatePlaceholderReport,\n} from '../../types/template-config.js';\nimport { TEMPLATE_PLACEHOLDERS } from '../../constants/template-placeholders.js';\n\n/**\n * File extensions to process\n */\nconst PROCESSABLE_EXTENSIONS = ['.md', '.json', '.yaml', '.yml', '.txt'];\n\n/**\n * Directories to skip\n */\nconst SKIP_DIRECTORIES = ['node_modules', '.git', 'dist', 'build', '.next', '.turbo'];\n\n/**\n * Flatten TemplateConfig into a key-value map for replacement\n */\nexport function flattenTemplateConfig(\n config: Partial<TemplateConfig>\n): Record<string, string> {\n const flattened: Record<string, string> = {};\n\n // Commands\n if (config.commands) {\n if (config.commands.typecheck)\n flattened['{{TYPECHECK_COMMAND}}'] = config.commands.typecheck;\n if (config.commands.lint)\n flattened['{{LINT_COMMAND}}'] = config.commands.lint;\n if (config.commands.test)\n flattened['{{TEST_COMMAND}}'] = config.commands.test;\n if (config.commands.coverage)\n flattened['{{COVERAGE_COMMAND}}'] = config.commands.coverage;\n if (config.commands.build)\n flattened['{{BUILD_COMMAND}}'] = config.commands.build;\n if (config.commands.format)\n flattened['{{FORMAT_COMMAND}}'] = config.commands.format;\n if (config.commands.securityScan)\n flattened['{{SECURITY_SCAN_COMMAND}}'] = config.commands.securityScan;\n if (config.commands.lighthouse)\n flattened['{{LIGHTHOUSE_COMMAND}}'] = config.commands.lighthouse;\n if (config.commands.bundleAnalyze)\n flattened['{{BUNDLE_ANALYZE_COMMAND}}'] = config.commands.bundleAnalyze;\n }\n\n // Paths\n if (config.paths) {\n if (config.paths.planningPath)\n flattened['{{PLANNING_PATH}}'] = config.paths.planningPath;\n if (config.paths.refactorPath)\n flattened['{{REFACTOR_PATH}}'] = config.paths.refactorPath;\n if (config.paths.archivePath)\n flattened['{{ARCHIVE_PATH}}'] = config.paths.archivePath;\n if (config.paths.schemasPath)\n flattened['{{SCHEMAS_PATH}}'] = config.paths.schemasPath;\n if (config.paths.projectRoot)\n flattened['{{PROJECT_ROOT}}'] = config.paths.projectRoot;\n }\n\n // Targets\n if (config.targets) {\n if (config.targets.coverageTarget !== undefined)\n flattened['{{COVERAGE_TARGET}}'] = String(config.targets.coverageTarget);\n if (config.targets.bundleSizeTarget !== undefined)\n flattened['{{BUNDLE_SIZE_TARGET}}'] = String(config.targets.bundleSizeTarget);\n if (config.targets.lcpTarget !== undefined)\n flattened['{{LCP_TARGET}}'] = String(config.targets.lcpTarget);\n if (config.targets.fidTarget !== undefined)\n flattened['{{FID_TARGET}}'] = String(config.targets.fidTarget);\n if (config.targets.clsTarget !== undefined)\n flattened['{{CLS_TARGET}}'] = String(config.targets.clsTarget);\n if (config.targets.apiResponseTarget !== undefined)\n flattened['{{API_RESPONSE_TARGET}}'] = String(config.targets.apiResponseTarget);\n if (config.targets.dbQueryTarget !== undefined)\n flattened['{{DB_QUERY_TARGET}}'] = String(config.targets.dbQueryTarget);\n if (config.targets.wcagLevel)\n flattened['{{WCAG_LEVEL}}'] = config.targets.wcagLevel;\n }\n\n // Tracking\n if (config.tracking) {\n if (config.tracking.issueTracker)\n flattened['{{ISSUE_TRACKER}}'] = config.tracking.issueTracker;\n if (config.tracking.trackingFile)\n flattened['{{TRACKING_FILE}}'] = config.tracking.trackingFile;\n if (config.tracking.registryFile)\n flattened['{{REGISTRY_FILE}}'] = config.tracking.registryFile;\n if (config.tracking.taskCodePattern)\n flattened['{{TASK_CODE_PATTERN}}'] = config.tracking.taskCodePattern;\n if (config.tracking.closedDays !== undefined)\n flattened['{{CLOSED_DAYS}}'] = String(config.tracking.closedDays);\n if (config.tracking.staleDays !== undefined)\n flattened['{{STALE_DAYS}}'] = String(config.tracking.staleDays);\n }\n\n // Tech Stack\n if (config.techStack) {\n if (config.techStack.frontendFramework)\n flattened['{{FRONTEND_FRAMEWORK}}'] = config.techStack.frontendFramework;\n if (config.techStack.databaseOrm)\n flattened['{{DATABASE_ORM}}'] = config.techStack.databaseOrm;\n if (config.techStack.validationLibrary)\n flattened['{{VALIDATION_LIBRARY}}'] = config.techStack.validationLibrary;\n if (config.techStack.authPattern)\n flattened['{{AUTH_PATTERN}}'] = config.techStack.authPattern;\n if (config.techStack.stateManagement)\n flattened['{{STATE_MANAGEMENT}}'] = config.techStack.stateManagement;\n if (config.techStack.testFramework)\n flattened['{{TEST_FRAMEWORK}}'] = config.techStack.testFramework;\n if (config.techStack.bundler)\n flattened['{{BUNDLER}}'] = config.techStack.bundler;\n if (config.techStack.apiFramework)\n flattened['{{API_FRAMEWORK}}'] = config.techStack.apiFramework;\n }\n\n // Environment\n if (config.environment) {\n if (config.environment.githubTokenEnv)\n flattened['{{GITHUB_TOKEN_ENV}}'] = config.environment.githubTokenEnv;\n if (config.environment.githubOwnerEnv)\n flattened['{{GITHUB_OWNER_ENV}}'] = config.environment.githubOwnerEnv;\n if (config.environment.githubRepoEnv)\n flattened['{{GITHUB_REPO_ENV}}'] = config.environment.githubRepoEnv;\n if (config.environment.issueTrackerTokenEnv)\n flattened['{{ISSUE_TRACKER_TOKEN_ENV}}'] = config.environment.issueTrackerTokenEnv;\n }\n\n // Brand\n if (config.brand) {\n if (config.brand.brandName)\n flattened['{{BRAND_NAME}}'] = config.brand.brandName;\n if (config.brand.primaryColor)\n flattened['{{PRIMARY_COLOR}}'] = config.brand.primaryColor;\n if (config.brand.secondaryColor)\n flattened['{{SECONDARY_COLOR}}'] = config.brand.secondaryColor;\n if (config.brand.fontFamily)\n flattened['{{FONT_FAMILY}}'] = config.brand.fontFamily;\n if (config.brand.toneOfVoice)\n flattened['{{TONE_OF_VOICE}}'] = config.brand.toneOfVoice;\n }\n\n return flattened;\n}\n\n/**\n * Check if file should be processed\n */\nfunction shouldProcessFile(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n return PROCESSABLE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Check if directory should be skipped\n */\nfunction shouldSkipDirectory(dirName: string): boolean {\n return SKIP_DIRECTORIES.includes(dirName) || dirName.startsWith('.');\n}\n\n/**\n * Get all files in directory recursively\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!shouldSkipDirectory(entry.name)) {\n const subFiles = await getAllFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile() && shouldProcessFile(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n\n/**\n * Replace placeholders in a single file\n */\nasync function replaceInFile(\n filePath: string,\n replacements: Record<string, string>\n): Promise<Array<{ placeholder: string; value: string }>> {\n const changes: Array<{ placeholder: string; value: string }> = [];\n\n try {\n let content = await fs.readFile(filePath, 'utf-8');\n let modified = false;\n\n for (const [placeholder, value] of Object.entries(replacements)) {\n if (content.includes(placeholder)) {\n content = content.split(placeholder).join(value);\n changes.push({ placeholder, value });\n modified = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(filePath, content, 'utf-8');\n }\n } catch {\n // File can't be read/written, skip\n }\n\n return changes;\n}\n\n/**\n * Replace template placeholders in directory\n */\nexport async function replaceTemplatePlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<TemplatePlaceholderReport> {\n const replacements = flattenTemplateConfig(config);\n const files = await getAllFiles(dir);\n const report: TemplatePlaceholderReport = {\n totalFiles: files.length,\n filesModified: 0,\n replacements: [],\n unreplaced: [],\n };\n\n for (const file of files) {\n const changes = await replaceInFile(file, replacements);\n if (changes.length > 0) {\n report.filesModified++;\n for (const change of changes) {\n report.replacements.push({\n file: path.relative(dir, file),\n placeholder: change.placeholder,\n value: change.value,\n });\n }\n }\n }\n\n // Find unreplaced placeholders\n const allPatterns = TEMPLATE_PLACEHOLDERS.map((p) => p.pattern);\n const replacedPatterns = new Set(Object.keys(replacements));\n report.unreplaced = allPatterns.filter((p) => !replacedPatterns.has(p));\n\n return report;\n}\n\n/**\n * Replace template placeholders with spinner UI\n */\nexport async function replaceTemplateConfigWithSpinner(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<TemplatePlaceholderReport> {\n const spinner = ora('Applying template configuration...').start();\n\n try {\n const report = await replaceTemplatePlaceholders(dir, config);\n\n if (report.filesModified > 0) {\n spinner.succeed(\n `Applied ${report.replacements.length} replacements in ${report.filesModified} files`\n );\n } else {\n spinner.info('No template placeholders found to replace');\n }\n\n return report;\n } catch (error) {\n spinner.fail('Failed to apply template configuration');\n throw error;\n }\n}\n\n/**\n * Get a summary of the replacement report\n */\nexport function formatReplacementReport(\n report: TemplatePlaceholderReport\n): string {\n const lines: string[] = [];\n\n lines.push(`Template Configuration Applied`);\n lines.push(`${'─'.repeat(40)}`);\n lines.push(`Total files scanned: ${report.totalFiles}`);\n lines.push(`Files modified: ${report.filesModified}`);\n lines.push(`Total replacements: ${report.replacements.length}`);\n\n if (report.replacements.length > 0) {\n lines.push('');\n lines.push('Replacements:');\n\n // Group by file\n const byFile: Record<string, string[]> = {};\n for (const r of report.replacements) {\n if (!byFile[r.file]) {\n byFile[r.file] = [];\n }\n byFile[r.file].push(` ${r.placeholder} → ${r.value}`);\n }\n\n for (const [file, changes] of Object.entries(byFile)) {\n lines.push(` ${file}:`);\n for (const change of changes) {\n lines.push(change);\n }\n }\n }\n\n if (report.unreplaced.length > 0) {\n lines.push('');\n lines.push('Not configured (using defaults or runtime values):');\n for (const p of report.unreplaced.slice(0, 10)) {\n lines.push(` ${p}`);\n }\n if (report.unreplaced.length > 10) {\n lines.push(` ... and ${report.unreplaced.length - 10} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Preview replacements without making changes\n */\nexport async function previewReplacements(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<{ file: string; placeholder: string; value: string }[]> {\n const replacements = flattenTemplateConfig(config);\n const files = await getAllFiles(dir);\n const preview: Array<{ file: string; placeholder: string; value: string }> = [];\n\n for (const file of files) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n\n for (const [placeholder, value] of Object.entries(replacements)) {\n if (content.includes(placeholder)) {\n preview.push({\n file: path.relative(dir, file),\n placeholder,\n value,\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return preview;\n}\n","/**\n * Template placeholder definitions for configurable values\n *\n * These placeholders use the {{PLACEHOLDER}} syntax and are configured\n * during installation or via the `configure` command.\n */\n\nimport type {\n TemplateConfigContext,\n TemplatePlaceholderDefinition,\n} from '../types/template-config.js';\n\n/**\n * Detect package manager command prefix\n */\nfunction getPackageManagerPrefix(context: TemplateConfigContext): string {\n switch (context.packageManager) {\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun run';\n case 'npm':\n return 'npm run';\n default:\n return 'pnpm';\n }\n}\n\n/**\n * Check if a script exists in package.json\n */\nfunction hasScript(context: TemplateConfigContext, name: string): boolean {\n return Boolean(context.scripts?.[name]);\n}\n\n/**\n * Get script command if it exists\n */\nfunction getScriptCommand(context: TemplateConfigContext, scriptName: string): string | undefined {\n if (!hasScript(context, scriptName)) return undefined;\n const prefix = getPackageManagerPrefix(context);\n return `${prefix} ${scriptName}`;\n}\n\n/**\n * Check if a dependency exists\n */\nfunction hasDependency(context: TemplateConfigContext, name: string): boolean {\n return Boolean(context.dependencies?.[name]);\n}\n\n/**\n * All configurable template placeholders\n */\nexport const TEMPLATE_PLACEHOLDERS: TemplatePlaceholderDefinition[] = [\n // ==========================================\n // COMMANDS CATEGORY\n // ==========================================\n {\n key: 'TYPECHECK_COMMAND',\n pattern: '{{TYPECHECK_COMMAND}}',\n category: 'commands',\n label: 'TypeScript Check Command',\n description: 'Command to run TypeScript type checking',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'typecheck') ||\n getScriptCommand(ctx, 'type-check') ||\n getScriptCommand(ctx, 'tsc') ||\n `${getPackageManagerPrefix(ctx)} typecheck`,\n required: true,\n example: 'pnpm typecheck',\n },\n {\n key: 'LINT_COMMAND',\n pattern: '{{LINT_COMMAND}}',\n category: 'commands',\n label: 'Lint Command',\n description: 'Command to run linting (ESLint, Biome, etc.)',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'lint') || `${getPackageManagerPrefix(ctx)} lint`,\n required: true,\n example: 'pnpm lint',\n },\n {\n key: 'LINT_FIX_COMMAND',\n pattern: '{{LINT_FIX_COMMAND}}',\n category: 'commands',\n label: 'Lint Fix Command',\n description: 'Command to run linting with auto-fix',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'lint:fix') || `${getPackageManagerPrefix(ctx)} lint --fix`,\n required: false,\n relatedTo: ['LINT_COMMAND'],\n example: 'pnpm lint --fix',\n },\n {\n key: 'TEST_COMMAND',\n pattern: '{{TEST_COMMAND}}',\n category: 'commands',\n label: 'Test Command',\n description: 'Command to run tests',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'test') || `${getPackageManagerPrefix(ctx)} test`,\n required: true,\n example: 'pnpm test',\n },\n {\n key: 'TEST_WATCH_COMMAND',\n pattern: '{{TEST_WATCH_COMMAND}}',\n category: 'commands',\n label: 'Test Watch Command',\n description: 'Command to run tests in watch mode',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'test:watch') || `${getPackageManagerPrefix(ctx)} test --watch`,\n required: false,\n relatedTo: ['TEST_COMMAND'],\n example: 'pnpm test --watch',\n },\n {\n key: 'COVERAGE_COMMAND',\n pattern: '{{COVERAGE_COMMAND}}',\n category: 'commands',\n label: 'Coverage Command',\n description: 'Command to run tests with coverage',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'test:coverage') ||\n getScriptCommand(ctx, 'coverage') ||\n `${getPackageManagerPrefix(ctx)} test --coverage`,\n required: true,\n relatedTo: ['TEST_COMMAND'],\n example: 'pnpm test:coverage',\n },\n {\n key: 'BUILD_COMMAND',\n pattern: '{{BUILD_COMMAND}}',\n category: 'commands',\n label: 'Build Command',\n description: 'Command to build the project',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'build') || `${getPackageManagerPrefix(ctx)} build`,\n required: false,\n example: 'pnpm build',\n },\n {\n key: 'FORMAT_COMMAND',\n pattern: '{{FORMAT_COMMAND}}',\n category: 'commands',\n label: 'Format Command',\n description: 'Command to format code (Prettier, Biome, etc.)',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'format') || `${getPackageManagerPrefix(ctx)} format`,\n required: false,\n example: 'pnpm format',\n },\n {\n key: 'SECURITY_SCAN_COMMAND',\n pattern: '{{SECURITY_SCAN_COMMAND}}',\n category: 'commands',\n label: 'Security Scan Command',\n description: 'Command to run security vulnerability scanning',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'audit') || `${getPackageManagerPrefix(ctx)} audit`,\n required: false,\n example: 'pnpm audit',\n },\n {\n key: 'LIGHTHOUSE_COMMAND',\n pattern: '{{LIGHTHOUSE_COMMAND}}',\n category: 'commands',\n label: 'Lighthouse Command',\n description: 'Command to run Lighthouse performance audit',\n inputType: 'text',\n default: 'npx lighthouse http://localhost:3000 --output=json',\n required: false,\n example: 'npx lighthouse http://localhost:3000 --output=json',\n },\n {\n key: 'BUNDLE_ANALYZE_COMMAND',\n pattern: '{{BUNDLE_ANALYZE_COMMAND}}',\n category: 'commands',\n label: 'Bundle Analyze Command',\n description: 'Command to analyze bundle size',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'analyze') || `${getPackageManagerPrefix(ctx)} build --analyze`,\n required: false,\n example: 'pnpm build --analyze',\n },\n\n // ==========================================\n // PATHS CATEGORY\n // ==========================================\n {\n key: 'PLANNING_PATH',\n pattern: '{{PLANNING_PATH}}',\n category: 'paths',\n label: 'Planning Directory',\n description: 'Path for planning session documents',\n inputType: 'path',\n default: '.claude/sessions/planning',\n required: true,\n example: '.claude/sessions/planning',\n },\n {\n key: 'REFACTOR_PATH',\n pattern: '{{REFACTOR_PATH}}',\n category: 'paths',\n label: 'Refactor Directory',\n description: 'Path for refactoring session documents',\n inputType: 'path',\n default: '.claude/sessions/refactor',\n required: false,\n relatedTo: ['PLANNING_PATH'],\n example: '.claude/sessions/refactor',\n },\n {\n key: 'ARCHIVE_PATH',\n pattern: '{{ARCHIVE_PATH}}',\n category: 'paths',\n label: 'Archive Directory',\n description: 'Path for archived planning sessions',\n inputType: 'path',\n default: '.claude/sessions/archive',\n required: false,\n relatedTo: ['PLANNING_PATH'],\n example: '.claude/sessions/archive',\n },\n {\n key: 'SCHEMAS_PATH',\n pattern: '{{SCHEMAS_PATH}}',\n category: 'paths',\n label: 'Schemas Directory',\n description: 'Path for JSON schemas',\n inputType: 'path',\n default: '.claude/schemas',\n required: false,\n example: '.claude/schemas',\n },\n {\n key: 'PROJECT_ROOT',\n pattern: '{{PROJECT_ROOT}}',\n category: 'paths',\n label: 'Project Root',\n description: 'Root directory of the project',\n inputType: 'path',\n default: (ctx) => ctx.projectPath || '.',\n required: true,\n example: '.',\n },\n\n // ==========================================\n // TARGETS CATEGORY\n // ==========================================\n {\n key: 'COVERAGE_TARGET',\n pattern: '{{COVERAGE_TARGET}}',\n category: 'targets',\n label: 'Coverage Target (%)',\n description: 'Minimum test coverage percentage',\n inputType: 'number',\n default: '90',\n validate: (value) => {\n const num = Number.parseInt(value, 10);\n if (Number.isNaN(num) || num < 0 || num > 100) {\n return 'Coverage must be between 0 and 100';\n }\n return true;\n },\n required: true,\n example: '90',\n },\n {\n key: 'BUNDLE_SIZE_TARGET',\n pattern: '{{BUNDLE_SIZE_TARGET}}',\n category: 'targets',\n label: 'Bundle Size Target (KB)',\n description: 'Maximum bundle size in kilobytes',\n inputType: 'number',\n default: '500',\n validate: (value) => {\n const num = Number.parseInt(value, 10);\n if (Number.isNaN(num) || num < 0) {\n return 'Bundle size must be a positive number';\n }\n return true;\n },\n required: false,\n example: '500',\n },\n {\n key: 'LCP_TARGET',\n pattern: '{{LCP_TARGET}}',\n category: 'performance',\n label: 'LCP Target (ms)',\n description: 'Largest Contentful Paint target in milliseconds',\n inputType: 'number',\n default: '2500',\n required: false,\n example: '2500',\n },\n {\n key: 'FID_TARGET',\n pattern: '{{FID_TARGET}}',\n category: 'performance',\n label: 'FID Target (ms)',\n description: 'First Input Delay target in milliseconds',\n inputType: 'number',\n default: '100',\n required: false,\n example: '100',\n },\n {\n key: 'CLS_TARGET',\n pattern: '{{CLS_TARGET}}',\n category: 'performance',\n label: 'CLS Target',\n description: 'Cumulative Layout Shift target',\n inputType: 'number',\n default: '0.1',\n required: false,\n example: '0.1',\n },\n {\n key: 'API_RESPONSE_TARGET',\n pattern: '{{API_RESPONSE_TARGET}}',\n category: 'performance',\n label: 'API Response Target (ms)',\n description: 'Maximum API response time in milliseconds',\n inputType: 'number',\n default: '200',\n required: false,\n example: '200',\n },\n {\n key: 'DB_QUERY_TARGET',\n pattern: '{{DB_QUERY_TARGET}}',\n category: 'performance',\n label: 'DB Query Target (ms)',\n description: 'Maximum database query time in milliseconds',\n inputType: 'number',\n default: '50',\n required: false,\n example: '50',\n },\n {\n key: 'WCAG_LEVEL',\n pattern: '{{WCAG_LEVEL}}',\n category: 'targets',\n label: 'WCAG Compliance Level',\n description: 'Target WCAG accessibility compliance level',\n inputType: 'select',\n choices: [\n { name: 'Level A (Minimum)', value: 'A' },\n { name: 'Level AA (Recommended)', value: 'AA' },\n { name: 'Level AAA (Highest)', value: 'AAA' },\n ],\n default: 'AA',\n required: false,\n example: 'AA',\n },\n\n // ==========================================\n // TRACKING CATEGORY\n // ==========================================\n {\n key: 'ISSUE_TRACKER',\n pattern: '{{ISSUE_TRACKER}}',\n category: 'tracking',\n label: 'Issue Tracker',\n description: 'Issue tracking system to use',\n inputType: 'select',\n choices: [\n { name: 'GitHub Issues', value: 'github', description: 'Use GitHub Issues for tracking' },\n { name: 'Linear', value: 'linear', description: 'Use Linear for tracking' },\n { name: 'Jira', value: 'jira', description: 'Use Jira for tracking' },\n { name: 'None', value: 'none', description: 'No issue tracker integration' },\n ],\n default: (ctx) => (ctx.hasGitHubRemote ? 'github' : 'none'),\n required: true,\n example: 'github',\n },\n {\n key: 'TRACKING_FILE',\n pattern: '{{TRACKING_FILE}}',\n category: 'tracking',\n label: 'Tracking File',\n description: 'Path to the task tracking file',\n inputType: 'path',\n default: '.claude/tracking/tasks.json',\n required: false,\n example: '.claude/tracking/tasks.json',\n },\n {\n key: 'REGISTRY_FILE',\n pattern: '{{REGISTRY_FILE}}',\n category: 'tracking',\n label: 'Registry File',\n description: 'Path to the code registry file',\n inputType: 'path',\n default: '.claude/tracking/registry.json',\n required: false,\n example: '.claude/tracking/registry.json',\n },\n {\n key: 'TASK_CODE_PATTERN',\n pattern: '{{TASK_CODE_PATTERN}}',\n category: 'tracking',\n label: 'Task Code Pattern',\n description: 'Pattern for task codes (e.g., PROJ-XXX)',\n inputType: 'text',\n default: 'TASK-',\n required: false,\n example: 'TASK-',\n },\n {\n key: 'CLOSED_DAYS',\n pattern: '{{CLOSED_DAYS}}',\n category: 'tracking',\n label: 'Closed Days Threshold',\n description: 'Days after which closed issues can be cleaned up',\n inputType: 'number',\n default: '30',\n required: false,\n example: '30',\n },\n {\n key: 'STALE_DAYS',\n pattern: '{{STALE_DAYS}}',\n category: 'tracking',\n label: 'Stale Days Threshold',\n description: 'Days of inactivity before an issue is considered stale',\n inputType: 'number',\n default: '14',\n required: false,\n example: '14',\n },\n\n // ==========================================\n // TECH STACK CATEGORY\n // ==========================================\n {\n key: 'FRONTEND_FRAMEWORK',\n pattern: '{{FRONTEND_FRAMEWORK}}',\n category: 'techStack',\n label: 'Frontend Framework',\n description: 'Primary frontend framework',\n inputType: 'select',\n choices: [\n { name: 'React', value: 'React' },\n { name: 'Next.js', value: 'Next.js' },\n { name: 'TanStack Start', value: 'TanStack Start' },\n { name: 'Vue', value: 'Vue' },\n { name: 'Nuxt', value: 'Nuxt' },\n { name: 'Svelte', value: 'Svelte' },\n { name: 'SvelteKit', value: 'SvelteKit' },\n { name: 'Astro', value: 'Astro' },\n { name: 'SolidJS', value: 'SolidJS' },\n { name: 'Remix', value: 'Remix' },\n { name: 'Angular', value: 'Angular' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, '@tanstack/start')) return 'TanStack Start';\n if (hasDependency(ctx, 'next')) return 'Next.js';\n if (hasDependency(ctx, 'nuxt')) return 'Nuxt';\n if (hasDependency(ctx, 'vue')) return 'Vue';\n if (hasDependency(ctx, 'svelte')) return 'Svelte';\n if (hasDependency(ctx, '@sveltejs/kit')) return 'SvelteKit';\n if (hasDependency(ctx, 'astro')) return 'Astro';\n if (hasDependency(ctx, 'solid-js')) return 'SolidJS';\n if (hasDependency(ctx, '@remix-run/react')) return 'Remix';\n if (hasDependency(ctx, '@angular/core')) return 'Angular';\n if (hasDependency(ctx, 'react')) return 'React';\n return 'None';\n },\n required: false,\n example: 'React',\n },\n {\n key: 'DATABASE_ORM',\n pattern: '{{DATABASE_ORM}}',\n category: 'techStack',\n label: 'Database/ORM',\n description: 'Database ORM or query builder',\n inputType: 'select',\n choices: [\n { name: 'Drizzle', value: 'Drizzle' },\n { name: 'Prisma', value: 'Prisma' },\n { name: 'TypeORM', value: 'TypeORM' },\n { name: 'Sequelize', value: 'Sequelize' },\n { name: 'Knex', value: 'Knex' },\n { name: 'Kysely', value: 'Kysely' },\n { name: 'MongoDB/Mongoose', value: 'Mongoose' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'drizzle-orm')) return 'Drizzle';\n if (hasDependency(ctx, 'prisma') || hasDependency(ctx, '@prisma/client')) return 'Prisma';\n if (hasDependency(ctx, 'typeorm')) return 'TypeORM';\n if (hasDependency(ctx, 'sequelize')) return 'Sequelize';\n if (hasDependency(ctx, 'knex')) return 'Knex';\n if (hasDependency(ctx, 'kysely')) return 'Kysely';\n if (hasDependency(ctx, 'mongoose')) return 'Mongoose';\n return 'None';\n },\n required: false,\n example: 'Drizzle',\n },\n {\n key: 'VALIDATION_LIBRARY',\n pattern: '{{VALIDATION_LIBRARY}}',\n category: 'techStack',\n label: 'Validation Library',\n description: 'Schema validation library',\n inputType: 'select',\n choices: [\n { name: 'Zod', value: 'Zod' },\n { name: 'Yup', value: 'Yup' },\n { name: 'Joi', value: 'Joi' },\n { name: 'Valibot', value: 'Valibot' },\n { name: 'ArkType', value: 'ArkType' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'zod')) return 'Zod';\n if (hasDependency(ctx, 'yup')) return 'Yup';\n if (hasDependency(ctx, 'joi')) return 'Joi';\n if (hasDependency(ctx, 'valibot')) return 'Valibot';\n if (hasDependency(ctx, 'arktype')) return 'ArkType';\n return 'None';\n },\n required: false,\n example: 'Zod',\n },\n {\n key: 'AUTH_PATTERN',\n pattern: '{{AUTH_PATTERN}}',\n category: 'techStack',\n label: 'Authentication Pattern',\n description: 'Authentication approach',\n inputType: 'select',\n choices: [\n { name: 'Better Auth', value: 'Better Auth' },\n { name: 'Clerk', value: 'Clerk' },\n { name: 'Auth.js (NextAuth)', value: 'Auth.js' },\n { name: 'Lucia', value: 'Lucia' },\n { name: 'Firebase Auth', value: 'Firebase' },\n { name: 'Supabase Auth', value: 'Supabase' },\n { name: 'Kinde', value: 'Kinde' },\n { name: 'WorkOS', value: 'WorkOS' },\n { name: 'Custom JWT', value: 'JWT' },\n { name: 'Session-based', value: 'Session' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'better-auth')) return 'Better Auth';\n if (hasDependency(ctx, '@clerk/nextjs') || hasDependency(ctx, '@clerk/clerk-react'))\n return 'Clerk';\n if (hasDependency(ctx, 'next-auth') || hasDependency(ctx, '@auth/core')) return 'Auth.js';\n if (hasDependency(ctx, 'lucia')) return 'Lucia';\n if (hasDependency(ctx, 'firebase')) return 'Firebase';\n if (hasDependency(ctx, '@supabase/supabase-js')) return 'Supabase';\n if (hasDependency(ctx, '@kinde-oss/kinde-auth-nextjs')) return 'Kinde';\n if (hasDependency(ctx, '@workos-inc/authkit-nextjs')) return 'WorkOS';\n return 'None';\n },\n required: false,\n example: 'Better Auth',\n },\n {\n key: 'STATE_MANAGEMENT',\n pattern: '{{STATE_MANAGEMENT}}',\n category: 'techStack',\n label: 'State Management',\n description: 'Client-side state management',\n inputType: 'select',\n choices: [\n { name: 'TanStack Query', value: 'TanStack Query' },\n { name: 'Zustand', value: 'Zustand' },\n { name: 'Jotai', value: 'Jotai' },\n { name: 'Redux Toolkit', value: 'Redux' },\n { name: 'MobX', value: 'MobX' },\n { name: 'Recoil', value: 'Recoil' },\n { name: 'Pinia (Vue)', value: 'Pinia' },\n { name: 'None/Context', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, '@tanstack/react-query')) return 'TanStack Query';\n if (hasDependency(ctx, 'zustand')) return 'Zustand';\n if (hasDependency(ctx, 'jotai')) return 'Jotai';\n if (hasDependency(ctx, '@reduxjs/toolkit')) return 'Redux';\n if (hasDependency(ctx, 'mobx')) return 'MobX';\n if (hasDependency(ctx, 'recoil')) return 'Recoil';\n if (hasDependency(ctx, 'pinia')) return 'Pinia';\n return 'None';\n },\n required: false,\n example: 'TanStack Query',\n },\n {\n key: 'TEST_FRAMEWORK',\n pattern: '{{TEST_FRAMEWORK}}',\n category: 'techStack',\n label: 'Test Framework',\n description: 'Testing framework',\n inputType: 'select',\n choices: [\n { name: 'Vitest', value: 'Vitest' },\n { name: 'Jest', value: 'Jest' },\n { name: 'Mocha', value: 'Mocha' },\n { name: 'Ava', value: 'Ava' },\n { name: 'Node Test Runner', value: 'Node' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'vitest')) return 'Vitest';\n if (hasDependency(ctx, 'jest')) return 'Jest';\n if (hasDependency(ctx, 'mocha')) return 'Mocha';\n if (hasDependency(ctx, 'ava')) return 'Ava';\n return 'None';\n },\n required: false,\n example: 'Vitest',\n },\n {\n key: 'BUNDLER',\n pattern: '{{BUNDLER}}',\n category: 'techStack',\n label: 'Bundler',\n description: 'Build tool/bundler',\n inputType: 'select',\n choices: [\n { name: 'Vite', value: 'Vite' },\n { name: 'Webpack', value: 'Webpack' },\n { name: 'Rollup', value: 'Rollup' },\n { name: 'esbuild', value: 'esbuild' },\n { name: 'Parcel', value: 'Parcel' },\n { name: 'Turbopack', value: 'Turbopack' },\n { name: 'tsup', value: 'tsup' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'vite')) return 'Vite';\n if (hasDependency(ctx, 'webpack')) return 'Webpack';\n if (hasDependency(ctx, 'rollup')) return 'Rollup';\n if (hasDependency(ctx, 'esbuild')) return 'esbuild';\n if (hasDependency(ctx, 'parcel')) return 'Parcel';\n if (hasDependency(ctx, 'tsup')) return 'tsup';\n return 'None';\n },\n required: false,\n example: 'Vite',\n },\n {\n key: 'API_FRAMEWORK',\n pattern: '{{API_FRAMEWORK}}',\n category: 'techStack',\n label: 'API Framework',\n description: 'Backend API framework',\n inputType: 'select',\n choices: [\n { name: 'Hono', value: 'Hono' },\n { name: 'Express', value: 'Express' },\n { name: 'Fastify', value: 'Fastify' },\n { name: 'Koa', value: 'Koa' },\n { name: 'NestJS', value: 'NestJS' },\n { name: 'tRPC', value: 'tRPC' },\n { name: 'Next.js API Routes', value: 'Next.js API' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'hono')) return 'Hono';\n if (hasDependency(ctx, 'express')) return 'Express';\n if (hasDependency(ctx, 'fastify')) return 'Fastify';\n if (hasDependency(ctx, 'koa')) return 'Koa';\n if (hasDependency(ctx, '@nestjs/core')) return 'NestJS';\n if (hasDependency(ctx, '@trpc/server')) return 'tRPC';\n if (hasDependency(ctx, 'next')) return 'Next.js API';\n return 'None';\n },\n required: false,\n example: 'Hono',\n },\n\n // ==========================================\n // ENVIRONMENT CATEGORY\n // ==========================================\n {\n key: 'GITHUB_TOKEN_ENV',\n pattern: '{{GITHUB_TOKEN_ENV}}',\n category: 'environment',\n label: 'GitHub Token Env Var',\n description: 'Environment variable name for GitHub token',\n inputType: 'envVar',\n default: 'GITHUB_TOKEN',\n required: false,\n example: 'GITHUB_TOKEN',\n },\n {\n key: 'GITHUB_OWNER_ENV',\n pattern: '{{GITHUB_OWNER_ENV}}',\n category: 'environment',\n label: 'GitHub Owner Env Var',\n description: 'Environment variable name for GitHub owner/org',\n inputType: 'envVar',\n default: 'GITHUB_OWNER',\n required: false,\n example: 'GITHUB_OWNER',\n },\n {\n key: 'GITHUB_REPO_ENV',\n pattern: '{{GITHUB_REPO_ENV}}',\n category: 'environment',\n label: 'GitHub Repo Env Var',\n description: 'Environment variable name for GitHub repository',\n inputType: 'envVar',\n default: 'GITHUB_REPO',\n required: false,\n example: 'GITHUB_REPO',\n },\n {\n key: 'ISSUE_TRACKER_TOKEN_ENV',\n pattern: '{{ISSUE_TRACKER_TOKEN_ENV}}',\n category: 'environment',\n label: 'Issue Tracker Token Env Var',\n description: 'Environment variable for issue tracker API token',\n inputType: 'envVar',\n default: (ctx) => {\n // Set based on selected tracker\n const tracker = ctx.values.ISSUE_TRACKER;\n if (tracker === 'linear') return 'LINEAR_API_KEY';\n if (tracker === 'jira') return 'JIRA_API_TOKEN';\n return 'GITHUB_TOKEN';\n },\n dependsOn: ['ISSUE_TRACKER'],\n required: false,\n example: 'GITHUB_TOKEN',\n },\n\n // ==========================================\n // BRAND CATEGORY\n // ==========================================\n {\n key: 'BRAND_NAME',\n pattern: '{{BRAND_NAME}}',\n category: 'brand',\n label: 'Brand Name',\n description: 'Your brand or product name',\n inputType: 'text',\n default: '',\n required: false,\n example: 'MyProduct',\n },\n {\n key: 'PRIMARY_COLOR',\n pattern: '{{PRIMARY_COLOR}}',\n category: 'brand',\n label: 'Primary Color',\n description: 'Primary brand color (hex)',\n inputType: 'text',\n validate: (value) => {\n if (!value) return true;\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n return 'Must be a valid hex color (e.g., #3B82F6)';\n }\n return true;\n },\n default: '#3B82F6',\n required: false,\n example: '#3B82F6',\n },\n {\n key: 'SECONDARY_COLOR',\n pattern: '{{SECONDARY_COLOR}}',\n category: 'brand',\n label: 'Secondary Color',\n description: 'Secondary brand color (hex)',\n inputType: 'text',\n validate: (value) => {\n if (!value) return true;\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n return 'Must be a valid hex color (e.g., #10B981)';\n }\n return true;\n },\n default: '#10B981',\n required: false,\n example: '#10B981',\n },\n {\n key: 'FONT_FAMILY',\n pattern: '{{FONT_FAMILY}}',\n category: 'brand',\n label: 'Font Family',\n description: 'Primary font family',\n inputType: 'text',\n default: 'Inter, system-ui, sans-serif',\n required: false,\n example: 'Inter, system-ui, sans-serif',\n },\n {\n key: 'TONE_OF_VOICE',\n pattern: '{{TONE_OF_VOICE}}',\n category: 'brand',\n label: 'Tone of Voice',\n description: 'Brand communication tone',\n inputType: 'select',\n choices: [\n { name: 'Professional', value: 'professional' },\n { name: 'Friendly', value: 'friendly' },\n { name: 'Casual', value: 'casual' },\n { name: 'Technical', value: 'technical' },\n { name: 'Playful', value: 'playful' },\n ],\n default: 'professional',\n required: false,\n example: 'professional',\n },\n];\n\n/**\n * Get placeholder definition by key\n */\nexport function getPlaceholderByKey(key: string): TemplatePlaceholderDefinition | undefined {\n return TEMPLATE_PLACEHOLDERS.find((p) => p.key === key);\n}\n\n/**\n * Get placeholder definition by pattern\n */\nexport function getPlaceholderByPattern(\n pattern: string\n): TemplatePlaceholderDefinition | undefined {\n return TEMPLATE_PLACEHOLDERS.find((p) => p.pattern === pattern);\n}\n\n/**\n * Get all placeholders for a category\n */\nexport function getPlaceholdersByCategory(category: string): TemplatePlaceholderDefinition[] {\n return TEMPLATE_PLACEHOLDERS.filter((p) => p.category === category);\n}\n\n/**\n * Get all required placeholders\n */\nexport function getRequiredPlaceholders(): TemplatePlaceholderDefinition[] {\n return TEMPLATE_PLACEHOLDERS.filter((p) => p.required);\n}\n\n/**\n * Get all placeholder keys\n */\nexport function getAllPlaceholderKeys(): string[] {\n return TEMPLATE_PLACEHOLDERS.map((p) => p.key);\n}\n\n/**\n * Get all placeholder patterns\n */\nexport function getAllPlaceholderPatterns(): string[] {\n return TEMPLATE_PLACEHOLDERS.map((p) => p.pattern);\n}\n\n/**\n * Check if a pattern is a configurable placeholder\n */\nexport function isConfigurablePlaceholder(pattern: string): boolean {\n return TEMPLATE_PLACEHOLDERS.some((p) => p.pattern === pattern);\n}\n\n/**\n * Compute default value for a placeholder\n */\nexport function computeDefaultValue(\n placeholder: TemplatePlaceholderDefinition,\n context: TemplateConfigContext\n): string | undefined {\n if (typeof placeholder.default === 'function') {\n return placeholder.default(context);\n }\n return placeholder.default;\n}\n","/**\n * Prompt cancellation utility with ESC key support\n *\n * Provides graceful cancellation handling for CLI prompts using AbortController.\n * - Handles Ctrl+C via ExitPromptError from @inquirer/prompts\n * - Handles ESC key by showing confirmation before cancelling\n * - Wraps all @inquirer/prompts functions to add ESC support\n */\n\nimport * as readline from 'node:readline';\nimport {\n checkbox as inquirerCheckbox,\n confirm as inquirerConfirm,\n input as inquirerInput,\n password as inquirerPassword,\n select as inquirerSelect,\n} from '@inquirer/prompts';\nimport type { Context } from '@inquirer/type';\nimport chalk from 'chalk';\n\n/**\n * Error thrown when user confirms cancellation via ESC\n */\nexport class UserCancelledError extends Error {\n constructor(message = 'Operation cancelled by user') {\n super(message);\n this.name = 'UserCancelledError';\n }\n}\n\n/**\n * Check if an error is a cancellation error (ESC confirmed, Ctrl+C, or abort)\n */\nexport function isCancellationError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'UserCancelledError' ||\n error.name === 'AbortPromptError'\n );\n}\n\n// Global state for ESC handling\nlet escHandlerActive = false;\nlet currentAbortController: AbortController | null = null;\nlet keypressHandler: ((str: string | undefined, key: readline.Key) => void) | null = null;\n\n/**\n * Start listening for ESC key presses\n */\nfunction startEscListener(): void {\n if (escHandlerActive || !process.stdin.isTTY) return;\n\n // Set up keypress events\n readline.emitKeypressEvents(process.stdin);\n\n keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === 'escape' && currentAbortController) {\n currentAbortController.abort();\n }\n };\n\n process.stdin.on('keypress', keypressHandler);\n escHandlerActive = true;\n}\n\n/**\n * Stop listening for ESC key presses\n */\nfunction stopEscListener(): void {\n if (!escHandlerActive || !keypressHandler) return;\n\n process.stdin.removeListener('keypress', keypressHandler);\n keypressHandler = null;\n escHandlerActive = false;\n}\n\n/**\n * Create an AbortController and start ESC listener\n */\nfunction setupAbortController(): AbortController {\n currentAbortController = new AbortController();\n startEscListener();\n return currentAbortController;\n}\n\n/**\n * Clean up after prompt completes\n */\nfunction cleanupAbortController(): void {\n currentAbortController = null;\n}\n\n/**\n * Check if error is from abort (ESC press)\n */\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortPromptError';\n}\n\n/**\n * Ask user to confirm cancellation\n * Uses inquirerConfirm directly to avoid recursion\n */\nasync function confirmCancellation(): Promise<boolean> {\n // Temporarily disable ESC listener for this prompt\n const wasActive = escHandlerActive;\n if (wasActive) {\n stopEscListener();\n }\n\n console.log(); // New line after aborted prompt\n\n try {\n const shouldCancel = await inquirerConfirm({\n message: chalk.yellow('Do you want to cancel the installation?'),\n default: false,\n });\n return shouldCancel;\n } catch (error) {\n // If user presses Ctrl+C during confirmation, treat as cancel\n if (isCancellationError(error)) {\n return true;\n }\n throw error;\n } finally {\n // Restore ESC listener if it was active\n if (wasActive) {\n startEscListener();\n }\n }\n}\n\n// Type definitions for prompt configs\ntype InputConfig = Parameters<typeof inquirerInput>[0];\ntype ConfirmConfig = Parameters<typeof inquirerConfirm>[0];\ntype SelectConfig<T> = Parameters<typeof inquirerSelect<T>>[0];\ntype CheckboxConfig<T> = Parameters<typeof inquirerCheckbox<T>>[0];\ntype PasswordConfig = Parameters<typeof inquirerPassword>[0];\n\n/**\n * Generic wrapper for prompts with ESC confirmation support\n */\nasync function withEscConfirmation<T, C>(\n promptFn: (config: C, context?: Context) => Promise<T>,\n config: C,\n context?: Context\n): Promise<T> {\n while (true) {\n const controller = setupAbortController();\n\n try {\n const result = await promptFn(config, { ...context, signal: controller.signal });\n cleanupAbortController();\n return result;\n } catch (error) {\n cleanupAbortController();\n\n // If ESC was pressed (AbortPromptError), ask for confirmation\n if (isAbortError(error)) {\n const shouldCancel = await confirmCancellation();\n\n if (shouldCancel) {\n throw new UserCancelledError('Cancelled with ESC');\n }\n\n // User chose not to cancel, show the prompt again\n console.log(chalk.dim(' Continuing...\\n'));\n continue;\n }\n\n // For other errors (including Ctrl+C), propagate them\n throw error;\n }\n }\n}\n\n/**\n * Input prompt with ESC confirmation support\n */\nexport async function input(config: InputConfig, context?: Context): Promise<string> {\n return withEscConfirmation(inquirerInput, config, context);\n}\n\n/**\n * Confirm prompt with ESC confirmation support\n */\nexport async function confirm(config: ConfirmConfig, context?: Context): Promise<boolean> {\n return withEscConfirmation(inquirerConfirm, config, context);\n}\n\n/**\n * Select prompt with ESC confirmation support\n */\nexport async function select<T>(config: SelectConfig<T>, context?: Context): Promise<T> {\n return withEscConfirmation(\n inquirerSelect as (config: SelectConfig<T>, context?: Context) => Promise<T>,\n config,\n context\n );\n}\n\n/**\n * Checkbox prompt with ESC confirmation support\n */\nexport async function checkbox<T>(config: CheckboxConfig<T>, context?: Context): Promise<T[]> {\n return withEscConfirmation(\n inquirerCheckbox as (config: CheckboxConfig<T>, context?: Context) => Promise<T[]>,\n config,\n context\n );\n}\n\n/**\n * Password prompt with ESC confirmation support\n */\nexport async function password(config: PasswordConfig, context?: Context): Promise<string> {\n return withEscConfirmation(inquirerPassword, config, context);\n}\n\n/**\n * Set up global handlers for graceful cancellation\n * This catches uncaught ExitPromptError from inquirer prompts\n */\nexport function setupGracefulCancellation(): void {\n // Handle uncaught ExitPromptError from inquirer (Ctrl+C during prompt)\n process.on('uncaughtException', (error) => {\n if (isCancellationError(error)) {\n stopEscListener();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n process.exit(0);\n }\n // Log and exit for other errors\n console.error(chalk.red('Unexpected error:'), error);\n process.exit(1);\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error && isCancellationError(reason)) {\n stopEscListener();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n process.exit(0);\n }\n console.error(chalk.red('Unhandled rejection:'), reason);\n process.exit(1);\n });\n\n // Handle SIGINT (Ctrl+C outside of prompt)\n process.on('SIGINT', () => {\n stopEscListener();\n console.log(chalk.dim('\\n Interrupted.\\n'));\n process.exit(0);\n });\n\n // Handle SIGTERM\n process.on('SIGTERM', () => {\n stopEscListener();\n console.log(chalk.dim('\\n Terminated.\\n'));\n process.exit(0);\n });\n}\n\n/**\n * Show a hint about how to cancel\n */\nexport function showCancelHint(): void {\n console.log(chalk.dim(' Press ESC or Ctrl+C to cancel at any time\\n'));\n}\n\n/**\n * Clean up resources when done\n */\nexport function cleanup(): void {\n stopEscListener();\n}\n\n/**\n * Print a cancellation message and exit\n */\nexport function exitWithCancel(message = 'Operation cancelled'): never {\n cleanup();\n console.log(chalk.yellow(`\\n ${message}\\n`));\n process.exit(0);\n}\n\n/**\n * Wrap an async function to handle cancellation gracefully\n */\nexport async function withCancellation<T>(\n fn: () => Promise<T>,\n options?: {\n onCancel?: () => void;\n exitOnCancel?: boolean;\n }\n): Promise<T | null> {\n try {\n return await fn();\n } catch (error) {\n if (isCancellationError(error)) {\n options?.onCancel?.();\n if (options?.exitOnCancel !== false) {\n exitWithCancel();\n }\n return null;\n }\n throw error;\n }\n}\n","/**\n * Bundle selection prompts\n */\n\nimport {\n formatBundleCompact,\n printBundleDisplay,\n printValidationWarnings,\n} from '../../lib/bundles/display.js';\nimport {\n formatBundleDetailedDescription,\n formatBundleForDisplay,\n getAllBundles,\n getBundleById,\n getBundleCategoryName,\n getBundlesGroupedByCategory,\n resolveBundles,\n} from '../../lib/bundles/resolver.js';\nimport { validateModuleDependencies } from '../../lib/bundles/validator.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BundleDefinition,\n BundleSelectionResult,\n BundleValidationResult,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\n\nexport type BundleSelectionMode = 'bundles' | 'individual' | 'both';\n\n/**\n * Prompt for bundle selection mode\n */\nexport async function promptBundleMode(): Promise<BundleSelectionMode> {\n const choice = await select<BundleSelectionMode>({\n message: 'How would you like to select modules?',\n choices: [\n {\n name: 'Use bundles (recommended)',\n value: 'bundles',\n description: 'Select pre-configured module bundles for common use cases',\n },\n {\n name: 'Select individual modules',\n value: 'individual',\n description: 'Choose modules one by one',\n },\n {\n name: 'Bundles + individual customization',\n value: 'both',\n description: 'Start with bundles, then add/remove individual modules',\n },\n ],\n default: 'bundles',\n });\n\n return choice;\n}\n\n/**\n * Prompt for bundle selection by category (internal, doesn't show summary)\n */\nasync function promptBundleSelectionByCategory(): Promise<string[]> {\n const grouped = getBundlesGroupedByCategory();\n const categories = Object.keys(grouped);\n\n logger.section('Module Bundles', '📦');\n logger.info('Select bundles to install. Use arrow keys to see details for each bundle.');\n logger.newline();\n\n const selectedBundles: string[] = [];\n\n for (const category of categories) {\n const bundles = grouped[category];\n const categoryName = getBundleCategoryName(category);\n\n logger.newline();\n logger.info(colors.primary(`${categoryName}:`));\n\n const choices = bundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n }));\n\n const selected = await checkbox({\n message: `Select ${categoryName.toLowerCase()} bundles:`,\n choices,\n required: false,\n });\n\n selectedBundles.push(...selected);\n }\n\n return selectedBundles;\n}\n\n/**\n * Prompt for bundle selection\n * Description shows detailed info when hovering over each choice\n * Shows summary with totals at the end with option to edit\n */\nexport async function promptBundleSelection(): Promise<string[]> {\n let selectedBundles = await promptBundleSelectionByCategory();\n\n // Show summary with totals and allow editing\n if (selectedBundles.length > 0) {\n let confirmed = false;\n while (!confirmed) {\n const action = await confirmBundleSelectionWithEdit(selectedBundles);\n\n if (action === 'confirm') {\n confirmed = true;\n } else if (action === 'edit') {\n selectedBundles = await editBundleSelection(selectedBundles);\n // If all bundles were removed, break the loop\n if (selectedBundles.length === 0) {\n break;\n }\n } else {\n // cancel\n return [];\n }\n }\n }\n\n return selectedBundles;\n}\n\n// Special values for checkbox options\nconst BROWSE_ALL_VALUE = '__browse_all__';\nconst SKIP_VALUE = '__skip__';\n\n/**\n * Prompt for quick bundle selection (multi-select from popular bundles)\n * Description shows detailed info when hovering over each choice\n */\nexport async function promptQuickBundleSelection(): Promise<string[]> {\n const allBundles = getAllBundles();\n\n // Top 6 most common bundles\n const featuredBundleIds = [\n 'react-tanstack-stack',\n 'hono-drizzle-stack',\n 'nextjs-prisma-stack',\n 'testing-complete',\n 'quality-complete',\n 'planning-complete',\n ];\n\n const featuredBundles = featuredBundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Bundle Selection');\n logger.info('Use arrow keys to navigate, Space to select, Enter to confirm.');\n logger.info(\n colors.muted(\n `Showing ${featuredBundles.length} popular bundles. ${allBundles.length} total available.`\n )\n );\n logger.newline();\n\n const choices = [\n // Featured bundles\n ...featuredBundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n })),\n // Actions\n {\n name: colors.primary(`Ver todos (${allBundles.length} bundles)`),\n value: BROWSE_ALL_VALUE,\n description:\n 'Browse all bundles organized by category: Stacks, Testing, Database, API, Frontend, Workflow',\n },\n {\n name: colors.muted('Omitir'),\n value: SKIP_VALUE,\n description: 'Continue without bundles - you can select individual modules later',\n },\n ];\n\n const selected = await checkbox({\n message: 'Select bundles (Space to toggle, Enter to confirm):',\n choices,\n required: false,\n });\n\n // Check if user selected \"Browse all\"\n if (selected.includes(BROWSE_ALL_VALUE)) {\n // Remove special values and keep any real bundles selected\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE && id !== SKIP_VALUE);\n const additional = await promptBundleSelection();\n // Merge without duplicates\n return [...realBundles, ...additional.filter((id) => !realBundles.includes(id))];\n }\n\n // Check if user selected \"Skip\"\n if (selected.includes(SKIP_VALUE)) {\n // If only skip was selected, return empty\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE && id !== SKIP_VALUE);\n if (realBundles.length === 0) {\n return [];\n }\n // If they selected bundles AND skip, just use the bundles\n return realBundles;\n }\n\n // If nothing selected, ask what to do\n if (selected.length === 0) {\n const action = await select<'browse' | 'skip'>({\n message: 'No bundles selected. What would you like to do?',\n choices: [\n {\n name: 'Browse all bundles by category',\n value: 'browse',\n description: `See all ${allBundles.length} available bundles organized by category`,\n },\n {\n name: 'Skip bundles',\n value: 'skip',\n description: 'Continue without selecting any bundles',\n },\n ],\n });\n\n if (action === 'browse') {\n return promptBundleSelection();\n }\n return [];\n }\n\n // Ask if they want to add more from other categories\n const addMore = await confirm({\n message: 'Would you like to browse additional bundles by category?',\n default: false,\n });\n\n let finalSelection = selected;\n if (addMore) {\n const additional = await promptBundleSelection();\n // Merge without duplicates\n finalSelection = [...selected, ...additional.filter((id) => !selected.includes(id))];\n }\n\n // Show summary with totals and allow editing\n if (finalSelection.length > 0) {\n let confirmed = false;\n while (!confirmed) {\n const action = await confirmBundleSelectionWithEdit(finalSelection);\n\n if (action === 'confirm') {\n confirmed = true;\n } else if (action === 'edit') {\n finalSelection = await editBundleSelection(finalSelection);\n // If all bundles were removed, break the loop\n if (finalSelection.length === 0) {\n break;\n }\n } else {\n // cancel\n return [];\n }\n }\n }\n\n return finalSelection;\n}\n\n/**\n * Show bundle contents preview using visual display\n */\nexport function showBundleContents(bundle: BundleDefinition): void {\n logger.newline();\n printBundleDisplay(bundle);\n}\n\n/**\n * Show detailed bundle information for a specific bundle by ID\n */\nexport async function showBundleDetails(bundleId: string): Promise<void> {\n const bundle = getBundleById(bundleId);\n if (!bundle) {\n logger.error(`Bundle not found: ${bundleId}`);\n return;\n }\n\n showBundleContents(bundle);\n}\n\n/**\n * Show validation warnings and auto-included modules\n */\nexport function showValidationResults(validation: BundleValidationResult): void {\n if (validation.errors.length === 0 && validation.warnings.length === 0) {\n return;\n }\n\n logger.newline();\n printValidationWarnings(validation);\n\n if (validation.autoIncluded.length > 0) {\n logger.newline();\n logger.info(colors.primary('Auto-included modules:'));\n for (const module of validation.autoIncluded) {\n logger.info(` ${colors.muted('•')} ${module.id} (${module.category})`);\n }\n }\n}\n\n/**\n * Module totals from resolved bundles\n */\nexport interface ModuleTotals {\n agents: number;\n skills: number;\n commands: number;\n docs: number;\n total: number;\n}\n\n/**\n * Calculate module totals from bundle selection\n */\nexport function calculateModuleTotals(bundleIds: string[]): ModuleTotals {\n const resolved = resolveBundles(bundleIds);\n return {\n agents: resolved.agents.length,\n skills: resolved.skills.length,\n commands: resolved.commands.length,\n docs: resolved.docs.length,\n total:\n resolved.agents.length +\n resolved.skills.length +\n resolved.commands.length +\n resolved.docs.length,\n };\n}\n\n/**\n * Show selected bundles summary with compact format and module totals\n */\nexport function showBundlesSummary(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Selected Bundles');\n\n for (const bundle of selectedBundles) {\n logger.success(`• ${formatBundleCompact(bundle)}`);\n }\n}\n\n/**\n * Show selected bundles summary with totals\n */\nexport function showBundlesSummaryWithTotals(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const totals = calculateModuleTotals(bundleIds);\n\n logger.newline();\n logger.subtitle(`Selected Bundles (${selectedBundles.length})`);\n\n for (const bundle of selectedBundles) {\n logger.success(` • ${formatBundleCompact(bundle)}`);\n }\n\n // Show totals box\n const border = colors.primary('│');\n logger.newline();\n logger.info(colors.primary('┌─────────────────────────────────────┐'));\n logger.info(`${border} Module Totals ${border}`);\n logger.info(colors.primary('├─────────────────────────────────────┤'));\n logger.info(\n `${border} 🤖 Agents: ${String(totals.agents).padStart(3)} ${border}`\n );\n logger.info(\n `${border} ⚡ Skills: ${String(totals.skills).padStart(3)} ${border}`\n );\n logger.info(\n `${border} 💻 Commands: ${String(totals.commands).padStart(3)} ${border}`\n );\n logger.info(\n `${border} 📚 Docs: ${String(totals.docs).padStart(3)} ${border}`\n );\n logger.info(colors.primary('├─────────────────────────────────────┤'));\n logger.info(\n `${border}${colors.success(` Total: ${String(totals.total).padStart(3)} modules `)}${border}`\n );\n logger.info(colors.primary('└─────────────────────────────────────┘'));\n}\n\n/**\n * Show detailed summary of all selected bundles with visual display\n */\nexport function showBundlesDetailedSummary(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle(`Selected Bundles (${selectedBundles.length})`);\n\n for (const bundle of selectedBundles) {\n showBundleContents(bundle);\n }\n}\n\n/**\n * Validate bundle selection and show any dependency issues\n */\nexport function validateAndShowDependencies(\n bundleIds: string[],\n selectedModules: ModuleSelectionResult\n): BundleValidationResult {\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const validation = validateModuleDependencies(selectedModules, selectedBundles);\n showValidationResults(validation);\n\n return validation;\n}\n\n/**\n * Action options for bundle selection confirmation\n */\nexport type BundleConfirmAction = 'confirm' | 'edit' | 'cancel';\n\n/**\n * Confirm bundle selection with option to edit\n */\nexport async function confirmBundleSelection(bundleIds: string[]): Promise<boolean> {\n showBundlesSummary(bundleIds);\n logger.newline();\n\n return confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n}\n\n/**\n * Confirm bundle selection with totals and option to go back and edit\n * Returns the action the user wants to take\n */\nexport async function confirmBundleSelectionWithEdit(\n bundleIds: string[]\n): Promise<BundleConfirmAction> {\n showBundlesSummaryWithTotals(bundleIds);\n logger.newline();\n\n const action = await select<BundleConfirmAction>({\n message: 'What would you like to do?',\n choices: [\n {\n name: colors.success('✓ Confirm selection'),\n value: 'confirm',\n description: 'Continue with the selected bundles',\n },\n {\n name: colors.warning('← Edit selection'),\n value: 'edit',\n description: 'Go back and modify your bundle selection',\n },\n {\n name: colors.muted('✕ Cancel'),\n value: 'cancel',\n description: 'Cancel and start over',\n },\n ],\n default: 'confirm',\n });\n\n return action;\n}\n\n/**\n * Edit bundle selection - allows removing bundles from current selection\n */\nexport async function editBundleSelection(currentBundleIds: string[]): Promise<string[]> {\n const allBundles = getAllBundles();\n const selectedBundles = currentBundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Edit Bundle Selection');\n logger.info('Uncheck bundles you want to remove, or add new ones.');\n logger.newline();\n\n const choices = selectedBundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n checked: true, // All currently selected bundles are checked\n }));\n\n // Add option to browse more bundles\n choices.push({\n name: colors.primary('+ Add more bundles...'),\n value: BROWSE_ALL_VALUE,\n description: 'Browse all available bundles to add more',\n checked: false,\n });\n\n const selected = await checkbox({\n message: 'Current bundles (uncheck to remove):',\n choices,\n required: false,\n });\n\n // Check if user wants to add more\n if (selected.includes(BROWSE_ALL_VALUE)) {\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE);\n const additional = await promptBundleSelection();\n // Merge without duplicates\n return [...realBundles, ...additional.filter((id) => !realBundles.includes(id))];\n }\n\n return selected;\n}\n\n/**\n * Confirm bundle selection with detailed view and validation\n */\nexport async function confirmBundleSelectionDetailed(\n bundleIds: string[],\n selectedModules: ModuleSelectionResult\n): Promise<{ confirmed: boolean; validation: BundleValidationResult }> {\n // Show compact summary first\n showBundlesSummary(bundleIds);\n\n // Validate and show any dependency issues\n const validation = validateAndShowDependencies(bundleIds, selectedModules);\n\n // Ask if user wants to see detailed view\n if (bundleIds.length > 0) {\n const showDetails = await confirm({\n message: 'Would you like to see detailed bundle information?',\n default: false,\n });\n\n if (showDetails) {\n showBundlesDetailedSummary(bundleIds);\n }\n }\n\n logger.newline();\n const confirmed = await confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n\n return { confirmed, validation };\n}\n\n/**\n * Prompt user to view bundle details during selection\n */\nexport async function promptBundlePreview(bundleIds: string[]): Promise<void> {\n if (bundleIds.length === 0) {\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n if (selectedBundles.length === 0) {\n return;\n }\n\n const choices = [\n ...selectedBundles.map((bundle) => ({\n name: formatBundleCompact(bundle),\n value: bundle.id,\n description: 'View detailed information',\n })),\n {\n name: 'Done viewing',\n value: 'done',\n description: 'Continue with selection',\n },\n ];\n\n let viewing = true;\n while (viewing) {\n const selected = await select<string>({\n message: 'Select a bundle to view details (or Done to continue):',\n choices,\n default: 'done',\n });\n\n if (selected === 'done') {\n viewing = false;\n } else {\n const bundle = selectedBundles.find((b) => b.id === selected);\n if (bundle) {\n showBundleContents(bundle);\n }\n }\n }\n}\n\n/**\n * Create empty bundle selection result\n */\nexport function createEmptyBundleResult(): BundleSelectionResult {\n return {\n selectedBundles: [],\n additionalModules: {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n },\n };\n}\n","/**\n * Bundle display utilities with ASCII box formatting\n * Provides rich visual display of bundle information\n */\n\nimport type { BundleDefinition, BundleValidationResult } from '../../types/bundles.js';\nimport { colors } from '../utils/logger.js';\nimport { resolveBundle } from './resolver.js';\n\n// Box drawing characters\nconst BOX = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n horizontalDown: '┬',\n horizontalUp: '┴',\n verticalRight: '├',\n verticalLeft: '┤',\n cross: '┼',\n};\n\n// Icons for different sections\nconst ICONS = {\n bundle: '📦',\n responsibilities: '🎯',\n useCases: '📋',\n agents: '🤖',\n skills: '⚡',\n commands: '💻',\n docs: '📚',\n tags: '🏷️',\n complexity: '📊',\n tech: '🔧',\n warning: '⚠️',\n error: '🔴',\n recommended: '🟡',\n check: '✓',\n bullet: '•',\n};\n\n/**\n * Default terminal width for box formatting\n */\nconst DEFAULT_WIDTH = 70;\n\n/**\n * Create a horizontal line for boxes\n */\nfunction horizontalLine(width: number, left: string, right: string, fill = BOX.horizontal): string {\n return left + fill.repeat(width - 2) + right;\n}\n\n/**\n * Pad a string to fit within box width\n */\nfunction padLine(content: string, width: number): string {\n const visibleLength = stripAnsi(content).length;\n const padding = Math.max(0, width - 2 - visibleLength);\n return `${BOX.vertical} ${content}${' '.repeat(padding)}${BOX.vertical}`;\n}\n\n/**\n * Strip ANSI codes for length calculation\n */\nfunction stripAnsi(str: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes use control characters\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n/**\n * Wrap text to fit within a maximum width\n */\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 <= maxWidth) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) lines.push(currentLine);\n\n return lines;\n}\n\n/**\n * Format complexity level with color\n */\nfunction formatComplexity(complexity?: string): string {\n switch (complexity) {\n case 'minimal':\n return colors.success('Minimal');\n case 'standard':\n return colors.primary('Standard');\n case 'comprehensive':\n return colors.warning('Comprehensive');\n default:\n return colors.muted('Standard');\n }\n}\n\n/**\n * Format a bundle for rich visual display\n * Returns an array of lines to be printed\n */\nexport function formatBundleVisualDisplay(\n bundle: BundleDefinition,\n width: number = DEFAULT_WIDTH\n): string[] {\n const lines: string[] = [];\n const contentWidth = width - 4; // Account for box borders and padding\n const resolved = resolveBundle(bundle);\n\n // Top border with title\n lines.push(horizontalLine(width, BOX.topLeft, BOX.topRight));\n\n // Bundle name with icon\n const title = `${ICONS.bundle} ${colors.primary(bundle.name)}`;\n lines.push(padLine(title, width));\n\n // Separator\n lines.push(horizontalLine(width, BOX.verticalRight, BOX.verticalLeft));\n\n // Description (wrapped)\n const descLines = wrapText(bundle.description, contentWidth);\n for (const line of descLines) {\n lines.push(padLine(line, width));\n }\n\n // Tech stack if available\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push(padLine('', width)); // Empty line\n lines.push(\n padLine(`${ICONS.tech} ${colors.muted('Tech:')} ${bundle.techStack.join(', ')}`, width)\n );\n }\n\n // Responsibilities if available\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push(padLine('', width));\n lines.push(padLine(`${ICONS.responsibilities} ${colors.primary('RESPONSIBILITIES:')}`, width));\n for (const resp of bundle.responsibilities) {\n const respLines = wrapText(`${ICONS.bullet} ${resp}`, contentWidth - 2);\n for (const line of respLines) {\n lines.push(padLine(` ${line}`, width));\n }\n }\n }\n\n // Use cases if available\n if (bundle.useCases && bundle.useCases.length > 0) {\n lines.push(padLine('', width));\n lines.push(padLine(`${ICONS.useCases} ${colors.primary('USE CASES:')}`, width));\n for (const useCase of bundle.useCases) {\n const ucLines = wrapText(`${ICONS.bullet} ${useCase}`, contentWidth - 2);\n for (const line of ucLines) {\n lines.push(padLine(` ${line}`, width));\n }\n }\n }\n\n // Agents section\n if (resolved.modules.agents.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.agents} ${colors.primary('AGENTS')} (${resolved.modules.agents.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.agents) {\n for (const agent of bundle.moduleDetails.agents) {\n lines.push(\n padLine(` ${ICONS.bullet} ${colors.secondary(agent.id)} - ${agent.role}`, width)\n );\n }\n } else {\n lines.push(padLine(` ${resolved.modules.agents.join(', ')}`, width));\n }\n }\n\n // Skills section\n if (resolved.modules.skills.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.skills} ${colors.primary('SKILLS')} (${resolved.modules.skills.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.skills) {\n for (const skill of bundle.moduleDetails.skills) {\n lines.push(\n padLine(` ${ICONS.bullet} ${colors.secondary(skill.id)} - ${skill.purpose}`, width)\n );\n }\n } else {\n lines.push(padLine(` ${resolved.modules.skills.join(', ')}`, width));\n }\n }\n\n // Commands section\n if (resolved.modules.commands.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.commands} ${colors.primary('COMMANDS')} (${resolved.modules.commands.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.commands) {\n for (const cmd of bundle.moduleDetails.commands) {\n lines.push(padLine(` ${ICONS.bullet} ${colors.secondary(cmd.usage)}`, width));\n }\n } else {\n const cmdList = resolved.modules.commands.map((c) => `/${c}`).join(', ');\n lines.push(padLine(` ${cmdList}`, width));\n }\n }\n\n // Docs section\n if (resolved.modules.docs.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(`${ICONS.docs} ${colors.primary('DOCS')} (${resolved.modules.docs.length}):`, width)\n );\n\n if (bundle.moduleDetails?.docs) {\n for (const doc of bundle.moduleDetails.docs) {\n lines.push(padLine(` ${ICONS.bullet} ${colors.secondary(doc.id)} - ${doc.topic}`, width));\n }\n } else {\n // Show first few and indicate more\n const maxShow = 5;\n const docsToShow = resolved.modules.docs.slice(0, maxShow);\n const remaining = resolved.modules.docs.length - maxShow;\n let docsText = docsToShow.join(', ');\n if (remaining > 0) {\n docsText += `, +${remaining} more`;\n }\n lines.push(padLine(` ${docsText}`, width));\n }\n }\n\n // Tags and complexity footer\n lines.push(padLine('', width));\n const footerParts: string[] = [];\n if (bundle.tags && bundle.tags.length > 0) {\n footerParts.push(`${ICONS.tags} ${colors.muted('Tags:')} ${bundle.tags.join(', ')}`);\n }\n footerParts.push(\n `${ICONS.complexity} ${colors.muted('Complexity:')} ${formatComplexity(bundle.complexity)}`\n );\n lines.push(padLine(footerParts.join(' '), width));\n\n // Bottom border\n lines.push(horizontalLine(width, BOX.bottomLeft, BOX.bottomRight));\n\n return lines;\n}\n\n/**\n * Format validation warnings for display\n */\nexport function formatValidationWarnings(\n validation: BundleValidationResult,\n width: number = DEFAULT_WIDTH\n): string[] {\n if (validation.errors.length === 0 && validation.warnings.length === 0) {\n return [];\n }\n\n const lines: string[] = [];\n\n // Top border\n lines.push(horizontalLine(width, BOX.topLeft, BOX.topRight));\n lines.push(padLine(`${ICONS.warning} ${colors.warning('DEPENDENCY WARNINGS')}`, width));\n lines.push(horizontalLine(width, BOX.verticalRight, BOX.verticalLeft));\n\n // Required (will be auto-included)\n if (validation.errors.length > 0) {\n lines.push(\n padLine(`${ICONS.error} ${colors.error('REQUIRED (will be auto-included):')}`, width)\n );\n for (const error of validation.errors) {\n lines.push(padLine(` ${ICONS.bullet} ${error.message}`, width));\n }\n }\n\n // Recommended (optional)\n if (validation.warnings.length > 0) {\n if (validation.errors.length > 0) {\n lines.push(padLine('', width));\n }\n lines.push(padLine(`${ICONS.recommended} ${colors.warning('RECOMMENDED (optional):')}`, width));\n for (const warning of validation.warnings) {\n lines.push(padLine(` ${ICONS.bullet} ${warning.message}`, width));\n }\n }\n\n // Bottom border\n lines.push(horizontalLine(width, BOX.bottomLeft, BOX.bottomRight));\n\n return lines;\n}\n\n/**\n * Format a compact bundle summary for list views\n */\nexport function formatBundleCompact(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const counts: string[] = [];\n\n if (resolved.modules.agents.length > 0) {\n counts.push(`${resolved.modules.agents.length} agents`);\n }\n if (resolved.modules.skills.length > 0) {\n counts.push(`${resolved.modules.skills.length} skills`);\n }\n if (resolved.modules.commands.length > 0) {\n counts.push(`${resolved.modules.commands.length} commands`);\n }\n if (resolved.modules.docs.length > 0) {\n counts.push(`${resolved.modules.docs.length} docs`);\n }\n\n return `${bundle.name} (${counts.join(', ')})`;\n}\n\n/**\n * Print bundle visual display to console\n */\nexport function printBundleDisplay(bundle: BundleDefinition, width?: number): void {\n const lines = formatBundleVisualDisplay(bundle, width);\n for (const line of lines) {\n console.log(line);\n }\n}\n\n/**\n * Print validation warnings to console\n */\nexport function printValidationWarnings(validation: BundleValidationResult, width?: number): void {\n const lines = formatValidationWarnings(validation, width);\n for (const line of lines) {\n console.log(line);\n }\n}\n","/**\n * Bundle dependency validation system\n * Validates module dependencies and bundle prerequisites/conflicts\n */\n\nimport type {\n BundleConflict,\n BundleDefinition,\n BundleModuleRef,\n BundlePrerequisiteMissing,\n BundleValidationResult,\n DependencyError,\n DependencyWarning,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\nimport { getBundleById } from './resolver.js';\n\n/**\n * Validate module dependencies within a bundle selection\n * Checks that all required modules are present and warns about optional ones\n */\nexport function validateModuleDependencies(\n selectedModules: ModuleSelectionResult,\n bundles: BundleDefinition[]\n): BundleValidationResult {\n const errors: DependencyError[] = [];\n const warnings: DependencyWarning[] = [];\n const autoIncluded: BundleModuleRef[] = [];\n\n // Build a set of all selected module IDs for quick lookup\n const selectedIds = new Set([\n ...selectedModules.agents,\n ...selectedModules.skills,\n ...selectedModules.commands,\n ...selectedModules.docs,\n ]);\n\n // Check each bundle's module dependencies\n for (const bundle of bundles) {\n for (const moduleRef of bundle.modules) {\n // Skip if this module has no requiredBy dependencies\n if (!moduleRef.requiredBy || moduleRef.requiredBy.length === 0) {\n continue;\n }\n\n // Check if any module that requires this one is selected\n for (const requiringModuleId of moduleRef.requiredBy) {\n if (!selectedIds.has(requiringModuleId)) {\n continue; // The requiring module isn't selected, so no dependency issue\n }\n\n // The requiring module is selected - check if the dependency is also selected\n if (!selectedIds.has(moduleRef.id)) {\n if (moduleRef.optional) {\n // Optional dependency - just warn\n warnings.push({\n moduleId: requiringModuleId,\n moduleCategory: findModuleCategory(requiringModuleId, bundle),\n dependencyId: moduleRef.id,\n dependencyCategory: moduleRef.category,\n message: `${requiringModuleId} works better with ${moduleRef.id}`,\n });\n } else {\n // Required dependency - error and auto-include\n errors.push({\n moduleId: requiringModuleId,\n moduleCategory: findModuleCategory(requiringModuleId, bundle),\n dependencyId: moduleRef.id,\n dependencyCategory: moduleRef.category,\n message: `${requiringModuleId} requires ${moduleRef.id}`,\n });\n\n // Auto-include the missing required module\n if (!autoIncluded.some((m) => m.id === moduleRef.id)) {\n autoIncluded.push({\n id: moduleRef.id,\n category: moduleRef.category,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n autoIncluded,\n };\n}\n\n/**\n * Find the category of a module within a bundle\n */\nfunction findModuleCategory(\n moduleId: string,\n bundle: BundleDefinition\n): 'agents' | 'skills' | 'commands' | 'docs' {\n const moduleRef = bundle.modules.find((m) => m.id === moduleId);\n return moduleRef?.category ?? 'agents';\n}\n\n/**\n * Validate bundle prerequisites\n * Checks that all prerequisite bundles are selected\n */\nexport function validateBundlePrerequisites(\n selectedBundleIds: string[]\n): BundlePrerequisiteMissing[] {\n const missing: BundlePrerequisiteMissing[] = [];\n const selectedSet = new Set(selectedBundleIds);\n\n for (const bundleId of selectedBundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle?.prerequisites) continue;\n\n for (const prereqId of bundle.prerequisites) {\n if (!selectedSet.has(prereqId)) {\n missing.push({\n bundleId,\n prerequisiteId: prereqId,\n message: `${bundle.name} requires ${prereqId} bundle`,\n });\n }\n }\n }\n\n return missing;\n}\n\n/**\n * Validate bundle conflicts\n * Checks for mutually exclusive bundles\n */\nexport function validateBundleConflicts(selectedBundleIds: string[]): BundleConflict[] {\n const conflicts: BundleConflict[] = [];\n const selectedSet = new Set(selectedBundleIds);\n\n for (const bundleId of selectedBundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle?.conflicts) continue;\n\n for (const conflictId of bundle.conflicts) {\n if (selectedSet.has(conflictId)) {\n // Avoid duplicate conflicts (A conflicts with B, B conflicts with A)\n const existingConflict = conflicts.find(\n (c) =>\n (c.bundleId === bundleId && c.conflictsWith === conflictId) ||\n (c.bundleId === conflictId && c.conflictsWith === bundleId)\n );\n\n if (!existingConflict) {\n const conflictingBundle = getBundleById(conflictId);\n conflicts.push({\n bundleId,\n conflictsWith: conflictId,\n reason: `${bundle.name} and ${conflictingBundle?.name ?? conflictId} are mutually exclusive`,\n });\n }\n }\n }\n }\n\n return conflicts;\n}\n\n/**\n * Full validation of bundle selection\n * Combines prerequisite, conflict, and dependency validation\n */\nexport function validateBundleSelection(\n selectedBundleIds: string[],\n selectedModules: ModuleSelectionResult\n): {\n moduleDependencies: BundleValidationResult;\n prerequisites: BundlePrerequisiteMissing[];\n conflicts: BundleConflict[];\n isValid: boolean;\n} {\n const selectedBundles = selectedBundleIds\n .map((id) => getBundleById(id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const moduleDependencies = validateModuleDependencies(selectedModules, selectedBundles);\n const prerequisites = validateBundlePrerequisites(selectedBundleIds);\n const conflicts = validateBundleConflicts(selectedBundleIds);\n\n return {\n moduleDependencies,\n prerequisites,\n conflicts,\n isValid: moduleDependencies.valid && prerequisites.length === 0 && conflicts.length === 0,\n };\n}\n\n/**\n * Get all modules that should be auto-included based on dependencies\n */\nexport function getAutoIncludedModules(\n selectedModules: ModuleSelectionResult,\n selectedBundleIds: string[]\n): ModuleSelectionResult {\n const selectedBundles = selectedBundleIds\n .map((id) => getBundleById(id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const validation = validateModuleDependencies(selectedModules, selectedBundles);\n\n const result: ModuleSelectionResult = {\n agents: [...selectedModules.agents],\n skills: [...selectedModules.skills],\n commands: [...selectedModules.commands],\n docs: [...selectedModules.docs],\n };\n\n // Add auto-included modules\n for (const module of validation.autoIncluded) {\n const targetArray = result[module.category];\n if (!targetArray.includes(module.id)) {\n targetArray.push(module.id);\n }\n }\n\n return result;\n}\n","/**\n * CI/CD configuration prompts\n */\n\nimport type { CICDConfig } from '../../lib/ci-cd/index.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { PackageManager } from '../../types/scaffold.js';\n\n/**\n * Prompt for CI/CD configuration\n */\nexport async function promptCICDConfig(options?: {\n packageManager?: PackageManager;\n defaults?: Partial<CICDConfig>;\n}): Promise<CICDConfig> {\n logger.section('CI/CD Configuration', '🚀');\n logger.info('Configure continuous integration and deployment workflows');\n logger.newline();\n\n // Ask if user wants to configure CI/CD\n const enableCICD = await confirm({\n message: 'Would you like to set up GitHub Actions workflows?',\n default: true,\n });\n\n if (!enableCICD) {\n return {\n enabled: false,\n provider: 'github-actions',\n ci: false,\n cd: false,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n }\n\n // Select which workflows to create\n const workflows = await checkbox<'ci' | 'cd'>({\n message: 'Which workflows would you like to create?',\n choices: [\n {\n name: 'CI (Continuous Integration) - Lint, test, build on PRs',\n value: 'ci',\n checked: true,\n },\n {\n name: 'Release - Create releases on version tags',\n value: 'cd',\n checked: false,\n },\n ],\n });\n\n if (workflows.length === 0) {\n return {\n enabled: false,\n provider: 'github-actions',\n ci: false,\n cd: false,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n }\n\n const hasCi = workflows.includes('ci');\n const hasCd = workflows.includes('cd');\n\n // CI configuration\n let runTests = true;\n let runLint = true;\n let runTypecheck = true;\n let runBuild = true;\n\n if (hasCi) {\n const ciSteps = await checkbox<'tests' | 'lint' | 'typecheck' | 'build'>({\n message: 'Which steps should the CI workflow run?',\n choices: [\n { name: 'Lint', value: 'lint', checked: true },\n { name: 'Type checking', value: 'typecheck', checked: true },\n { name: 'Tests', value: 'tests', checked: true },\n { name: 'Build', value: 'build', checked: true },\n ],\n });\n\n runTests = ciSteps.includes('tests');\n runLint = ciSteps.includes('lint');\n runTypecheck = ciSteps.includes('typecheck');\n runBuild = ciSteps.includes('build');\n }\n\n // Node.js version\n const nodeVersion = await select<string>({\n message: 'Node.js version:',\n choices: [\n { name: '22 (LTS - Recommended)', value: '22' },\n { name: '20 (LTS)', value: '20' },\n { name: '18 (LTS)', value: '18' },\n { name: 'Custom', value: 'custom' },\n ],\n default: '22',\n });\n\n let finalNodeVersion = nodeVersion;\n if (nodeVersion === 'custom') {\n finalNodeVersion = await input({\n message: 'Enter Node.js version:',\n default: '22',\n validate: (v) => {\n if (!/^\\d+(\\.\\d+)?$/.test(v)) {\n return 'Please enter a valid version (e.g., \"20\" or \"20.10\")';\n }\n return true;\n },\n });\n }\n\n // Caching\n const enableCaching = await confirm({\n message: 'Enable dependency caching for faster builds?',\n default: true,\n });\n\n return {\n enabled: true,\n provider: 'github-actions',\n ci: hasCi,\n cd: hasCd,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: finalNodeVersion,\n enableCaching,\n runTests,\n runLint,\n runTypecheck,\n runBuild,\n };\n}\n\n/**\n * Show CI/CD configuration summary\n */\nexport function showCICDSummary(config: CICDConfig): void {\n if (!config.enabled) {\n logger.item('CI/CD: Not configured');\n return;\n }\n\n const workflows: string[] = [];\n if (config.ci) workflows.push('CI');\n if (config.cd) workflows.push('Release');\n\n logger.item(`CI/CD: ${workflows.join(', ')}`);\n\n if (config.ci) {\n const steps: string[] = [];\n if (config.runLint) steps.push('lint');\n if (config.runTypecheck) steps.push('typecheck');\n if (config.runTests) steps.push('test');\n if (config.runBuild) steps.push('build');\n logger.info(` CI steps: ${steps.join(', ')}`);\n }\n\n logger.info(` Node.js: ${config.nodeVersion}`);\n logger.info(` Caching: ${config.enableCaching ? 'enabled' : 'disabled'}`);\n}\n","/**\n * Folder structure preferences prompts\n */\n\nimport {\n DOCS_LOCATION_OPTIONS,\n GITHUB_WORKFLOW_TEMPLATES,\n PLANNING_LOCATION_OPTIONS,\n TEST_LOCATION_OPTIONS,\n TEST_PATTERN_OPTIONS,\n getFolderRecommendationsForBundles,\n getRecommendedWorkflows,\n mergeFolderPreferences,\n} from '../../constants/folder-preferences.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n DocsFileLocation,\n FolderPreferences,\n GithubWorkflowTemplate,\n PlanningFileLocation,\n TestFileLocation,\n} from '../../types/folder-preferences.js';\n\n/**\n * Prompt for test file location preference\n */\nexport async function promptTestLocation(options?: {\n recommended?: TestFileLocation;\n}): Promise<{ location: TestFileLocation; pattern: string }> {\n const choices = TEST_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<TestFileLocation>({\n message: 'Where should test files be located?',\n choices,\n default: options?.recommended || 'test-folder-root',\n });\n\n const patternChoices = TEST_PATTERN_OPTIONS.map((opt) => ({\n name: opt.name,\n value: opt.value,\n description: opt.description,\n }));\n\n const pattern = await select<string>({\n message: 'Test file naming pattern:',\n choices: patternChoices,\n default: '*.test.ts',\n });\n\n return { location, pattern };\n}\n\n/**\n * Prompt for planning file location preference\n */\nexport async function promptPlanningLocation(options?: {\n recommended?: PlanningFileLocation;\n}): Promise<{ location: PlanningFileLocation; commitToGit: boolean }> {\n const choices = PLANNING_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<PlanningFileLocation>({\n message: 'Where should planning files (PDR, tech-analysis, TODOs) be stored?',\n choices,\n default: options?.recommended || 'claude-sessions',\n });\n\n const commitToGit = await confirm({\n message: 'Should planning files be committed to git?',\n default: false,\n });\n\n if (!commitToGit) {\n logger.info(\n colors.muted(' Planning files will be added to .gitignore. You can change this later.')\n );\n }\n\n return { location, commitToGit };\n}\n\n/**\n * Prompt for documentation file location preference\n */\nexport async function promptDocsLocation(options?: {\n recommended?: DocsFileLocation;\n}): Promise<{ location: DocsFileLocation }> {\n const choices = DOCS_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<DocsFileLocation>({\n message: 'Where should documentation files be stored?',\n choices,\n default: options?.recommended || 'docs-root',\n });\n\n return { location };\n}\n\n/**\n * Prompt for GitHub Actions workflow selection\n */\nexport async function promptGithubWorkflows(options?: {\n recommended?: string[];\n technologies?: string[];\n}): Promise<string[]> {\n // Get recommended workflows\n const recommendedWorkflows = options?.technologies\n ? getRecommendedWorkflows(options.technologies)\n : [];\n const recommendedIds = new Set([\n ...(options?.recommended || []),\n ...recommendedWorkflows.map((w) => w.id),\n ]);\n\n // Group by category\n const categories: Array<{ name: string; workflows: GithubWorkflowTemplate[] }> = [\n {\n name: 'CI (Continuous Integration)',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'ci'),\n },\n {\n name: 'Quality',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'quality'),\n },\n {\n name: 'Security',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'security'),\n },\n {\n name: 'CD (Deployment)',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'cd'),\n },\n {\n name: 'Release',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'release'),\n },\n ];\n\n logger.newline();\n logger.subtitle('GitHub Actions Workflows');\n logger.info('Select workflows to create. Use Space to toggle, Enter to confirm.');\n if (recommendedIds.size > 0) {\n logger.info(colors.muted('⭐ indicates recommended workflows for your stack.'));\n }\n logger.newline();\n\n const selectedWorkflows: string[] = [];\n\n for (const category of categories) {\n if (category.workflows.length === 0) continue;\n\n const choices = category.workflows.map((workflow) => ({\n name: workflow.name + (recommendedIds.has(workflow.id) ? ` ${colors.primary('⭐')}` : ''),\n value: workflow.id,\n description: workflow.description,\n checked: recommendedIds.has(workflow.id),\n }));\n\n const selected = await checkbox({\n message: `${category.name}:`,\n choices,\n required: false,\n });\n\n selectedWorkflows.push(...selected);\n }\n\n return selectedWorkflows;\n}\n\n/**\n * Prompt for folder preferences based on selected bundles\n */\nexport async function promptFolderPreferences(options: {\n selectedBundles: string[];\n technologies?: string[];\n}): Promise<FolderPreferences> {\n const { selectedBundles, technologies = [] } = options;\n\n // Get recommendations based on bundles\n const recommendations = getFolderRecommendationsForBundles(selectedBundles);\n const mergedDefaults = mergeFolderPreferences(recommendations);\n\n // Determine which sections to show based on bundles\n const hasTestingBundle = selectedBundles.some(\n (id) => id.includes('testing') || id.includes('quality')\n );\n const hasPlanningBundle = selectedBundles.some((id) => id.includes('planning'));\n const hasDocsBundle = selectedBundles.some((id) => id.includes('documentation'));\n const hasCiCdBundle = selectedBundles.some((id) => id.includes('cicd') || id.includes('ci-cd'));\n\n // Show recommendations if any\n if (recommendations.length > 0) {\n logger.newline();\n logger.subtitle('Folder Structure Recommendations');\n logger.info(colors.muted('Based on your selected bundles, we recommend:'));\n for (const rec of recommendations) {\n logger.info(` ${colors.primary('•')} ${rec.reason}`);\n }\n logger.newline();\n }\n\n const preferences: FolderPreferences = {};\n\n // Tests configuration\n if (hasTestingBundle) {\n logger.newline();\n logger.subtitle('Test Files Configuration');\n preferences.tests = await promptTestLocation({\n recommended: mergedDefaults.tests?.location,\n });\n }\n\n // Planning configuration\n if (hasPlanningBundle) {\n logger.newline();\n logger.subtitle('Planning Files Configuration');\n preferences.planning = await promptPlanningLocation({\n recommended: mergedDefaults.planning?.location,\n });\n }\n\n // Docs configuration\n if (hasDocsBundle) {\n logger.newline();\n logger.subtitle('Documentation Configuration');\n preferences.docs = await promptDocsLocation({\n recommended: mergedDefaults.docs?.location,\n });\n }\n\n // CI/CD configuration - ask if they want to set it up\n const setupCiCd =\n hasCiCdBundle ||\n (await confirm({\n message: 'Would you like to set up GitHub Actions workflows?',\n default: true,\n }));\n\n if (setupCiCd) {\n const workflows = await promptGithubWorkflows({\n recommended: mergedDefaults.cicd?.workflows,\n technologies,\n });\n\n if (workflows.length > 0) {\n preferences.cicd = {\n location: 'github-workflows',\n workflows,\n };\n }\n }\n\n return preferences;\n}\n\n/**\n * Show folder preferences summary\n */\nexport function showFolderPreferencesSummary(preferences: FolderPreferences): void {\n logger.newline();\n logger.subtitle('Folder Structure Summary');\n\n if (preferences.tests) {\n const testOpt = TEST_LOCATION_OPTIONS.find((o) => o.value === preferences.tests?.location);\n logger.keyValue('Tests', testOpt?.name || preferences.tests.location);\n logger.keyValue('Test Pattern', preferences.tests.pattern);\n }\n\n if (preferences.planning) {\n const planOpt = PLANNING_LOCATION_OPTIONS.find(\n (o) => o.value === preferences.planning?.location\n );\n logger.keyValue('Planning', planOpt?.name || preferences.planning.location);\n logger.keyValue(\n 'Commit Planning',\n preferences.planning.commitToGit ? 'Yes' : 'No (will be in .gitignore)'\n );\n }\n\n if (preferences.docs) {\n const docsOpt = DOCS_LOCATION_OPTIONS.find((o) => o.value === preferences.docs?.location);\n logger.keyValue('Documentation', docsOpt?.name || preferences.docs.location);\n }\n\n if (preferences.cicd && preferences.cicd.workflows.length > 0) {\n logger.keyValue('CI/CD Location', '.github/workflows/');\n logger.info(` ${colors.muted('Workflows:')} ${preferences.cicd.workflows.join(', ')}`);\n }\n}\n\n/**\n * Confirm folder preferences\n */\nexport async function confirmFolderPreferences(preferences: FolderPreferences): Promise<boolean> {\n showFolderPreferencesSummary(preferences);\n logger.newline();\n\n return confirm({\n message: 'Are these folder structure preferences correct?',\n default: true,\n });\n}\n\n/**\n * Quick folder preferences with smart defaults\n */\nexport async function promptQuickFolderPreferences(options: {\n selectedBundles: string[];\n technologies?: string[];\n}): Promise<FolderPreferences | null> {\n const recommendations = getFolderRecommendationsForBundles(options.selectedBundles);\n const mergedDefaults = mergeFolderPreferences(recommendations);\n\n // If we have recommendations, show them and ask if user wants to customize\n if (recommendations.length > 0) {\n logger.section('Folder Structure', '📁');\n logger.info(colors.muted('Based on your bundles, we have recommended folder settings.'));\n\n showFolderPreferencesSummary(mergedDefaults);\n\n const customize = await confirm({\n message: 'Would you like to customize these folder preferences?',\n default: false,\n });\n\n if (!customize) {\n return mergedDefaults;\n }\n }\n\n // Full customization\n return promptFolderPreferences(options);\n}\n","/**\n * Folder preferences constants and defaults\n */\n\nimport type {\n BundleFolderRecommendations,\n FolderPreferences,\n GithubWorkflowTemplate,\n} from '../types/folder-preferences.js';\n\n/**\n * Default folder preferences\n */\nexport const DEFAULT_FOLDER_PREFERENCES: FolderPreferences = {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n planning: {\n location: 'claude-sessions',\n commitToGit: false,\n },\n docs: {\n location: 'docs-root',\n },\n cicd: {\n location: 'github-workflows',\n workflows: [],\n },\n};\n\n/**\n * Test file location options with descriptions\n */\nexport const TEST_LOCATION_OPTIONS = [\n {\n value: 'colocated' as const,\n name: 'Colocated with source files',\n description:\n 'Tests next to source files (e.g., src/utils/foo.ts → src/utils/foo.test.ts). Good for small projects.',\n },\n {\n value: 'test-folder-root' as const,\n name: 'Root test/ folder (Recommended)',\n description:\n 'Tests in test/ folder mirroring src structure (e.g., test/utils/foo.test.ts). Best for medium-large projects.',\n },\n {\n value: 'test-folder-src' as const,\n name: 'Inside src/__tests__/',\n description:\n 'Tests in src/__tests__/ folder (e.g., src/__tests__/utils/foo.test.ts). Common in Create React App.',\n },\n];\n\n/**\n * Planning file location options\n */\nexport const PLANNING_LOCATION_OPTIONS = [\n {\n value: 'claude-sessions' as const,\n name: '.claude/sessions/planning/ (Recommended)',\n description:\n 'Planning files in .claude/sessions/planning/. Keeps Claude-specific files organized.',\n },\n {\n value: 'docs-planning' as const,\n name: 'docs/planning/',\n description:\n 'Planning files in docs/planning/. Good if you want planning docs alongside other docs.',\n },\n {\n value: 'root-planning' as const,\n name: 'planning/ at root',\n description: 'Planning files in planning/ at project root. Maximum visibility.',\n },\n];\n\n/**\n * Documentation file location options\n */\nexport const DOCS_LOCATION_OPTIONS = [\n {\n value: 'docs-root' as const,\n name: 'docs/ at project root (Recommended)',\n description: 'Documentation in docs/ folder. Standard location for most projects.',\n },\n {\n value: 'claude-docs' as const,\n name: '.claude/docs/',\n description: 'Documentation in .claude/docs/. Keeps all Claude-related files together.',\n },\n {\n value: 'readme-only' as const,\n name: 'README files only',\n description: 'Only README.md files, no separate docs folder. Good for simple projects.',\n },\n];\n\n/**\n * Test file naming pattern options\n */\nexport const TEST_PATTERN_OPTIONS = [\n {\n value: '*.test.ts',\n name: '*.test.ts (Recommended)',\n description: 'Standard test pattern (foo.test.ts)',\n },\n {\n value: '*.spec.ts',\n name: '*.spec.ts',\n description: 'Spec pattern common in Angular (foo.spec.ts)',\n },\n {\n value: '*.test.tsx',\n name: '*.test.tsx',\n description: 'For React component tests (Component.test.tsx)',\n },\n];\n\n/**\n * GitHub Actions workflow templates\n */\nexport const GITHUB_WORKFLOW_TEMPLATES: GithubWorkflowTemplate[] = [\n // CI Workflows\n {\n id: 'ci-node',\n name: 'Node.js CI',\n description: 'Run tests, lint, and type-check on push and PR',\n filename: 'ci.yml',\n category: 'ci',\n suitedFor: ['node', 'typescript', 'javascript'],\n recommended: true,\n },\n {\n id: 'ci-node-matrix',\n name: 'Node.js CI (Matrix)',\n description: 'Test across multiple Node.js versions (18, 20, 22)',\n filename: 'ci-matrix.yml',\n category: 'ci',\n suitedFor: ['node', 'typescript', 'library'],\n },\n {\n id: 'ci-pnpm',\n name: 'PNPM CI',\n description: 'CI workflow optimized for PNPM with caching',\n filename: 'ci-pnpm.yml',\n category: 'ci',\n suitedFor: ['pnpm', 'monorepo'],\n recommended: true,\n },\n {\n id: 'ci-turborepo',\n name: 'Turborepo CI',\n description: 'CI for Turborepo monorepos with remote caching',\n filename: 'ci-turborepo.yml',\n category: 'ci',\n suitedFor: ['turborepo', 'monorepo'],\n },\n\n // Quality Workflows\n {\n id: 'quality-biome',\n name: 'Biome Quality Check',\n description: 'Run Biome linter and formatter checks',\n filename: 'quality-biome.yml',\n category: 'quality',\n suitedFor: ['biome', 'typescript'],\n },\n {\n id: 'quality-eslint-prettier',\n name: 'ESLint + Prettier',\n description: 'Run ESLint and Prettier checks',\n filename: 'quality-eslint.yml',\n category: 'quality',\n suitedFor: ['eslint', 'prettier'],\n },\n {\n id: 'quality-typecheck',\n name: 'TypeScript Type Check',\n description: 'Run TypeScript type checking only',\n filename: 'typecheck.yml',\n category: 'quality',\n suitedFor: ['typescript'],\n },\n\n // Security Workflows\n {\n id: 'security-codeql',\n name: 'CodeQL Analysis',\n description: 'GitHub CodeQL security scanning',\n filename: 'codeql.yml',\n category: 'security',\n suitedFor: ['javascript', 'typescript'],\n },\n {\n id: 'security-dependency-review',\n name: 'Dependency Review',\n description: 'Review dependencies for vulnerabilities on PRs',\n filename: 'dependency-review.yml',\n category: 'security',\n },\n {\n id: 'security-audit',\n name: 'NPM Audit',\n description: 'Run npm audit for security vulnerabilities',\n filename: 'npm-audit.yml',\n category: 'security',\n suitedFor: ['node', 'npm'],\n },\n\n // CD Workflows\n {\n id: 'cd-vercel',\n name: 'Vercel Deploy',\n description: 'Deploy to Vercel on push to main',\n filename: 'deploy-vercel.yml',\n category: 'cd',\n suitedFor: ['nextjs', 'react', 'vercel'],\n },\n {\n id: 'cd-cloudflare-pages',\n name: 'Cloudflare Pages Deploy',\n description: 'Deploy to Cloudflare Pages',\n filename: 'deploy-cloudflare.yml',\n category: 'cd',\n suitedFor: ['astro', 'cloudflare'],\n },\n {\n id: 'cd-docker',\n name: 'Docker Build & Push',\n description: 'Build and push Docker image to registry',\n filename: 'docker-build.yml',\n category: 'cd',\n suitedFor: ['docker', 'api'],\n },\n\n // Release Workflows\n {\n id: 'release-npm',\n name: 'NPM Publish',\n description: 'Publish package to NPM on release',\n filename: 'npm-publish.yml',\n category: 'release',\n suitedFor: ['library', 'npm'],\n },\n {\n id: 'release-changesets',\n name: 'Changesets Release',\n description: 'Automated versioning with Changesets',\n filename: 'changesets.yml',\n category: 'release',\n suitedFor: ['monorepo', 'library'],\n },\n {\n id: 'release-semantic',\n name: 'Semantic Release',\n description: 'Automated semantic versioning and changelog',\n filename: 'semantic-release.yml',\n category: 'release',\n suitedFor: ['library'],\n },\n];\n\n/**\n * Bundle-specific folder recommendations\n */\nexport const BUNDLE_FOLDER_RECOMMENDATIONS: BundleFolderRecommendations[] = [\n // Testing bundles\n {\n trigger: 'testing-complete',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n },\n reason:\n 'Complete testing suite works best with a dedicated test/ folder to organize unit, integration, and E2E tests separately.',\n },\n {\n trigger: 'testing-minimal',\n recommendations: {\n tests: {\n location: 'colocated',\n pattern: '*.test.ts',\n },\n },\n reason:\n 'Minimal testing with colocated tests keeps test files close to source for simpler projects.',\n },\n\n // Planning bundles\n {\n trigger: 'planning-complete',\n recommendations: {\n planning: {\n location: 'claude-sessions',\n commitToGit: false,\n },\n },\n reason:\n 'Complete planning workflow uses .claude/sessions/planning/ to keep PDRs, tech-analysis, and TODOs organized.',\n },\n\n // Documentation bundles\n {\n trigger: 'documentation-complete',\n recommendations: {\n docs: {\n location: 'docs-root',\n },\n },\n reason:\n 'Documentation bundle uses standard docs/ folder for maximum compatibility with documentation tools.',\n },\n\n // Stack-specific recommendations\n {\n trigger: 'react-tanstack-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.tsx',\n },\n },\n reason: 'React projects benefit from *.test.tsx pattern for component tests with JSX support.',\n },\n {\n trigger: 'nextjs-prisma-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n cicd: {\n location: 'github-workflows',\n workflows: ['ci-node', 'cd-vercel'],\n },\n },\n reason: 'Next.js projects typically deploy to Vercel with standard Node.js CI.',\n },\n {\n trigger: 'hono-drizzle-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n cicd: {\n location: 'github-workflows',\n workflows: ['ci-pnpm', 'security-audit'],\n },\n },\n reason: 'API stacks benefit from security audits and optimized PNPM CI.',\n },\n];\n\n/**\n * Get workflow templates by category\n */\nexport function getWorkflowsByCategory(\n category: GithubWorkflowTemplate['category']\n): GithubWorkflowTemplate[] {\n return GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === category);\n}\n\n/**\n * Get recommended workflows based on detected technologies\n */\nexport function getRecommendedWorkflows(technologies: string[]): GithubWorkflowTemplate[] {\n const techSet = new Set(technologies.map((t) => t.toLowerCase()));\n\n return GITHUB_WORKFLOW_TEMPLATES.filter((workflow) => {\n if (workflow.recommended) return true;\n if (!workflow.suitedFor) return false;\n return workflow.suitedFor.some((tech) => techSet.has(tech.toLowerCase()));\n });\n}\n\n/**\n * Get folder recommendations for selected bundles\n */\nexport function getFolderRecommendationsForBundles(\n bundleIds: string[]\n): BundleFolderRecommendations[] {\n const bundleSet = new Set(bundleIds);\n return BUNDLE_FOLDER_RECOMMENDATIONS.filter((rec) => bundleSet.has(rec.trigger));\n}\n\n/**\n * Merge folder recommendations with defaults\n */\nexport function mergeFolderPreferences(\n recommendations: BundleFolderRecommendations[]\n): FolderPreferences {\n const merged = { ...DEFAULT_FOLDER_PREFERENCES };\n\n for (const rec of recommendations) {\n if (rec.recommendations.tests) {\n merged.tests = { ...merged.tests, ...rec.recommendations.tests };\n }\n if (rec.recommendations.planning) {\n merged.planning = { ...merged.planning, ...rec.recommendations.planning };\n }\n if (rec.recommendations.docs) {\n merged.docs = { ...merged.docs, ...rec.recommendations.docs };\n }\n if (rec.recommendations.cicd) {\n merged.cicd = {\n ...merged.cicd,\n ...rec.recommendations.cicd,\n // Merge workflows without duplicates\n workflows: [\n ...new Set([\n ...(merged.cicd?.workflows || []),\n ...(rec.recommendations.cicd.workflows || []),\n ]),\n ],\n };\n }\n }\n\n return merged;\n}\n","/**\n * Prompts exports\n */\n\n// Project info\nexport {\n promptProjectInfo,\n confirmProjectInfo,\n} from './project-info.js';\n\n// Preferences\nexport {\n promptPreferences,\n promptPackageManagerPreference,\n confirmPreferences,\n} from './preferences.js';\n\n// Scaffold\nexport {\n promptScaffoldType,\n promptProjectType,\n promptPackageManager,\n promptScaffoldOptions,\n confirmScaffoldOptions,\n} from './scaffold.js';\n\n// Bundle selection\nexport {\n promptBundleMode,\n promptBundleSelection,\n promptQuickBundleSelection,\n showBundleContents,\n showBundlesSummary,\n showBundlesSummaryWithTotals,\n confirmBundleSelection,\n confirmBundleSelectionWithEdit,\n editBundleSelection,\n calculateModuleTotals,\n createEmptyBundleResult,\n type BundleSelectionMode,\n type BundleConfirmAction,\n type ModuleTotals,\n} from './bundle-select.js';\n\n// Item selection (granular)\nexport {\n promptSingleItem,\n promptBatchAction,\n selectItemsFromCategory,\n showCategorySelectionSummary,\n confirmCategorySelection,\n type ItemAction,\n type BatchAction,\n} from './item-select.js';\n\n// Hook configuration\nexport {\n promptHookConfig,\n showHookSummary,\n confirmHookConfig,\n} from './hook-config.js';\n\n// MCP configuration\nexport {\n promptMcpConfig,\n showMcpSummary,\n confirmMcpConfig,\n showSkippedMcpInstructions,\n type McpConfigResult,\n type SkippedMcpConfig,\n type SkippedField,\n} from './mcp-config.js';\n\n// Permissions configuration\nexport {\n promptPermissionsConfig,\n showPermissionsSummary,\n confirmPermissionsConfig,\n generatePermissionRules,\n} from './permissions.js';\n\n// Update prompts\nexport {\n promptUpdateAction,\n showUpdateReport,\n promptNewModules,\n promptUpdatedModules,\n promptConflictResolution,\n promptReconfigureOptions,\n confirmUpdate,\n promptBackup,\n type UpdateAction,\n type ModuleUpdate,\n type ConflictResolution,\n} from './update.js';\n\n// Confirmation prompts\nexport {\n confirmOverwrite,\n promptExistingProjectAction,\n showFinalSummary,\n confirmFinalConfiguration,\n confirmDestructiveAction,\n showPostInstallInstructions,\n showDependencyInstructions,\n} from './confirm.js';\n\n// Code style prompts\nexport {\n promptCodeStyleConfig,\n showCodeStyleSummary,\n confirmCodeStyleConfig,\n} from './code-style.js';\n\n// Folder preferences prompts\nexport {\n promptTestLocation,\n promptPlanningLocation,\n promptDocsLocation,\n promptGithubWorkflows,\n promptFolderPreferences,\n promptQuickFolderPreferences,\n showFolderPreferencesSummary,\n confirmFolderPreferences,\n} from './folder-preferences.js';\n\n// CI/CD configuration prompts\nexport { promptCICDConfig, showCICDSummary } from './ci-cd-config.js';\n","/**\n * Project information prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, input } from '../../lib/utils/prompt-cancel.js';\nimport type { ProjectInfo } from '../../types/config.js';\n\ninterface ProjectInfoOptions {\n defaults?: Partial<ProjectInfo>;\n skipOptional?: boolean;\n}\n\n/**\n * Prompt for project information\n */\nexport async function promptProjectInfo(options?: ProjectInfoOptions): Promise<ProjectInfo> {\n logger.section('Project Information', '📋');\n\n const name = await input({\n message: 'Project name:',\n default: options?.defaults?.name,\n validate: (value) => {\n if (!value.trim()) return 'Project name is required';\n if (!/^[a-zA-Z0-9-_\\s]+$/.test(value)) {\n return 'Project name can only contain letters, numbers, dashes, underscores, and spaces';\n }\n return true;\n },\n });\n\n const description = await input({\n message: 'Project description:',\n default: options?.defaults?.description || '',\n validate: (value) => {\n if (!value.trim()) return 'Description is required';\n return true;\n },\n });\n\n const org = await input({\n message: 'GitHub organization/username:',\n default: options?.defaults?.org || '',\n validate: (value) => {\n if (!value.trim()) return 'Organization is required';\n if (!/^[a-zA-Z0-9-]+$/.test(value)) {\n return 'Organization can only contain letters, numbers, and dashes';\n }\n return true;\n },\n });\n\n const repo = await input({\n message: 'Repository name:',\n default: options?.defaults?.repo || name.toLowerCase().replace(/\\s+/g, '-'),\n validate: (value) => {\n if (!value.trim()) return 'Repository name is required';\n if (!/^[a-zA-Z0-9-_]+$/.test(value)) {\n return 'Repository name can only contain letters, numbers, dashes, and underscores';\n }\n return true;\n },\n });\n\n // Ask for author (optional)\n const author = await input({\n message: 'Author (name or \"Name <email>\"):',\n default: options?.defaults?.author || '',\n });\n\n // Ask if user wants to configure entity type\n let entityType = 'item';\n let entityTypePlural = 'items';\n\n const wantEntityConfig = await confirm({\n message: 'Configure primary entity type? (Used for code examples and templates)',\n default: false,\n });\n\n if (wantEntityConfig) {\n logger.info('The entity type is used in code examples and templates throughout the project.');\n logger.info(\n 'For example, if your project manages \"products\", code examples will use product-related names.'\n );\n logger.newline();\n\n entityType = await input({\n message: 'Primary entity type (e.g., product, article, user, listing):',\n default: options?.defaults?.entityType || 'item',\n validate: (value) => {\n if (!value.trim()) return 'Entity type is required';\n return true;\n },\n });\n\n entityTypePlural = await input({\n message: 'Entity type plural:',\n default: options?.defaults?.entityTypePlural || pluralize(entityType),\n });\n } else if (options?.defaults?.entityType) {\n entityType = options.defaults.entityType;\n entityTypePlural = options.defaults.entityTypePlural || pluralize(entityType);\n }\n\n let domain: string | undefined;\n let location: string | undefined;\n\n if (!options?.skipOptional) {\n const wantDomain = await confirm({\n message: 'Do you want to specify a domain?',\n default: false,\n });\n\n if (wantDomain) {\n domain = await input({\n message: 'Domain (e.g., myproject.com):',\n default: options?.defaults?.domain || '',\n validate: (value) => {\n if (value && !/^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(value)) {\n return 'Please enter a valid domain';\n }\n return true;\n },\n });\n }\n\n const wantLocation = await confirm({\n message: 'Do you want to specify a location/region?',\n default: false,\n });\n\n if (wantLocation) {\n location = await input({\n message: 'Location/Region:',\n default: options?.defaults?.location || '',\n });\n }\n }\n\n return {\n name: name.trim(),\n description: description.trim(),\n org: org.trim(),\n repo: repo.trim(),\n domain,\n entityType: entityType.trim().toLowerCase(),\n entityTypePlural: entityTypePlural.trim().toLowerCase(),\n location,\n author: author.trim() || undefined,\n };\n}\n\n/**\n * Simple pluralization helper\n */\nfunction pluralize(word: string): string {\n const lower = word.toLowerCase();\n if (lower.endsWith('y')) {\n return `${lower.slice(0, -1)}ies`;\n }\n if (lower.endsWith('s') || lower.endsWith('x') || lower.endsWith('ch') || lower.endsWith('sh')) {\n return `${lower}es`;\n }\n return `${lower}s`;\n}\n\n/**\n * Confirm project info summary\n */\nexport async function confirmProjectInfo(info: ProjectInfo): Promise<boolean> {\n logger.newline();\n logger.subtitle('Project Summary');\n logger.keyValue('Name', info.name);\n logger.keyValue('Description', info.description);\n logger.keyValue('GitHub', `${info.org}/${info.repo}`);\n if (info.author) logger.keyValue('Author', info.author);\n logger.keyValue('Entity', `${info.entityType} / ${info.entityTypePlural}`);\n if (info.domain) logger.keyValue('Domain', info.domain);\n if (info.location) logger.keyValue('Location', info.location);\n logger.newline();\n\n return confirm({\n message: 'Is this information correct?',\n default: true,\n });\n}\n","/**\n * User preferences prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type { Preferences } from '../../types/config.js';\nimport type { PackageManager } from '../../types/scaffold.js';\n\ninterface PreferencesOptions {\n defaults?: Partial<Preferences>;\n detectedPackageManager?: PackageManager;\n}\n\n/**\n * Prompt for user preferences\n */\nexport async function promptPreferences(options?: PreferencesOptions): Promise<Preferences> {\n logger.section('Preferences', '⚙️');\n\n const language = await select({\n message: 'Working language (for documentation and comments):',\n choices: [\n { name: 'English', value: 'en' as const },\n { name: 'Español', value: 'es' as const },\n ],\n default: options?.defaults?.language || 'en',\n });\n\n const responseLanguage = await select({\n message: 'Claude response language:',\n choices: [\n { name: 'English', value: 'en' as const },\n { name: 'Español', value: 'es' as const },\n ],\n default: options?.defaults?.responseLanguage || language,\n });\n\n const includeCoAuthor = await confirm({\n message: 'Include Claude as commit co-author?',\n default: options?.defaults?.includeCoAuthor ?? true,\n });\n\n // Package manager selection\n const packageManager = await promptPackageManagerPreference(options?.detectedPackageManager);\n\n return {\n language,\n responseLanguage,\n includeCoAuthor,\n packageManager,\n };\n}\n\n/**\n * Prompt for package manager preference\n */\nexport async function promptPackageManagerPreference(\n detected?: PackageManager\n): Promise<PackageManager> {\n const choices = [\n {\n name: 'pnpm (recommended)',\n value: 'pnpm' as const,\n description: 'Fast, disk space efficient package manager',\n },\n {\n name: 'npm',\n value: 'npm' as const,\n description: 'Node.js default package manager',\n },\n {\n name: 'yarn',\n value: 'yarn' as const,\n description: 'Fast, reliable dependency management',\n },\n {\n name: 'bun',\n value: 'bun' as const,\n description: 'All-in-one JavaScript runtime & toolkit',\n },\n ];\n\n // Mark detected package manager\n if (detected) {\n const detectedChoice = choices.find((c) => c.value === detected);\n if (detectedChoice) {\n detectedChoice.name = `${detectedChoice.name} (detected)`;\n }\n }\n\n return select({\n message: 'Preferred package manager:',\n choices,\n default: detected || 'pnpm',\n });\n}\n\n/**\n * Confirm preferences summary\n */\nexport async function confirmPreferences(prefs: Preferences): Promise<boolean> {\n logger.newline();\n logger.subtitle('Preferences Summary');\n logger.keyValue('Working language', prefs.language === 'en' ? 'English' : 'Español');\n logger.keyValue('Response language', prefs.responseLanguage === 'en' ? 'English' : 'Español');\n logger.keyValue('Co-author', prefs.includeCoAuthor ? 'Yes' : 'No');\n logger.keyValue('Package manager', prefs.packageManager || 'pnpm');\n logger.newline();\n\n return confirm({\n message: 'Are these preferences correct?',\n default: true,\n });\n}\n","/**\n * Project scaffold prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n PackageManager,\n ProjectType,\n ScaffoldOptions,\n ScaffoldType,\n} from '../../types/scaffold.js';\n\ninterface ScaffoldPromptOptions {\n existingProject?: boolean;\n detectedType?: ProjectType;\n detectedPackageManager?: PackageManager;\n}\n\n/**\n * Prompt for scaffold type\n */\nexport async function promptScaffoldType(options?: ScaffoldPromptOptions): Promise<ScaffoldType> {\n logger.section('Configuration Scope', '🏗️');\n\n if (options?.existingProject) {\n logger.info('Existing project detected');\n logger.newline();\n\n const choice = await select({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'Add Claude config only (recommended)',\n value: 'claude-only' as const,\n description: 'Creates .claude/ folder without touching existing files',\n },\n {\n name: 'Full project setup (⚠️ may overwrite files)',\n value: 'full-project' as const,\n description: 'Includes project scaffolding - use with caution',\n },\n ],\n default: 'claude-only',\n });\n\n if (choice === 'full-project') {\n const confirmed = await confirm({\n message: '⚠️ This may overwrite existing files. Are you sure?',\n default: false,\n });\n if (!confirmed) {\n return 'claude-only';\n }\n }\n\n return choice;\n }\n\n return select({\n message: 'What would you like to configure?',\n choices: [\n {\n name: 'Claude configuration only',\n value: 'claude-only' as const,\n description: 'Only creates .claude/ folder with agents, commands, skills, docs',\n },\n {\n name: 'Full project setup',\n value: 'full-project' as const,\n description: 'Creates project structure + Claude configuration',\n },\n ],\n default: 'claude-only',\n });\n}\n\n/**\n * Prompt for project type\n */\nexport async function promptProjectType(detectedType?: ProjectType): Promise<ProjectType> {\n const choices = [\n {\n name: 'Node.js (TypeScript)',\n value: 'node' as const,\n description: 'Basic Node.js project with TypeScript',\n },\n {\n name: 'Monorepo (TurboRepo + pnpm)',\n value: 'monorepo' as const,\n description: 'Multi-package monorepo setup',\n },\n {\n name: 'Astro',\n value: 'astro' as const,\n description: 'Astro static/SSR site',\n },\n {\n name: 'Next.js',\n value: 'nextjs' as const,\n description: 'Next.js full-stack React framework',\n },\n {\n name: 'Vite + React',\n value: 'vite-react' as const,\n description: 'Vite bundled React SPA',\n },\n {\n name: 'Hono API',\n value: 'hono' as const,\n description: 'Hono lightweight API server',\n },\n {\n name: 'Custom',\n value: 'custom' as const,\n description: 'Define your own project structure',\n },\n ];\n\n if (detectedType) {\n const detected = choices.find((c) => c.value === detectedType);\n if (detected) {\n detected.name = `${detected.name} (detected)`;\n }\n }\n\n return select({\n message: 'Project type:',\n choices,\n default: detectedType || 'node',\n });\n}\n\n/**\n * Prompt for package manager\n */\nexport async function promptPackageManager(detected?: PackageManager): Promise<PackageManager> {\n const choices = [\n { name: 'pnpm (recommended)', value: 'pnpm' as const },\n { name: 'npm', value: 'npm' as const },\n { name: 'yarn', value: 'yarn' as const },\n { name: 'bun', value: 'bun' as const },\n ];\n\n if (detected) {\n const detectedChoice = choices.find((c) => c.value === detected);\n if (detectedChoice) {\n detectedChoice.name = `${detectedChoice.name} (detected)`;\n }\n }\n\n return select({\n message: 'Package manager:',\n choices,\n default: detected || 'pnpm',\n });\n}\n\n/**\n * Prompt for scaffold options\n */\nexport async function promptScaffoldOptions(\n options?: ScaffoldPromptOptions\n): Promise<ScaffoldOptions> {\n const type = await promptScaffoldType(options);\n\n if (type === 'claude-only') {\n return { type };\n }\n\n const projectType = await promptProjectType(options?.detectedType);\n const packageManager = await promptPackageManager(options?.detectedPackageManager);\n\n logger.newline();\n logger.subtitle('Additional Options');\n\n const additionalOptions = await checkbox({\n message: 'Select additional options:',\n choices: [\n { name: 'Initialize git repository', value: 'initGit', checked: true },\n { name: 'Create README.md', value: 'createReadme', checked: true },\n { name: 'Create .gitignore', value: 'createGitignore', checked: true },\n ],\n });\n\n return {\n type,\n projectType,\n packageManager,\n initGit: additionalOptions.includes('initGit'),\n createReadme: additionalOptions.includes('createReadme'),\n createGitignore: additionalOptions.includes('createGitignore'),\n };\n}\n\n/**\n * Confirm scaffold options\n */\nexport async function confirmScaffoldOptions(scaffoldOptions: ScaffoldOptions): Promise<boolean> {\n logger.newline();\n logger.subtitle('Scaffold Summary');\n logger.keyValue(\n 'Type',\n scaffoldOptions.type === 'claude-only' ? 'Claude config only' : 'Full project'\n );\n\n if (scaffoldOptions.type === 'full-project') {\n logger.keyValue('Project type', scaffoldOptions.projectType || 'node');\n logger.keyValue('Package manager', scaffoldOptions.packageManager || 'pnpm');\n logger.keyValue('Init git', scaffoldOptions.initGit ? 'Yes' : 'No');\n logger.keyValue('Create README', scaffoldOptions.createReadme ? 'Yes' : 'No');\n logger.keyValue('Create .gitignore', scaffoldOptions.createGitignore ? 'Yes' : 'No');\n }\n\n logger.newline();\n\n return confirm({\n message: 'Proceed with these options?',\n default: true,\n });\n}\n","/**\n * Granular item-by-item selection prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory, ModuleDefinition } from '../../types/modules.js';\n\nexport type ItemAction = 'install' | 'skip';\nexport type BatchAction = 'all' | 'none' | 'preset' | 'continue';\n\ninterface CategorySelectionResult {\n category: ModuleCategory;\n selectedItems: string[];\n skippedItems: string[];\n}\n\n/**\n * Prompt for a single item installation\n */\nexport async function promptSingleItem(\n item: ModuleDefinition,\n options?: {\n defaultInstall?: boolean;\n showDescription?: boolean;\n }\n): Promise<ItemAction> {\n const defaultValue = options?.defaultInstall ?? true;\n\n if (options?.showDescription && item.description) {\n logger.note(item.description);\n }\n\n const install = await confirm({\n message: `Install ${colors.primary(item.name)}?`,\n default: defaultValue,\n });\n\n return install ? 'install' : 'skip';\n}\n\n/**\n * Prompt for batch action before starting category selection\n */\nexport async function promptBatchAction(\n category: ModuleCategory,\n totalItems: number,\n hasPreset?: boolean\n): Promise<BatchAction> {\n const choices: Array<{ name: string; value: BatchAction; description: string }> = [\n {\n name: 'Install all (recommended)',\n value: 'all',\n description: `Install all ${totalItems} ${category}`,\n },\n {\n name: 'Select one by one',\n value: 'continue',\n description: `Review each of the ${totalItems} items`,\n },\n {\n name: 'Skip all',\n value: 'none',\n description: `Skip all ${category}`,\n },\n ];\n\n if (hasPreset) {\n choices.splice(1, 0, {\n name: 'Use preset for this category',\n value: 'preset',\n description: 'Use the preset selection for this category',\n });\n }\n\n return select<BatchAction>({\n message: `${capitalize(category)} selection (${totalItems} available):`,\n choices,\n default: 'all',\n });\n}\n\n/**\n * Select items from a category one by one\n */\nexport async function selectItemsFromCategory(\n category: ModuleCategory,\n items: ModuleDefinition[],\n options?: {\n preselected?: string[];\n showDescriptions?: boolean;\n }\n): Promise<CategorySelectionResult> {\n const selectedItems: string[] = [];\n const skippedItems: string[] = [];\n\n logger.newline();\n logger.subtitle(`${capitalize(category)} Selection`);\n logger.info(`${items.length} ${category} available`);\n logger.newline();\n\n // Check for batch action first\n const batchAction = await promptBatchAction(\n category,\n items.length,\n options?.preselected && options.preselected.length > 0\n );\n\n if (batchAction === 'all') {\n return {\n category,\n selectedItems: items.map((i) => i.id),\n skippedItems: [],\n };\n }\n\n if (batchAction === 'none') {\n return {\n category,\n selectedItems: [],\n skippedItems: items.map((i) => i.id),\n };\n }\n\n if (batchAction === 'preset' && options?.preselected) {\n const preselectedSet = new Set(options.preselected);\n return {\n category,\n selectedItems: items.filter((i) => preselectedSet.has(i.id)).map((i) => i.id),\n skippedItems: items.filter((i) => !preselectedSet.has(i.id)).map((i) => i.id),\n };\n }\n\n // One by one selection\n const remainingItems = [...items];\n let currentIndex = 0;\n\n while (currentIndex < remainingItems.length) {\n const item = remainingItems[currentIndex];\n const remaining = remainingItems.length - currentIndex - 1;\n const isPreselected = options?.preselected?.includes(item.id);\n\n // Show progress\n const progress = colors.muted(`[${currentIndex + 1}/${remainingItems.length}]`);\n console.log(`\\n${progress} ${colors.bold(item.name)}`);\n\n if (options?.showDescriptions && item.description) {\n logger.note(item.description);\n }\n\n // Ask with shortcuts\n const action = await promptItemWithShortcuts(item, {\n defaultInstall: isPreselected,\n remainingCount: remaining,\n });\n\n switch (action) {\n case 'install':\n selectedItems.push(item.id);\n currentIndex++;\n break;\n\n case 'skip':\n skippedItems.push(item.id);\n currentIndex++;\n break;\n\n case 'install-rest':\n selectedItems.push(item.id);\n // Install all remaining\n for (let i = currentIndex + 1; i < remainingItems.length; i++) {\n selectedItems.push(remainingItems[i].id);\n }\n currentIndex = remainingItems.length;\n break;\n\n case 'skip-rest':\n skippedItems.push(item.id);\n // Skip all remaining\n for (let i = currentIndex + 1; i < remainingItems.length; i++) {\n skippedItems.push(remainingItems[i].id);\n }\n currentIndex = remainingItems.length;\n break;\n }\n }\n\n return {\n category,\n selectedItems,\n skippedItems,\n };\n}\n\ntype ItemActionExtended = 'install' | 'skip' | 'install-rest' | 'skip-rest';\n\n/**\n * Prompt for item with keyboard shortcuts\n */\nasync function promptItemWithShortcuts(\n item: ModuleDefinition,\n options: {\n defaultInstall?: boolean;\n remainingCount: number;\n }\n): Promise<ItemActionExtended> {\n const choices: Array<{ name: string; value: ItemActionExtended }> = [\n { name: 'Yes, install', value: 'install' },\n { name: 'No, skip', value: 'skip' },\n ];\n\n if (options.remainingCount > 0) {\n choices.push(\n {\n name: `Install all remaining (${options.remainingCount + 1} items)`,\n value: 'install-rest',\n },\n {\n name: `Skip all remaining (${options.remainingCount + 1} items)`,\n value: 'skip-rest',\n }\n );\n }\n\n return select<ItemActionExtended>({\n message: `Install ${item.name}?`,\n choices,\n default: options.defaultInstall !== false ? 'install' : 'skip',\n });\n}\n\n/**\n * Show selection summary for a category\n */\nexport function showCategorySelectionSummary(result: CategorySelectionResult): void {\n const { category, selectedItems, skippedItems } = result;\n\n logger.newline();\n logger.subtitle(`${capitalize(category)} Summary`);\n\n if (selectedItems.length > 0) {\n logger.success(`Selected (${selectedItems.length}): ${selectedItems.join(', ')}`);\n }\n\n if (skippedItems.length > 0) {\n logger.info(`Skipped (${skippedItems.length}): ${colors.muted(skippedItems.join(', '))}`);\n }\n}\n\n/**\n * Confirm category selection\n */\nexport async function confirmCategorySelection(result: CategorySelectionResult): Promise<boolean> {\n showCategorySelectionSummary(result);\n logger.newline();\n\n return confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Hook configuration prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { HookConfig } from '../../types/config.js';\n\ntype HookType = 'notification' | 'stop' | 'subagentStop' | 'custom';\n\ninterface HookPromptOptions {\n defaults?: Partial<HookConfig>;\n}\n\n/**\n * Prompt for hook configuration\n */\nexport async function promptHookConfig(options?: HookPromptOptions): Promise<HookConfig> {\n logger.section('Hook Configuration', '🪝');\n\n const enableHooks = await confirm({\n message: 'Do you want to configure hooks?',\n default: true,\n });\n\n if (!enableHooks) {\n return {\n enabled: false,\n };\n }\n\n // Select which hooks to configure\n const selectedHooks = await checkbox({\n message: 'Which hooks do you want to configure?',\n choices: [\n {\n name: 'Notification hook (alerts when Claude needs attention)',\n value: 'notification' as HookType,\n checked: true,\n },\n {\n name: 'Stop hook (plays sound when Claude stops)',\n value: 'stop' as HookType,\n checked: false,\n },\n {\n name: 'Subagent stop hook (plays sound when subagent completes)',\n value: 'subagentStop' as HookType,\n checked: false,\n },\n ],\n });\n\n const config: HookConfig = {\n enabled: true,\n };\n\n // Configure notification hook\n if (selectedHooks.includes('notification')) {\n config.notification = await promptNotificationHook(options?.defaults?.notification);\n }\n\n // Configure stop hook\n if (selectedHooks.includes('stop')) {\n config.stop = await promptStopHook();\n }\n\n // Configure subagent stop hook\n if (selectedHooks.includes('subagentStop')) {\n config.subagentStop = await promptSubagentStopHook();\n }\n\n return config;\n}\n\n/**\n * Prompt for notification hook configuration\n */\nasync function promptNotificationHook(\n defaults?: HookConfig['notification']\n): Promise<HookConfig['notification']> {\n logger.newline();\n logger.info('Notification Hook Configuration');\n\n const notificationTypes = await checkbox({\n message: 'Select notification types:',\n choices: [\n {\n name: 'Desktop notifications (notify-send / terminal-notifier)',\n value: 'desktop',\n checked: defaults?.desktop ?? true,\n },\n {\n name: 'Audio notifications (text-to-speech)',\n value: 'audio',\n checked: defaults?.audio ?? false,\n },\n ],\n });\n\n let customCommand: string | undefined;\n const wantCustom = await confirm({\n message: 'Do you want to add a custom notification command?',\n default: false,\n });\n\n if (wantCustom) {\n customCommand = await input({\n message: 'Custom command (receives notification text as argument):',\n default: defaults?.customCommand,\n });\n }\n\n return {\n desktop: notificationTypes.includes('desktop'),\n audio: notificationTypes.includes('audio'),\n customCommand: customCommand || undefined,\n };\n}\n\n/**\n * Prompt for stop hook configuration\n */\nasync function promptStopHook(): Promise<HookConfig['stop']> {\n logger.newline();\n logger.info('Stop Hook Configuration');\n\n const soundType = await select({\n message: 'What should happen when Claude stops?',\n choices: [\n { name: 'Play beep sound', value: 'beep' },\n { name: 'Play custom sound', value: 'custom' },\n { name: 'Run custom command', value: 'command' },\n ],\n default: 'beep',\n });\n\n if (soundType === 'beep') {\n return { beep: true };\n }\n\n if (soundType === 'custom') {\n const soundPath = await input({\n message: 'Path to sound file:',\n validate: (v) => (v.trim() ? true : 'Please enter a valid path'),\n });\n return { customSound: soundPath };\n }\n\n const customCommand = await input({\n message: 'Custom command to run:',\n validate: (v) => (v.trim() ? true : 'Please enter a command'),\n });\n return { customCommand };\n}\n\n/**\n * Prompt for subagent stop hook configuration\n */\nasync function promptSubagentStopHook(): Promise<HookConfig['subagentStop']> {\n logger.newline();\n logger.info('Subagent Stop Hook Configuration');\n\n const soundType = await select({\n message: 'What should happen when a subagent completes?',\n choices: [\n { name: 'Play short beep', value: 'beep' },\n { name: 'Play custom sound', value: 'custom' },\n { name: 'Run custom command', value: 'command' },\n ],\n default: 'beep',\n });\n\n if (soundType === 'beep') {\n return { beep: true };\n }\n\n if (soundType === 'custom') {\n const soundPath = await input({\n message: 'Path to sound file:',\n validate: (v) => (v.trim() ? true : 'Please enter a valid path'),\n });\n return { customSound: soundPath };\n }\n\n const customCommand = await input({\n message: 'Custom command to run:',\n validate: (v) => (v.trim() ? true : 'Please enter a command'),\n });\n return { customCommand };\n}\n\n/**\n * Show hook configuration summary\n */\nexport function showHookSummary(config: HookConfig): void {\n logger.newline();\n logger.subtitle('Hook Configuration Summary');\n\n if (!config.enabled) {\n logger.info('Hooks: Disabled');\n return;\n }\n\n if (config.notification) {\n const notifTypes: string[] = [];\n if (config.notification.desktop) notifTypes.push('desktop');\n if (config.notification.audio) notifTypes.push('audio');\n if (config.notification.customCommand) notifTypes.push('custom');\n logger.keyValue('Notification', notifTypes.join(', ') || 'none');\n }\n\n if (config.stop) {\n if (config.stop.beep) logger.keyValue('Stop', 'beep');\n else if (config.stop.customSound) logger.keyValue('Stop', `sound: ${config.stop.customSound}`);\n else if (config.stop.customCommand)\n logger.keyValue('Stop', `command: ${config.stop.customCommand}`);\n }\n\n if (config.subagentStop) {\n if (config.subagentStop.beep) logger.keyValue('Subagent Stop', 'beep');\n else if (config.subagentStop.customSound)\n logger.keyValue('Subagent Stop', `sound: ${config.subagentStop.customSound}`);\n else if (config.subagentStop.customCommand)\n logger.keyValue('Subagent Stop', `command: ${config.subagentStop.customCommand}`);\n }\n}\n\n/**\n * Confirm hook configuration\n */\nexport async function confirmHookConfig(config: HookConfig): Promise<boolean> {\n showHookSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this hook configuration correct?',\n default: true,\n });\n}\n","/**\n * MCP server configuration prompts\n */\n\nimport { MCP_SERVERS, getMcpServer } from '../../constants/mcp-servers.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, password, select } from '../../lib/utils/prompt-cancel.js';\nimport type { McpConfig } from '../../types/config.js';\nimport type { McpConfigField, McpInstallation, McpServerDefinition } from '../../types/mcp.js';\n\ninterface McpPromptOptions {\n defaults?: Partial<McpConfig>;\n}\n\n/** Track servers with skipped configuration */\nexport interface McpConfigResult {\n config: McpConfig;\n skippedConfigs: SkippedMcpConfig[];\n}\n\n/** Information about a skipped MCP server configuration */\nexport interface SkippedMcpConfig {\n serverId: string;\n serverName: string;\n skippedFields: SkippedField[];\n installInstructions?: string;\n}\n\n/** A single skipped configuration field */\nexport interface SkippedField {\n name: string;\n description: string;\n envVar?: string;\n howToGet?: string;\n}\n\n/**\n * Prompt for MCP configuration\n * Returns both the config and information about any skipped configurations\n */\nexport async function promptMcpConfig(options?: McpPromptOptions): Promise<McpConfigResult> {\n logger.section('MCP Servers', '🔌');\n\n const enableMcp = await confirm({\n message: 'Do you want to configure MCP servers?',\n default: true,\n });\n\n if (!enableMcp) {\n return {\n config: {\n level: 'project',\n servers: [],\n },\n skippedConfigs: [],\n };\n }\n\n // Select installation level\n const level = await select({\n message: 'Where should MCP servers be configured?',\n choices: [\n {\n name: 'Project level (.claude/settings.local.json)',\n value: 'project' as const,\n description: 'Specific to this project',\n },\n {\n name: 'User level (~/.claude/settings.json)',\n value: 'user' as const,\n description: 'Available in all projects',\n },\n ],\n default: options?.defaults?.level || 'project',\n });\n\n // Group servers by category for display\n const serversByCategory = groupServersByCategory();\n const selectedServerIds: string[] = [];\n\n logger.newline();\n logger.info('Select MCP servers to install:');\n logger.newline();\n\n // Show grouped selection\n for (const [category, servers] of Object.entries(serversByCategory)) {\n const choices = servers.map((s) => ({\n name: `${s.name} - ${s.description}`,\n value: s.id,\n checked: options?.defaults?.servers?.some((i) => i.serverId === s.id) ?? false,\n }));\n\n const categoryLabel = formatCategory(category);\n const selected = await checkbox({\n message: `${categoryLabel}:`,\n choices,\n });\n\n selectedServerIds.push(...selected);\n }\n\n // Ask about custom server\n const wantCustom = await confirm({\n message: 'Do you want to add a custom MCP server?',\n default: false,\n });\n\n const installations: McpInstallation[] = [];\n const skippedConfigs: SkippedMcpConfig[] = [];\n\n // Configure selected servers\n for (const serverId of selectedServerIds) {\n const server = getMcpServer(serverId);\n if (server) {\n const result = await configureServer(server, level);\n installations.push(result.installation);\n if (result.skippedConfig) {\n skippedConfigs.push(result.skippedConfig);\n }\n }\n }\n\n // Configure custom server\n if (wantCustom) {\n const customInstallation = await promptCustomServer(level);\n if (customInstallation) {\n installations.push(customInstallation);\n }\n }\n\n return {\n config: {\n level,\n servers: installations,\n },\n skippedConfigs,\n };\n}\n\n/**\n * Group servers by category\n */\nfunction groupServersByCategory(): Record<string, McpServerDefinition[]> {\n const groups: Record<string, McpServerDefinition[]> = {};\n\n for (const server of MCP_SERVERS) {\n if (!groups[server.category]) {\n groups[server.category] = [];\n }\n groups[server.category].push(server);\n }\n\n return groups;\n}\n\n/**\n * Format category name for display\n */\nfunction formatCategory(category: string): string {\n const labels: Record<string, string> = {\n documentation: '📚 Documentation',\n database: '🗄️ Database',\n cache: '💾 Cache & Key-Value',\n 'version-control': '🔄 Version Control',\n deployment: '🚀 Deployment',\n infrastructure: '🏗️ Infrastructure',\n 'project-mgmt': '📋 Project Management',\n monitoring: '📊 Monitoring',\n testing: '🧪 Testing & Browser',\n security: '🔐 Security',\n communication: '💬 Communication',\n design: '🎨 Design',\n payments: '💳 Payments',\n search: '🔍 Search',\n ai: '🤖 AI & ML',\n custom: '⚙️ Custom',\n };\n return labels[category] || category;\n}\n\n/** Result from configuring a single server */\ninterface ConfigureServerResult {\n installation: McpInstallation;\n skippedConfig: SkippedMcpConfig | null;\n}\n\n/**\n * Configure a single MCP server\n * Fields are optional - skipped fields are tracked for post-install instructions\n */\nasync function configureServer(\n server: McpServerDefinition,\n level: 'user' | 'project'\n): Promise<ConfigureServerResult> {\n const config: Record<string, unknown> = {};\n const skippedFields: SkippedField[] = [];\n\n if (server.requiresConfig && server.configFields) {\n logger.newline();\n logger.info(`Configuring ${colors.primary(server.name)}...`);\n logger.info(\n colors.muted(\n ' (Press Enter to skip optional fields - instructions will be shown at the end)'\n )\n );\n\n for (const field of server.configFields) {\n const result = await promptConfigFieldOptional(field);\n if (result.value !== undefined && result.value !== '') {\n config[field.name] = result.value;\n } else if (result.skipped) {\n skippedFields.push({\n name: field.name,\n description: field.description,\n envVar: field.envVar,\n });\n }\n }\n }\n\n const installation: McpInstallation = {\n serverId: server.id,\n level,\n config,\n };\n\n const skippedConfig: SkippedMcpConfig | null =\n skippedFields.length > 0\n ? {\n serverId: server.id,\n serverName: server.name,\n skippedFields,\n installInstructions: server.installInstructions,\n }\n : null;\n\n return { installation, skippedConfig };\n}\n\n/** Result from prompting a config field */\ninterface PromptFieldResult {\n value: string | boolean | number | undefined;\n skipped: boolean;\n}\n\n/**\n * Prompt for a config field value (all fields are optional)\n * Returns both the value and whether it was skipped\n */\nasync function promptConfigFieldOptional(field: McpConfigField): Promise<PromptFieldResult> {\n const envHint = field.envVar ? colors.muted(` (env: ${field.envVar})`) : '';\n const optionalHint = colors.muted(' [optional]');\n\n // Try to get from environment\n const envValue = field.envVar ? process.env[field.envVar] : undefined;\n\n if (field.type === 'boolean') {\n const value = await confirm({\n message: `${field.description}${envHint}:`,\n default: (field.default as boolean) ?? false,\n });\n return { value, skipped: false };\n }\n\n if (field.type === 'number') {\n const value = await input({\n message: `${field.description}${envHint}${optionalHint}:`,\n default: envValue || (field.default as string) || '',\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n if (Number.isNaN(Number(value))) {\n logger.warn('Invalid number, skipping field');\n return { value: undefined, skipped: true };\n }\n return { value: Number(value), skipped: false };\n }\n\n // String type - use password input for sensitive fields\n const isSensitive =\n field.name.toLowerCase().includes('token') ||\n field.name.toLowerCase().includes('key') ||\n field.name.toLowerCase().includes('secret') ||\n field.name.toLowerCase().includes('password');\n\n if (isSensitive) {\n if (envValue) {\n const useEnv = await confirm({\n message: `Found ${field.envVar} in environment. Use it?`,\n default: true,\n });\n if (useEnv) return { value: envValue, skipped: false };\n }\n\n const value = await password({\n message: `${field.description}${envHint}${optionalHint}:`,\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n return { value, skipped: false };\n }\n\n const value = await input({\n message: `${field.description}${envHint}${optionalHint}:`,\n default: envValue || (field.default as string) || '',\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n return { value, skipped: false };\n}\n\n/**\n * Prompt for custom MCP server\n */\nasync function promptCustomServer(level: 'user' | 'project'): Promise<McpInstallation | null> {\n logger.newline();\n logger.info('Configure custom MCP server');\n\n const serverId = await input({\n message: 'Server ID (unique identifier):',\n validate: (v) => {\n if (!v.trim()) return 'Server ID is required';\n if (!/^[a-z0-9-]+$/.test(v)) return 'Use lowercase letters, numbers, and dashes only';\n return true;\n },\n });\n\n const packageName = await input({\n message: 'NPM package or command:',\n validate: (v) => (v.trim() ? true : 'Package name is required'),\n });\n\n const hasConfig = await confirm({\n message: 'Does this server require configuration?',\n default: false,\n });\n\n const config: Record<string, unknown> = {\n package: packageName,\n };\n\n if (hasConfig) {\n let addMore = true;\n while (addMore) {\n const fieldName = await input({\n message: 'Config field name:',\n });\n\n if (fieldName.trim()) {\n const fieldValue = await input({\n message: `Value for ${fieldName}:`,\n });\n config[fieldName] = fieldValue;\n }\n\n addMore = await confirm({\n message: 'Add another config field?',\n default: false,\n });\n }\n }\n\n return {\n serverId,\n level,\n config,\n };\n}\n\n/**\n * Show MCP configuration summary\n */\nexport function showMcpSummary(config: McpConfig): void {\n logger.newline();\n logger.subtitle('MCP Configuration Summary');\n\n if (config.servers.length === 0) {\n logger.info('No MCP servers configured');\n return;\n }\n\n logger.keyValue('Level', config.level === 'user' ? 'User (~/.claude/)' : 'Project (.claude/)');\n logger.newline();\n\n for (const installation of config.servers) {\n const server = getMcpServer(installation.serverId);\n const name = server?.name || installation.serverId;\n logger.item(name);\n\n // Show non-sensitive config\n for (const [key, value] of Object.entries(installation.config)) {\n if (\n key.toLowerCase().includes('token') ||\n key.toLowerCase().includes('key') ||\n key.toLowerCase().includes('secret')\n ) {\n logger.keyValue(key, '***', 1);\n } else {\n logger.keyValue(key, String(value), 1);\n }\n }\n }\n}\n\n/**\n * Confirm MCP configuration\n */\nexport async function confirmMcpConfig(config: McpConfig): Promise<boolean> {\n showMcpSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this MCP configuration correct?',\n default: true,\n });\n}\n\n/**\n * Show post-install instructions for skipped MCP configurations\n * This should be called at the end of the installation process\n */\nexport function showSkippedMcpInstructions(\n skippedConfigs: SkippedMcpConfig[],\n mcpLevel: 'user' | 'project'\n): void {\n if (skippedConfigs.length === 0) {\n return;\n }\n\n logger.newline();\n logger.title('MCP Server Configuration Required');\n logger.newline();\n logger.info('Some MCP servers need additional configuration.');\n logger.info('Add the required values to complete the setup:');\n\n const configFile =\n mcpLevel === 'user'\n ? colors.primary('~/.claude/settings.json')\n : colors.primary('.claude/settings.local.json');\n\n logger.newline();\n logger.keyValue('Config file', configFile);\n\n for (const skipped of skippedConfigs) {\n logger.newline();\n logger.subtitle(skipped.serverName);\n\n if (skipped.installInstructions) {\n logger.info(skipped.installInstructions);\n }\n\n logger.newline();\n logger.info('Missing configuration:');\n\n for (const field of skipped.skippedFields) {\n const envInfo = field.envVar ? colors.muted(` (or set env: ${field.envVar})`) : '';\n logger.item(`${colors.warning(field.name)}: ${field.description}${envInfo}`);\n }\n\n // Show example JSON snippet\n logger.newline();\n logger.info('Add to mcpServers in your config file:');\n logger.raw(colors.muted(' {'));\n logger.raw(colors.muted(` \"${skipped.serverId}\": {`));\n for (const field of skipped.skippedFields) {\n logger.raw(colors.muted(` \"${field.name}\": \"<your-${field.name}>\",`));\n }\n logger.raw(colors.muted(' }'));\n logger.raw(colors.muted(' }'));\n }\n\n logger.newline();\n logger.info(\n colors.muted(\n 'Tip: You can also use environment variables for sensitive values like tokens and keys.'\n )\n );\n}\n","/**\n * Permission configuration prompts\n */\n\nimport {\n PERMISSION_PRESETS,\n PRESET_DESCRIPTIONS,\n generateAllowRules,\n generateDenyRules,\n} from '../../constants/permissions.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BashPermissions,\n CustomPermissions,\n FilePermissions,\n GitPermissions,\n PermissionPreset,\n PermissionsConfig,\n WebPermissions,\n} from '../../types/permissions.js';\n\ninterface PermissionsPromptOptions {\n defaults?: Partial<PermissionsConfig>;\n}\n\n/**\n * Prompt for permissions configuration\n */\nexport async function promptPermissionsConfig(\n options?: PermissionsPromptOptions\n): Promise<PermissionsConfig> {\n logger.section('Permissions', '🔐');\n\n const configurePermissions = await confirm({\n message: 'Do you want to configure Claude Code permissions?',\n default: true,\n });\n\n if (!configurePermissions) {\n return {\n preset: 'default',\n ...PERMISSION_PRESETS.default,\n custom: { allow: [], deny: [] },\n };\n }\n\n // Select preset or custom\n const preset = await promptPresetSelection();\n\n if (preset !== 'custom') {\n const presetConfig = PERMISSION_PRESETS[preset];\n\n // Ask if they want to customize the preset\n const customize = await confirm({\n message: 'Do you want to customize these permissions?',\n default: false,\n });\n\n if (!customize) {\n return {\n preset,\n ...presetConfig,\n custom: { allow: [], deny: [] },\n };\n }\n }\n\n // Custom configuration\n logger.newline();\n logger.info('Configure permissions for each category:');\n\n const files = await promptFilePermissions(options?.defaults?.files);\n const git = await promptGitPermissions(options?.defaults?.git);\n const bash = await promptBashPermissions(options?.defaults?.bash);\n const web = await promptWebPermissions(options?.defaults?.web);\n const custom = await promptCustomPermissions(options?.defaults?.custom);\n\n return {\n preset: 'custom',\n files,\n git,\n bash,\n web,\n custom,\n };\n}\n\n/**\n * Prompt for permission preset selection\n */\nasync function promptPresetSelection(): Promise<PermissionPreset> {\n const choices = Object.entries(PRESET_DESCRIPTIONS).map(([key, info]) => ({\n name: info.name,\n value: key as PermissionPreset,\n description: info.description,\n }));\n\n return select({\n message: 'Select a permission preset:',\n choices,\n default: 'default',\n });\n}\n\n/**\n * Prompt for file permissions\n */\nasync function promptFilePermissions(\n defaults?: Partial<FilePermissions>\n): Promise<FilePermissions> {\n logger.newline();\n logger.info(colors.bold('📁 File Operations'));\n\n const readAll = await confirm({\n message: 'Allow Read on all files?',\n default: defaults?.readAll ?? true,\n });\n\n const writeCode = await confirm({\n message: 'Allow Write on code files (*.ts, *.js, *.tsx, *.jsx, etc.)?',\n default: defaults?.writeCode ?? true,\n });\n\n const writeConfig = await confirm({\n message: 'Allow Write on config files (*.json, *.yaml, *.toml)?',\n default: defaults?.writeConfig ?? true,\n });\n\n const writeMarkdown = await confirm({\n message: 'Allow Write on markdown files (*.md)?',\n default: defaults?.writeMarkdown ?? true,\n });\n\n const writeOther = await confirm({\n message: 'Allow Write on other files (*.css, *.html, *.sql, etc.)?',\n default: defaults?.writeOther ?? false,\n });\n\n const editTool = await confirm({\n message: 'Allow Edit tool (inline file editing)?',\n default: defaults?.editTool ?? true,\n });\n\n return {\n readAll,\n writeCode,\n writeConfig,\n writeMarkdown,\n writeOther,\n editTool,\n };\n}\n\n/**\n * Prompt for git permissions\n */\nasync function promptGitPermissions(defaults?: Partial<GitPermissions>): Promise<GitPermissions> {\n logger.newline();\n logger.info(colors.bold('🔄 Git Operations'));\n\n const readOnly = await confirm({\n message: 'Allow git read operations (status, diff, log)?',\n default: defaults?.readOnly ?? true,\n });\n\n const staging = await confirm({\n message: 'Allow git add (staging)?',\n default: defaults?.staging ?? false,\n });\n\n const commit = await confirm({\n message: 'Allow git commit?',\n default: defaults?.commit ?? false,\n });\n\n let push = false;\n if (commit) {\n push = await confirm({\n message: '⚠️ Allow git push? (use with caution)',\n default: defaults?.push ?? false,\n });\n }\n\n const branching = await confirm({\n message: 'Allow git branching (checkout, branch, merge)?',\n default: defaults?.branching ?? false,\n });\n\n return {\n readOnly,\n staging,\n commit,\n push,\n branching,\n };\n}\n\n/**\n * Prompt for bash permissions\n */\nasync function promptBashPermissions(\n defaults?: Partial<BashPermissions>\n): Promise<BashPermissions> {\n logger.newline();\n logger.info(colors.bold('💻 Bash/Terminal Operations'));\n\n const packageManager = await confirm({\n message: 'Allow package manager commands (pnpm, npm, yarn)?',\n default: defaults?.packageManager ?? true,\n });\n\n const testing = await confirm({\n message: 'Allow test commands (vitest, jest, playwright)?',\n default: defaults?.testing ?? true,\n });\n\n const building = await confirm({\n message: 'Allow build commands (tsc, vite build, etc.)?',\n default: defaults?.building ?? true,\n });\n\n const docker = await confirm({\n message: 'Allow docker commands?',\n default: defaults?.docker ?? false,\n });\n\n const arbitrary = await confirm({\n message: '⚠️ Allow arbitrary bash commands? (dangerous)',\n default: defaults?.arbitrary ?? false,\n });\n\n return {\n packageManager,\n testing,\n building,\n docker,\n arbitrary,\n };\n}\n\n/**\n * Prompt for web permissions\n */\nasync function promptWebPermissions(defaults?: Partial<WebPermissions>): Promise<WebPermissions> {\n logger.newline();\n logger.info(colors.bold('🌐 Web Operations'));\n\n const fetch = await confirm({\n message: 'Allow WebFetch (fetch web pages)?',\n default: defaults?.fetch ?? true,\n });\n\n const search = await confirm({\n message: 'Allow WebSearch?',\n default: defaults?.search ?? true,\n });\n\n return {\n fetch,\n search,\n };\n}\n\n/**\n * Prompt for custom permissions\n */\nasync function promptCustomPermissions(\n defaults?: Partial<CustomPermissions>\n): Promise<CustomPermissions> {\n logger.newline();\n logger.info(colors.bold('⚙️ Custom Rules'));\n\n const wantCustom = await confirm({\n message: 'Do you want to add custom allow/deny rules?',\n default: false,\n });\n\n if (!wantCustom) {\n return {\n allow: defaults?.allow ?? [],\n deny: defaults?.deny ?? [],\n };\n }\n\n const allow: string[] = [...(defaults?.allow ?? [])];\n const deny: string[] = [...(defaults?.deny ?? [])];\n\n // Add allow rules\n let addMoreAllow = true;\n while (addMoreAllow) {\n const rule = await input({\n message: 'Add allow rule (e.g., \"Bash(npm run *)\"):',\n });\n\n if (rule.trim()) {\n allow.push(rule.trim());\n }\n\n addMoreAllow = await confirm({\n message: 'Add another allow rule?',\n default: false,\n });\n }\n\n // Add deny rules\n let addMoreDeny = await confirm({\n message: 'Do you want to add custom deny rules?',\n default: false,\n });\n\n while (addMoreDeny) {\n const rule = await input({\n message: 'Add deny rule (e.g., \"Write(secrets/*)\"):',\n });\n\n if (rule.trim()) {\n deny.push(rule.trim());\n }\n\n addMoreDeny = await confirm({\n message: 'Add another deny rule?',\n default: false,\n });\n }\n\n return { allow, deny };\n}\n\n/**\n * Show permissions summary\n */\nexport function showPermissionsSummary(config: PermissionsConfig): void {\n logger.newline();\n logger.subtitle('Permissions Summary');\n\n logger.keyValue('Preset', PRESET_DESCRIPTIONS[config.preset].name);\n logger.newline();\n\n // Files\n logger.info('📁 Files:');\n logger.keyValue(' Read all', config.files.readAll ? '✔' : '✖');\n logger.keyValue(' Write code', config.files.writeCode ? '✔' : '✖');\n logger.keyValue(' Write config', config.files.writeConfig ? '✔' : '✖');\n logger.keyValue(' Write markdown', config.files.writeMarkdown ? '✔' : '✖');\n logger.keyValue(' Write other', config.files.writeOther ? '✔' : '✖');\n logger.keyValue(' Edit tool', config.files.editTool ? '✔' : '✖');\n\n // Git\n logger.newline();\n logger.info('🔄 Git:');\n logger.keyValue(' Read only', config.git.readOnly ? '✔' : '✖');\n logger.keyValue(' Staging', config.git.staging ? '✔' : '✖');\n logger.keyValue(' Commit', config.git.commit ? '✔' : '✖');\n logger.keyValue(' Push', config.git.push ? '✔' : '✖');\n logger.keyValue(' Branching', config.git.branching ? '✔' : '✖');\n\n // Bash\n logger.newline();\n logger.info('💻 Bash:');\n logger.keyValue(' Package manager', config.bash.packageManager ? '✔' : '✖');\n logger.keyValue(' Testing', config.bash.testing ? '✔' : '✖');\n logger.keyValue(' Building', config.bash.building ? '✔' : '✖');\n logger.keyValue(' Docker', config.bash.docker ? '✔' : '✖');\n logger.keyValue(' Arbitrary', config.bash.arbitrary ? '✔' : '✖');\n\n // Web\n logger.newline();\n logger.info('🌐 Web:');\n logger.keyValue(' Fetch', config.web.fetch ? '✔' : '✖');\n logger.keyValue(' Search', config.web.search ? '✔' : '✖');\n\n // Custom rules\n if (config.custom?.allow?.length || config.custom?.deny?.length) {\n logger.newline();\n logger.info('⚙️ Custom rules:');\n if (config.custom?.allow?.length) {\n logger.keyValue(' Allow', config.custom.allow.join(', '));\n }\n if (config.custom?.deny?.length) {\n logger.keyValue(' Deny', config.custom.deny.join(', '));\n }\n }\n}\n\n/**\n * Confirm permissions configuration\n */\nexport async function confirmPermissionsConfig(config: PermissionsConfig): Promise<boolean> {\n showPermissionsSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this permission configuration correct?',\n default: true,\n });\n}\n\n/**\n * Generate the rules that will be written to settings.json\n */\nexport function generatePermissionRules(config: PermissionsConfig): {\n allow: string[];\n deny: string[];\n} {\n return {\n allow: generateAllowRules(config),\n deny: generateDenyRules(config),\n };\n}\n","/**\n * Update prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\n\nexport type UpdateAction = 'check' | 'modules' | 'config' | 'all' | 'cancel';\n\nexport interface ModuleUpdate {\n id: string;\n name: string;\n category: string;\n type: 'new' | 'updated' | 'deprecated';\n hasLocalChanges?: boolean;\n}\n\nexport type ConflictResolution = 'keep' | 'update' | 'merge' | 'diff';\n\n/**\n * Prompt for update action\n */\nexport async function promptUpdateAction(): Promise<UpdateAction> {\n logger.subtitle('Update Options');\n\n return select({\n message: 'What would you like to update?',\n choices: [\n {\n name: 'Check for updates',\n value: 'check' as const,\n description: 'Show what has changed without modifying files',\n },\n {\n name: 'Update modules only',\n value: 'modules' as const,\n description: 'Update agents, skills, commands, docs',\n },\n {\n name: 'Reconfigure settings',\n value: 'config' as const,\n description: 'Re-run configuration for MCP, hooks, preferences',\n },\n {\n name: 'Full update',\n value: 'all' as const,\n description: 'Update everything',\n },\n {\n name: 'Cancel',\n value: 'cancel' as const,\n },\n ],\n default: 'check',\n });\n}\n\n/**\n * Show update report\n */\nexport function showUpdateReport(updates: {\n new: ModuleUpdate[];\n updated: ModuleUpdate[];\n deprecated: ModuleUpdate[];\n conflicts: ModuleUpdate[];\n}): void {\n logger.newline();\n logger.title('Update Report');\n\n if (updates.new.length === 0 && updates.updated.length === 0 && updates.deprecated.length === 0) {\n logger.success('Everything is up to date!');\n return;\n }\n\n if (updates.new.length > 0) {\n logger.newline();\n logger.info(colors.bold(`✚ New modules available (${updates.new.length}):`));\n for (const mod of updates.new) {\n logger.item(`${mod.category}: ${colors.primary(mod.name)}`);\n }\n }\n\n if (updates.updated.length > 0) {\n logger.newline();\n logger.info(colors.bold(`↻ Updated modules (${updates.updated.length}):`));\n for (const mod of updates.updated) {\n const conflict = mod.hasLocalChanges ? colors.warning(' (local changes)') : '';\n logger.item(`${mod.category}: ${colors.primary(mod.name)}${conflict}`);\n }\n }\n\n if (updates.deprecated.length > 0) {\n logger.newline();\n logger.info(colors.bold(`✗ Deprecated modules (${updates.deprecated.length}):`));\n for (const mod of updates.deprecated) {\n logger.item(`${mod.category}: ${colors.muted(mod.name)}`);\n }\n }\n\n if (updates.conflicts.length > 0) {\n logger.newline();\n logger.warn(`⚠ Modules with conflicts (${updates.conflicts.length}):`);\n for (const mod of updates.conflicts) {\n logger.item(`${mod.category}: ${colors.warning(mod.name)} - has local modifications`);\n }\n }\n}\n\n/**\n * Prompt for new module installation\n */\nexport async function promptNewModules(modules: ModuleUpdate[]): Promise<string[]> {\n if (modules.length === 0) return [];\n\n logger.newline();\n const choices = modules.map((mod) => ({\n name: `${mod.category}: ${mod.name}`,\n value: mod.id,\n checked: false,\n }));\n\n return checkbox({\n message: 'Select new modules to install:',\n choices,\n });\n}\n\n/**\n * Prompt for updating existing modules\n */\nexport async function promptUpdatedModules(modules: ModuleUpdate[]): Promise<string[]> {\n if (modules.length === 0) return [];\n\n logger.newline();\n const choices = modules.map((mod) => ({\n name: `${mod.category}: ${mod.name}${mod.hasLocalChanges ? ' ⚠️' : ''}`,\n value: mod.id,\n checked: !mod.hasLocalChanges, // Don't check by default if has local changes\n }));\n\n return checkbox({\n message: 'Select modules to update:',\n choices,\n });\n}\n\n/**\n * Prompt for conflict resolution\n */\nexport async function promptConflictResolution(module: ModuleUpdate): Promise<ConflictResolution> {\n logger.newline();\n logger.warn(`Conflict: ${module.category}/${module.name} has local modifications`);\n\n return select({\n message: 'How do you want to resolve this conflict?',\n choices: [\n {\n name: 'Keep local version',\n value: 'keep' as const,\n description: 'Do not update this module',\n },\n {\n name: 'Use updated version',\n value: 'update' as const,\n description: 'Replace with new version (lose local changes)',\n },\n {\n name: 'Show diff',\n value: 'diff' as const,\n description: 'See what changed before deciding',\n },\n ],\n default: 'keep',\n });\n}\n\n/**\n * Prompt for reconfiguration options\n */\nexport async function promptReconfigureOptions(): Promise<string[]> {\n logger.newline();\n\n return checkbox({\n message: 'What would you like to reconfigure?',\n choices: [\n { name: 'MCP servers', value: 'mcp', checked: false },\n { name: 'Hooks', value: 'hooks', checked: false },\n { name: 'Preferences (language, co-author)', value: 'preferences', checked: false },\n { name: 'Permissions', value: 'permissions', checked: false },\n { name: 'Add/remove modules', value: 'modules', checked: false },\n ],\n });\n}\n\n/**\n * Confirm update\n */\nexport async function confirmUpdate(summary: {\n newModules: number;\n updatedModules: number;\n removedModules: number;\n reconfigurations: string[];\n}): Promise<boolean> {\n logger.newline();\n logger.subtitle('Update Summary');\n\n if (summary.newModules > 0) {\n logger.keyValue('New modules', String(summary.newModules));\n }\n if (summary.updatedModules > 0) {\n logger.keyValue('Updated modules', String(summary.updatedModules));\n }\n if (summary.removedModules > 0) {\n logger.keyValue('Removed modules', String(summary.removedModules));\n }\n if (summary.reconfigurations.length > 0) {\n logger.keyValue('Reconfigured', summary.reconfigurations.join(', '));\n }\n\n logger.newline();\n\n return confirm({\n message: 'Apply these updates?',\n default: true,\n });\n}\n\n/**\n * Prompt to create backup before update\n */\nexport async function promptBackup(): Promise<boolean> {\n return confirm({\n message: 'Create backup before updating?',\n default: true,\n });\n}\n","/**\n * General confirmation prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { ClaudeConfig } from '../../types/config.js';\n\n/**\n * Confirm overwrite of existing configuration\n */\nexport async function confirmOverwrite(existingPath: string): Promise<boolean> {\n logger.warn(`Existing configuration found at ${existingPath}`);\n\n return confirm({\n message: 'Do you want to overwrite the existing configuration?',\n default: false,\n });\n}\n\n/**\n * Prompt for action when existing project detected\n */\nexport async function promptExistingProjectAction(): Promise<'skip' | 'overwrite' | 'merge'> {\n return select({\n message: 'Existing .claude/ folder detected. What would you like to do?',\n choices: [\n {\n name: 'Skip (keep existing)',\n value: 'skip' as const,\n description: 'Do not modify existing configuration',\n },\n {\n name: 'Overwrite',\n value: 'overwrite' as const,\n description: 'Replace existing configuration',\n },\n {\n name: 'Merge',\n value: 'merge' as const,\n description: 'Add new items, keep existing',\n },\n ],\n default: 'skip',\n });\n}\n\n/**\n * Show final configuration summary\n */\nexport function showFinalSummary(config: ClaudeConfig): void {\n logger.newline();\n logger.title('Configuration Summary');\n\n // Project info\n logger.subtitle('Project');\n logger.keyValue('Name', config.project.name);\n logger.keyValue('GitHub', `${config.project.org}/${config.project.repo}`);\n if (config.project.domain) {\n logger.keyValue('Domain', config.project.domain);\n }\n\n // Preferences\n logger.newline();\n logger.subtitle('Preferences');\n logger.keyValue('Language', config.preferences.language === 'en' ? 'English' : 'Español');\n logger.keyValue('Co-author', config.preferences.includeCoAuthor ? 'Yes' : 'No');\n\n // Modules\n logger.newline();\n logger.subtitle('Modules');\n\n const moduleCategories = ['agents', 'skills', 'commands', 'docs'] as const;\n for (const category of moduleCategories) {\n const selected = config.modules[category].selected;\n if (selected.length > 0) {\n logger.keyValue(capitalize(category), `${selected.length} selected`);\n logger.note(selected.join(', '));\n }\n }\n\n // Extras\n logger.newline();\n logger.subtitle('Extras');\n const extras: string[] = [];\n if (config.extras.schemas) extras.push('schemas');\n if (config.extras.scripts) extras.push('scripts');\n if (config.extras.hooks.enabled) extras.push('hooks');\n if (config.extras.sessions) extras.push('sessions');\n logger.keyValue('Included', extras.join(', ') || 'none');\n\n // Code Style\n if (config.extras.codeStyle?.enabled) {\n const codeStyleTools: string[] = [];\n if (config.extras.codeStyle.editorconfig) codeStyleTools.push('EditorConfig');\n if (config.extras.codeStyle.commitlint) codeStyleTools.push('Commitlint');\n if (config.extras.codeStyle.biome) codeStyleTools.push('Biome');\n if (config.extras.codeStyle.prettier) codeStyleTools.push('Prettier');\n logger.keyValue('Code Style', codeStyleTools.join(', '));\n }\n\n // MCP\n if (config.mcp.servers.length > 0) {\n logger.newline();\n logger.subtitle('MCP Servers');\n logger.keyValue('Level', config.mcp.level);\n logger.keyValue('Servers', config.mcp.servers.map((s) => s.serverId).join(', '));\n }\n\n // Scaffold\n logger.newline();\n logger.subtitle('Scaffold');\n logger.keyValue(\n 'Type',\n config.scaffold.type === 'claude-only' ? 'Claude config only' : 'Full project'\n );\n}\n\n/**\n * Confirm final configuration\n */\nexport async function confirmFinalConfiguration(config: ClaudeConfig): Promise<boolean> {\n showFinalSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Proceed with this configuration?',\n default: true,\n });\n}\n\n/**\n * Confirm destructive action\n */\nexport async function confirmDestructiveAction(action: string): Promise<boolean> {\n logger.warn(`⚠️ This action is destructive: ${action}`);\n\n const firstConfirm = await confirm({\n message: 'Are you sure you want to proceed?',\n default: false,\n });\n\n if (!firstConfirm) return false;\n\n const typeConfirm = await input({\n message: 'Type \"yes\" to confirm:',\n });\n\n return typeConfirm.toLowerCase() === 'yes';\n}\n\n/**\n * Show post-installation instructions\n */\nexport function showPostInstallInstructions(config: ClaudeConfig): void {\n logger.newline();\n logger.title('Installation Complete!');\n\n const steps: string[] = [];\n\n // Git steps\n if (config.scaffold.type === 'full-project') {\n steps.push('Review the generated project structure');\n }\n\n steps.push('Review .claude/CLAUDE.md for agent instructions');\n steps.push('Customize agents, commands, and skills as needed');\n\n // MCP steps\n if (config.mcp.servers.length > 0) {\n const mcpFile =\n config.mcp.level === 'user' ? '~/.claude/settings.json' : '.claude/settings.local.json';\n steps.push(`Configure MCP server credentials in ${mcpFile}`);\n }\n\n // Hook steps\n if (config.extras.hooks.enabled) {\n steps.push('Review hook scripts in .claude/hooks/');\n if (config.extras.hooks.notification?.audio) {\n steps.push('Install Piper TTS for audio notifications (see docs)');\n }\n }\n\n logger.instructions('Next Steps:', steps);\n\n // Show useful commands\n logger.subtitle('Useful Commands');\n logger.raw('');\n logger.raw(` ${colors.primary('claude-config status')} - Show current configuration`);\n logger.raw(` ${colors.primary('claude-config list')} - List available modules`);\n logger.raw(` ${colors.primary('claude-config add')} - Add a module`);\n logger.raw(` ${colors.primary('claude-config update')} - Update configuration`);\n logger.raw('');\n}\n\n/**\n * Show dependency installation instructions\n */\nexport function showDependencyInstructions(\n dependencies: Array<{ name: string; instructions: string[] }>\n): void {\n if (dependencies.length === 0) return;\n\n logger.newline();\n logger.title('Required Dependencies');\n logger.info('Some features require additional system dependencies:');\n\n for (const dep of dependencies) {\n logger.newline();\n logger.subtitle(dep.name);\n for (const instruction of dep.instructions) {\n logger.raw(` ${instruction}`);\n }\n }\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Code style configuration prompts\n */\n\nimport {\n CODE_STYLE_PRESETS,\n type CodeStylePreset,\n DEFAULT_BIOME_OPTIONS,\n DEFAULT_COMMITLINT_OPTIONS,\n DEFAULT_EDITORCONFIG_OPTIONS,\n DEFAULT_PRETTIER_OPTIONS,\n} from '../../constants/code-style-defaults.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BiomeOptions,\n CodeStyleConfig,\n CommitlintOptions,\n EditorConfigOptions,\n IndentStyle,\n PrettierOptions,\n QuoteStyle,\n} from '../../types/config.js';\n\ntype CodeStyleTool = 'editorconfig' | 'commitlint' | 'biome' | 'prettier';\n\ninterface CodeStyleChoice {\n name: string;\n value: CodeStyleTool;\n description: string;\n checked: boolean;\n}\n\nconst CODE_STYLE_TOOLS: CodeStyleChoice[] = [\n {\n name: 'EditorConfig',\n value: 'editorconfig',\n description: 'Consistent coding styles across editors',\n checked: true,\n },\n {\n name: 'Commitlint',\n value: 'commitlint',\n description: 'Lint commit messages (conventional commits)',\n checked: true,\n },\n {\n name: 'Biome',\n value: 'biome',\n description: 'Fast linter and formatter (ESLint + Prettier alternative)',\n checked: false,\n },\n {\n name: 'Prettier',\n value: 'prettier',\n description: 'Code formatter (use if not using Biome)',\n checked: false,\n },\n];\n\n/**\n * Prompt for code style configuration\n */\nexport async function promptCodeStyleConfig(options?: {\n defaults?: Partial<CodeStyleConfig>;\n}): Promise<CodeStyleConfig> {\n logger.section('Code Style', '🎨');\n logger.info('Configure code formatting and linting tools');\n logger.newline();\n\n // First, ask if user wants to install code style tools\n const enableCodeStyle = await confirm({\n message: 'Would you like to install code style configuration files?',\n default: true,\n });\n\n if (!enableCodeStyle) {\n return {\n enabled: false,\n editorconfig: false,\n commitlint: false,\n biome: false,\n prettier: false,\n };\n }\n\n // Select which tools to install\n const selectedTools = await checkbox<CodeStyleTool>({\n message: 'Select the tools to configure:',\n choices: CODE_STYLE_TOOLS.map((tool) => ({\n name: `${tool.name} - ${tool.description}`,\n value: tool.value,\n checked: options?.defaults?.[tool.value] ?? tool.checked,\n })),\n });\n\n // Warn if both Biome and Prettier are selected\n if (selectedTools.includes('biome') && selectedTools.includes('prettier')) {\n logger.warn('Note: Both Biome and Prettier selected. Biome can replace Prettier.');\n\n const keepBoth = await confirm({\n message: 'Keep both? (Prettier may conflict with Biome)',\n default: false,\n });\n\n if (!keepBoth) {\n const preferred = await select<'biome' | 'prettier'>({\n message: 'Which formatter would you prefer?',\n choices: [\n { name: 'Biome (faster, all-in-one)', value: 'biome' },\n { name: 'Prettier (more plugins)', value: 'prettier' },\n ],\n });\n\n // Remove the non-preferred one\n const indexToRemove =\n preferred === 'biome' ? selectedTools.indexOf('prettier') : selectedTools.indexOf('biome');\n if (indexToRemove > -1) {\n selectedTools.splice(indexToRemove, 1);\n }\n }\n }\n\n // If no tools selected, return early\n if (selectedTools.length === 0) {\n return {\n enabled: false,\n editorconfig: false,\n commitlint: false,\n biome: false,\n prettier: false,\n };\n }\n\n // Ask if user wants to customize settings or use defaults\n const customizeSettings = await confirm({\n message: 'Would you like to customize code style settings? (No = use standard defaults)',\n default: false,\n });\n\n let editorconfigOptions: EditorConfigOptions | undefined;\n let biomeOptions: BiomeOptions | undefined;\n let prettierOptions: PrettierOptions | undefined;\n let commitlintOptions: CommitlintOptions | undefined;\n\n if (customizeSettings) {\n // First, offer preset selection if editorconfig, biome, or prettier is selected\n const hasFormatter =\n selectedTools.includes('editorconfig') ||\n selectedTools.includes('biome') ||\n selectedTools.includes('prettier');\n\n if (hasFormatter) {\n const preset = await promptStylePreset();\n\n if (preset !== 'custom') {\n const presetConfig = CODE_STYLE_PRESETS[preset];\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = presetConfig.editorconfig;\n }\n if (selectedTools.includes('biome') && presetConfig.biome) {\n biomeOptions = {\n ...DEFAULT_BIOME_OPTIONS,\n formatter: presetConfig.biome,\n };\n }\n if (selectedTools.includes('prettier') && presetConfig.prettier) {\n prettierOptions = presetConfig.prettier;\n }\n } else {\n // Custom configuration - prompt for each tool\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = await promptEditorConfigOptions();\n }\n if (selectedTools.includes('biome')) {\n biomeOptions = await promptBiomeOptions();\n }\n if (selectedTools.includes('prettier')) {\n prettierOptions = await promptPrettierOptions();\n }\n }\n }\n\n // Commitlint configuration (always separate)\n if (selectedTools.includes('commitlint')) {\n commitlintOptions = await promptCommitlintOptions();\n }\n } else {\n // Use defaults\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = DEFAULT_EDITORCONFIG_OPTIONS;\n }\n if (selectedTools.includes('biome')) {\n biomeOptions = DEFAULT_BIOME_OPTIONS;\n }\n if (selectedTools.includes('prettier')) {\n prettierOptions = DEFAULT_PRETTIER_OPTIONS;\n }\n if (selectedTools.includes('commitlint')) {\n commitlintOptions = DEFAULT_COMMITLINT_OPTIONS;\n }\n }\n\n return {\n enabled: selectedTools.length > 0,\n editorconfig: selectedTools.includes('editorconfig'),\n editorconfigOptions,\n commitlint: selectedTools.includes('commitlint'),\n commitlintOptions,\n biome: selectedTools.includes('biome'),\n biomeOptions,\n prettier: selectedTools.includes('prettier'),\n prettierOptions,\n };\n}\n\n/**\n * Prompt for style preset selection\n */\nasync function promptStylePreset(): Promise<CodeStylePreset> {\n logger.newline();\n logger.info('Choose a code style preset:');\n\n return select<CodeStylePreset>({\n message: 'Style preset:',\n choices: Object.entries(CODE_STYLE_PRESETS).map(([key, preset]) => ({\n name: `${preset.name} - ${preset.description}`,\n value: key as CodeStylePreset,\n })),\n default: 'standard',\n });\n}\n\n/**\n * Prompt for EditorConfig options\n */\nasync function promptEditorConfigOptions(): Promise<EditorConfigOptions> {\n logger.newline();\n logger.subtitle('EditorConfig Options');\n\n const indentStyle = await select<IndentStyle>({\n message: 'Indent style:',\n choices: [\n { name: 'Spaces', value: 'space' },\n { name: 'Tabs', value: 'tab' },\n ],\n default: DEFAULT_EDITORCONFIG_OPTIONS.indentStyle,\n });\n\n const indentSizeStr = await input({\n message: 'Indent size:',\n default: String(DEFAULT_EDITORCONFIG_OPTIONS.indentSize),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const indentSize = Number(indentSizeStr);\n\n const endOfLine = await select<'lf' | 'crlf' | 'cr'>({\n message: 'Line endings:',\n choices: [\n { name: 'LF (Unix/Mac)', value: 'lf' },\n { name: 'CRLF (Windows)', value: 'crlf' },\n { name: 'CR (Old Mac)', value: 'cr' },\n ],\n default: DEFAULT_EDITORCONFIG_OPTIONS.endOfLine,\n });\n\n const maxLineLengthStr = await input({\n message: 'Max line length (or \"off\"):',\n default: String(DEFAULT_EDITORCONFIG_OPTIONS.maxLineLength),\n validate: (v) => {\n if (v.toLowerCase() === 'off') return true;\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200)\n return 'Enter a number between 40 and 200, or \"off\"';\n return true;\n },\n });\n const maxLineLength = maxLineLengthStr.toLowerCase() === 'off' ? 'off' : Number(maxLineLengthStr);\n\n return {\n indentStyle,\n indentSize,\n endOfLine,\n insertFinalNewline: true,\n trimTrailingWhitespace: true,\n charset: 'utf-8',\n maxLineLength,\n };\n}\n\n/**\n * Prompt for Biome options\n */\nasync function promptBiomeOptions(): Promise<BiomeOptions> {\n logger.newline();\n logger.subtitle('Biome Options');\n\n // Formatter options\n const indentStyle = await select<IndentStyle>({\n message: 'Indent style:',\n choices: [\n { name: 'Spaces', value: 'space' },\n { name: 'Tabs', value: 'tab' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.indentStyle,\n });\n\n const indentWidthStr = await input({\n message: 'Indent width:',\n default: String(DEFAULT_BIOME_OPTIONS.formatter.indentWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const indentWidth = Number(indentWidthStr);\n\n const lineWidthStr = await input({\n message: 'Line width:',\n default: String(DEFAULT_BIOME_OPTIONS.formatter.lineWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200) return 'Enter a number between 40 and 200';\n return true;\n },\n });\n const lineWidth = Number(lineWidthStr);\n\n const quoteStyle = await select<QuoteStyle>({\n message: 'Quote style:',\n choices: [\n { name: 'Single quotes', value: 'single' },\n { name: 'Double quotes', value: 'double' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.quoteStyle,\n });\n\n const semicolons = await select<'always' | 'asNeeded'>({\n message: 'Semicolons:',\n choices: [\n { name: 'Always', value: 'always' },\n { name: 'As needed (ASI)', value: 'asNeeded' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.semicolons,\n });\n\n const trailingCommas = await select<'all' | 'es5' | 'none'>({\n message: 'Trailing commas:',\n choices: [\n { name: 'All', value: 'all' },\n { name: 'ES5 (only where valid in ES5)', value: 'es5' },\n { name: 'None', value: 'none' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.trailingCommas,\n });\n\n // Linter options (simplified)\n const enableRecommended = await confirm({\n message: 'Enable recommended linter rules?',\n default: true,\n });\n\n return {\n formatter: {\n indentStyle,\n indentWidth,\n lineWidth,\n quoteStyle,\n semicolons,\n trailingCommas,\n quoteProperties: 'asNeeded',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParentheses: 'always',\n },\n linter: {\n recommended: enableRecommended,\n correctness: enableRecommended,\n suspicious: enableRecommended,\n style: enableRecommended,\n complexity: enableRecommended,\n security: enableRecommended,\n performance: enableRecommended,\n a11y: enableRecommended,\n },\n organizeImports: true,\n ignorePatterns: DEFAULT_BIOME_OPTIONS.ignorePatterns,\n };\n}\n\n/**\n * Prompt for Prettier options\n */\nasync function promptPrettierOptions(): Promise<PrettierOptions> {\n logger.newline();\n logger.subtitle('Prettier Options');\n\n const printWidthStr = await input({\n message: 'Print width:',\n default: String(DEFAULT_PRETTIER_OPTIONS.printWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200) return 'Enter a number between 40 and 200';\n return true;\n },\n });\n const printWidth = Number(printWidthStr);\n\n const tabWidthStr = await input({\n message: 'Tab width:',\n default: String(DEFAULT_PRETTIER_OPTIONS.tabWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const tabWidth = Number(tabWidthStr);\n\n const useTabs = await confirm({\n message: 'Use tabs instead of spaces?',\n default: DEFAULT_PRETTIER_OPTIONS.useTabs,\n });\n\n const semi = await confirm({\n message: 'Use semicolons?',\n default: DEFAULT_PRETTIER_OPTIONS.semi,\n });\n\n const singleQuote = await confirm({\n message: 'Use single quotes?',\n default: DEFAULT_PRETTIER_OPTIONS.singleQuote,\n });\n\n const trailingComma = await select<'all' | 'es5' | 'none'>({\n message: 'Trailing commas:',\n choices: [\n { name: 'All', value: 'all' },\n { name: 'ES5', value: 'es5' },\n { name: 'None', value: 'none' },\n ],\n default: DEFAULT_PRETTIER_OPTIONS.trailingComma,\n });\n\n const bracketSpacing = await confirm({\n message: 'Bracket spacing? ({ foo: bar })',\n default: DEFAULT_PRETTIER_OPTIONS.bracketSpacing,\n });\n\n const arrowParens = await select<'always' | 'avoid'>({\n message: 'Arrow function parentheses:',\n choices: [\n { name: 'Always (x) => x', value: 'always' },\n { name: 'Avoid x => x', value: 'avoid' },\n ],\n default: DEFAULT_PRETTIER_OPTIONS.arrowParens,\n });\n\n return {\n printWidth,\n tabWidth,\n useTabs,\n semi,\n singleQuote,\n jsxSingleQuote: false,\n trailingComma,\n bracketSpacing,\n bracketSameLine: false,\n arrowParens,\n endOfLine: 'lf',\n proseWrap: 'preserve',\n htmlWhitespaceSensitivity: 'css',\n singleAttributePerLine: false,\n };\n}\n\n/**\n * Prompt for Commitlint options\n */\nasync function promptCommitlintOptions(): Promise<CommitlintOptions> {\n logger.newline();\n logger.subtitle('Commitlint Options');\n\n const useDefaults = await confirm({\n message: 'Use conventional commits defaults?',\n default: true,\n });\n\n if (useDefaults) {\n const huskyIntegration = await confirm({\n message: 'Enable Husky integration (git hooks)?',\n default: true,\n });\n\n return {\n ...DEFAULT_COMMITLINT_OPTIONS,\n huskyIntegration,\n };\n }\n\n // Custom commit types\n const typesInput = await input({\n message: 'Commit types (comma-separated):',\n default: DEFAULT_COMMITLINT_OPTIONS.types.join(', '),\n });\n const types = typesInput\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n\n // Custom scopes\n const scopesInput = await input({\n message: 'Allowed scopes (comma-separated, empty for any):',\n default: '',\n });\n const scopes = scopesInput\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const headerMaxLengthStr = await input({\n message: 'Maximum header length:',\n default: String(DEFAULT_COMMITLINT_OPTIONS.headerMaxLength),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 20 || num > 200) return 'Enter a number between 20 and 200';\n return true;\n },\n });\n const headerMaxLength = Number(headerMaxLengthStr);\n\n const scopeRequired = await confirm({\n message: 'Require scope in commit messages?',\n default: false,\n });\n\n const huskyIntegration = await confirm({\n message: 'Enable Husky integration (git hooks)?',\n default: true,\n });\n\n return {\n extends: ['@commitlint/config-conventional'],\n types,\n scopes,\n headerMaxLength,\n scopeRequired,\n bodyRequired: false,\n bodyMaxLineLength: 100,\n huskyIntegration,\n };\n}\n\n/**\n * Show code style configuration summary\n */\nexport function showCodeStyleSummary(config: CodeStyleConfig): void {\n if (!config.enabled) {\n logger.item('Code style: Not configured');\n return;\n }\n\n const tools: string[] = [];\n if (config.editorconfig) tools.push('EditorConfig');\n if (config.commitlint) tools.push('Commitlint');\n if (config.biome) tools.push('Biome');\n if (config.prettier) tools.push('Prettier');\n\n logger.item(`Code style: ${tools.join(', ')}`);\n\n // Show key settings\n if (config.editorconfigOptions) {\n const ec = config.editorconfigOptions;\n logger.info(\n colors.muted(\n ` EditorConfig: ${ec.indentStyle === 'space' ? `${ec.indentSize} spaces` : 'tabs'}, ${ec.endOfLine.toUpperCase()}`\n )\n );\n }\n\n if (config.biomeOptions) {\n const bf = config.biomeOptions.formatter;\n logger.info(\n colors.muted(\n ` Biome: ${bf.indentStyle === 'space' ? `${bf.indentWidth} spaces` : 'tabs'}, ${bf.quoteStyle} quotes, ${bf.semicolons === 'always' ? 'semicolons' : 'no semicolons'}`\n )\n );\n }\n\n if (config.prettierOptions) {\n const pr = config.prettierOptions;\n logger.info(\n colors.muted(\n ` Prettier: ${pr.useTabs ? 'tabs' : `${pr.tabWidth} spaces`}, ${pr.singleQuote ? 'single' : 'double'} quotes, ${pr.semi ? 'semicolons' : 'no semicolons'}`\n )\n );\n }\n\n if (config.commitlintOptions) {\n const cl = config.commitlintOptions;\n logger.info(\n colors.muted(\n ` Commitlint: ${cl.types.length} types, ${cl.huskyIntegration ? 'Husky enabled' : 'no Husky'}`\n )\n );\n }\n}\n\n/**\n * Confirm code style configuration\n */\nexport async function confirmCodeStyleConfig(config: CodeStyleConfig): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n showCodeStyleSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Install these code style configurations?',\n default: true,\n });\n}\n","/**\n * Template configuration prompts\n *\n * Interactive prompts for configuring template placeholders\n * with auto-detection and smart defaults.\n */\n\nimport {\n TEMPLATE_PLACEHOLDERS,\n computeDefaultValue,\n getPlaceholdersByCategory,\n} from '../../constants/template-placeholders.js';\nimport {\n getGlobalTemplateConfig,\n hasGlobalDefaults,\n mergeWithGlobalDefaults,\n updateGlobalDefaults,\n} from '../../lib/config/global-defaults.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n TemplateConfig,\n TemplateConfigContext,\n TemplateConfigSetupMode,\n TemplatePlaceholderCategory,\n TemplatePlaceholderDefinition,\n} from '../../types/template-config.js';\n\n/**\n * Category display names and order\n */\nconst CATEGORY_INFO: Record<TemplatePlaceholderCategory, { name: string; order: number }> = {\n commands: { name: 'CLI Commands', order: 1 },\n paths: { name: 'Directory Paths', order: 2 },\n targets: { name: 'Quality Targets', order: 3 },\n tracking: { name: 'Issue Tracking', order: 4 },\n techStack: { name: 'Technology Stack', order: 5 },\n performance: { name: 'Performance Targets', order: 6 },\n environment: { name: 'Environment Variables', order: 7 },\n brand: { name: 'Brand Identity', order: 8 },\n};\n\n/**\n * Options for template config prompts\n */\nexport interface TemplateConfigPromptOptions {\n /** Context for computing defaults */\n context: TemplateConfigContext;\n /** Setup mode */\n mode?: TemplateConfigSetupMode;\n /** Specific category to configure */\n category?: TemplatePlaceholderCategory;\n /** Only configure required placeholders */\n requiredOnly?: boolean;\n /** Skip confirmation */\n skipConfirm?: boolean;\n}\n\n/**\n * Prompt for setup mode selection\n */\nexport async function promptSetupMode(): Promise<TemplateConfigSetupMode> {\n const mode = await select<TemplateConfigSetupMode>({\n message: 'Configuration mode:',\n choices: [\n {\n name: 'Quick Setup (recommended)',\n value: 'quick',\n description: 'Auto-detect values, confirm all at once',\n },\n {\n name: 'Guided Setup',\n value: 'guided',\n description: 'Step through each category',\n },\n {\n name: 'Advanced Setup',\n value: 'advanced',\n description: 'Configure all options individually',\n },\n ],\n default: 'quick',\n });\n\n return mode;\n}\n\n/**\n * Build context for computing defaults\n */\nexport async function buildConfigContext(projectPath: string): Promise<TemplateConfigContext> {\n const context: TemplateConfigContext = {\n projectPath,\n values: {},\n };\n\n try {\n // Read package.json for scripts and dependencies\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const pkgPath = path.join(projectPath, 'package.json');\n\n const pkgContent = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent) as {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n context.scripts = pkg.scripts || {};\n context.dependencies = {\n ...(pkg.dependencies || {}),\n ...(pkg.devDependencies || {}),\n };\n\n // Detect TypeScript\n context.hasTypeScript =\n Boolean(context.dependencies.typescript) ||\n (await fileExists(path.join(projectPath, 'tsconfig.json')));\n\n // Detect package manager\n if (await fileExists(path.join(projectPath, 'pnpm-lock.yaml'))) {\n context.packageManager = 'pnpm';\n } else if (await fileExists(path.join(projectPath, 'yarn.lock'))) {\n context.packageManager = 'yarn';\n } else if (await fileExists(path.join(projectPath, 'bun.lockb'))) {\n context.packageManager = 'bun';\n } else {\n context.packageManager = 'npm';\n }\n\n // Detect git\n context.isGitRepo = await fileExists(path.join(projectPath, '.git'));\n\n // Detect GitHub remote\n if (context.isGitRepo) {\n try {\n const { execSync } = await import('node:child_process');\n const remotes = execSync('git remote -v', {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n context.hasGitHubRemote = remotes.includes('github.com');\n } catch {\n context.hasGitHubRemote = false;\n }\n }\n } catch {\n // Default context if package.json doesn't exist\n }\n\n return context;\n}\n\n/**\n * Check if a file exists\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n const fs = await import('node:fs/promises');\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Prompt for a single placeholder value\n */\nasync function promptPlaceholder(\n placeholder: TemplatePlaceholderDefinition,\n context: TemplateConfigContext,\n detectedValue?: string\n): Promise<string> {\n const defaultValue = detectedValue || computeDefaultValue(placeholder, context) || '';\n\n switch (placeholder.inputType) {\n case 'select': {\n if (!placeholder.choices || placeholder.choices.length === 0) {\n // Fall back to text input\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n });\n }\n\n const choices = placeholder.choices.map((c) => ({\n name: c.name,\n value: c.value,\n description: c.description,\n }));\n\n return select({\n message: `${placeholder.label}:`,\n choices,\n default: defaultValue || choices[0].value,\n });\n }\n\n case 'number': {\n const result = await input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n return 'Please enter a valid number';\n }\n return true;\n },\n });\n return result;\n }\n\n case 'path': {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return 'This path is required';\n }\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n return true;\n },\n });\n }\n\n case 'envVar': {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return 'This environment variable is required';\n }\n if (value && !/^[A-Z][A-Z0-9_]*$/.test(value)) {\n return 'Environment variable should be UPPER_SNAKE_CASE';\n }\n return true;\n },\n });\n }\n\n default: {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return `${placeholder.label} is required`;\n }\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n return true;\n },\n });\n }\n }\n}\n\n/**\n * Compute all default values for quick setup\n */\nfunction computeAllDefaults(\n context: TemplateConfigContext,\n globalDefaults?: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n for (const placeholder of TEMPLATE_PLACEHOLDERS) {\n const defaultValue = computeDefaultValue(placeholder, context);\n if (defaultValue) {\n setConfigValue(config, placeholder, defaultValue);\n }\n }\n\n // Merge with global defaults (global takes lower priority)\n if (globalDefaults) {\n return mergeWithGlobalDefaults(config, globalDefaults);\n }\n\n return config;\n}\n\n/**\n * Set a value in the config based on placeholder definition\n */\nfunction setConfigValue(\n config: Partial<TemplateConfig>,\n placeholder: TemplatePlaceholderDefinition,\n value: string\n): void {\n const key = placeholderKeyToConfigKey(placeholder.key, placeholder.category);\n\n switch (placeholder.category) {\n case 'commands':\n if (!config.commands) config.commands = {};\n (config.commands as Record<string, string>)[key] = value;\n break;\n case 'paths':\n if (!config.paths) config.paths = {};\n (config.paths as Record<string, string>)[key] = value;\n break;\n case 'targets':\n case 'performance': {\n if (!config.targets) config.targets = {};\n const numValue = Number(value);\n if (!Number.isNaN(numValue)) {\n (config.targets as Record<string, number | string>)[key] = numValue;\n } else {\n (config.targets as Record<string, number | string>)[key] = value;\n }\n break;\n }\n case 'tracking':\n if (!config.tracking) config.tracking = {};\n (config.tracking as Record<string, string | number>)[key] = key.endsWith('Days')\n ? Number(value)\n : value;\n break;\n case 'techStack':\n if (!config.techStack) config.techStack = {};\n (config.techStack as Record<string, string>)[key] = value;\n break;\n case 'environment':\n if (!config.environment) config.environment = {};\n (config.environment as Record<string, string>)[key] = value;\n break;\n case 'brand':\n if (!config.brand) config.brand = {};\n (config.brand as Record<string, string>)[key] = value;\n break;\n }\n}\n\n/**\n * Convert PLACEHOLDER_KEY to configKey\n */\nfunction placeholderKeyToConfigKey(key: string, category: string): string {\n let cleanKey = key;\n\n // Remove common suffixes\n if (category === 'commands' && key.endsWith('_COMMAND')) {\n cleanKey = key.slice(0, -8);\n } else if (category === 'environment' && key.endsWith('_ENV')) {\n cleanKey = key.slice(0, -4);\n } else if (key.endsWith('_TARGET')) {\n cleanKey = key.slice(0, -7);\n }\n\n // Convert SNAKE_CASE to camelCase\n return cleanKey.toLowerCase().replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Main template configuration prompt\n */\nexport async function promptTemplateConfig(\n options: TemplateConfigPromptOptions\n): Promise<Partial<TemplateConfig>> {\n const { context, mode = 'quick', category, requiredOnly = false } = options;\n\n logger.section('Template Configuration', '📝');\n\n // Explain why this is important\n logger.newline();\n logger.info('This step personalizes all Claude Code configuration files for YOUR project.');\n logger.info('Your answers will be used to:');\n logger.newline();\n logger.item('Replace {{PLACEHOLDERS}} in agents, commands, and skills');\n logger.item('Configure CLAUDE.md with your tech stack and commands');\n logger.item('Set up quality targets (coverage, performance, accessibility)');\n logger.item('Customize code examples to match your project structure');\n logger.newline();\n logger.info('Accurate configuration means better AI assistance tailored to your codebase!');\n logger.newline();\n\n // Get global defaults if available\n const hasDefaults = await hasGlobalDefaults();\n const globalDefaults = hasDefaults ? await getGlobalTemplateConfig() : undefined;\n\n if (mode === 'quick') {\n return promptQuickSetup(context, globalDefaults);\n }\n\n if (category) {\n return promptCategory(category, context, requiredOnly);\n }\n\n if (mode === 'guided') {\n return promptGuidedSetup(context, requiredOnly);\n }\n\n return promptAdvancedSetup(context);\n}\n\n/**\n * Quick setup: auto-detect and confirm\n */\nasync function promptQuickSetup(\n context: TemplateConfigContext,\n globalDefaults?: Partial<TemplateConfig>\n): Promise<Partial<TemplateConfig>> {\n logger.info('Auto-detecting configuration from project...');\n logger.newline();\n\n const detected = computeAllDefaults(context, globalDefaults);\n\n // Display detected values by category\n displayDetectedConfig(detected, context);\n\n // Allow editing\n const wantEdit = await confirm({\n message: 'Would you like to modify any values?',\n default: false,\n });\n\n let finalConfig = detected;\n\n if (wantEdit) {\n finalConfig = await promptEditConfig(detected, context);\n }\n\n return finalConfig;\n}\n\n/**\n * Display detected configuration\n */\nfunction displayDetectedConfig(\n config: Partial<TemplateConfig>,\n _context: TemplateConfigContext\n): void {\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n for (const category of categories) {\n const placeholders = getPlaceholdersByCategory(category);\n if (placeholders.length === 0) continue;\n\n const values = getCategoryValues(config, category);\n if (Object.keys(values).length === 0) continue;\n\n logger.subtitle(CATEGORY_INFO[category].name);\n\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n const placeholder = TEMPLATE_PLACEHOLDERS.find(\n (p) => placeholderKeyToConfigKey(p.key, p.category) === key\n );\n const label = placeholder?.label || key;\n logger.keyValue(label, String(value));\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Get values for a specific category\n */\nfunction getCategoryValues(\n config: Partial<TemplateConfig>,\n category: TemplatePlaceholderCategory\n): Record<string, unknown> {\n switch (category) {\n case 'commands':\n return (config.commands as Record<string, unknown>) || {};\n case 'paths':\n return (config.paths as Record<string, unknown>) || {};\n case 'targets':\n case 'performance':\n return (config.targets as Record<string, unknown>) || {};\n case 'tracking':\n return (config.tracking as Record<string, unknown>) || {};\n case 'techStack':\n return (config.techStack as Record<string, unknown>) || {};\n case 'environment':\n return (config.environment as Record<string, unknown>) || {};\n case 'brand':\n return (config.brand as Record<string, unknown>) || {};\n default:\n return {};\n }\n}\n\n/**\n * Prompt to edit specific values\n */\nasync function promptEditConfig(\n config: Partial<TemplateConfig>,\n context: TemplateConfigContext\n): Promise<Partial<TemplateConfig>> {\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n const categoryToEdit = await select<TemplatePlaceholderCategory | 'done'>({\n message: 'Which category would you like to edit?',\n choices: [\n ...categories.map((cat) => ({\n name: CATEGORY_INFO[cat].name,\n value: cat,\n })),\n { name: 'Done editing', value: 'done' as const },\n ],\n });\n\n if (categoryToEdit === 'done') {\n return config;\n }\n\n const editedCategory = await promptCategory(categoryToEdit, context, false);\n\n // Merge edited values\n const merged = { ...config };\n switch (categoryToEdit) {\n case 'commands':\n merged.commands = { ...config.commands, ...editedCategory.commands };\n break;\n case 'paths':\n merged.paths = { ...config.paths, ...editedCategory.paths };\n break;\n case 'targets':\n case 'performance':\n merged.targets = { ...config.targets, ...editedCategory.targets };\n break;\n case 'tracking':\n merged.tracking = { ...config.tracking, ...editedCategory.tracking };\n break;\n case 'techStack':\n merged.techStack = { ...config.techStack, ...editedCategory.techStack };\n break;\n case 'environment':\n merged.environment = { ...config.environment, ...editedCategory.environment };\n break;\n case 'brand':\n merged.brand = { ...config.brand, ...editedCategory.brand };\n break;\n }\n\n // Ask if they want to edit more\n const editMore = await confirm({\n message: 'Edit another category?',\n default: false,\n });\n\n if (editMore) {\n return promptEditConfig(merged, context);\n }\n\n return merged;\n}\n\n/**\n * Prompt for a specific category\n */\nasync function promptCategory(\n category: TemplatePlaceholderCategory,\n context: TemplateConfigContext,\n requiredOnly: boolean\n): Promise<Partial<TemplateConfig>> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n logger.subtitle(CATEGORY_INFO[category].name);\n\n let placeholders = getPlaceholdersByCategory(category);\n\n if (requiredOnly) {\n placeholders = placeholders.filter((p) => p.required);\n }\n\n // Update context with already configured values\n const updatedContext = { ...context };\n\n for (const placeholder of placeholders) {\n const value = await promptPlaceholder(placeholder, updatedContext);\n if (value) {\n setConfigValue(config, placeholder, value);\n // Update context for dependent placeholders\n updatedContext.values[placeholder.key] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Guided setup: step through each category\n */\nasync function promptGuidedSetup(\n context: TemplateConfigContext,\n requiredOnly: boolean\n): Promise<Partial<TemplateConfig>> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n const updatedContext = { ...context };\n\n for (const category of categories) {\n const placeholders = getPlaceholdersByCategory(category);\n const relevantPlaceholders = requiredOnly\n ? placeholders.filter((p) => p.required)\n : placeholders;\n\n if (relevantPlaceholders.length === 0) continue;\n\n const configureCategory = await confirm({\n message: `Configure ${CATEGORY_INFO[category].name}? (${relevantPlaceholders.length} options)`,\n default: true,\n });\n\n if (!configureCategory) continue;\n\n const categoryConfig = await promptCategory(category, updatedContext, requiredOnly);\n\n // Merge into main config\n switch (category) {\n case 'commands':\n config.commands = { ...config.commands, ...categoryConfig.commands };\n break;\n case 'paths':\n config.paths = { ...config.paths, ...categoryConfig.paths };\n break;\n case 'targets':\n case 'performance':\n config.targets = { ...config.targets, ...categoryConfig.targets };\n break;\n case 'tracking':\n config.tracking = { ...config.tracking, ...categoryConfig.tracking };\n break;\n case 'techStack':\n config.techStack = { ...config.techStack, ...categoryConfig.techStack };\n break;\n case 'environment':\n config.environment = { ...config.environment, ...categoryConfig.environment };\n break;\n case 'brand':\n config.brand = { ...config.brand, ...categoryConfig.brand };\n break;\n }\n\n // Update context\n for (const [key, value] of Object.entries(getCategoryValues(categoryConfig, category))) {\n if (value !== undefined) {\n updatedContext.values[key.toUpperCase()] = String(value);\n }\n }\n }\n\n return config;\n}\n\n/**\n * Advanced setup: configure all options\n */\nasync function promptAdvancedSetup(\n context: TemplateConfigContext\n): Promise<Partial<TemplateConfig>> {\n return promptGuidedSetup(context, false);\n}\n\n/**\n * Confirm template configuration\n */\nexport async function confirmTemplateConfig(\n config: Partial<TemplateConfig>,\n context: TemplateConfigContext\n): Promise<boolean> {\n logger.newline();\n logger.subtitle('Configuration Summary');\n displayDetectedConfig(config, context);\n\n return confirm({\n message: 'Apply this configuration?',\n default: true,\n });\n}\n\n/**\n * Prompt to save as global defaults\n */\nexport async function promptSaveGlobalDefaults(config: Partial<TemplateConfig>): Promise<boolean> {\n const save = await confirm({\n message: 'Save these values as global defaults for future projects?',\n default: false,\n });\n\n if (save) {\n await updateGlobalDefaults(config);\n logger.success('Global defaults saved to ~/.claude/defaults.json');\n }\n\n return save;\n}\n","/**\n * List command - list available and installed modules\n */\n\nimport { Command } from 'commander';\nimport {\n BUNDLE_CATEGORY_NAMES,\n getAllBundles,\n getBundlesGroupedByCategory,\n} from '../../constants/bundles.js';\nimport { MCP_SERVERS } from '../../constants/mcp-servers.js';\nimport { formatBundleForDisplay, resolveBundle } from '../../lib/bundles/resolver.js';\nimport { readConfig } from '../../lib/config/index.js';\nimport { loadRegistry } from '../../lib/modules/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface ListOptions {\n installed?: boolean;\n available?: boolean;\n bundles?: boolean;\n mcp?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create list command\n */\nexport function createListCommand(): Command {\n const cmd = new Command('list')\n .description('List available modules, bundles, or MCP servers')\n .argument('[type]', 'Type to list (agents|skills|commands|docs|bundles|mcp)')\n .option('-i, --installed', 'Show only installed modules')\n .option('-a, --available', 'Show all available modules')\n .option('--bundles', 'List all bundles')\n .option('--mcp', 'List MCP servers')\n .option('-v, --verbose', 'Show detailed information')\n .action(runList);\n\n return cmd;\n}\n\n/**\n * Run list command\n */\nasync function runList(type: string | undefined, options: ListOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // List bundles\n if (options.bundles || type === 'bundles') {\n listBundles(options.verbose);\n return;\n }\n\n // List MCP servers\n if (options.mcp || type === 'mcp') {\n listMcpServers(options.verbose);\n return;\n }\n\n // Get templates path (bundled with package)\n const templatesPath = getTemplatesPath();\n\n // Load registry\n const registry = await loadRegistry(templatesPath);\n\n // Read current config\n const config = await readConfig(projectPath);\n\n // Determine what to list\n const categories: ModuleCategory[] = type\n ? [type as ModuleCategory]\n : ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n if (!registry[category]) continue;\n\n logger.newline();\n logger.title(capitalize(category));\n\n const allModules = registry[category];\n const installedIds = config?.modules[category].selected || [];\n const installedSet = new Set(installedIds);\n\n if (options.installed) {\n // Show only installed\n const installed = allModules.filter((m) => installedSet.has(m.id));\n if (installed.length === 0) {\n logger.info(`No ${category} installed`);\n } else {\n for (const mod of installed) {\n showModule(mod, true, options.verbose);\n }\n }\n } else {\n // Show all with installation status\n for (const mod of allModules) {\n const isInstalled = installedSet.has(mod.id);\n showModule(mod, isInstalled, options.verbose);\n }\n }\n\n logger.newline();\n logger.info(`Total: ${allModules.length} | Installed: ${installedIds.length}`);\n }\n } catch (error) {\n logger.error(`Failed to list modules: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show module info\n */\nfunction showModule(\n mod: { id: string; name: string; description?: string; tags?: string[] },\n isInstalled: boolean,\n verbose?: boolean\n): void {\n const status = isInstalled ? colors.success('✔') : colors.muted('○');\n const name = isInstalled ? colors.primary(mod.name) : mod.name;\n\n console.log(` ${status} ${name} ${colors.muted(`(${mod.id})`)}`);\n\n if (verbose && mod.description) {\n logger.note(` ${mod.description}`);\n }\n\n if (verbose && mod.tags && mod.tags.length > 0) {\n logger.note(` Tags: ${mod.tags.join(', ')}`);\n }\n}\n\n/**\n * List bundles\n */\nfunction listBundles(verbose?: boolean): void {\n logger.title('Available Bundles');\n logger.newline();\n\n const grouped = getBundlesGroupedByCategory();\n\n for (const [category, bundles] of Object.entries(grouped)) {\n const categoryName = BUNDLE_CATEGORY_NAMES[category] || category;\n logger.subtitle(categoryName);\n\n for (const bundle of bundles) {\n console.log(\n ` ${colors.primary(formatBundleForDisplay(bundle))} ${colors.muted(`(${bundle.id})`)}`\n );\n logger.note(` ${bundle.description}`);\n\n if (verbose) {\n const resolved = resolveBundle(bundle);\n\n if (bundle.longDescription) {\n logger.newline();\n logger.note(` ${bundle.longDescription}`);\n }\n\n logger.newline();\n logger.info(' Modules:');\n if (resolved.modules.agents.length > 0) {\n logger.note(` Agents: ${resolved.modules.agents.join(', ')}`);\n }\n if (resolved.modules.skills.length > 0) {\n logger.note(` Skills: ${resolved.modules.skills.join(', ')}`);\n }\n if (resolved.modules.commands.length > 0) {\n logger.note(` Commands: ${resolved.modules.commands.join(', ')}`);\n }\n if (resolved.modules.docs.length > 0) {\n logger.note(` Docs: ${resolved.modules.docs.join(', ')}`);\n }\n\n if (bundle.techStack && bundle.techStack.length > 0) {\n logger.newline();\n logger.note(` Tech stack: ${bundle.techStack.join(', ')}`);\n }\n\n if (bundle.alternativeTo && bundle.alternativeTo.length > 0) {\n logger.note(` Alternative to: ${bundle.alternativeTo.join(', ')}`);\n }\n }\n logger.newline();\n }\n }\n\n const allBundles = getAllBundles();\n logger.info(`Total bundles: ${allBundles.length}`);\n}\n\n/**\n * List MCP servers\n */\nfunction listMcpServers(verbose?: boolean): void {\n logger.title('Available MCP Servers');\n logger.newline();\n\n // Group by category\n const byCategory: Record<string, typeof MCP_SERVERS> = {};\n for (const server of MCP_SERVERS) {\n if (!byCategory[server.category]) {\n byCategory[server.category] = [];\n }\n byCategory[server.category].push(server);\n }\n\n for (const [category, servers] of Object.entries(byCategory)) {\n logger.subtitle(formatCategory(category));\n\n for (const server of servers) {\n console.log(` ${colors.primary(server.name)} ${colors.muted(`(${server.id})`)}`);\n logger.note(` ${server.description}`);\n\n if (verbose) {\n logger.note(` Package: ${server.package}`);\n if (server.requiresConfig) {\n logger.note(' Requires config: Yes');\n if (server.configFields) {\n const required = server.configFields.filter((f) => f.required).map((f) => f.name);\n if (required.length > 0) {\n logger.note(` Required fields: ${required.join(', ')}`);\n }\n }\n }\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Format category name\n */\nfunction formatCategory(category: string): string {\n const labels: Record<string, string> = {\n documentation: 'Documentation',\n database: 'Database',\n 'version-control': 'Version Control',\n deployment: 'Deployment',\n infrastructure: 'Infrastructure',\n 'project-mgmt': 'Project Management',\n monitoring: 'Monitoring',\n };\n return labels[category] || category;\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Add command - add modules to configuration\n */\n\nimport { Command } from 'commander';\nimport { addModulesToConfig, readConfig, updateConfig } from '../../lib/config/index.js';\nimport { getModule, loadRegistry, resolveModules } from '../../lib/modules/index.js';\nimport { installModules } from '../../lib/modules/installer.js';\nimport { replacePlaceholders } from '../../lib/placeholders/index.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport { confirm } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface AddOptions {\n force?: boolean;\n noDeps?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create add command\n */\nexport function createAddCommand(): Command {\n const cmd = new Command('add')\n .description('Add a module to the configuration')\n .argument('<module>', 'Module to add (format: type:id, e.g., agents:tech-lead)')\n .option('-f, --force', 'Overwrite if already installed')\n .option('--no-deps', 'Skip dependency installation')\n .option('-v, --verbose', 'Detailed output')\n .action(runAdd);\n\n return cmd;\n}\n\n/**\n * Run add command\n */\nasync function runAdd(moduleSpec: string, options: AddOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Parse module spec\n const [category, moduleId] = parseModuleSpec(moduleSpec);\n\n if (!category || !moduleId) {\n logger.error('Invalid module format. Use: type:id (e.g., agents:tech-lead)');\n logger.info('Valid types: agents, skills, commands, docs');\n process.exit(1);\n }\n\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Load registry\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n\n // Find module\n const module = getModule(registry, category, moduleId);\n if (!module) {\n logger.error(`Module not found: ${moduleSpec}`);\n logger.info(`Run \"claude-config list ${category}\" to see available modules`);\n process.exit(1);\n }\n\n // Check if already installed\n const alreadyInstalled = config.modules[category].selected.includes(moduleId);\n if (alreadyInstalled && !options.force) {\n logger.warn(`Module ${colors.primary(module.name)} is already installed`);\n const overwrite = await confirm({\n message: 'Reinstall anyway?',\n default: false,\n });\n if (!overwrite) {\n return;\n }\n }\n\n // Resolve dependencies\n const modulesToInstall = [moduleId];\n if (!options.noDeps && module.dependencies && module.dependencies.length > 0) {\n const resolution = resolveModules(registry, category, [moduleId]);\n\n if (resolution.unresolved.length > 0) {\n logger.warn(`Some dependencies not found: ${resolution.unresolved.join(', ')}`);\n }\n\n // Add dependencies that aren't installed\n for (const dep of resolution.resolved) {\n if (dep.id !== moduleId && !config.modules[category].selected.includes(dep.id)) {\n modulesToInstall.push(dep.id);\n }\n }\n\n if (modulesToInstall.length > 1) {\n logger.info(`Will also install dependencies: ${modulesToInstall.slice(1).join(', ')}`);\n const proceed = await confirm({\n message: 'Continue?',\n default: true,\n });\n if (!proceed) {\n return;\n }\n }\n }\n\n // Install modules\n logger.newline();\n const moduleDefs = modulesToInstall\n .map((id) => getModule(registry, category, id))\n .filter(Boolean) as (typeof module)[];\n\n const result = await installModules(category, moduleDefs, {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n });\n\n // Update config\n const updatedConfig = addModulesToConfig(config, category, modulesToInstall);\n await updateConfig(projectPath, updatedConfig);\n\n // Replace placeholders in new files\n const claudePath = joinPath(projectPath, '.claude');\n await replacePlaceholders(claudePath, config.project, {\n silent: !options.verbose,\n });\n\n // Show results\n if (result.installed.length > 0) {\n logger.success(`Installed: ${result.installed.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n logger.info(`Skipped (already exists): ${result.skipped.join(', ')}`);\n }\n if (result.failed.length > 0) {\n logger.error(`Failed: ${result.failed.map((f) => `${f.id} (${f.error})`).join(', ')}`);\n }\n } catch (error) {\n logger.error(`Failed to add module: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Parse module specification\n */\nfunction parseModuleSpec(spec: string): [ModuleCategory | null, string | null] {\n const parts = spec.split(':');\n\n if (parts.length !== 2) {\n return [null, null];\n }\n\n const [type, id] = parts;\n const validTypes: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n if (!validTypes.includes(type as ModuleCategory)) {\n return [null, null];\n }\n\n return [type as ModuleCategory, id];\n}\n","/**\n * Remove command - remove modules from configuration\n */\n\nimport { Command } from 'commander';\nimport { readConfig, removeModulesFromConfig, updateConfig } from '../../lib/config/index.js';\nimport { checkRemovalImpact, getModule, loadRegistry } from '../../lib/modules/index.js';\nimport { uninstallModule } from '../../lib/modules/installer.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport { confirm } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface RemoveOptions {\n force?: boolean;\n keepFiles?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create remove command\n */\nexport function createRemoveCommand(): Command {\n const cmd = new Command('remove')\n .description('Remove a module from the configuration')\n .argument('<module>', 'Module to remove (format: type:id, e.g., agents:tech-lead)')\n .option('-f, --force', 'Remove without confirmation')\n .option('--keep-files', 'Keep module files, only remove from config')\n .option('-v, --verbose', 'Detailed output')\n .action(runRemove);\n\n return cmd;\n}\n\n/**\n * Run remove command\n */\nasync function runRemove(moduleSpec: string, options: RemoveOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Parse module spec\n const [category, moduleId] = parseModuleSpec(moduleSpec);\n\n if (!category || !moduleId) {\n logger.error('Invalid module format. Use: type:id (e.g., agents:tech-lead)');\n logger.info('Valid types: agents, skills, commands, docs');\n process.exit(1);\n }\n\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Check if installed\n const isInstalled = config.modules[category].selected.includes(moduleId);\n if (!isInstalled) {\n logger.warn(`Module ${moduleSpec} is not installed`);\n return;\n }\n\n // Load registry for module info\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n const module = getModule(registry, category, moduleId);\n\n // Check for dependents\n const impact = checkRemovalImpact(\n registry,\n category,\n moduleId,\n config.modules[category].selected\n );\n\n if (!impact.canRemove) {\n logger.warn(`Cannot remove ${moduleSpec}. The following modules depend on it:`);\n for (const dep of impact.blockedBy) {\n logger.item(dep);\n }\n\n if (!options.force) {\n const forceRemove = await confirm({\n message: 'Remove anyway? (dependent modules may break)',\n default: false,\n });\n if (!forceRemove) {\n return;\n }\n }\n }\n\n // Confirm removal\n if (!options.force) {\n const moduleName = module?.name || moduleId;\n const confirmed = await confirm({\n message: `Remove ${colors.primary(moduleName)}?`,\n default: false,\n });\n if (!confirmed) {\n return;\n }\n }\n\n // Remove file unless --keep-files\n if (!options.keepFiles) {\n const result = await uninstallModule(category, moduleId, projectPath);\n if (!result.success) {\n logger.warn(`Could not remove file: ${result.error}`);\n }\n }\n\n // Update config\n const updatedConfig = removeModulesFromConfig(config, category, [moduleId]);\n await updateConfig(projectPath, updatedConfig);\n\n logger.success(`Removed ${colors.primary(module?.name || moduleId)}`);\n\n if (options.keepFiles) {\n logger.info('Files were kept. Module removed from configuration only.');\n }\n } catch (error) {\n logger.error(`Failed to remove module: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Parse module specification\n */\nfunction parseModuleSpec(spec: string): [ModuleCategory | null, string | null] {\n const parts = spec.split(':');\n\n if (parts.length !== 2) {\n return [null, null];\n }\n\n const [type, id] = parts;\n const validTypes: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n if (!validTypes.includes(type as ModuleCategory)) {\n return [null, null];\n }\n\n return [type as ModuleCategory, id];\n}\n","/**\n * Status command - show current configuration status\n */\n\nimport { Command } from 'commander';\nimport { hasClaudeDir, readConfig } from '../../lib/config/index.js';\nimport { getHooksStatus } from '../../lib/hooks/index.js';\nimport { getInstalledMcpServers } from '../../lib/mcp/index.js';\nimport { getCurrentPermissions } from '../../lib/permissions/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\n\ninterface StatusOptions {\n json?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show current Claude configuration status')\n .option('--json', 'Output as JSON')\n .option('-v, --verbose', 'Show detailed information')\n .action(runStatus);\n\n return cmd;\n}\n\n/**\n * Run status command\n */\nasync function runStatus(options: StatusOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Check for .claude directory\n if (!(await hasClaudeDir(projectPath))) {\n logger.warn('No Claude configuration found in this directory');\n logger.info('Run \"claude-config init\" to initialize');\n process.exit(0);\n }\n\n // Read config\n const config = await readConfig(projectPath);\n\n if (!config) {\n logger.warn('.claude directory exists but config.json is missing');\n logger.info('Run \"claude-config init\" to initialize properly');\n process.exit(0);\n }\n\n // Get additional status info\n const hooksStatus = await getHooksStatus(projectPath);\n const mcpServers = await getInstalledMcpServers(projectPath);\n const permissions = await getCurrentPermissions(projectPath);\n\n if (options.json) {\n const status = {\n version: config.version,\n project: config.project,\n preferences: config.preferences,\n modules: {\n agents: config.modules.agents.selected,\n skills: config.modules.skills.selected,\n commands: config.modules.commands.selected,\n docs: config.modules.docs.selected,\n },\n extras: {\n schemas: config.extras.schemas,\n scripts: config.extras.scripts,\n hooks: hooksStatus,\n sessions: config.extras.sessions,\n },\n mcp: {\n level: config.mcp.level,\n project: mcpServers.project,\n user: mcpServers.user,\n },\n permissions: {\n project: permissions.project,\n user: permissions.user,\n },\n scaffold: config.scaffold,\n lastUpdated: config.customizations.lastUpdated,\n };\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n // Display status\n logger.title('Claude Configuration Status');\n\n // Project info\n logger.newline();\n logger.subtitle('Project');\n logger.keyValue('Name', config.project.name);\n logger.keyValue('Description', config.project.description);\n logger.keyValue('GitHub', `${config.project.org}/${config.project.repo}`);\n if (config.project.domain) {\n logger.keyValue('Domain', config.project.domain);\n }\n logger.keyValue('Entity', `${config.project.entityType} / ${config.project.entityTypePlural}`);\n\n // Preferences\n logger.newline();\n logger.subtitle('Preferences');\n logger.keyValue('Language', config.preferences.language === 'en' ? 'English' : 'Español');\n logger.keyValue(\n 'Response Language',\n config.preferences.responseLanguage === 'en' ? 'English' : 'Español'\n );\n logger.keyValue('Co-author', config.preferences.includeCoAuthor ? 'Yes' : 'No');\n\n // Modules\n logger.newline();\n logger.subtitle('Modules');\n showModuleStatus('Agents', config.modules.agents.selected, options.verbose);\n showModuleStatus('Skills', config.modules.skills.selected, options.verbose);\n showModuleStatus('Commands', config.modules.commands.selected, options.verbose);\n showModuleStatus('Docs', config.modules.docs.selected, options.verbose);\n\n // Extras\n logger.newline();\n logger.subtitle('Extras');\n logger.keyValue(\n 'Schemas',\n config.extras.schemas ? colors.success('enabled') : colors.muted('disabled')\n );\n logger.keyValue(\n 'Scripts',\n config.extras.scripts ? colors.success('enabled') : colors.muted('disabled')\n );\n logger.keyValue(\n 'Sessions',\n config.extras.sessions ? colors.success('enabled') : colors.muted('disabled')\n );\n\n // Hooks\n logger.newline();\n logger.keyValue(\n 'Hooks',\n hooksStatus.enabled ? colors.success('enabled') : colors.muted('disabled')\n );\n if (hooksStatus.enabled && options.verbose) {\n for (const hook of hooksStatus.hooks) {\n if (hook.exists) {\n const status = hook.executable ? colors.success('✔') : colors.warning('⚠ not executable');\n logger.item(`${hook.name}: ${status}`, 1);\n }\n }\n }\n\n // MCP Servers\n logger.newline();\n logger.subtitle('MCP Servers');\n logger.keyValue('Level', config.mcp.level);\n\n if (mcpServers.project.length > 0) {\n logger.keyValue('Project', mcpServers.project.join(', '));\n }\n if (mcpServers.user.length > 0) {\n logger.keyValue('User', mcpServers.user.join(', '));\n }\n if (mcpServers.project.length === 0 && mcpServers.user.length === 0) {\n logger.info('No MCP servers configured');\n }\n\n // Permissions\n if (options.verbose && (permissions.project || permissions.user)) {\n logger.newline();\n logger.subtitle('Permissions');\n if (permissions.project?.allow) {\n logger.keyValue('Project Allow', `${permissions.project.allow.length} rules`);\n }\n if (permissions.project?.deny) {\n logger.keyValue('Project Deny', `${permissions.project.deny.length} rules`);\n }\n if (permissions.user?.allow) {\n logger.keyValue('User Allow', `${permissions.user.allow.length} rules`);\n }\n if (permissions.user?.deny) {\n logger.keyValue('User Deny', `${permissions.user.deny.length} rules`);\n }\n }\n\n // Meta\n logger.newline();\n logger.subtitle('Configuration');\n logger.keyValue('Version', config.version);\n logger.keyValue('Template', config.templateSource.type);\n logger.keyValue('Last Updated', formatDate(config.customizations.lastUpdated));\n logger.keyValue(\n 'Placeholders',\n config.customizations.placeholdersReplaced ? 'Replaced' : 'Not replaced'\n );\n\n if (config.customizations.customFiles.length > 0) {\n logger.keyValue('Custom Files', String(config.customizations.customFiles.length));\n if (options.verbose) {\n for (const file of config.customizations.customFiles) {\n logger.item(file, 1);\n }\n }\n }\n } catch (error) {\n logger.error(`Failed to get status: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show module status\n */\nfunction showModuleStatus(label: string, modules: string[], verbose?: boolean): void {\n const count = modules.length;\n const status = count > 0 ? colors.success(`${count} installed`) : colors.muted('none');\n logger.keyValue(label, status);\n\n if (verbose && count > 0) {\n logger.note(` ${modules.join(', ')}`);\n }\n}\n\n/**\n * Format date\n */\nfunction formatDate(isoString: string): string {\n try {\n const date = new Date(isoString);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n } catch {\n return isoString;\n }\n}\n","/**\n * Update command - update configuration and modules\n */\n\nimport { Command } from 'commander';\nimport { readConfig, updateConfig } from '../../lib/config/index.js';\nimport { installHooks } from '../../lib/hooks/index.js';\nimport { installMcpServers } from '../../lib/mcp/index.js';\nimport { filterModules, getModule, loadRegistry } from '../../lib/modules/index.js';\nimport { getInstalledModules, installModules } from '../../lib/modules/installer.js';\nimport { installPermissions } from '../../lib/permissions/index.js';\nimport { replacePlaceholders } from '../../lib/placeholders/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport type { ModuleCategory } from '../../types/modules.js';\nimport {\n promptHookConfig,\n promptMcpConfig,\n promptPermissionsConfig,\n promptPreferences,\n showSkippedMcpInstructions,\n} from '../prompts/index.js';\nimport {\n type ModuleUpdate,\n promptConflictResolution,\n promptNewModules,\n promptReconfigureOptions,\n promptUpdateAction,\n promptUpdatedModules,\n showUpdateReport,\n} from '../prompts/update.js';\n\ninterface UpdateOptions {\n check?: boolean;\n modules?: boolean;\n config?: boolean;\n all?: boolean;\n force?: boolean;\n interactive?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n const cmd = new Command('update')\n .description('Update configuration and modules')\n .option('--check', 'Only check for updates')\n .option('--modules', 'Update only modules')\n .option('--config', 'Reconfigure settings')\n .option('--all', 'Update everything')\n .option('-f, --force', 'Overwrite files without asking')\n .option('-i, --interactive', 'Ask for each change')\n .option('-v, --verbose', 'Detailed output')\n .action(runUpdate);\n\n return cmd;\n}\n\n/**\n * Run update command\n */\nasync function runUpdate(options: UpdateOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Load registry\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n\n // Determine action\n let action = options.check\n ? 'check'\n : options.modules\n ? 'modules'\n : options.config\n ? 'config'\n : options.all\n ? 'all'\n : null;\n\n if (!action) {\n const result = await promptUpdateAction();\n if (result === 'cancel') {\n return;\n }\n action = result;\n }\n\n // Check for updates\n const updates = await detectUpdates(registry, config, projectPath);\n\n if (action === 'check') {\n showUpdateReport(updates);\n return;\n }\n\n // Show update report\n showUpdateReport(updates);\n\n // Handle module updates\n if (action === 'modules' || action === 'all') {\n await handleModuleUpdates(projectPath, config, registry, updates, options);\n }\n\n // Handle configuration updates\n if (action === 'config' || action === 'all') {\n await handleConfigUpdates(projectPath, config, options);\n }\n } catch (error) {\n logger.error(`Update failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Detect updates\n */\nasync function detectUpdates(\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n config: Awaited<ReturnType<typeof readConfig>>,\n projectPath: string\n): Promise<{\n new: ModuleUpdate[];\n updated: ModuleUpdate[];\n deprecated: ModuleUpdate[];\n conflicts: ModuleUpdate[];\n}> {\n const result = {\n new: [] as ModuleUpdate[],\n updated: [] as ModuleUpdate[],\n deprecated: [] as ModuleUpdate[],\n conflicts: [] as ModuleUpdate[],\n };\n\n if (!config) return result;\n\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const installed = config.modules[category].selected;\n const installedSet = new Set(installed);\n const available = registry[category];\n\n // Find new modules\n for (const mod of available) {\n if (!installedSet.has(mod.id)) {\n result.new.push({\n id: mod.id,\n name: mod.name,\n category,\n type: 'new',\n });\n }\n }\n\n // Find updated/deprecated (would need version tracking)\n // For now, just check if files exist\n await getInstalledModules(category, projectPath);\n\n for (const id of installed) {\n const mod = available.find((m) => m.id === id);\n if (!mod) {\n // Module was removed from registry\n result.deprecated.push({\n id,\n name: id,\n category,\n type: 'deprecated',\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Handle module updates\n */\nasync function handleModuleUpdates(\n projectPath: string,\n config: NonNullable<Awaited<ReturnType<typeof readConfig>>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n updates: Awaited<ReturnType<typeof detectUpdates>>,\n options: UpdateOptions\n): Promise<void> {\n const templatesPath = getTemplatesPath();\n\n // Handle new modules\n if (updates.new.length > 0) {\n logger.newline();\n const newIds = options.interactive ? await promptNewModules(updates.new) : [];\n\n if (newIds.length > 0) {\n // Group by category\n const byCategory: Record<ModuleCategory, string[]> = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n for (const update of updates.new) {\n if (newIds.includes(update.id)) {\n byCategory[update.category as ModuleCategory].push(update.id);\n }\n }\n\n // Install new modules\n for (const [category, ids] of Object.entries(byCategory)) {\n if (ids.length === 0) continue;\n\n const modules = filterModules(registry, category as ModuleCategory, ids);\n await installModules(category as ModuleCategory, modules, {\n templatesPath,\n targetPath: projectPath,\n overwrite: false,\n });\n\n // Update config\n config.modules[category as ModuleCategory].selected.push(...ids);\n }\n }\n }\n\n // Handle updated modules\n if (updates.updated.length > 0 && options.interactive) {\n const updateIds = await promptUpdatedModules(updates.updated);\n\n for (const id of updateIds) {\n const update = updates.updated.find((u) => u.id === id);\n if (!update) continue;\n\n // Handle conflicts\n if (update.hasLocalChanges && !options.force) {\n const resolution = await promptConflictResolution(update);\n\n if (resolution === 'keep') continue;\n if (resolution === 'diff') {\n logger.info('Diff display not implemented yet');\n continue;\n }\n }\n\n // Update module\n const mod = getModule(registry, update.category as ModuleCategory, id);\n if (mod) {\n await installModules(update.category as ModuleCategory, [mod], {\n templatesPath,\n targetPath: projectPath,\n overwrite: true,\n });\n }\n }\n }\n\n // Replace placeholders in updated files\n const claudePath = resolvePath(projectPath, '.claude');\n await replacePlaceholders(claudePath, config.project, { silent: !options.verbose });\n\n // Save config\n config.customizations.lastUpdated = new Date().toISOString();\n await updateConfig(projectPath, config);\n}\n\n/**\n * Handle configuration updates\n */\nasync function handleConfigUpdates(\n projectPath: string,\n config: NonNullable<Awaited<ReturnType<typeof readConfig>>>,\n _options: UpdateOptions\n): Promise<void> {\n const reconfigureOptions = await promptReconfigureOptions();\n\n if (reconfigureOptions.includes('preferences')) {\n const preferences = await promptPreferences({\n defaults: config.preferences,\n });\n config.preferences = preferences;\n }\n\n if (reconfigureOptions.includes('hooks')) {\n const hookConfig = await promptHookConfig({\n defaults: config.extras.hooks,\n });\n config.extras.hooks = hookConfig;\n await installHooks(projectPath, hookConfig);\n }\n\n if (reconfigureOptions.includes('mcp')) {\n const mcpResult = await promptMcpConfig({\n defaults: config.mcp,\n });\n config.mcp = mcpResult.config;\n await installMcpServers(projectPath, mcpResult.config);\n\n // Show instructions for skipped configurations\n if (mcpResult.skippedConfigs.length > 0) {\n showSkippedMcpInstructions(mcpResult.skippedConfigs, mcpResult.config.level);\n }\n }\n\n if (reconfigureOptions.includes('permissions')) {\n const permissionsConfig = await promptPermissionsConfig();\n config.customizations.permissions = permissionsConfig;\n await installPermissions(projectPath, permissionsConfig, 'project');\n }\n\n // Save config\n config.customizations.lastUpdated = new Date().toISOString();\n await updateConfig(projectPath, config);\n\n logger.success('Configuration updated');\n}\n","/**\n * Configure command - configure template placeholders\n */\n\nimport { Command } from 'commander';\nimport {\n formatGlobalDefaults,\n getGlobalDefaultsPath,\n readGlobalDefaults,\n} from '../../lib/config/global-defaults.js';\nimport { readConfig, writeConfig } from '../../lib/config/index.js';\nimport {\n formatReplacementReport,\n previewReplacements,\n replaceTemplateConfigWithSpinner,\n} from '../../lib/templates/config-replacer.js';\nimport {\n formatScanSummary,\n getUnconfiguredPlaceholders,\n scanForPlaceholders,\n} from '../../lib/templates/scanner.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport type { TemplatePlaceholderCategory } from '../../types/template-config.js';\nimport {\n buildConfigContext,\n confirmTemplateConfig,\n promptSaveGlobalDefaults,\n promptSetupMode,\n promptTemplateConfig,\n} from '../prompts/template-config.js';\n\ninterface ConfigureOptions {\n scan?: boolean;\n category?: TemplatePlaceholderCategory;\n preview?: boolean;\n showDefaults?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create configure command\n */\nexport function createConfigureCommand(): Command {\n const cmd = new Command('configure')\n .description('Configure template placeholders interactively')\n .argument('[path]', 'Project path (default: current directory)')\n .option('--scan', 'Scan for unconfigured placeholders only')\n .option(\n '-c, --category <name>',\n 'Configure specific category (commands|paths|targets|tracking|techStack|environment|brand)'\n )\n .option('--preview', 'Preview changes without applying')\n .option('--show-defaults', 'Show global defaults')\n .option('-v, --verbose', 'Detailed output')\n .action(runConfigure);\n\n return cmd;\n}\n\n/**\n * Run configure command\n */\nasync function runConfigure(path: string | undefined, options: ConfigureOptions): Promise<void> {\n const projectPath = resolvePath(path || '.');\n const claudePath = joinPath(projectPath, '.claude');\n\n logger.configure({ verbose: options.verbose, silent: false });\n\n logger.title('Template Configuration');\n\n try {\n // Show global defaults\n if (options.showDefaults) {\n await showGlobalDefaults();\n return;\n }\n\n // Scan mode - just show unconfigured placeholders\n if (options.scan) {\n await scanMode(claudePath, projectPath);\n return;\n }\n\n // Preview mode - show what would be replaced\n if (options.preview) {\n await previewMode(claudePath, projectPath);\n return;\n }\n\n // Interactive configuration\n await interactiveMode(claudePath, projectPath, options);\n } catch (error) {\n logger.error(`Configuration failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show global defaults\n */\nasync function showGlobalDefaults(): Promise<void> {\n const defaults = await readGlobalDefaults();\n const formatted = formatGlobalDefaults(defaults);\n\n logger.info(`Path: ${colors.muted(getGlobalDefaultsPath())}`);\n logger.newline();\n logger.info(formatted);\n}\n\n/**\n * Scan mode - show unconfigured placeholders\n */\nasync function scanMode(claudePath: string, projectPath: string): Promise<void> {\n logger.info(`Scanning ${colors.primary(claudePath)} for placeholders...`);\n logger.newline();\n\n const scanResult = await scanForPlaceholders(claudePath);\n\n if (scanResult.placeholders.length === 0) {\n logger.success('No configurable placeholders found');\n return;\n }\n\n logger.info(formatScanSummary(scanResult));\n\n // Check for existing config\n const existingConfig = await readConfig(projectPath);\n\n if (existingConfig?.templateConfig) {\n const unconfigured = await getUnconfiguredPlaceholders(\n claudePath,\n existingConfig.templateConfig\n );\n\n if (unconfigured.length > 0) {\n logger.newline();\n logger.warn(`${unconfigured.length} placeholders not configured:`);\n for (const p of unconfigured) {\n logger.info(` ${p}`);\n }\n logger.newline();\n logger.info('Run `claude-config configure` to configure them');\n } else {\n logger.newline();\n logger.success('All placeholders are configured');\n }\n } else {\n logger.newline();\n logger.info('Run `claude-config configure` to configure placeholders');\n }\n}\n\n/**\n * Preview mode - show what would be replaced\n */\nasync function previewMode(claudePath: string, projectPath: string): Promise<void> {\n const existingConfig = await readConfig(projectPath);\n\n if (!existingConfig?.templateConfig) {\n logger.warn('No template configuration found');\n logger.info('Run `claude-config configure` first to set up configuration');\n return;\n }\n\n logger.info('Preview of replacements:');\n logger.newline();\n\n const replacements = await previewReplacements(claudePath, existingConfig.templateConfig);\n\n if (replacements.length === 0) {\n logger.info('No placeholders to replace');\n return;\n }\n\n // Group by file\n const byFile: Record<string, Array<{ placeholder: string; value: string }>> = {};\n for (const r of replacements) {\n if (!byFile[r.file]) {\n byFile[r.file] = [];\n }\n byFile[r.file].push({ placeholder: r.placeholder, value: r.value });\n }\n\n for (const [file, changes] of Object.entries(byFile)) {\n logger.subtitle(file);\n for (const change of changes) {\n logger.info(` ${change.placeholder} → ${colors.primary(change.value)}`);\n }\n logger.newline();\n }\n\n logger.success(\n `Total: ${replacements.length} replacements in ${Object.keys(byFile).length} files`\n );\n}\n\n/**\n * Interactive configuration mode\n */\nasync function interactiveMode(\n claudePath: string,\n projectPath: string,\n options: ConfigureOptions\n): Promise<void> {\n // Build context\n const context = await buildConfigContext(projectPath);\n\n // Select mode (unless category specified)\n let mode: 'quick' | 'guided' | 'advanced' = 'quick';\n if (!options.category) {\n mode = await promptSetupMode();\n }\n\n // Prompt for configuration\n const templateConfig = await promptTemplateConfig({\n context,\n mode,\n category: options.category as TemplatePlaceholderCategory | undefined,\n });\n\n // Show summary and confirm\n const confirmed = await confirmTemplateConfig(templateConfig, context);\n if (!confirmed) {\n logger.warn('Configuration cancelled');\n return;\n }\n\n // Apply replacements\n const report = await replaceTemplateConfigWithSpinner(claudePath, templateConfig);\n\n if (options.verbose) {\n logger.newline();\n logger.info(formatReplacementReport(report));\n }\n\n // Update project config\n const existingConfig = await readConfig(projectPath);\n if (existingConfig) {\n existingConfig.templateConfig = {\n commands: { ...existingConfig.templateConfig?.commands, ...templateConfig.commands },\n paths: { ...existingConfig.templateConfig?.paths, ...templateConfig.paths },\n targets: { ...existingConfig.templateConfig?.targets, ...templateConfig.targets },\n tracking: { ...existingConfig.templateConfig?.tracking, ...templateConfig.tracking },\n techStack: { ...existingConfig.templateConfig?.techStack, ...templateConfig.techStack },\n environment: {\n ...existingConfig.templateConfig?.environment,\n ...templateConfig.environment,\n },\n brand: { ...existingConfig.templateConfig?.brand, ...templateConfig.brand },\n };\n existingConfig.customizations.lastUpdated = new Date().toISOString();\n\n await writeConfig(projectPath, existingConfig);\n logger.success('Configuration saved to .claude/config.json');\n }\n\n // Offer to save as global defaults\n await promptSaveGlobalDefaults(templateConfig);\n\n logger.newline();\n logger.success('Template configuration complete!');\n}\n","/**\n * Template placeholder scanner\n *\n * Scans template files to discover {{PLACEHOLDER}} patterns\n * and returns information about which placeholders are used.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n PlaceholderScanResult,\n TemplateConfig,\n TemplatePlaceholderCategory,\n} from '../../types/template-config.js';\nimport {\n getAllPlaceholderPatterns,\n getPlaceholderByPattern,\n isConfigurablePlaceholder,\n TEMPLATE_PLACEHOLDERS,\n} from '../../constants/template-placeholders.js';\n\n/**\n * Regex to match {{PLACEHOLDER}} patterns\n */\nconst PLACEHOLDER_REGEX = /\\{\\{([A-Z][A-Z0-9_]*)\\}\\}/g;\n\n/**\n * File extensions to scan\n */\nconst SCANNABLE_EXTENSIONS = ['.md', '.json', '.yaml', '.yml', '.txt'];\n\n/**\n * Directories to skip during scanning\n */\nconst SKIP_DIRECTORIES = ['node_modules', '.git', 'dist', 'build', '.next', '.turbo'];\n\n/**\n * Check if a path should be scanned\n */\nfunction shouldScanPath(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n return SCANNABLE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Check if a directory should be skipped\n */\nfunction shouldSkipDirectory(dirName: string): boolean {\n return SKIP_DIRECTORIES.includes(dirName) || dirName.startsWith('.');\n}\n\n/**\n * Extract all placeholder patterns from content\n */\nexport function extractPlaceholders(content: string): string[] {\n const matches = content.matchAll(PLACEHOLDER_REGEX);\n const placeholders = new Set<string>();\n\n for (const match of matches) {\n placeholders.add(`{{${match[1]}}}`);\n }\n\n return Array.from(placeholders);\n}\n\n/**\n * Recursively get all files in a directory\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!shouldSkipDirectory(entry.name)) {\n const subFiles = await getAllFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile() && shouldScanPath(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n\n/**\n * Scan a directory for template placeholders\n */\nexport async function scanForPlaceholders(\n dir: string\n): Promise<PlaceholderScanResult> {\n const allPlaceholders = new Set<string>();\n const filesByPlaceholder: Record<string, string[]> = {};\n const counts: Record<string, number> = {};\n const byCategory: Record<TemplatePlaceholderCategory, string[]> = {\n commands: [],\n paths: [],\n targets: [],\n tracking: [],\n techStack: [],\n performance: [],\n brand: [],\n environment: [],\n };\n\n const files = await getAllFiles(dir);\n\n for (const file of files) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n const placeholders = extractPlaceholders(content);\n\n for (const placeholder of placeholders) {\n // Only track configurable placeholders\n if (!isConfigurablePlaceholder(placeholder)) continue;\n\n allPlaceholders.add(placeholder);\n\n // Track files\n if (!filesByPlaceholder[placeholder]) {\n filesByPlaceholder[placeholder] = [];\n }\n filesByPlaceholder[placeholder].push(path.relative(dir, file));\n\n // Count occurrences\n const regex = new RegExp(\n placeholder.replace(/[{}]/g, '\\\\$&'),\n 'g'\n );\n const matchCount = (content.match(regex) || []).length;\n counts[placeholder] = (counts[placeholder] || 0) + matchCount;\n }\n } catch {\n // File can't be read, skip\n }\n }\n\n // Group by category\n for (const placeholder of allPlaceholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def) {\n byCategory[def.category].push(placeholder);\n }\n }\n\n return {\n placeholders: Array.from(allPlaceholders).sort(),\n byCategory,\n filesByPlaceholder,\n counts,\n };\n}\n\n/**\n * Get unconfigured placeholders (placeholders found but not in config)\n */\nexport async function getUnconfiguredPlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<string[]> {\n const scanResult = await scanForPlaceholders(dir);\n const unconfigured: string[] = [];\n\n // Flatten config to get configured keys\n const configuredKeys = new Set<string>();\n\n if (config.commands) {\n for (const [key] of Object.entries(config.commands)) {\n configuredKeys.add(key.toUpperCase() + '_COMMAND');\n }\n }\n if (config.paths) {\n for (const [key] of Object.entries(config.paths)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.targets) {\n for (const [key] of Object.entries(config.targets)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.tracking) {\n for (const [key] of Object.entries(config.tracking)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.techStack) {\n for (const [key] of Object.entries(config.techStack)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.environment) {\n for (const [key] of Object.entries(config.environment)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.brand) {\n for (const [key] of Object.entries(config.brand)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n\n // Check each found placeholder\n for (const placeholder of scanResult.placeholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def && !configuredKeys.has(def.key)) {\n unconfigured.push(placeholder);\n }\n }\n\n return unconfigured;\n}\n\n/**\n * Get placeholders that are required but not configured\n */\nexport async function getMissingRequiredPlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<string[]> {\n const scanResult = await scanForPlaceholders(dir);\n const missing: string[] = [];\n\n for (const placeholder of scanResult.placeholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def?.required) {\n // Check if configured\n const isConfigured = isPlaceholderConfigured(def.key, config);\n if (!isConfigured) {\n missing.push(placeholder);\n }\n }\n }\n\n return missing;\n}\n\n/**\n * Check if a specific placeholder key is configured\n */\nfunction isPlaceholderConfigured(\n key: string,\n config: Partial<TemplateConfig>\n): boolean {\n const def = TEMPLATE_PLACEHOLDERS.find((p) => p.key === key);\n if (!def) return false;\n\n switch (def.category) {\n case 'commands': {\n const cmdKey = keyToConfigKey(key, 'commands');\n return Boolean(\n config.commands?.[cmdKey as keyof typeof config.commands]\n );\n }\n case 'paths': {\n const pathKey = keyToConfigKey(key, 'paths');\n return Boolean(config.paths?.[pathKey as keyof typeof config.paths]);\n }\n case 'targets':\n case 'performance': {\n const targetKey = keyToConfigKey(key, 'targets');\n return config.targets?.[targetKey as keyof typeof config.targets] !== undefined;\n }\n case 'tracking': {\n const trackKey = keyToConfigKey(key, 'tracking');\n return Boolean(\n config.tracking?.[trackKey as keyof typeof config.tracking]\n );\n }\n case 'techStack': {\n const techKey = keyToConfigKey(key, 'techStack');\n return Boolean(\n config.techStack?.[techKey as keyof typeof config.techStack]\n );\n }\n case 'environment': {\n const envKey = keyToConfigKey(key, 'environment');\n return Boolean(\n config.environment?.[envKey as keyof typeof config.environment]\n );\n }\n case 'brand': {\n const brandKey = keyToConfigKey(key, 'brand');\n return Boolean(config.brand?.[brandKey as keyof typeof config.brand]);\n }\n default:\n return false;\n }\n}\n\n/**\n * Convert placeholder key to config object key\n * e.g., TYPECHECK_COMMAND -> typecheck\n * COVERAGE_TARGET -> coverageTarget\n */\nfunction keyToConfigKey(key: string, category: string): string {\n // Remove category suffix if present\n let cleanKey = key;\n\n if (category === 'commands' && key.endsWith('_COMMAND')) {\n cleanKey = key.slice(0, -8);\n } else if (category === 'environment' && key.endsWith('_ENV')) {\n cleanKey = key.slice(0, -4);\n }\n\n // Convert SNAKE_CASE to camelCase\n return cleanKey\n .toLowerCase()\n .replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Get scan summary as formatted string\n */\nexport function formatScanSummary(result: PlaceholderScanResult): string {\n const lines: string[] = [];\n\n lines.push(`Found ${result.placeholders.length} configurable placeholders:\\n`);\n\n const categories = Object.entries(result.byCategory).filter(\n ([, placeholders]) => placeholders.length > 0\n );\n\n for (const [category, placeholders] of categories) {\n lines.push(` ${category} (${placeholders.length}):`);\n for (const placeholder of placeholders) {\n const count = result.counts[placeholder] || 0;\n const files = result.filesByPlaceholder[placeholder]?.length || 0;\n lines.push(` ${placeholder} - ${count} uses in ${files} files`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * List all known configurable placeholder patterns\n */\nexport function listAllConfigurablePlaceholders(): string[] {\n return getAllPlaceholderPatterns();\n}\n","/**\n * ASCII Banner utility using figlet and chalk\n */\n\nimport chalk from 'chalk';\nimport figlet from 'figlet';\n\n/**\n * Display the CLI banner\n */\nexport function showBanner(): void {\n const bannerText = figlet.textSync('Qazuor', {\n font: 'Standard',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n });\n\n // Create gradient effect with chalk\n const lines = bannerText.split('\\n');\n const colors = [\n chalk.hex('#FF6B6B'), // Coral red\n chalk.hex('#FF8E53'), // Orange\n chalk.hex('#FED330'), // Yellow\n chalk.hex('#26DE81'), // Green\n chalk.hex('#4BCFFA'), // Light blue\n chalk.hex('#A55EEA'), // Purple\n ];\n\n const coloredBanner = lines\n .map((line, index) => {\n const colorIndex = index % colors.length;\n return colors[colorIndex](line);\n })\n .join('\\n');\n\n console.log(coloredBanner);\n console.log(chalk.gray(' Claude Code Configuration & Project Setup'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n}\n\n/**\n * Display a smaller inline banner for commands\n */\nexport function showInlineBanner(): void {\n console.log();\n console.log(chalk.hex('#4BCFFA').bold(' ⚡ Qazuor Claude Config'));\n console.log(chalk.gray(' ─────────────────────────────────'));\n console.log();\n}\n"],"mappings":"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","names":["fs","path","os","import_commander","ora","pc","import_node_path","import_fs_extra","chalk","args","path","fse","CONFIG_FILE","CLAUDE_DIR","fs","path","platform","platform","platform","fs","os","glob","module","module","remove","listFiles","backup","getInstallCommand","os","PROJECT_SETTINGS_FILE","USER_SETTINGS_FILE","import_node_path","path","fs","fs","path","import_ora","replaceInFile","spinner","ora","import_chalk","inquirerConfirm","chalk","inquirerInput","inquirerSelect","inquirerCheckbox","inquirerPassword","value","hasConfig","writeConfig","module","capitalize","capitalize","huskyIntegration","fs","path","path","getInstallCommand","import_commander","capitalize","formatCategory","import_commander","module","import_commander","parseModuleSpec","module","import_commander","import_commander","import_commander","fs","path","SKIP_DIRECTORIES","shouldSkipDirectory","getAllFiles","path","VERSION","import_chalk","figlet","colors","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.6_typescript@5.9.3/node_modules/tsup/assets/cjs_shims.js","../src/lib/utils/fs.ts","../src/bin.ts","../src/cli/index.ts","../src/cli/commands/index.ts","../src/cli/commands/init.ts","../src/lib/bundles/resolver.ts","../src/constants/bundles.ts","../src/lib/ci-cd/index.ts","../src/lib/ci-cd/github-actions-generator.ts","../src/lib/utils/spinner.ts","../src/lib/code-style/index.ts","../src/lib/code-style/installer.ts","../src/constants/code-style-defaults.ts","../src/lib/utils/logger.ts","../src/lib/code-style/generator.ts","../src/lib/code-style/vscode-installer.ts","../src/lib/config/index.ts","../src/lib/config/reader.ts","../src/lib/config/writer.ts","../src/lib/config/global-defaults.ts","../src/lib/dependencies/index.ts","../src/lib/dependencies/checker.ts","../src/constants/dependencies.ts","../src/lib/git-hooks/index.ts","../src/lib/git-hooks/husky-installer.ts","../src/lib/hooks/index.ts","../src/lib/hooks/configurator.ts","../src/lib/mcp/index.ts","../src/lib/mcp/configurator.ts","../src/constants/mcp-servers.ts","../src/lib/modules/index.ts","../src/lib/modules/registry.ts","../src/lib/modules/resolver.ts","../src/lib/modules/installer.ts","../src/lib/npm/index.ts","../src/lib/npm/package-manager.ts","../src/constants/npm-dependencies.ts","../src/lib/permissions/index.ts","../src/lib/permissions/configurator.ts","../src/constants/permissions.ts","../src/lib/placeholders/index.ts","../src/lib/placeholders/replacer.ts","../src/constants/placeholders.ts","../src/lib/scaffold/claude-md-generator.ts","../src/lib/utils/paths.ts","../src/lib/scaffold/index.ts","../src/lib/scaffold/detector.ts","../src/lib/scaffold/generator.ts","../src/lib/utils/git.ts","../src/lib/templates/config-replacer.ts","../src/constants/template-placeholders.ts","../src/lib/utils/prompt-cancel.ts","../src/lib/wizard/index.ts","../src/lib/wizard/step.ts","../src/lib/wizard/navigator.ts","../src/lib/wizard/history.ts","../src/lib/wizard/engine.ts","../src/lib/wizard/init-steps.ts","../src/cli/prompts/bundle-select.ts","../src/lib/bundles/display.ts","../src/lib/bundles/validator.ts","../src/cli/prompts/ci-cd-config.ts","../src/cli/prompts/code-style.ts","../src/cli/prompts/folder-preferences.ts","../src/constants/folder-preferences.ts","../src/cli/prompts/hook-config.ts","../src/cli/prompts/item-select.ts","../src/cli/prompts/mcp-config.ts","../src/cli/prompts/permissions.ts","../src/cli/prompts/preferences.ts","../src/cli/prompts/project-info.ts","../src/cli/prompts/scaffold.ts","../src/cli/prompts/template-config.ts","../src/cli/prompts/index.ts","../src/cli/prompts/update.ts","../src/cli/prompts/confirm.ts","../src/cli/commands/list.ts","../src/cli/commands/add.ts","../src/cli/commands/remove.ts","../src/cli/commands/status.ts","../src/cli/commands/update.ts","../src/cli/commands/configure.ts","../src/lib/templates/scanner.ts","../src/lib/utils/banner.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","/**\n * Filesystem utility functions\n */\n\nimport path from 'node:path';\nimport fs from 'fs-extra';\nimport { glob } from 'glob';\n\n/**\n * Check if a path exists\n */\nexport async function pathExists(filePath: string): Promise<boolean> {\n return fs.pathExists(filePath);\n}\n\n/**\n * Check if a path is a directory\n */\nexport async function isDirectory(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a path is a file\n */\nexport async function isFile(filePath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(filePath);\n return stat.isFile();\n } catch {\n return false;\n }\n}\n\n/**\n * Read a JSON file\n */\nexport async function readJson<T = unknown>(filePath: string): Promise<T> {\n return fs.readJson(filePath);\n}\n\n/**\n * Write a JSON file\n */\nexport async function writeJson(\n filePath: string,\n data: unknown,\n options?: { spaces?: number }\n): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeJson(filePath, data, { spaces: options?.spaces ?? 2 });\n}\n\n/**\n * Read a text file\n */\nexport async function readFile(filePath: string): Promise<string> {\n return fs.readFile(filePath, 'utf-8');\n}\n\n/**\n * Write a text file\n */\nexport async function writeFile(filePath: string, content: string): Promise<void> {\n await fs.ensureDir(path.dirname(filePath));\n await fs.writeFile(filePath, content, 'utf-8');\n}\n\n/**\n * Copy a file or directory\n */\nexport async function copy(\n src: string,\n dest: string,\n options?: { overwrite?: boolean }\n): Promise<void> {\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest, { overwrite: options?.overwrite ?? false });\n}\n\n/**\n * Copy a directory recursively\n */\nexport async function copyDir(\n src: string,\n dest: string,\n options?: { overwrite?: boolean; filter?: (src: string) => boolean }\n): Promise<void> {\n await fs.copy(src, dest, {\n overwrite: options?.overwrite ?? false,\n filter: options?.filter,\n });\n}\n\n/**\n * Create a directory (and parents if needed)\n */\nexport async function ensureDir(dirPath: string): Promise<void> {\n await fs.ensureDir(dirPath);\n}\n\n/**\n * Remove a file or directory\n */\nexport async function remove(filePath: string): Promise<void> {\n await fs.remove(filePath);\n}\n\n/**\n * List files matching a pattern\n */\nexport async function listFiles(\n pattern: string,\n options?: { cwd?: string; ignore?: string[] }\n): Promise<string[]> {\n return glob(pattern, {\n cwd: options?.cwd,\n ignore: options?.ignore,\n nodir: true,\n });\n}\n\n/**\n * List directories matching a pattern\n */\nexport async function listDirs(pattern: string, options?: { cwd?: string }): Promise<string[]> {\n const matches = await glob(pattern, {\n cwd: options?.cwd,\n });\n\n const dirs: string[] = [];\n for (const match of matches) {\n const fullPath = options?.cwd ? path.join(options.cwd, match) : match;\n if (await isDirectory(fullPath)) {\n dirs.push(match);\n }\n }\n\n return dirs;\n}\n\n/**\n * Get file info\n */\nexport async function getFileInfo(filePath: string): Promise<{\n exists: boolean;\n isFile: boolean;\n isDirectory: boolean;\n size: number;\n modified: Date;\n} | null> {\n try {\n const stat = await fs.stat(filePath);\n return {\n exists: true,\n isFile: stat.isFile(),\n isDirectory: stat.isDirectory(),\n size: stat.size,\n modified: stat.mtime,\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Read all files in a directory recursively\n */\nexport async function readDirRecursive(\n dirPath: string,\n options?: { extensions?: string[] }\n): Promise<string[]> {\n const pattern = options?.extensions ? `**/*.{${options.extensions.join(',')}}` : '**/*';\n\n return glob(pattern, {\n cwd: dirPath,\n nodir: true,\n });\n}\n\n/**\n * Calculate hash of a file for comparison\n */\nexport async function getFileHash(filePath: string): Promise<string> {\n const crypto = await import('node:crypto');\n const content = await fs.readFile(filePath);\n return crypto.createHash('sha256').update(content).digest('hex');\n}\n\n/**\n * Compare two files\n */\nexport async function filesAreEqual(file1: string, file2: string): Promise<boolean> {\n try {\n const [hash1, hash2] = await Promise.all([getFileHash(file1), getFileHash(file2)]);\n return hash1 === hash2;\n } catch {\n return false;\n }\n}\n\n/**\n * Get relative path from base\n */\nexport function relativePath(from: string, to: string): string {\n return path.relative(from, to);\n}\n\n/**\n * Resolve path segments\n */\nexport function resolvePath(...segments: string[]): string {\n return path.resolve(...segments);\n}\n\n/**\n * Join path segments\n */\nexport function joinPath(...segments: string[]): string {\n return path.join(...segments);\n}\n\n/**\n * Get directory name\n */\nexport function dirname(filePath: string): string {\n return path.dirname(filePath);\n}\n\n/**\n * Get base name\n */\nexport function basename(filePath: string, ext?: string): string {\n return path.basename(filePath, ext);\n}\n\n/**\n * Get file extension\n */\nexport function extname(filePath: string): string {\n return path.extname(filePath);\n}\n\n/**\n * Backup a file or directory\n */\nexport async function backup(src: string, suffix = '.backup'): Promise<string> {\n const backupPath = `${src}${suffix}`;\n await copy(src, backupPath, { overwrite: true });\n return backupPath;\n}\n\n/**\n * Make a file executable (Unix only)\n */\nexport async function makeExecutable(filePath: string): Promise<void> {\n try {\n await fs.chmod(filePath, 0o755);\n } catch {\n // Ignore on Windows\n }\n}\n\n/**\n * Temporary directory utilities\n */\nexport async function createTempDir(prefix = 'claude-config-'): Promise<string> {\n const os = await import('node:os');\n const tempBase = os.tmpdir();\n const tempDir = path.join(tempBase, `${prefix}${Date.now()}`);\n await ensureDir(tempDir);\n return tempDir;\n}\n\nexport async function cleanTempDir(tempDir: string): Promise<void> {\n await remove(tempDir);\n}\n","#!/usr/bin/env node\n/**\n * CLI entry point for @qazuor/claude-code-config\n */\n\nimport { program } from './cli/index.js';\nimport { showBanner } from './lib/utils/banner.js';\nimport { setupGracefulCancellation } from './lib/utils/prompt-cancel.js';\n\n// Set up graceful cancellation handlers\nsetupGracefulCancellation();\n\n// Show banner on startup (only for init command or no args)\nconst args = process.argv.slice(2);\nconst showBannerCommands = ['init', 'help', '--help', '-h', ''];\nconst shouldShowBanner = args.length === 0 || showBannerCommands.includes(args[0] || '');\n\nif (shouldShowBanner) {\n showBanner();\n}\n\nprogram.parse(process.argv);\n","import { Command } from 'commander';\n\nimport {\n createAddCommand,\n createConfigureCommand,\n createInitCommand,\n createListCommand,\n createRemoveCommand,\n createStatusCommand,\n createUpdateCommand,\n} from './commands/index.js';\n\nconst VERSION = '0.1.0';\n\nexport const program = new Command()\n .name('qazuor-claude-config')\n .description('CLI tool to install and manage Claude Code configurations')\n .version(VERSION);\n\n// Register all commands\nprogram.addCommand(createInitCommand());\nprogram.addCommand(createListCommand());\nprogram.addCommand(createAddCommand());\nprogram.addCommand(createRemoveCommand());\nprogram.addCommand(createStatusCommand());\nprogram.addCommand(createUpdateCommand());\nprogram.addCommand(createConfigureCommand());\n\nexport { VERSION };\n","/**\n * Commands exports\n */\n\nexport { createInitCommand } from './init.js';\nexport { createListCommand } from './list.js';\nexport { createAddCommand } from './add.js';\nexport { createRemoveCommand } from './remove.js';\nexport { createStatusCommand } from './status.js';\nexport { createUpdateCommand } from './update.js';\nexport { createConfigureCommand } from './configure.js';\n","/**\n * Init command - initialize Claude configuration\n */\n\nimport { Command } from 'commander';\nimport { resolveBundles } from '../../lib/bundles/resolver.js';\nimport { type CICDConfig, installCICDWithSpinner } from '../../lib/ci-cd/index.js';\nimport { installCodeStyle, showCodeStyleInstructions } from '../../lib/code-style/index.js';\nimport { installVSCodeConfig } from '../../lib/code-style/vscode-installer.js';\nimport { writeConfig } from '../../lib/config/index.js';\nimport {\n checkFeatureDependencies,\n formatDependencyReport,\n formatManualInstallInstructions,\n getRequiredFeatures,\n installDependencies,\n} from '../../lib/dependencies/index.js';\nimport {\n deriveHuskyConfigFromCodeStyle,\n installHuskyWithSpinner,\n} from '../../lib/git-hooks/index.js';\nimport { installHooks } from '../../lib/hooks/index.js';\nimport { installMcpServers } from '../../lib/mcp/index.js';\nimport { filterModules, loadRegistry } from '../../lib/modules/index.js';\nimport { installAllModules, installExtras } from '../../lib/modules/installer.js';\nimport {\n deriveToolSelectionFromCodeStyle,\n generatePackageJsonChanges,\n getInstallCommand,\n getSetupInstructions,\n readPackageJson,\n updatePackageJson,\n} from '../../lib/npm/index.js';\nimport { installPermissions, setCoAuthorSetting } from '../../lib/permissions/index.js';\nimport { replacePlaceholders, showReplacementReport } from '../../lib/placeholders/index.js';\nimport { generateClaudeMdWithSpinner } from '../../lib/scaffold/claude-md-generator.js';\nimport {\n detectProject,\n generateScaffoldWithProgress,\n getProjectDescription,\n getProjectName,\n hasExistingClaudeConfig,\n} from '../../lib/scaffold/index.js';\nimport { replaceTemplateConfigWithSpinner } from '../../lib/templates/config-replacer.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport {\n cleanup,\n confirm,\n setupGracefulCancellation,\n showCancelHint,\n} from '../../lib/utils/prompt-cancel.js';\nimport { spinner, withSpinner } from '../../lib/utils/spinner.js';\nimport { runWizard, showWizardSummary } from '../../lib/wizard/index.js';\nimport {\n type InitWizardContext,\n type InitWizardValues,\n createInitWizardConfig,\n} from '../../lib/wizard/init-steps.js';\nimport type { ClaudeConfig } from '../../types/config.js';\nimport type { ModuleCategory, ModuleDefinition, ModuleRegistry } from '../../types/modules.js';\nimport type { DependencyGenerationConfig, ToolSelection } from '../../types/package-json.js';\nimport type { TemplateConfig } from '../../types/template-config.js';\nimport {\n type SkippedMcpConfig,\n confirmFinalConfiguration,\n promptExistingProjectAction,\n showPostInstallInstructions,\n showSkippedMcpInstructions,\n} from '../prompts/index.js';\nimport { promptSaveGlobalDefaults } from '../prompts/template-config.js';\n\n/** Extended config result that includes skipped MCP configurations */\ninterface ConfigBuildResult {\n config: ClaudeConfig;\n skippedMcpConfigs: SkippedMcpConfig[];\n templateConfig?: Partial<TemplateConfig>;\n cicdConfig?: CICDConfig;\n}\n\n// Package version (will be replaced at build time or read from package.json)\nconst VERSION = '0.1.0';\n\ninterface InitOptions {\n bundles?: string;\n template?: string;\n branch?: string;\n yes?: boolean;\n force?: boolean;\n dryRun?: boolean;\n claudeOnly?: boolean;\n noPlaceholders?: boolean;\n noMcp?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create init command\n */\nexport function createInitCommand(): Command {\n const cmd = new Command('init')\n .description('Initialize Claude configuration in a project')\n .argument('[path]', 'Project path (default: current directory)')\n .option(\n '-b, --bundles <ids>',\n 'Comma-separated bundle IDs to install (e.g., \"react-tanstack-stack,testing-complete\")'\n )\n .option('-t, --template <url>', 'Remote git repo for templates')\n .option('--branch <name>', 'Branch/tag for remote template')\n .option('-y, --yes', 'Accept defaults, skip prompts')\n .option('-f, --force', 'Overwrite existing .claude/')\n .option('--dry-run', 'Show what would happen without making changes')\n .option('--claude-only', 'Only Claude config, no project scaffold')\n .option('--no-placeholders', 'Skip placeholder replacement')\n .option('--no-mcp', 'Skip MCP configuration')\n .option('-v, --verbose', 'Detailed output')\n .action(runInit);\n\n return cmd;\n}\n\n/**\n * Run init command\n */\nasync function runInit(path: string | undefined, options: InitOptions): Promise<void> {\n const projectPath = resolvePath(path || '.');\n\n logger.configure({ verbose: options.verbose, silent: false });\n\n logger.title('@qazuor/claude-code-config');\n logger.info(`Initializing Claude configuration in ${colors.primary(projectPath)}`);\n\n // Setup graceful cancellation for interactive mode\n if (!options.yes) {\n setupGracefulCancellation();\n showCancelHint();\n }\n\n try {\n // Check for existing configuration\n if (await hasExistingClaudeConfig(projectPath)) {\n if (!options.force) {\n const action = await promptExistingProjectAction();\n if (action === 'skip') {\n logger.info('Keeping existing configuration');\n return;\n }\n if (action !== 'overwrite' && action !== 'merge') {\n return;\n }\n }\n }\n\n // Detect project\n const detection = await detectProject(projectPath);\n if (detection.detected) {\n logger.newline();\n logger.success(`Detected ${detection.projectType || 'Node.js'} project`);\n if (detection.suggestedBundles && detection.suggestedBundles.length > 0) {\n logger.info(`Suggested bundles: ${colors.primary(detection.suggestedBundles.join(', '))}`);\n }\n }\n\n // Get templates path (bundled with package)\n const templatesPath = getTemplatesPath();\n\n // Load module registry\n const registry = await withSpinner(\n 'Loading module registry...',\n () => loadRegistry(templatesPath),\n { silent: options.dryRun }\n );\n\n // Collect configuration through prompts or defaults\n const buildResult = options.yes\n ? await buildDefaultConfig(projectPath, detection, options)\n : await buildInteractiveConfig(projectPath, detection, registry, options);\n\n if (!buildResult) {\n logger.warn('Configuration cancelled');\n return;\n }\n\n const { config, skippedMcpConfigs, templateConfig, cicdConfig } = buildResult;\n\n // Store template config in main config\n if (templateConfig) {\n config.templateConfig = templateConfig;\n }\n\n // Show final summary and confirm\n if (!options.yes && !options.dryRun) {\n const confirmed = await confirmFinalConfiguration(config);\n if (!confirmed) {\n logger.warn('Configuration cancelled');\n return;\n }\n }\n\n if (options.dryRun) {\n logger.newline();\n logger.title('Dry Run - No changes made');\n showConfigSummary(config);\n return;\n }\n\n // Execute installation\n await executeInstallation(projectPath, config, registry, templatesPath, options, cicdConfig);\n\n // Apply template configuration (replace {{PLACEHOLDER}} patterns)\n if (templateConfig && !options.noPlaceholders) {\n const claudePath = joinPath(projectPath, '.claude');\n await replaceTemplateConfigWithSpinner(claudePath, templateConfig);\n\n // Offer to save as global defaults\n if (!options.yes) {\n await promptSaveGlobalDefaults(templateConfig);\n }\n }\n\n // Check dependencies\n const features = getRequiredFeatures({\n hooks: config.extras.hooks,\n mcp: config.mcp,\n });\n\n if (features.length > 0) {\n const depReport = await checkFeatureDependencies(features);\n if (depReport.missing.length > 0) {\n logger.section('System Dependencies', '🔧');\n logger.warn(`Found ${depReport.missing.length} missing system dependencies`);\n logger.newline();\n\n // Show what's missing\n for (const dep of depReport.missing) {\n logger.item(`${dep.name} - ${dep.description}`);\n }\n logger.newline();\n\n if (!options.yes) {\n const shouldInstall = await confirm({\n message: 'Would you like to try installing these dependencies now?',\n default: true,\n });\n\n if (shouldInstall) {\n logger.newline();\n const results = await installDependencies(depReport.missing, {\n onProgress: (dep, index, total) => {\n spinner.start(`Installing ${dep.name} (${index + 1}/${total})...`);\n },\n });\n\n const successful = results.filter((r) => r.success);\n const failed = results.filter((r) => !r.success);\n\n if (successful.length > 0) {\n spinner.succeed(`Installed ${successful.length} dependencies successfully`);\n }\n\n if (failed.length > 0) {\n spinner.fail(`Failed to install ${failed.length} dependencies`);\n logger.newline();\n logger.warn('The following dependencies could not be installed automatically:');\n for (const result of failed) {\n logger.item(`${result.dep.name}: ${result.error}`);\n }\n\n // Show manual instructions for failed ones\n const failedReport = {\n ...depReport,\n missing: failed.map((r) => r.dep),\n };\n logger.newline();\n formatDependencyReport(failedReport);\n }\n } else {\n // User chose not to install - show manual instructions\n logger.newline();\n logger.info('You can install them later using the following commands:');\n const instructions = formatManualInstallInstructions(depReport);\n for (const line of instructions) {\n logger.raw(line);\n }\n }\n } else {\n // Non-interactive mode - just show the report\n formatDependencyReport(depReport);\n }\n }\n }\n\n // Show post-install instructions\n showPostInstallInstructions(config);\n\n // Show MCP configuration instructions for skipped fields\n if (skippedMcpConfigs.length > 0) {\n showSkippedMcpInstructions(skippedMcpConfigs, config.mcp.level);\n }\n\n // Cleanup after successful completion\n cleanup();\n } catch (error) {\n cleanup();\n spinner.fail();\n logger.error(`Initialization failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Build configuration with defaults (for --yes flag or --bundles flag)\n */\nasync function buildDefaultConfig(\n projectPath: string,\n detection: Awaited<ReturnType<typeof detectProject>>,\n options: InitOptions\n): Promise<ConfigBuildResult> {\n // Determine which bundles to use\n let bundleIds: string[] = [];\n\n if (options.bundles) {\n // Use bundles from command line\n bundleIds = options.bundles.split(',').map((id) => id.trim());\n } else if (detection.suggestedBundles && detection.suggestedBundles.length > 0) {\n // Use suggested bundles from detection\n bundleIds = detection.suggestedBundles;\n } else {\n // Default minimal bundles\n bundleIds = ['git-workflow', 'testing-minimal', 'quality-minimal'];\n }\n\n // Resolve bundles to modules\n const resolvedModules = resolveBundles(bundleIds);\n\n const projectName = (await getProjectName(projectPath)) || 'my-project';\n const projectDesc = (await getProjectDescription(projectPath)) || 'My project';\n\n // Determine extras based on selected bundles\n const hasPlanning = bundleIds.some((id) => id.includes('planning'));\n const hasTesting = bundleIds.some((id) => id.includes('testing'));\n\n const config: ClaudeConfig = {\n version: VERSION,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: {\n name: projectName,\n description: projectDesc,\n org: 'my-org',\n repo: projectName.toLowerCase().replace(/\\s+/g, '-'),\n entityType: 'item',\n entityTypePlural: 'items',\n },\n preferences: {\n language: 'en',\n responseLanguage: 'en',\n includeCoAuthor: true,\n },\n mcp: {\n level: 'project',\n servers: [],\n },\n modules: {\n agents: { selected: resolvedModules.agents, excluded: [] },\n skills: { selected: resolvedModules.skills, excluded: [] },\n commands: { selected: resolvedModules.commands, excluded: [] },\n docs: { selected: resolvedModules.docs, excluded: [] },\n },\n extras: {\n schemas: hasTesting,\n scripts: false,\n hooks: { enabled: false },\n sessions: hasPlanning,\n },\n scaffold: {\n type: options.claudeOnly ? 'claude-only' : 'claude-only',\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n selectedBundles: bundleIds,\n },\n };\n\n return {\n config,\n skippedMcpConfigs: [], // No MCP servers in default mode\n };\n}\n\n/**\n * Build configuration interactively using wizard with back navigation\n */\nasync function buildInteractiveConfig(\n projectPath: string,\n detection: Awaited<ReturnType<typeof detectProject>>,\n registry: ModuleRegistry,\n options: InitOptions\n): Promise<ConfigBuildResult | null> {\n // Get initial project info for defaults\n const projectName = await getProjectName(projectPath);\n const projectDesc = await getProjectDescription(projectPath);\n\n // Create wizard configuration\n const wizardConfig = createInitWizardConfig(\n projectPath,\n {\n detected: detection.detected,\n projectType: detection.projectType,\n packageManager: detection.packageManager,\n suggestedBundles: detection.suggestedBundles,\n detectedTechnologies: detection.detectedTechnologies,\n },\n registry\n );\n\n // Initial context with detected values and project info\n const initialContext: Partial<InitWizardContext> = {\n projectPath,\n registry,\n detection: {\n detected: detection.detected,\n projectType: detection.projectType,\n packageManager: detection.packageManager,\n suggestedBundles: detection.suggestedBundles,\n detectedTechnologies: detection.detectedTechnologies,\n },\n projectInfo: {\n name: projectName || '',\n description: projectDesc || '',\n org: '',\n repo: projectName?.toLowerCase().replace(/\\s+/g, '-') || '',\n entityType: 'item',\n entityTypePlural: 'items',\n },\n };\n\n // Run the wizard with explicit types\n const wizardResult = await runWizard<InitWizardValues, InitWizardContext>(\n wizardConfig,\n initialContext\n );\n\n if (wizardResult.cancelled) {\n return null;\n }\n\n // Show wizard completion summary\n showWizardSummary(wizardResult.state);\n\n // Extract values from wizard result\n const {\n projectInfo,\n preferences,\n scaffoldOptions,\n bundleSelection,\n hookConfig,\n mcpConfig: mcpResult,\n permissionsConfig,\n codeStyleConfig,\n cicdConfig,\n folderPreferences,\n templateConfig: templateConfigResult,\n } = wizardResult.values;\n\n // Handle MCP skip option\n let mcpConfig: ClaudeConfig['mcp'] = { level: 'project', servers: [] };\n let skippedMcpConfigs: SkippedMcpConfig[] = [];\n\n if (!options.noMcp && mcpResult) {\n mcpConfig = mcpResult.config;\n skippedMcpConfigs = mcpResult.skippedConfigs;\n }\n\n // Determine extras based on selected bundles\n const hasPlanning = bundleSelection.selectedBundles.some((id) => id.includes('planning'));\n const hasTesting = bundleSelection.selectedBundles.some((id) => id.includes('testing'));\n\n // Resolve bundles to modules\n const resolvedModules = resolveBundles(bundleSelection.selectedBundles);\n\n // Merge with additional individual modules\n const modules = {\n agents: [...new Set([...resolvedModules.agents, ...bundleSelection.additionalModules.agents])],\n skills: [...new Set([...resolvedModules.skills, ...bundleSelection.additionalModules.skills])],\n commands: [\n ...new Set([...resolvedModules.commands, ...bundleSelection.additionalModules.commands]),\n ],\n docs: [...new Set([...resolvedModules.docs, ...bundleSelection.additionalModules.docs])],\n };\n\n const config: ClaudeConfig = {\n version: VERSION,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: projectInfo,\n preferences,\n mcp: mcpConfig,\n modules: {\n agents: { selected: modules.agents, excluded: [] },\n skills: { selected: modules.skills, excluded: [] },\n commands: { selected: modules.commands, excluded: [] },\n docs: { selected: modules.docs, excluded: [] },\n },\n extras: {\n schemas: hasTesting,\n scripts: false,\n hooks: hookConfig,\n sessions: hasPlanning,\n codeStyle: codeStyleConfig,\n folderPreferences: folderPreferences || undefined,\n },\n scaffold: {\n type: scaffoldOptions.type,\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n permissions: permissionsConfig,\n selectedBundles: bundleSelection.selectedBundles,\n },\n };\n\n return {\n config,\n skippedMcpConfigs,\n templateConfig: templateConfigResult,\n cicdConfig,\n };\n}\n\n/**\n * Execute the installation\n */\nasync function executeInstallation(\n projectPath: string,\n config: ClaudeConfig,\n registry: ModuleRegistry,\n templatesPath: string,\n options: InitOptions,\n cicdConfig?: CICDConfig\n): Promise<void> {\n logger.newline();\n logger.title('Installing Configuration');\n\n // Generate scaffold if needed\n if (config.scaffold.type === 'full-project') {\n const scaffoldResult = await generateScaffoldWithProgress(projectPath, {\n type: config.scaffold.type,\n });\n config.scaffold.createdStructure = [\n ...scaffoldResult.createdDirs,\n ...scaffoldResult.createdFiles,\n ];\n }\n\n // Generate CLAUDE.md in project root\n const claudeMdResult = await generateClaudeMdWithSpinner(projectPath, config.project, {\n overwrite: options.force,\n templateConfig: config.templateConfig,\n claudeConfig: config,\n });\n if (claudeMdResult.error) {\n logger.warn(`CLAUDE.md generation warning: ${claudeMdResult.error}`);\n } else if (claudeMdResult.skipped) {\n logger.info('CLAUDE.md already exists, skipped');\n }\n\n // Resolve modules (tags -> actual module definitions)\n const modulesByCategory: Record<ModuleCategory, ModuleDefinition[]> = {\n agents: filterModules(registry, 'agents', config.modules.agents.selected),\n skills: filterModules(registry, 'skills', config.modules.skills.selected),\n commands: filterModules(registry, 'commands', config.modules.commands.selected),\n docs: filterModules(registry, 'docs', config.modules.docs.selected),\n };\n\n // Install modules\n const installResults = await installAllModules(modulesByCategory, {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n });\n\n // Update config with actual installed module IDs (not tags)\n config.modules.agents.selected = installResults.agents?.installed ?? [];\n config.modules.skills.selected = installResults.skills?.installed ?? [];\n config.modules.commands.selected = installResults.commands?.installed ?? [];\n config.modules.docs.selected = installResults.docs?.installed ?? [];\n\n // Install extras\n await installExtras(\n {\n schemas: config.extras.schemas,\n scripts: config.extras.scripts,\n hooks: config.extras.hooks.enabled,\n sessions: config.extras.sessions,\n },\n {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n }\n );\n\n // Replace placeholders\n if (!options.noPlaceholders) {\n const claudePath = joinPath(projectPath, '.claude');\n const report = await replacePlaceholders(claudePath, config.project);\n config.customizations.placeholdersReplaced = true;\n\n if (options.verbose) {\n showReplacementReport(report);\n }\n }\n\n // Install hooks\n if (config.extras.hooks.enabled) {\n const hookResult = await installHooks(projectPath, config.extras.hooks);\n if (hookResult.errors.length > 0) {\n logger.warn(`Hook installation warnings: ${hookResult.errors.join(', ')}`);\n }\n }\n\n // Install MCP servers\n if (config.mcp.servers.length > 0) {\n const mcpResult = await installMcpServers(projectPath, config.mcp);\n if (!mcpResult.success) {\n logger.warn(`MCP installation warnings: ${mcpResult.errors.join(', ')}`);\n }\n }\n\n // Install permissions\n const permissions = config.customizations.permissions;\n if (permissions) {\n await installPermissions(projectPath, permissions, 'project');\n }\n\n // Set co-author setting\n await setCoAuthorSetting(projectPath, config.preferences.includeCoAuthor, 'project');\n\n // Install code style configurations\n if (config.extras.codeStyle?.enabled) {\n const codeStyleResult = await installCodeStyle(projectPath, config.extras.codeStyle, {\n overwrite: options.force,\n });\n if (codeStyleResult.errors.length > 0) {\n logger.warn(`Code style installation warnings: ${codeStyleResult.errors.join(', ')}`);\n }\n\n // Install VSCode settings for code style tools\n const vscodeResult = await installVSCodeConfig(projectPath, config.extras.codeStyle, {\n overwrite: options.force,\n merge: !options.force, // Merge with existing settings if not forcing\n });\n if (vscodeResult.settings.error) {\n logger.warn(`VSCode settings warning: ${vscodeResult.settings.error}`);\n } else if (vscodeResult.settings.created || vscodeResult.settings.updated) {\n logger.info('VSCode settings configured for code style tools');\n }\n\n // Install Husky hooks if commitlint with husky integration is enabled\n const huskyConfig = deriveHuskyConfigFromCodeStyle(config.extras.codeStyle);\n if (huskyConfig) {\n const huskyResult = await installHuskyWithSpinner(projectPath, huskyConfig, {\n overwrite: options.force,\n });\n if (huskyResult.errors.length > 0) {\n logger.warn(`Husky installation warnings: ${huskyResult.errors.join(', ')}`);\n }\n }\n }\n\n // Install CI/CD workflows\n if (cicdConfig?.enabled) {\n const cicdResult = await installCICDWithSpinner(projectPath, cicdConfig, {\n overwrite: options.force,\n });\n if (cicdResult.errors.length > 0) {\n logger.warn(`CI/CD installation warnings: ${cicdResult.errors.join(', ')}`);\n }\n }\n\n // Write config\n await writeConfig(projectPath, config);\n\n logger.newline();\n logger.success('Configuration installed successfully!');\n\n // Show code style instructions if needed\n if (config.extras.codeStyle?.enabled) {\n showCodeStyleInstructions(config.extras.codeStyle);\n }\n\n // Update package.json with dependencies if code style tools are enabled\n if (config.extras.codeStyle?.enabled) {\n await handlePackageJsonUpdate(projectPath, config, options);\n }\n}\n\n/**\n * Handle package.json update with code style dependencies\n */\nasync function handlePackageJsonUpdate(\n projectPath: string,\n config: ClaudeConfig,\n options: InitOptions\n): Promise<void> {\n const codeStyle = config.extras.codeStyle;\n if (!codeStyle?.enabled) return;\n\n // Derive tool selection from code style config\n const toolSelection = deriveToolSelectionFromCodeStyle({\n biome: codeStyle.biome,\n prettier: codeStyle.prettier,\n commitlint: codeStyle.commitlint,\n });\n\n // Check if there are any tools selected\n const hasTools = toolSelection.linter || toolSelection.formatter || toolSelection.commitlint;\n if (!hasTools) return;\n\n // Generate package.json changes\n const packageManager = config.preferences.packageManager || 'pnpm';\n const depConfig: DependencyGenerationConfig = {\n tools: toolSelection as ToolSelection,\n packageManager,\n project: {\n name: config.project.name,\n description: config.project.description,\n author: config.project.author,\n repository:\n config.project.org && config.project.repo\n ? `https://github.com/${config.project.org}/${config.project.repo}`\n : undefined,\n },\n };\n\n const changes = generatePackageJsonChanges(depConfig);\n\n // Check if there are any changes to make\n const hasChanges =\n Object.keys(changes.scripts || {}).length > 0 ||\n Object.keys(changes.dependencies || {}).length > 0 ||\n Object.keys(changes.devDependencies || {}).length > 0;\n\n if (!hasChanges) return;\n\n // Show what would be added\n logger.newline();\n logger.section('Package.json Updates', '📦');\n\n // Check if package.json exists\n const existingPackageJson = await readPackageJson(projectPath);\n const packageJsonExists = existingPackageJson !== null;\n\n if (!packageJsonExists) {\n logger.info('No package.json found. A new one will be created.');\n }\n\n // Show proposed devDependencies\n if (changes.devDependencies && Object.keys(changes.devDependencies).length > 0) {\n logger.subtitle('Dev Dependencies to add:');\n for (const [name, version] of Object.entries(changes.devDependencies)) {\n logger.item(`${name}@${version}`);\n }\n }\n\n // Show proposed scripts\n if (changes.scripts && Object.keys(changes.scripts).length > 0) {\n logger.newline();\n logger.subtitle('Scripts to add:');\n for (const [name, command] of Object.entries(changes.scripts)) {\n logger.item(`${name}: ${command}`);\n }\n }\n\n // Ask user if they want to update package.json\n if (!options.yes) {\n logger.newline();\n const shouldUpdate = await confirm({\n message: packageJsonExists\n ? 'Would you like to update package.json with these changes?'\n : 'Would you like to create package.json with these settings?',\n default: true,\n });\n\n if (!shouldUpdate) {\n logger.info('Skipped package.json update. You can add these manually later.');\n showManualDependencyInstructions(changes, packageManager, toolSelection as ToolSelection);\n return;\n }\n }\n\n // Apply changes\n if (!options.dryRun) {\n const result = await updatePackageJson(projectPath, changes, {\n scriptsMerge: 'skip-existing',\n dependenciesMerge: 'skip-existing',\n createIfMissing: true,\n });\n\n if (result.success) {\n if (result.created) {\n logger.success('Created package.json');\n } else if (result.modified) {\n logger.success('Updated package.json');\n }\n\n // Show what was added/skipped\n if (result.addedDevDependencies.length > 0) {\n logger.info(`Added ${result.addedDevDependencies.length} dev dependencies`);\n }\n if (result.skippedDevDependencies.length > 0) {\n logger.info(\n `Skipped ${result.skippedDevDependencies.length} existing dependencies: ${result.skippedDevDependencies.join(', ')}`\n );\n }\n if (result.addedScripts.length > 0) {\n logger.info(`Added ${result.addedScripts.length} scripts`);\n }\n if (result.skippedScripts.length > 0) {\n logger.info(\n `Skipped ${result.skippedScripts.length} existing scripts: ${result.skippedScripts.join(', ')}`\n );\n }\n\n // Show install command\n logger.newline();\n logger.subtitle('Next Steps');\n logger.info('Run the following command to install dependencies:');\n logger.raw(` ${getInstallCommand(packageManager)}`);\n\n // Show setup instructions if any\n const setupInstructions = getSetupInstructions(toolSelection as ToolSelection);\n if (setupInstructions.length > 0) {\n logger.newline();\n logger.subtitle('Additional Setup');\n for (const instruction of setupInstructions) {\n logger.raw(` ${instruction}`);\n }\n }\n } else {\n logger.warn(`Failed to update package.json: ${result.error}`);\n showManualDependencyInstructions(changes, packageManager, toolSelection as ToolSelection);\n }\n } else {\n logger.info('Dry run - package.json would be updated with above changes');\n }\n}\n\n/**\n * Show manual instructions for adding dependencies\n */\nfunction showManualDependencyInstructions(\n changes: ReturnType<typeof generatePackageJsonChanges>,\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun',\n toolSelection: ToolSelection\n): void {\n logger.newline();\n logger.subtitle('Manual Installation');\n\n // Show install command for dependencies\n if (changes.devDependencies && Object.keys(changes.devDependencies).length > 0) {\n const pkgNames = Object.keys(changes.devDependencies).join(' ');\n let installCmd: string;\n switch (packageManager) {\n case 'npm':\n installCmd = `npm install -D ${pkgNames}`;\n break;\n case 'yarn':\n installCmd = `yarn add -D ${pkgNames}`;\n break;\n case 'pnpm':\n installCmd = `pnpm add -D ${pkgNames}`;\n break;\n case 'bun':\n installCmd = `bun add -D ${pkgNames}`;\n break;\n default:\n installCmd = `npm install -D ${pkgNames}`;\n }\n logger.info('Install dev dependencies:');\n logger.raw(` ${installCmd}`);\n }\n\n // Show scripts to add\n if (changes.scripts && Object.keys(changes.scripts).length > 0) {\n logger.newline();\n logger.info('Add these scripts to package.json:');\n for (const [name, command] of Object.entries(changes.scripts)) {\n logger.raw(` \"${name}\": \"${command}\"`);\n }\n }\n\n // Show setup instructions\n const setupInstructions = getSetupInstructions(toolSelection);\n if (setupInstructions.length > 0) {\n logger.newline();\n logger.subtitle('Additional Setup');\n for (const instruction of setupInstructions) {\n logger.raw(` ${instruction}`);\n }\n }\n}\n\n/**\n * Show config summary\n */\nfunction showConfigSummary(config: ClaudeConfig): void {\n logger.subtitle('Configuration');\n logger.keyValue('Project', config.project.name);\n logger.keyValue('Preset', 'custom');\n logger.keyValue('Agents', String(config.modules.agents.selected.length));\n logger.keyValue('Skills', String(config.modules.skills.selected.length));\n logger.keyValue('Commands', String(config.modules.commands.selected.length));\n logger.keyValue('Docs', String(config.modules.docs.selected.length));\n}\n","/**\n * Bundle resolver - resolves bundles to individual modules\n */\n\nimport {\n BUNDLE_CATEGORY_NAMES,\n getAllBundles,\n getBundleById,\n getBundlesGroupedByCategory,\n} from '../../constants/bundles.js';\nimport type {\n BundleDefinition,\n BundleSelectionResult,\n ResolvedBundle,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\n\n/**\n * Resolve a bundle to its constituent modules\n */\nexport function resolveBundle(bundle: BundleDefinition): ResolvedBundle {\n const modules: ResolvedBundle['modules'] = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n for (const moduleRef of bundle.modules) {\n switch (moduleRef.category) {\n case 'agents':\n modules.agents.push(moduleRef.id);\n break;\n case 'skills':\n modules.skills.push(moduleRef.id);\n break;\n case 'commands':\n modules.commands.push(moduleRef.id);\n break;\n case 'docs':\n modules.docs.push(moduleRef.id);\n break;\n }\n }\n\n return {\n bundle,\n modules,\n };\n}\n\n/**\n * Resolve multiple bundles to a combined module selection\n */\nexport function resolveBundles(bundleIds: string[]): ModuleSelectionResult {\n const result: ModuleSelectionResult = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n const seenModules = {\n agents: new Set<string>(),\n skills: new Set<string>(),\n commands: new Set<string>(),\n docs: new Set<string>(),\n };\n\n for (const bundleId of bundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle) continue;\n\n const resolved = resolveBundle(bundle);\n\n // Add modules without duplicates\n for (const id of resolved.modules.agents) {\n if (!seenModules.agents.has(id)) {\n seenModules.agents.add(id);\n result.agents.push(id);\n }\n }\n for (const id of resolved.modules.skills) {\n if (!seenModules.skills.has(id)) {\n seenModules.skills.add(id);\n result.skills.push(id);\n }\n }\n for (const id of resolved.modules.commands) {\n if (!seenModules.commands.has(id)) {\n seenModules.commands.add(id);\n result.commands.push(id);\n }\n }\n for (const id of resolved.modules.docs) {\n if (!seenModules.docs.has(id)) {\n seenModules.docs.add(id);\n result.docs.push(id);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Merge bundle selection with additional individual modules\n */\nexport function mergeBundleSelection(bundleResult: BundleSelectionResult): ModuleSelectionResult {\n // Start with resolved bundles\n const result = resolveBundles(bundleResult.selectedBundles);\n\n // Track what we have\n const seenModules = {\n agents: new Set(result.agents),\n skills: new Set(result.skills),\n commands: new Set(result.commands),\n docs: new Set(result.docs),\n };\n\n // Add additional modules without duplicates\n for (const id of bundleResult.additionalModules.agents) {\n if (!seenModules.agents.has(id)) {\n result.agents.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.skills) {\n if (!seenModules.skills.has(id)) {\n result.skills.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.commands) {\n if (!seenModules.commands.has(id)) {\n result.commands.push(id);\n }\n }\n for (const id of bundleResult.additionalModules.docs) {\n if (!seenModules.docs.has(id)) {\n result.docs.push(id);\n }\n }\n\n return result;\n}\n\n/**\n * Find bundles that contain a specific module\n */\nexport function findBundlesContainingModule(\n moduleId: string,\n category: 'agents' | 'skills' | 'commands' | 'docs'\n): BundleDefinition[] {\n return getAllBundles().filter((bundle) =>\n bundle.modules.some((m) => m.id === moduleId && m.category === category)\n );\n}\n\n/**\n * Get suggested bundles based on selected modules\n */\nexport function getSuggestedBundles(selectedModules: ModuleSelectionResult): BundleDefinition[] {\n const allBundles = getAllBundles();\n const suggestions: BundleDefinition[] = [];\n\n for (const bundle of allBundles) {\n const resolved = resolveBundle(bundle);\n\n // Check overlap with selected modules\n let matchCount = 0;\n let totalInBundle = 0;\n\n for (const agentId of resolved.modules.agents) {\n totalInBundle++;\n if (selectedModules.agents.includes(agentId)) matchCount++;\n }\n for (const skillId of resolved.modules.skills) {\n totalInBundle++;\n if (selectedModules.skills.includes(skillId)) matchCount++;\n }\n for (const commandId of resolved.modules.commands) {\n totalInBundle++;\n if (selectedModules.commands.includes(commandId)) matchCount++;\n }\n for (const docId of resolved.modules.docs) {\n totalInBundle++;\n if (selectedModules.docs.includes(docId)) matchCount++;\n }\n\n // Suggest if at least 30% overlap but not 100%\n const overlapRatio = totalInBundle > 0 ? matchCount / totalInBundle : 0;\n if (overlapRatio >= 0.3 && overlapRatio < 1.0) {\n suggestions.push(bundle);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Format bundle for display (short version for list names)\n */\nexport function formatBundleForDisplay(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const parts: string[] = [];\n\n if (resolved.modules.agents.length > 0) {\n parts.push(`${resolved.modules.agents.length} agents`);\n }\n if (resolved.modules.skills.length > 0) {\n parts.push(`${resolved.modules.skills.length} skills`);\n }\n if (resolved.modules.commands.length > 0) {\n parts.push(`${resolved.modules.commands.length} commands`);\n }\n if (resolved.modules.docs.length > 0) {\n parts.push(`${resolved.modules.docs.length} docs`);\n }\n\n return `${bundle.name} (${parts.join(', ')})`;\n}\n\n/**\n * Format bundle description with full details for selection prompts\n * Shows detailed multiline info that appears when hovering over a choice\n */\nexport function formatBundleDetailedDescription(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const lines: string[] = [];\n\n // Main description\n lines.push(bundle.description);\n lines.push('');\n\n // Responsibilities (if available)\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push('📋 Responsibilities:');\n for (const resp of bundle.responsibilities.slice(0, 3)) {\n lines.push(` • ${resp}`);\n }\n if (bundle.responsibilities.length > 3) {\n lines.push(` • ...and ${bundle.responsibilities.length - 3} more`);\n }\n lines.push('');\n }\n\n // Use cases (if available and no responsibilities)\n if (bundle.useCases && bundle.useCases.length > 0 && !bundle.responsibilities?.length) {\n lines.push('🎯 Use cases:');\n for (const uc of bundle.useCases.slice(0, 2)) {\n lines.push(` • ${uc}`);\n }\n lines.push('');\n }\n\n // Modules breakdown\n lines.push('📦 Includes:');\n if (resolved.modules.agents.length > 0) {\n lines.push(\n ` 🤖 Agents (${resolved.modules.agents.length}): ${resolved.modules.agents.join(', ')}`\n );\n }\n if (resolved.modules.skills.length > 0) {\n lines.push(\n ` ⚡ Skills (${resolved.modules.skills.length}): ${resolved.modules.skills.join(', ')}`\n );\n }\n if (resolved.modules.commands.length > 0) {\n const cmds = resolved.modules.commands.map((c) => `/${c}`).join(', ');\n lines.push(` 💻 Commands (${resolved.modules.commands.length}): ${cmds}`);\n }\n if (resolved.modules.docs.length > 0) {\n const docsPreview = resolved.modules.docs.slice(0, 4);\n const more =\n resolved.modules.docs.length > 4 ? `, +${resolved.modules.docs.length - 4} more` : '';\n lines.push(` 📚 Docs (${resolved.modules.docs.length}): ${docsPreview.join(', ')}${more}`);\n }\n\n // Tech stack\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push('');\n lines.push(`🔧 Tech: ${bundle.techStack.join(', ')}`);\n }\n\n // Complexity indicator\n if (bundle.complexity) {\n const complexityLabel =\n bundle.complexity === 'minimal'\n ? '⚡ Minimal - Quick setup'\n : bundle.complexity === 'comprehensive'\n ? '🔥 Comprehensive - Full featured'\n : '⭐ Standard';\n lines.push(`📊 ${complexityLabel}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format bundle with rich multi-line description for display\n * Use this when you can show multiple lines\n */\nexport function formatBundleRichDescription(bundle: BundleDefinition): string[] {\n const resolved = resolveBundle(bundle);\n const lines: string[] = [];\n\n // Main description\n lines.push(bundle.description);\n\n // Responsibilities preview\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push('');\n lines.push('Responsibilities:');\n for (const resp of bundle.responsibilities.slice(0, 3)) {\n lines.push(` • ${resp}`);\n }\n if (bundle.responsibilities.length > 3) {\n lines.push(` • ...and ${bundle.responsibilities.length - 3} more`);\n }\n }\n\n // Use cases preview\n if (bundle.useCases && bundle.useCases.length > 0) {\n lines.push('');\n lines.push('Use cases:');\n for (const uc of bundle.useCases.slice(0, 2)) {\n lines.push(` • ${uc}`);\n }\n }\n\n // Modules breakdown\n lines.push('');\n lines.push('Includes:');\n if (resolved.modules.agents.length > 0) {\n lines.push(` 🤖 Agents: ${resolved.modules.agents.join(', ')}`);\n }\n if (resolved.modules.skills.length > 0) {\n lines.push(` ⚡ Skills: ${resolved.modules.skills.join(', ')}`);\n }\n if (resolved.modules.commands.length > 0) {\n lines.push(` 💻 Commands: /${resolved.modules.commands.join(', /')}`);\n }\n if (resolved.modules.docs.length > 0) {\n const docsPreview = resolved.modules.docs.slice(0, 5);\n const more =\n resolved.modules.docs.length > 5 ? `, +${resolved.modules.docs.length - 5} more` : '';\n lines.push(` 📚 Docs: ${docsPreview.join(', ')}${more}`);\n }\n\n // Tech stack\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push('');\n lines.push(`🔧 Tech: ${bundle.techStack.join(', ')}`);\n }\n\n return lines;\n}\n\n/**\n * Get bundle category display name\n */\nexport function getBundleCategoryName(category: string): string {\n return BUNDLE_CATEGORY_NAMES[category] ?? category;\n}\n\n/**\n * Export convenience access to constants\n */\nexport { getAllBundles, getBundleById, getBundlesGroupedByCategory, BUNDLE_CATEGORY_NAMES };\n","/**\n * Predefined bundles for grouping related modules\n */\n\nimport type { BundleDefinition } from '../types/bundles.js';\n\n/**\n * All available bundles\n */\nexport const BUNDLES: BundleDefinition[] = [\n // ===================\n // STACK BUNDLES\n // ===================\n {\n id: 'react-tanstack-stack',\n name: 'React + TanStack Stack',\n description: 'React with TanStack Router/Start for admin dashboards and SPAs',\n category: 'stack',\n longDescription:\n 'Complete stack for building React applications with TanStack Router and Start. Includes React component development, TanStack-specific patterns, and related testing/quality tools.',\n techStack: ['React', 'TanStack Start', 'TanStack Router', 'TanStack Query', 'TypeScript'],\n tags: ['react', 'tanstack', 'admin', 'spa'],\n complexity: 'comprehensive',\n responsibilities: [\n 'React component architecture and best practices',\n 'TanStack Router file-based routing patterns',\n 'Server state management with TanStack Query',\n 'Form handling with React Hook Form + Zod',\n 'UI components with Shadcn/Radix primitives',\n ],\n scope: 'Full frontend stack for React SPAs and admin dashboards',\n useCases: [\n 'Admin dashboards and internal tools',\n 'Complex single-page applications',\n 'Data-heavy applications with tables/forms',\n 'Projects using TanStack ecosystem',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'react-senior-dev',\n role: 'React Architecture',\n responsibilities: ['Component design', 'State management', 'Performance optimization'],\n },\n {\n id: 'tanstack-start-engineer',\n role: 'TanStack Specialist',\n responsibilities: ['Router setup', 'Query patterns', 'SSR configuration'],\n },\n {\n id: 'ux-ui-designer',\n role: 'UI/UX Design',\n responsibilities: ['Component styling', 'Accessibility', 'Design system'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'React Testing Library patterns' },\n { id: 'shadcn-specialist', purpose: 'Shadcn UI component usage' },\n { id: 'accessibility-audit', purpose: 'WCAG compliance' },\n { id: 'tanstack-query-patterns', purpose: 'Query/mutation patterns' },\n { id: 'react-hook-form-patterns', purpose: 'Form validation patterns' },\n { id: 'zustand-patterns', purpose: 'Client state management' },\n ],\n commands: [],\n docs: [{ id: 'design-standards', topic: 'UI/UX design standards' }],\n },\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'tanstack-start-engineer', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'zustand-patterns', category: 'skills', optional: true },\n { id: 'design-standards', category: 'docs', requiredBy: ['ux-ui-designer'], optional: true },\n ],\n },\n {\n id: 'astro-react-stack',\n name: 'Astro + React Stack',\n description: 'Astro with React islands for content-focused websites',\n category: 'stack',\n longDescription:\n 'Stack for building fast, content-focused websites with Astro and React components. Perfect for marketing sites, blogs, and documentation sites.',\n techStack: ['Astro', 'React', 'Tailwind CSS', 'MDX', 'TypeScript'],\n tags: ['astro', 'react', 'ssg', 'content'],\n complexity: 'standard',\n responsibilities: [\n 'Static site generation with Astro',\n 'Interactive React islands for dynamic content',\n 'SEO optimization and meta tags',\n 'Performance-first architecture',\n 'Content management with MDX',\n ],\n scope: 'Content-focused websites with selective interactivity',\n useCases: [\n 'Marketing and landing pages',\n 'Documentation sites',\n 'Blogs and content platforms',\n 'Portfolio websites',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'astro-engineer',\n role: 'Astro Specialist',\n responsibilities: ['Routing', 'Islands architecture', 'Build optimization'],\n },\n {\n id: 'react-senior-dev',\n role: 'React Components',\n responsibilities: ['Interactive components', 'Client hydration'],\n },\n {\n id: 'seo-ai-specialist',\n role: 'SEO Optimization',\n responsibilities: ['Meta tags', 'Structured data', 'Performance'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'Component testing' },\n { id: 'vercel-specialist', purpose: 'Deployment optimization' },\n { id: 'performance-audit', purpose: 'Core Web Vitals' },\n ],\n commands: [],\n docs: [],\n },\n modules: [\n { id: 'astro-engineer', category: 'agents' },\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'seo-ai-specialist', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'vercel-specialist', category: 'skills' },\n { id: 'performance-audit', category: 'skills' },\n ],\n },\n {\n id: 'nextjs-prisma-stack',\n name: 'Next.js + Prisma Stack',\n description: 'Full-stack Next.js with Prisma for modern web apps',\n category: 'stack',\n longDescription:\n 'Complete full-stack setup with Next.js App Router and Prisma ORM. Includes React components, Server Actions, and database patterns.',\n techStack: ['Next.js', 'React', 'Prisma', 'Tailwind CSS', 'TypeScript'],\n tags: ['nextjs', 'prisma', 'fullstack', 'react'],\n complexity: 'comprehensive',\n alternativeTo: ['react-tanstack-stack', 'astro-react-stack'],\n responsibilities: [\n 'Full-stack React with Next.js App Router',\n 'Database modeling with Prisma ORM',\n 'Server Actions and API routes',\n 'Authentication with NextAuth.js',\n 'Deployment on Vercel',\n ],\n scope: 'Complete full-stack web application development',\n useCases: [\n 'SaaS applications',\n 'E-commerce platforms',\n 'Full-stack web apps with auth',\n 'Projects needing SSR/SSG flexibility',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'nextjs-engineer',\n role: 'Next.js Specialist',\n responsibilities: ['App Router', 'Server Actions', 'Caching strategies'],\n },\n {\n id: 'react-senior-dev',\n role: 'React Components',\n responsibilities: ['Client components', 'State management'],\n },\n {\n id: 'prisma-engineer',\n role: 'Database',\n responsibilities: ['Schema design', 'Migrations', 'Query optimization'],\n },\n {\n id: 'ux-ui-designer',\n role: 'UI/UX',\n responsibilities: ['Design system', 'Responsive design'],\n },\n ],\n skills: [\n { id: 'web-app-testing', purpose: 'Next.js testing patterns' },\n { id: 'shadcn-specialist', purpose: 'UI components' },\n { id: 'vercel-specialist', purpose: 'Deployment' },\n { id: 'tanstack-query-patterns', purpose: 'Client data fetching' },\n { id: 'react-hook-form-patterns', purpose: 'Form handling' },\n { id: 'nextauth-patterns', purpose: 'Authentication' },\n ],\n commands: [],\n docs: [],\n },\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'vercel-specialist', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'nextauth-patterns', category: 'skills', optional: true },\n ],\n },\n {\n id: 'express-prisma-stack',\n name: 'Express + Prisma API Stack',\n description: 'Express backend with Prisma ORM',\n category: 'stack',\n longDescription:\n 'Backend stack using Express for APIs and Prisma for database access. Classic, well-documented stack for traditional REST APIs.',\n techStack: ['Express.js', 'Prisma', 'PostgreSQL', 'Zod', 'TypeScript'],\n tags: ['express', 'prisma', 'api', 'backend'],\n complexity: 'standard',\n alternativeTo: ['hono-drizzle-stack'],\n responsibilities: [\n 'RESTful API design with Express',\n 'Database access with Prisma ORM',\n 'Request validation with Zod',\n 'Error handling and logging',\n 'Authentication middleware',\n ],\n scope: 'Backend API development with traditional Express patterns',\n useCases: [\n 'REST APIs for mobile apps',\n 'Backend services for SPAs',\n 'Microservices',\n 'Projects needing Express ecosystem',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'express-engineer',\n role: 'Express Specialist',\n responsibilities: ['Route design', 'Middleware', 'Error handling'],\n },\n {\n id: 'prisma-engineer',\n role: 'Database',\n responsibilities: ['Schema', 'Migrations', 'Queries'],\n },\n {\n id: 'node-typescript-engineer',\n role: 'Node.js/TypeScript',\n responsibilities: ['Type safety', 'Build config', 'Shared packages'],\n },\n ],\n skills: [\n { id: 'api-app-testing', purpose: 'API testing with supertest' },\n { id: 'error-handling-patterns', purpose: 'Error middleware' },\n { id: 'security-testing', purpose: 'Security best practices' },\n ],\n commands: [],\n docs: [{ id: 'architecture-patterns', topic: 'API architecture patterns' }],\n },\n modules: [\n { id: 'express-engineer', category: 'agents' },\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'node-typescript-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'architecture-patterns', category: 'docs', optional: true },\n ],\n },\n {\n id: 'hono-drizzle-stack',\n name: 'Hono + Drizzle API Stack',\n description: 'Hono API framework with Drizzle ORM for type-safe backends',\n category: 'stack',\n longDescription:\n 'Complete backend stack using Hono for APIs and Drizzle for database access. Includes shared TypeScript packages, API testing, and quality tools.',\n techStack: ['Hono', 'Drizzle ORM', 'PostgreSQL', 'Zod', 'TypeScript'],\n tags: ['hono', 'drizzle', 'api', 'backend'],\n complexity: 'standard',\n alternativeTo: ['express-prisma-stack'],\n responsibilities: [\n 'High-performance APIs with Hono',\n 'Type-safe database queries with Drizzle',\n 'Schema validation with Zod',\n 'Edge-ready deployment',\n 'Monorepo-friendly architecture',\n ],\n scope: 'Modern, type-safe backend API development',\n useCases: [\n 'Edge/serverless APIs',\n 'Type-safe monorepo backends',\n 'High-performance REST APIs',\n 'Projects prioritizing type safety',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'hono-engineer',\n role: 'Hono Specialist',\n responsibilities: ['Route handlers', 'Middleware', 'OpenAPI integration'],\n },\n {\n id: 'db-drizzle-engineer',\n role: 'Drizzle Database',\n responsibilities: ['Schema design', 'Migrations', 'Type-safe queries'],\n },\n {\n id: 'node-typescript-engineer',\n role: 'TypeScript/Node',\n responsibilities: ['Type inference', 'Build setup', 'Shared types'],\n },\n ],\n skills: [\n { id: 'api-app-testing', purpose: 'Hono testing patterns' },\n { id: 'error-handling-patterns', purpose: 'Error middleware' },\n { id: 'security-testing', purpose: 'Security validation' },\n ],\n commands: [],\n docs: [{ id: 'architecture-patterns', topic: 'API architecture patterns' }],\n },\n modules: [\n { id: 'hono-engineer', category: 'agents' },\n { id: 'db-drizzle-engineer', category: 'agents' },\n { id: 'node-typescript-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'architecture-patterns', category: 'docs', optional: true },\n ],\n },\n\n // ===================\n // TESTING BUNDLES\n // ===================\n {\n id: 'testing-complete',\n name: 'Complete Testing Suite',\n description: 'All testing skills and QA tools for comprehensive test coverage',\n category: 'testing',\n longDescription:\n 'Everything you need for a robust testing strategy including TDD methodology, web testing, API testing, performance testing, and QA validation.',\n techStack: ['Vitest', 'Playwright', 'Testing Library', 'MSW'],\n tags: ['testing', 'tdd', 'qa', 'e2e'],\n complexity: 'comprehensive',\n responsibilities: [\n 'TDD workflow enforcement (Red-Green-Refactor)',\n 'Unit, integration, and E2E testing patterns',\n 'API testing with mocking and fixtures',\n 'Performance testing and benchmarking',\n 'QA validation and acceptance criteria',\n ],\n scope: 'Complete testing strategy from unit tests to E2E',\n useCases: [\n 'Projects requiring 90%+ test coverage',\n 'TDD-first development workflow',\n 'API-heavy applications needing thorough testing',\n 'Projects with QA validation requirements',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'qa-engineer',\n role: 'Quality Assurance',\n responsibilities: [\n 'Test planning and strategy',\n 'Acceptance criteria validation',\n 'Bug triage and reporting',\n ],\n },\n ],\n skills: [\n { id: 'tdd-methodology', purpose: 'TDD workflow and best practices' },\n { id: 'web-app-testing', purpose: 'Frontend testing patterns' },\n { id: 'api-app-testing', purpose: 'API and backend testing' },\n { id: 'performance-testing', purpose: 'Performance benchmarks' },\n { id: 'qa-criteria-validator', purpose: 'Acceptance validation' },\n ],\n commands: [{ id: 'run-tests', usage: '/run-tests --coverage' }],\n docs: [{ id: 'testing-standards', topic: 'Testing conventions and standards' }],\n },\n modules: [\n { id: 'qa-engineer', category: 'agents' },\n { id: 'tdd-methodology', category: 'skills' },\n { id: 'web-app-testing', category: 'skills' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'performance-testing', category: 'skills' },\n { id: 'qa-criteria-validator', category: 'skills' },\n { id: 'run-tests', category: 'commands' },\n // Doc required by QA agent and TDD skill\n { id: 'testing-standards', category: 'docs', requiredBy: ['qa-engineer', 'tdd-methodology'] },\n ],\n },\n {\n id: 'testing-minimal',\n name: 'Minimal Testing',\n description: 'Essential testing tools for TDD workflow',\n category: 'testing',\n longDescription: 'Core testing tools for TDD development without the full QA suite.',\n techStack: ['Vitest', 'Testing Library'],\n tags: ['testing', 'tdd', 'minimal'],\n complexity: 'minimal',\n responsibilities: [\n 'Basic TDD workflow support',\n 'Unit and integration testing',\n 'Test execution and reporting',\n ],\n scope: 'Essential testing for small to medium projects',\n useCases: [\n 'Small projects with basic testing needs',\n 'Quick prototypes needing some test coverage',\n 'Projects where full QA suite is overkill',\n ],\n moduleDetails: {\n agents: [],\n skills: [\n { id: 'tdd-methodology', purpose: 'TDD workflow basics' },\n { id: 'api-app-testing', purpose: 'API testing patterns' },\n ],\n commands: [{ id: 'run-tests', usage: '/run-tests' }],\n docs: [],\n },\n modules: [\n { id: 'tdd-methodology', category: 'skills' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'run-tests', category: 'commands' },\n ],\n },\n\n // ===================\n // QUALITY BUNDLES\n // ===================\n {\n id: 'quality-complete',\n name: 'Complete Quality Suite',\n description: 'Full quality assurance with security, performance, and accessibility audits',\n category: 'quality',\n longDescription:\n 'Comprehensive quality assurance bundle including all audit types, code review, and debugging tools.',\n tags: ['quality', 'audit', 'security', 'performance'],\n complexity: 'comprehensive',\n responsibilities: [\n 'Security vulnerability detection and prevention',\n 'Performance profiling and optimization guidance',\n 'Accessibility compliance (WCAG) validation',\n 'Code quality review and best practices',\n 'Bug investigation and debugging assistance',\n ],\n scope: 'Complete quality assurance across security, performance, and accessibility',\n useCases: [\n 'Enterprise applications with strict security requirements',\n 'Public-facing apps needing accessibility compliance',\n 'Performance-critical applications',\n 'Projects requiring comprehensive code reviews',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'qa-engineer',\n role: 'Quality Assurance Lead',\n responsibilities: [\n 'Test strategy and coverage',\n 'Acceptance criteria validation',\n 'Quality metrics tracking',\n ],\n },\n {\n id: 'debugger',\n role: 'Debug Specialist',\n responsibilities: ['Root cause analysis', 'Bug reproduction', 'Fix verification'],\n },\n ],\n skills: [\n { id: 'security-audit', purpose: 'OWASP vulnerability scanning' },\n { id: 'security-testing', purpose: 'Security test patterns' },\n { id: 'performance-audit', purpose: 'Performance bottleneck detection' },\n { id: 'performance-testing', purpose: 'Load and stress testing' },\n { id: 'accessibility-audit', purpose: 'WCAG compliance checking' },\n { id: 'qa-criteria-validator', purpose: 'Acceptance criteria validation' },\n ],\n commands: [\n { id: 'quality-check', usage: '/quality-check' },\n { id: 'code-check', usage: '/code-check src/' },\n { id: 'review-code', usage: '/review-code --thorough' },\n { id: 'review-security', usage: '/review-security' },\n { id: 'review-performance', usage: '/review-performance' },\n ],\n docs: [\n { id: 'code-standards', topic: 'Code quality standards' },\n { id: 'atomic-commits', topic: 'Atomic commit practices' },\n ],\n },\n modules: [\n { id: 'qa-engineer', category: 'agents' },\n { id: 'debugger', category: 'agents' },\n { id: 'security-audit', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n { id: 'performance-audit', category: 'skills' },\n { id: 'performance-testing', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n { id: 'qa-criteria-validator', category: 'skills' },\n { id: 'quality-check', category: 'commands' },\n { id: 'code-check', category: 'commands' },\n { id: 'review-code', category: 'commands' },\n { id: 'review-security', category: 'commands' },\n { id: 'review-performance', category: 'commands' },\n // Docs required by agents\n { id: 'code-standards', category: 'docs', requiredBy: ['qa-engineer'] },\n { id: 'atomic-commits', category: 'docs', optional: true },\n ],\n },\n {\n id: 'quality-minimal',\n name: 'Minimal Quality',\n description: 'Essential quality checks for everyday development',\n category: 'quality',\n longDescription: 'Core quality tools without the full audit suite.',\n tags: ['quality', 'minimal'],\n complexity: 'minimal',\n responsibilities: [\n 'Basic code quality checks',\n 'Quick code reviews',\n 'Lint and format validation',\n ],\n scope: 'Essential quality checks for day-to-day development',\n useCases: [\n 'Small projects with basic quality needs',\n 'Quick PRs needing fast review',\n 'Projects where full audits are overkill',\n ],\n moduleDetails: {\n agents: [],\n skills: [],\n commands: [\n { id: 'quality-check', usage: '/quality-check' },\n { id: 'code-check', usage: '/code-check' },\n { id: 'review-code', usage: '/review-code' },\n ],\n docs: [],\n },\n modules: [\n { id: 'quality-check', category: 'commands' },\n { id: 'code-check', category: 'commands' },\n { id: 'review-code', category: 'commands' },\n ],\n },\n\n // ===================\n // DATABASE BUNDLES\n // ===================\n {\n id: 'drizzle-database',\n name: 'Drizzle Database',\n description: 'Drizzle ORM with type-safe database patterns',\n category: 'database',\n longDescription:\n 'Database development with Drizzle ORM including schema design, migrations, and data validation.',\n techStack: ['Drizzle ORM', 'PostgreSQL', 'SQLite', 'Zod'],\n tags: ['database', 'drizzle', 'orm'],\n alternativeTo: ['prisma-database', 'mongoose-database'],\n modules: [\n { id: 'db-drizzle-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n {\n id: 'prisma-database',\n name: 'Prisma Database',\n description: 'Prisma ORM with type-safe database patterns',\n category: 'database',\n longDescription:\n 'Database development with Prisma ORM including schema design, migrations, and data validation.',\n techStack: ['Prisma', 'PostgreSQL', 'MySQL', 'SQLite', 'MongoDB'],\n tags: ['database', 'prisma', 'orm'],\n alternativeTo: ['drizzle-database', 'mongoose-database'],\n modules: [\n { id: 'prisma-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n {\n id: 'mongoose-database',\n name: 'MongoDB + Mongoose',\n description: 'MongoDB with Mongoose ODM',\n category: 'database',\n longDescription:\n 'MongoDB development with Mongoose ODM including document schemas and aggregation pipelines.',\n techStack: ['Mongoose', 'MongoDB', 'TypeScript'],\n tags: ['database', 'mongodb', 'mongoose', 'nosql'],\n alternativeTo: ['drizzle-database', 'prisma-database'],\n modules: [\n { id: 'mongoose-engineer', category: 'agents' },\n { id: 'json-data-auditor', category: 'skills' },\n ],\n },\n\n // ===================\n // API BUNDLES\n // ===================\n {\n id: 'hono-api',\n name: 'Hono API',\n description: 'Hono framework for high-performance APIs',\n category: 'api',\n longDescription:\n 'API development with Hono framework including middleware, validation, and error handling.',\n techStack: ['Hono', 'Zod', 'TypeScript'],\n tags: ['api', 'hono', 'backend'],\n alternativeTo: ['express-api', 'fastify-api', 'nestjs-api'],\n modules: [\n { id: 'hono-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'express-api',\n name: 'Express API',\n description: 'Express.js framework for REST APIs',\n category: 'api',\n longDescription:\n 'API development with Express.js including middleware chains, validation, and error handling.',\n techStack: ['Express.js', 'Zod', 'TypeScript', 'Passport.js'],\n tags: ['api', 'express', 'backend'],\n alternativeTo: ['hono-api', 'fastify-api', 'nestjs-api'],\n modules: [\n { id: 'express-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'fastify-api',\n name: 'Fastify API',\n description: 'Fastify framework for high-performance APIs',\n category: 'api',\n longDescription:\n 'High-performance API development with Fastify plugin architecture and schema validation.',\n techStack: ['Fastify', 'TypeBox', 'TypeScript', 'Pino'],\n tags: ['api', 'fastify', 'backend', 'performance'],\n alternativeTo: ['hono-api', 'express-api', 'nestjs-api'],\n modules: [\n { id: 'fastify-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n {\n id: 'nestjs-api',\n name: 'NestJS API',\n description: 'NestJS framework for enterprise APIs',\n category: 'api',\n longDescription:\n 'Enterprise API development with NestJS dependency injection and modular architecture.',\n techStack: ['NestJS', 'TypeScript', 'class-validator', 'TypeORM'],\n tags: ['api', 'nestjs', 'backend', 'enterprise'],\n alternativeTo: ['hono-api', 'express-api', 'fastify-api'],\n modules: [\n { id: 'nestjs-engineer', category: 'agents' },\n { id: 'api-app-testing', category: 'skills' },\n { id: 'error-handling-patterns', category: 'skills' },\n ],\n },\n\n // ===================\n // FRONTEND BUNDLES\n // ===================\n {\n id: 'react-ui',\n name: 'React UI Development',\n description: 'React component development with Shadcn UI',\n category: 'frontend',\n longDescription:\n 'React component development bundle with Shadcn UI, accessibility, and design system tools.',\n techStack: ['React', 'Shadcn UI', 'Tailwind CSS', 'Radix UI'],\n tags: ['react', 'ui', 'components'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'ux-ui-designer', category: 'agents' },\n { id: 'shadcn-specialist', category: 'skills' },\n { id: 'brand-guidelines', category: 'skills' },\n { id: 'accessibility-audit', category: 'skills' },\n ],\n },\n {\n id: 'react-forms',\n name: 'React Forms',\n description: 'React Hook Form with Zod validation',\n category: 'frontend',\n longDescription:\n 'Form handling patterns with React Hook Form and Zod validation. Includes Shadcn form integration.',\n techStack: ['React Hook Form', 'Zod', 'React', 'TypeScript'],\n tags: ['react', 'forms', 'validation'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'react-hook-form-patterns', category: 'skills' },\n { id: 'shadcn-specialist', category: 'skills' },\n ],\n },\n {\n id: 'react-state-zustand',\n name: 'React State (Zustand)',\n description: 'Zustand for lightweight state management',\n category: 'frontend',\n longDescription:\n 'State management with Zustand including slices, persist middleware, and TanStack Query integration.',\n techStack: ['Zustand', 'TanStack Query', 'React', 'TypeScript'],\n tags: ['react', 'state', 'zustand'],\n alternativeTo: ['react-state-redux'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'zustand-patterns', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills' },\n ],\n },\n {\n id: 'react-state-redux',\n name: 'React State (Redux)',\n description: 'Redux Toolkit for complex state management',\n category: 'frontend',\n longDescription:\n 'State management with Redux Toolkit including RTK Query, async thunks, and enterprise patterns.',\n techStack: ['Redux Toolkit', 'RTK Query', 'React', 'TypeScript'],\n tags: ['react', 'state', 'redux'],\n alternativeTo: ['react-state-zustand'],\n modules: [\n { id: 'react-senior-dev', category: 'agents' },\n { id: 'redux-toolkit-patterns', category: 'skills' },\n { id: 'tanstack-query-patterns', category: 'skills', optional: true },\n ],\n },\n {\n id: 'nextjs-auth',\n name: 'Next.js Authentication',\n description: 'NextAuth.js authentication for Next.js apps',\n category: 'frontend',\n longDescription:\n 'Authentication patterns with NextAuth.js including OAuth providers, credentials, sessions, and RBAC.',\n techStack: ['NextAuth.js', 'Auth.js', 'Next.js', 'Prisma'],\n tags: ['nextjs', 'auth', 'oauth'],\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'nextauth-patterns', category: 'skills' },\n { id: 'security-testing', category: 'skills' },\n ],\n },\n {\n id: 'nextjs-i18n',\n name: 'Next.js Internationalization',\n description: 'Multi-language support for Next.js apps',\n category: 'frontend',\n longDescription:\n 'Internationalization with next-intl including locale routing, translations, and formatting.',\n techStack: ['next-intl', 'Next.js', 'React', 'TypeScript'],\n tags: ['nextjs', 'i18n', 'internationalization'],\n modules: [\n { id: 'nextjs-engineer', category: 'agents' },\n { id: 'i18n-specialist', category: 'agents', optional: true },\n { id: 'i18n-patterns', category: 'skills' },\n ],\n },\n\n // ===================\n // WORKFLOW BUNDLES\n // ===================\n {\n id: 'planning-complete',\n name: 'Complete Planning Workflow',\n description: 'Full planning workflow with PDR, tech analysis, and task tracking',\n category: 'workflow',\n longDescription:\n 'Complete planning workflow bundle including product definition, technical analysis, task breakdown, and sync to issue trackers.',\n tags: ['planning', 'workflow', 'pdr'],\n complexity: 'comprehensive',\n responsibilities: [\n 'Feature planning from requirements to implementation tasks',\n 'Technical analysis and architecture decision documentation',\n 'Task breakdown with atomic task methodology',\n 'Integration with issue trackers (GitHub, Linear)',\n ],\n scope: 'End-to-end planning workflow for features, refactors, and epics',\n useCases: [\n 'Starting a new feature from scratch',\n 'Planning a major refactor or migration',\n 'Breaking down epics into manageable tasks',\n 'Documenting technical decisions (ADRs)',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'product-functional',\n role: 'Product Requirements',\n responsibilities: [\n 'Create PDR documents',\n 'Define acceptance criteria',\n 'User story mapping',\n ],\n },\n {\n id: 'product-technical',\n role: 'Technical Analysis',\n responsibilities: ['Architecture decisions', 'Tech stack evaluation', 'Risk assessment'],\n },\n {\n id: 'tech-lead',\n role: 'Coordination & Task Breakdown',\n responsibilities: ['Task atomization', 'Workflow selection', 'Team coordination'],\n },\n ],\n skills: [],\n commands: [\n { id: 'start-feature-plan', usage: '/start-feature-plan \"User authentication\"' },\n { id: 'start-refactor-plan', usage: '/start-refactor-plan \"Database optimization\"' },\n { id: 'sync-planning', usage: '/sync-planning' },\n ],\n docs: [\n { id: 'decision-tree', topic: 'Workflow selection guide' },\n { id: 'phase-1-planning', topic: 'Planning phase methodology' },\n { id: 'phase-2-implementation', topic: 'Implementation phase guide' },\n { id: 'phase-3-validation', topic: 'Validation and QA phase' },\n { id: 'phase-4-finalization', topic: 'Closing and documentation' },\n { id: 'pdr-template', topic: 'Product Definition Record template' },\n { id: 'tech-analysis-template', topic: 'Technical analysis template' },\n { id: 'todos-template', topic: 'Task tracking template' },\n ],\n },\n modules: [\n { id: 'product-functional', category: 'agents' },\n { id: 'product-technical', category: 'agents' },\n { id: 'tech-lead', category: 'agents' },\n { id: 'start-feature-plan', category: 'commands' },\n { id: 'start-refactor-plan', category: 'commands' },\n { id: 'sync-planning', category: 'commands' },\n // Required docs - needed for agents to work properly\n { id: 'decision-tree', category: 'docs', requiredBy: ['tech-lead'] },\n {\n id: 'phase-1-planning',\n category: 'docs',\n requiredBy: ['product-functional', 'product-technical'],\n },\n { id: 'phase-2-implementation', category: 'docs', requiredBy: ['tech-lead'] },\n { id: 'phase-3-validation', category: 'docs' },\n { id: 'phase-4-finalization', category: 'docs' },\n { id: 'pdr-template', category: 'docs', requiredBy: ['product-functional'] },\n { id: 'tech-analysis-template', category: 'docs', requiredBy: ['product-technical'] },\n { id: 'todos-template', category: 'docs', requiredBy: ['tech-lead'] },\n ],\n },\n {\n id: 'documentation-complete',\n name: 'Complete Documentation',\n description: 'All documentation standards, templates, and writing tools',\n category: 'workflow',\n longDescription:\n 'Everything for comprehensive documentation including standards, templates, diagrams, and writing guidelines.',\n tags: ['documentation', 'writing', 'standards'],\n complexity: 'standard',\n responsibilities: [\n 'Technical documentation writing',\n 'API documentation generation',\n 'Architecture diagram creation',\n 'Markdown formatting and standards',\n 'Glossary and terminology management',\n ],\n scope: 'Complete documentation workflow for technical projects',\n useCases: [\n 'Creating and maintaining project documentation',\n 'Writing API and SDK documentation',\n 'Creating architecture diagrams',\n 'Standardizing documentation across team',\n ],\n moduleDetails: {\n agents: [\n {\n id: 'tech-writer',\n role: 'Technical Writer',\n responsibilities: ['Documentation structure', 'Content writing', 'Style consistency'],\n },\n ],\n skills: [\n { id: 'documentation-writer', purpose: 'Documentation best practices' },\n { id: 'mermaid-diagram-specialist', purpose: 'Diagram creation' },\n ],\n commands: [\n { id: 'update-docs', usage: '/update-docs' },\n { id: 'markdown-format', usage: '/markdown-format' },\n ],\n docs: [\n { id: 'documentation-standards', topic: 'Documentation conventions' },\n { id: 'workflow-diagrams', topic: 'Diagram templates' },\n { id: 'glossary', topic: 'Project terminology' },\n ],\n },\n modules: [\n { id: 'tech-writer', category: 'agents' },\n { id: 'documentation-writer', category: 'skills' },\n { id: 'mermaid-diagram-specialist', category: 'skills' },\n { id: 'update-docs', category: 'commands' },\n { id: 'markdown-format', category: 'commands' },\n { id: 'documentation-standards', category: 'docs', requiredBy: ['tech-writer'] },\n { id: 'workflow-diagrams', category: 'docs', optional: true },\n { id: 'glossary', category: 'docs', optional: true },\n ],\n },\n {\n id: 'git-workflow',\n name: 'Git Workflow',\n description: 'Git commit conventions and atomic commit practices',\n category: 'workflow',\n longDescription: 'Git workflow tools including conventional commits and atomic commit helpers.',\n tags: ['git', 'commits', 'workflow'],\n complexity: 'minimal',\n responsibilities: [\n 'Conventional commit message formatting',\n 'Atomic commit enforcement',\n 'Commit message generation',\n ],\n scope: 'Git commit workflow and conventions',\n useCases: [\n 'Enforcing commit message standards',\n 'Generating semantic commit messages',\n 'Following atomic commit practices',\n ],\n moduleDetails: {\n agents: [],\n skills: [{ id: 'git-commit-helper', purpose: 'Commit message patterns' }],\n commands: [{ id: 'commit', usage: '/commit' }],\n docs: [{ id: 'atomic-commits', topic: 'Atomic commit guidelines' }],\n },\n modules: [\n { id: 'git-commit-helper', category: 'skills' },\n { id: 'commit', category: 'commands' },\n { id: 'atomic-commits', category: 'docs', optional: true },\n ],\n },\n {\n id: 'cicd-github-actions',\n name: 'GitHub Actions CI/CD',\n description: 'GitHub Actions workflows for CI/CD automation',\n category: 'workflow',\n longDescription:\n 'Complete CI/CD setup with GitHub Actions including testing, quality checks, security scanning, and deployment workflows.',\n techStack: ['GitHub Actions', 'Node.js', 'PNPM'],\n tags: ['cicd', 'github', 'automation', 'devops'],\n complexity: 'standard',\n responsibilities: [\n 'Continuous Integration workflows',\n 'Automated testing on PRs',\n 'Code quality checks',\n 'Security scanning',\n 'Deployment automation',\n ],\n scope: 'CI/CD pipeline automation with GitHub Actions',\n useCases: [\n 'Automating test runs on PRs',\n 'Automated deployments to staging/production',\n 'Code quality gates',\n 'Security vulnerability scanning',\n ],\n moduleDetails: {\n agents: [],\n skills: [{ id: 'github-actions-specialist', purpose: 'GitHub Actions workflow patterns' }],\n commands: [],\n docs: [{ id: 'cicd-workflows', topic: 'CI/CD workflow documentation' }],\n },\n modules: [\n { id: 'github-actions-specialist', category: 'skills', optional: true },\n { id: 'cicd-workflows', category: 'docs', optional: true },\n ],\n },\n];\n\n/**\n * Get all bundles\n */\nexport function getAllBundles(): BundleDefinition[] {\n return BUNDLES;\n}\n\n/**\n * Get bundles by category\n */\nexport function getBundlesByCategory(category: string): BundleDefinition[] {\n return BUNDLES.filter((b) => b.category === category);\n}\n\n/**\n * Get bundle by ID\n */\nexport function getBundleById(id: string): BundleDefinition | undefined {\n return BUNDLES.find((b) => b.id === id);\n}\n\n/**\n * Get bundles grouped by category\n */\nexport function getBundlesGroupedByCategory(): Record<string, BundleDefinition[]> {\n const grouped: Record<string, BundleDefinition[]> = {};\n\n for (const bundle of BUNDLES) {\n if (!grouped[bundle.category]) {\n grouped[bundle.category] = [];\n }\n grouped[bundle.category].push(bundle);\n }\n\n return grouped;\n}\n\n/**\n * Category display names\n */\nexport const BUNDLE_CATEGORY_NAMES: Record<string, string> = {\n stack: 'Tech Stacks',\n testing: 'Testing',\n quality: 'Quality Assurance',\n database: 'Database',\n api: 'API Frameworks',\n frontend: 'Frontend',\n workflow: 'Workflows',\n cicd: 'CI/CD & DevOps',\n};\n","/**\n * CI/CD module - GitHub Actions and related CI/CD utilities\n */\n\nexport {\n getDefaultCICDConfig,\n installCICD,\n installCICDWithSpinner,\n type CICDConfig,\n type CICDInstallResult,\n} from './github-actions-generator.js';\n","/**\n * GitHub Actions workflow generator\n */\n\nimport type { PackageManager } from '../../types/scaffold.js';\nimport { ensureDir, joinPath, pathExists, writeFile } from '../utils/fs.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface CICDConfig {\n /** Enable CI/CD configuration */\n enabled: boolean;\n /** CI provider */\n provider: 'github-actions';\n /** Enable CI workflow (lint, test, build) */\n ci: boolean;\n /** Enable CD workflow (deploy) */\n cd: boolean;\n /** Package manager to use */\n packageManager: PackageManager;\n /** Node.js version */\n nodeVersion: string;\n /** Enable caching */\n enableCaching: boolean;\n /** Run tests */\n runTests: boolean;\n /** Run linting */\n runLint: boolean;\n /** Run typecheck */\n runTypecheck: boolean;\n /** Run build */\n runBuild: boolean;\n}\n\nexport interface CICDInstallResult {\n /** Files that were created */\n created: string[];\n /** Files that were skipped */\n skipped: string[];\n /** Errors encountered */\n errors: string[];\n}\n\n/**\n * Get package manager install command\n */\nfunction getInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'npm':\n return 'npm ci';\n case 'yarn':\n return 'yarn install --frozen-lockfile';\n case 'pnpm':\n return 'pnpm install --frozen-lockfile';\n case 'bun':\n return 'bun install --frozen-lockfile';\n default:\n return 'npm ci';\n }\n}\n\n/**\n * Get package manager run command\n */\nfunction getRunCommand(packageManager: PackageManager, script: string): string {\n switch (packageManager) {\n case 'npm':\n return `npm run ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'pnpm':\n return `pnpm ${script}`;\n case 'bun':\n return `bun run ${script}`;\n default:\n return `npm run ${script}`;\n }\n}\n\n/**\n * Get cache configuration for package manager\n */\nfunction getCacheConfig(packageManager: PackageManager): { path: string; key: string } {\n switch (packageManager) {\n case 'npm':\n return {\n path: '~/.npm',\n key: \"npm-${{ hashFiles('**/package-lock.json') }}\",\n };\n case 'yarn':\n return {\n path: '.yarn/cache',\n key: \"yarn-${{ hashFiles('**/yarn.lock') }}\",\n };\n case 'pnpm':\n return {\n path: '~/.local/share/pnpm/store',\n key: \"pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}\",\n };\n case 'bun':\n return {\n path: '~/.bun/install/cache',\n key: \"bun-${{ hashFiles('**/bun.lockb') }}\",\n };\n default:\n return {\n path: '~/.npm',\n key: \"npm-${{ hashFiles('**/package-lock.json') }}\",\n };\n }\n}\n\n/**\n * Generate CI workflow content\n */\nfunction generateCIWorkflow(config: CICDConfig): string {\n const { packageManager, nodeVersion, enableCaching, runTests, runLint, runTypecheck, runBuild } =\n config;\n\n const cache = getCacheConfig(packageManager);\n const installCmd = getInstallCommand(packageManager);\n\n const steps: string[] = [];\n\n // Checkout\n steps.push(` - name: Checkout\n uses: actions/checkout@v4`);\n\n // Setup pnpm if needed\n if (packageManager === 'pnpm') {\n steps.push(`\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: latest`);\n }\n\n // Setup Bun if needed\n if (packageManager === 'bun') {\n steps.push(`\n - name: Setup Bun\n uses: oven-sh/setup-bun@v2\n with:\n bun-version: latest`);\n }\n\n // Setup Node.js\n if (packageManager !== 'bun') {\n steps.push(`\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '${nodeVersion}'${\n enableCaching\n ? `\n cache: '${packageManager}'`\n : ''\n }`);\n }\n\n // Cache (if not using built-in node cache)\n if (enableCaching && packageManager === 'bun') {\n steps.push(`\n - name: Cache dependencies\n uses: actions/cache@v4\n with:\n path: ${cache.path}\n key: ${cache.key}`);\n }\n\n // Install dependencies\n steps.push(`\n - name: Install dependencies\n run: ${installCmd}`);\n\n // Lint\n if (runLint) {\n steps.push(`\n - name: Lint\n run: ${getRunCommand(packageManager, 'lint')}`);\n }\n\n // Typecheck\n if (runTypecheck) {\n steps.push(`\n - name: Type check\n run: ${getRunCommand(packageManager, 'typecheck')}`);\n }\n\n // Test\n if (runTests) {\n steps.push(`\n - name: Run tests\n run: ${getRunCommand(packageManager, 'test')}`);\n }\n\n // Build\n if (runBuild) {\n steps.push(`\n - name: Build\n run: ${getRunCommand(packageManager, 'build')}`);\n }\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${steps.join('\\n')}\n`;\n}\n\n/**\n * Generate Release workflow content\n */\nfunction generateReleaseWorkflow(config: CICDConfig): string {\n const { packageManager, nodeVersion } = config;\n const installCmd = getInstallCommand(packageManager);\n\n let setupSteps = '';\n if (packageManager === 'pnpm') {\n setupSteps = `\n - name: Setup pnpm\n uses: pnpm/action-setup@v4\n with:\n version: latest\n`;\n }\n\n return `name: Release\n\non:\n push:\n tags:\n - 'v*'\n\njobs:\n release:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n with:\n fetch-depth: 0\n${setupSteps}\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '${nodeVersion}'\n cache: '${packageManager}'\n registry-url: 'https://registry.npmjs.org'\n\n - name: Install dependencies\n run: ${installCmd}\n\n - name: Build\n run: ${getRunCommand(packageManager, 'build')}\n\n - name: Create GitHub Release\n uses: softprops/action-gh-release@v1\n with:\n generate_release_notes: true\n`;\n}\n\n/**\n * Install CI/CD workflows\n */\nexport async function installCICD(\n projectPath: string,\n config: CICDConfig,\n options?: { overwrite?: boolean }\n): Promise<CICDInstallResult> {\n const result: CICDInstallResult = {\n created: [],\n skipped: [],\n errors: [],\n };\n\n if (!config.enabled) {\n return result;\n }\n\n const workflowsDir = joinPath(projectPath, '.github', 'workflows');\n\n try {\n // Ensure workflows directory exists\n await ensureDir(workflowsDir);\n\n // Install CI workflow\n if (config.ci) {\n const ciPath = joinPath(workflowsDir, 'ci.yml');\n if (!(await pathExists(ciPath)) || options?.overwrite) {\n const content = generateCIWorkflow(config);\n await writeFile(ciPath, content);\n result.created.push('ci.yml');\n } else {\n result.skipped.push('ci.yml');\n }\n }\n\n // Install CD/Release workflow\n if (config.cd) {\n const releasePath = joinPath(workflowsDir, 'release.yml');\n if (!(await pathExists(releasePath)) || options?.overwrite) {\n const content = generateReleaseWorkflow(config);\n await writeFile(releasePath, content);\n result.created.push('release.yml');\n } else {\n result.skipped.push('release.yml');\n }\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error));\n }\n\n return result;\n}\n\n/**\n * Install CI/CD with spinner\n */\nexport async function installCICDWithSpinner(\n projectPath: string,\n config: CICDConfig,\n options?: { overwrite?: boolean }\n): Promise<CICDInstallResult> {\n return withSpinner(\n 'Installing GitHub Actions workflows...',\n () => installCICD(projectPath, config, options),\n {\n successText: 'Installed GitHub Actions workflows',\n }\n );\n}\n\n/**\n * Get default CI/CD configuration\n */\nexport function getDefaultCICDConfig(packageManager: PackageManager): CICDConfig {\n return {\n enabled: true,\n provider: 'github-actions',\n ci: true,\n cd: false,\n packageManager,\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n}\n","/**\n * Spinner utility for progress indication\n */\n\nimport ora, { type Ora } from 'ora';\nimport pc from 'picocolors';\n\ninterface SpinnerOptions {\n text?: string;\n color?: 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white' | 'gray';\n}\n\nclass SpinnerManager {\n private spinner: Ora | null = null;\n private silent = false;\n\n configure(options: { silent?: boolean }): void {\n if (options.silent !== undefined) this.silent = options.silent;\n }\n\n /**\n * Start a spinner with a message\n */\n start(text: string, options?: SpinnerOptions): Ora | null {\n if (this.silent) return null;\n\n // Stop any existing spinner\n this.stop();\n\n this.spinner = ora({\n text,\n color: options?.color || 'cyan',\n spinner: 'dots',\n }).start();\n\n return this.spinner;\n }\n\n /**\n * Update spinner text\n */\n text(text: string): void {\n if (this.spinner) {\n this.spinner.text = text;\n }\n }\n\n /**\n * Stop spinner with success message\n */\n succeed(text?: string): void {\n if (this.spinner) {\n this.spinner.succeed(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with failure message\n */\n fail(text?: string): void {\n if (this.spinner) {\n this.spinner.fail(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with warning message\n */\n warn(text?: string): void {\n if (this.spinner) {\n this.spinner.warn(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner with info message\n */\n info(text?: string): void {\n if (this.spinner) {\n this.spinner.info(text);\n this.spinner = null;\n }\n }\n\n /**\n * Stop spinner without message\n */\n stop(): void {\n if (this.spinner) {\n this.spinner.stop();\n this.spinner = null;\n }\n }\n\n /**\n * Check if spinner is running\n */\n isRunning(): boolean {\n return this.spinner?.isSpinning ?? false;\n }\n}\n\n// Export singleton instance\nexport const spinner = new SpinnerManager();\n\n/**\n * Execute an async operation with a spinner\n */\nexport async function withSpinner<T>(\n text: string,\n operation: () => Promise<T>,\n options?: {\n successText?: string;\n failText?: string;\n silent?: boolean;\n }\n): Promise<T> {\n if (options?.silent) {\n return operation();\n }\n\n spinner.start(text);\n\n try {\n const result = await operation();\n spinner.succeed(options?.successText || text);\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n spinner.fail(options?.failText || `${text} - ${pc.red(errorMessage)}`);\n throw error;\n }\n}\n\n/**\n * Create a progress indicator for multiple steps\n */\nexport function createProgressTracker(totalSteps: number, options?: { silent?: boolean }) {\n let currentStep = 0;\n\n return {\n next(stepText: string): void {\n currentStep++;\n if (!options?.silent) {\n spinner.start(`[${currentStep}/${totalSteps}] ${stepText}`);\n }\n },\n\n complete(text?: string): void {\n if (!options?.silent) {\n spinner.succeed(text || `[${currentStep}/${totalSteps}] Done`);\n }\n },\n\n fail(text?: string): void {\n if (!options?.silent) {\n spinner.fail(text);\n }\n },\n\n get current(): number {\n return currentStep;\n },\n\n get total(): number {\n return totalSteps;\n },\n };\n}\n","/**\n * Code style module exports\n */\n\nexport {\n installCodeStyle,\n getCodeStyleDependencies,\n showCodeStyleInstructions,\n} from './installer.js';\n\nexport {\n generateVSCodeExtensions,\n generateVSCodeSettings,\n installVSCodeConfig,\n installVSCodeExtensions,\n installVSCodeSettings,\n type VSCodeInstallResult,\n type VSCodeSettings,\n} from './vscode-installer.js';\n","/**\n * Code style configuration installer\n */\n\nimport path from 'node:path';\nimport fse from 'fs-extra';\nimport {\n DEFAULT_BIOME_OPTIONS,\n DEFAULT_COMMITLINT_OPTIONS,\n DEFAULT_EDITORCONFIG_OPTIONS,\n DEFAULT_PRETTIER_OPTIONS,\n} from '../../constants/code-style-defaults.js';\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { logger } from '../utils/logger.js';\nimport { spinner } from '../utils/spinner.js';\nimport {\n generateBiomeConfig,\n generateCommitlintConfig,\n generateEditorConfig,\n generatePrettierConfig,\n generatePrettierIgnore,\n} from './generator.js';\n\ninterface InstallResult {\n installed: string[];\n skipped: string[];\n errors: string[];\n}\n\nconst CODE_STYLE_FILES: Record<string, string> = {\n editorconfig: '.editorconfig',\n commitlint: 'commitlint.config.js',\n biome: 'biome.json',\n prettier: '.prettierrc',\n};\n\nconst PRETTIER_IGNORE = '.prettierignore';\n\n/**\n * Install code style configuration files\n * Generates files based on user options, or copies templates as fallback\n */\nexport async function installCodeStyle(\n targetPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean }\n): Promise<InstallResult> {\n const result: InstallResult = {\n installed: [],\n skipped: [],\n errors: [],\n };\n\n if (!config.enabled) {\n return result;\n }\n\n spinner.start('Installing code style configurations...');\n\n // Install EditorConfig\n if (config.editorconfig) {\n const filename = CODE_STYLE_FILES.editorconfig;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const editorconfigOptions = config.editorconfigOptions ?? DEFAULT_EDITORCONFIG_OPTIONS;\n const content = generateEditorConfig(editorconfigOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`editorconfig: ${errorMsg}`);\n }\n }\n\n // Install Biome\n if (config.biome) {\n const filename = CODE_STYLE_FILES.biome;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const biomeOptions = config.biomeOptions ?? DEFAULT_BIOME_OPTIONS;\n const content = generateBiomeConfig(biomeOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`biome: ${errorMsg}`);\n }\n }\n\n // Install Prettier\n if (config.prettier) {\n const filename = CODE_STYLE_FILES.prettier;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const prettierOptions = config.prettierOptions ?? DEFAULT_PRETTIER_OPTIONS;\n const content = generatePrettierConfig(prettierOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n\n // Also install .prettierignore\n const ignoreDest = path.join(targetPath, PRETTIER_IGNORE);\n if (!(await fse.pathExists(ignoreDest)) || options?.overwrite) {\n const ignoreContent = generatePrettierIgnore();\n await fse.writeFile(ignoreDest, ignoreContent, 'utf-8');\n result.installed.push(PRETTIER_IGNORE);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`prettier: ${errorMsg}`);\n }\n }\n\n // Install Commitlint\n if (config.commitlint) {\n const filename = CODE_STYLE_FILES.commitlint;\n const destPath = path.join(targetPath, filename);\n\n try {\n if ((await fse.pathExists(destPath)) && !options?.overwrite) {\n result.skipped.push(filename);\n } else {\n const commitlintOptions = config.commitlintOptions ?? DEFAULT_COMMITLINT_OPTIONS;\n const content = generateCommitlintConfig(commitlintOptions);\n await fse.writeFile(destPath, content, 'utf-8');\n result.installed.push(filename);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n result.errors.push(`commitlint: ${errorMsg}`);\n }\n }\n\n if (result.errors.length > 0) {\n spinner.fail('Code style installation completed with errors');\n } else if (result.installed.length > 0) {\n spinner.succeed(`Installed ${result.installed.length} code style config(s)`);\n } else {\n spinner.stop();\n logger.info('No code style configs to install (all skipped)');\n }\n\n return result;\n}\n\n/**\n * Get dependencies needed for the code style tools\n */\nexport function getCodeStyleDependencies(config: CodeStyleConfig): {\n devDependencies: string[];\n instructions: string[];\n} {\n const devDependencies: string[] = [];\n const instructions: string[] = [];\n\n if (config.commitlint) {\n devDependencies.push('@commitlint/cli', '@commitlint/config-conventional');\n\n const huskyEnabled = config.commitlintOptions?.huskyIntegration ?? true;\n if (huskyEnabled) {\n instructions.push(\n 'For commitlint with git hooks, install Husky:',\n ' pnpm add -D husky',\n ' npx husky init',\n ' echo \"npx --no -- commitlint --edit \\\\${1}\" > .husky/commit-msg'\n );\n }\n }\n\n if (config.biome) {\n devDependencies.push('@biomejs/biome');\n instructions.push(\n 'Add Biome scripts to package.json:',\n ' \"lint\": \"biome check .\",',\n ' \"lint:fix\": \"biome check --write .\",',\n ' \"format\": \"biome format --write .\"'\n );\n }\n\n if (config.prettier) {\n devDependencies.push('prettier');\n instructions.push(\n 'Add Prettier scripts to package.json:',\n ' \"format\": \"prettier --write .\",',\n ' \"format:check\": \"prettier --check .\"'\n );\n }\n\n return { devDependencies, instructions };\n}\n\n/**\n * Show installation instructions for code style tools\n */\nexport function showCodeStyleInstructions(config: CodeStyleConfig): void {\n if (!config.enabled) return;\n\n const { devDependencies, instructions } = getCodeStyleDependencies(config);\n\n if (devDependencies.length > 0) {\n logger.newline();\n logger.subtitle('Code Style Dependencies');\n logger.info('Install the following dev dependencies:');\n logger.newline();\n logger.raw(` pnpm add -D ${devDependencies.join(' ')}`);\n logger.newline();\n\n if (instructions.length > 0) {\n logger.subtitle('Additional Setup');\n for (const instruction of instructions) {\n logger.raw(` ${instruction}`);\n }\n }\n }\n}\n","/**\n * Default values for code style configurations\n */\n\nimport type {\n BiomeFormatterOptions,\n BiomeLinterOptions,\n BiomeOptions,\n CommitlintOptions,\n EditorConfigOptions,\n PrettierOptions,\n} from '../types/config.js';\n\n/**\n * Default EditorConfig options\n */\nexport const DEFAULT_EDITORCONFIG_OPTIONS: EditorConfigOptions = {\n indentStyle: 'space',\n indentSize: 2,\n endOfLine: 'lf',\n insertFinalNewline: true,\n trimTrailingWhitespace: true,\n charset: 'utf-8',\n maxLineLength: 100,\n};\n\n/**\n * Default Biome formatter options\n */\nexport const DEFAULT_BIOME_FORMATTER_OPTIONS: BiomeFormatterOptions = {\n indentStyle: 'space',\n indentWidth: 2,\n lineWidth: 100,\n quoteStyle: 'single',\n semicolons: 'always',\n trailingCommas: 'all',\n quoteProperties: 'asNeeded',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParentheses: 'always',\n};\n\n/**\n * Default Biome linter options\n */\nexport const DEFAULT_BIOME_LINTER_OPTIONS: BiomeLinterOptions = {\n recommended: true,\n correctness: true,\n suspicious: true,\n style: true,\n complexity: true,\n security: true,\n performance: true,\n a11y: true,\n};\n\n/**\n * Default Biome options\n */\nexport const DEFAULT_BIOME_OPTIONS: BiomeOptions = {\n formatter: DEFAULT_BIOME_FORMATTER_OPTIONS,\n linter: DEFAULT_BIOME_LINTER_OPTIONS,\n organizeImports: true,\n ignorePatterns: ['node_modules', 'dist', 'build', '.next', '.nuxt', 'coverage'],\n};\n\n/**\n * Default Prettier options\n */\nexport const DEFAULT_PRETTIER_OPTIONS: PrettierOptions = {\n printWidth: 100,\n tabWidth: 2,\n useTabs: false,\n semi: true,\n singleQuote: true,\n jsxSingleQuote: false,\n trailingComma: 'es5',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParens: 'always',\n endOfLine: 'lf',\n proseWrap: 'preserve',\n htmlWhitespaceSensitivity: 'css',\n singleAttributePerLine: false,\n};\n\n/**\n * Default commit types for conventional commits\n */\nexport const DEFAULT_COMMIT_TYPES = [\n 'feat',\n 'fix',\n 'docs',\n 'style',\n 'refactor',\n 'perf',\n 'test',\n 'build',\n 'ci',\n 'chore',\n 'revert',\n];\n\n/**\n * Default Commitlint options\n */\nexport const DEFAULT_COMMITLINT_OPTIONS: CommitlintOptions = {\n extends: ['@commitlint/config-conventional'],\n types: DEFAULT_COMMIT_TYPES,\n scopes: [], // Empty = any scope allowed\n headerMaxLength: 100,\n scopeRequired: false,\n bodyRequired: false,\n bodyMaxLineLength: 100,\n huskyIntegration: true,\n};\n\n/**\n * Style presets for quick selection\n */\nexport type CodeStylePreset = 'standard' | 'airbnb' | 'google' | 'minimal' | 'custom';\n\nexport interface CodeStylePresetConfig {\n name: string;\n description: string;\n editorconfig: EditorConfigOptions;\n biome?: BiomeFormatterOptions;\n prettier?: PrettierOptions;\n}\n\nexport const CODE_STYLE_PRESETS: Record<CodeStylePreset, CodeStylePresetConfig> = {\n standard: {\n name: 'Standard',\n description: '2 spaces, single quotes, semicolons, LF line endings',\n editorconfig: DEFAULT_EDITORCONFIG_OPTIONS,\n biome: DEFAULT_BIOME_FORMATTER_OPTIONS,\n prettier: DEFAULT_PRETTIER_OPTIONS,\n },\n airbnb: {\n name: 'Airbnb',\n description: '2 spaces, single quotes, semicolons, trailing commas',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n maxLineLength: 100,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n trailingCommas: 'all',\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n trailingComma: 'all',\n },\n },\n google: {\n name: 'Google',\n description: '2 spaces, single quotes, semicolons, 80 char lines',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n maxLineLength: 80,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n lineWidth: 80,\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n printWidth: 80,\n },\n },\n minimal: {\n name: 'Minimal',\n description: '2 spaces, double quotes, no semicolons',\n editorconfig: {\n ...DEFAULT_EDITORCONFIG_OPTIONS,\n },\n biome: {\n ...DEFAULT_BIOME_FORMATTER_OPTIONS,\n quoteStyle: 'double',\n semicolons: 'asNeeded',\n },\n prettier: {\n ...DEFAULT_PRETTIER_OPTIONS,\n singleQuote: false,\n semi: false,\n },\n },\n custom: {\n name: 'Custom',\n description: 'Configure each option manually',\n editorconfig: DEFAULT_EDITORCONFIG_OPTIONS,\n biome: DEFAULT_BIOME_FORMATTER_OPTIONS,\n prettier: DEFAULT_PRETTIER_OPTIONS,\n },\n};\n","/**\n * Logger utility with colored output\n */\n\nimport chalk from 'chalk';\n\nexport type LogLevel = 'debug' | 'info' | 'success' | 'warn' | 'error';\n\ninterface LoggerOptions {\n verbose?: boolean;\n silent?: boolean;\n}\n\nconst SYMBOLS = {\n info: chalk.blue('ℹ'),\n success: chalk.green('✔'),\n warn: chalk.yellow('⚠'),\n error: chalk.red('✖'),\n debug: chalk.gray('●'),\n arrow: chalk.cyan('→'),\n bullet: chalk.dim('•'),\n};\n\nclass Logger {\n private verbose = false;\n private silent = false;\n\n configure(options: LoggerOptions): void {\n if (options.verbose !== undefined) this.verbose = options.verbose;\n if (options.silent !== undefined) this.silent = options.silent;\n }\n\n private log(level: LogLevel, message: string, ...args: unknown[]): void {\n if (this.silent && level !== 'error') return;\n if (level === 'debug' && !this.verbose) return;\n\n const prefix = SYMBOLS[level];\n const formattedMessage = args.length > 0 ? `${message} ${args.join(' ')}` : message;\n\n switch (level) {\n case 'error':\n console.error(`${prefix} ${chalk.red(formattedMessage)}`);\n break;\n case 'warn':\n console.warn(`${prefix} ${chalk.yellow(formattedMessage)}`);\n break;\n case 'success':\n console.log(`${prefix} ${chalk.green(formattedMessage)}`);\n break;\n case 'debug':\n console.log(`${prefix} ${chalk.gray(formattedMessage)}`);\n break;\n default:\n console.log(`${prefix} ${formattedMessage}`);\n }\n }\n\n debug(message: string, ...args: unknown[]): void {\n this.log('debug', message, ...args);\n }\n\n info(message: string, ...args: unknown[]): void {\n this.log('info', message, ...args);\n }\n\n success(message: string, ...args: unknown[]): void {\n this.log('success', message, ...args);\n }\n\n warn(message: string, ...args: unknown[]): void {\n this.log('warn', message, ...args);\n }\n\n error(message: string, ...args: unknown[]): void {\n this.log('error', message, ...args);\n }\n\n /**\n * Print a blank line\n */\n newline(): void {\n if (!this.silent) console.log();\n }\n\n /**\n * Print a title/header\n */\n title(text: string): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(chalk.cyan(text)));\n console.log(chalk.dim('─'.repeat(Math.min(text.length + 4, 60))));\n }\n\n /**\n * Print a subtitle\n */\n subtitle(text: string): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(text));\n }\n\n /**\n * Print a large section header for major transitions\n * Creates a visually prominent divider between configuration sections\n */\n section(text: string, icon?: string): void {\n if (this.silent) return;\n const displayIcon = icon || '◆';\n const width = 60;\n const border = '═'.repeat(width);\n const innerWidth = width - 4;\n const paddedText = text.length > innerWidth ? text.slice(0, innerWidth) : text;\n const leftPad = Math.floor((innerWidth - paddedText.length) / 2);\n const rightPad = innerWidth - paddedText.length - leftPad;\n\n console.log();\n console.log(chalk.cyan(`╔${border}╗`));\n console.log(chalk.cyan('║') + ' '.repeat(width) + chalk.cyan('║'));\n console.log(\n `${\n chalk.cyan('║') + ' '.repeat(leftPad + 1) + chalk.hex('#FED330')(displayIcon)\n } ${chalk.bold.white(paddedText)}${' '.repeat(rightPad + 1)}${chalk.cyan('║')}`\n );\n console.log(chalk.cyan('║') + ' '.repeat(width) + chalk.cyan('║'));\n console.log(chalk.cyan(`╚${border}╝`));\n console.log();\n }\n\n /**\n * Print a step in a process\n */\n step(stepNumber: number, totalSteps: number, message: string): void {\n if (this.silent) return;\n const progress = chalk.dim(`[${stepNumber}/${totalSteps}]`);\n console.log(`${progress} ${message}`);\n }\n\n /**\n * Print a list item\n */\n item(text: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${SYMBOLS.bullet} ${text}`);\n }\n\n /**\n * Print a key-value pair\n */\n keyValue(key: string, value: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${chalk.dim(`${key}:`)} ${value}`);\n }\n\n /**\n * Print an arrow item (for showing changes/actions)\n */\n arrow(text: string, indent = 0): void {\n if (this.silent) return;\n const spaces = ' '.repeat(indent);\n console.log(`${spaces}${SYMBOLS.arrow} ${text}`);\n }\n\n /**\n * Print a boxed message\n */\n box(title: string, content: string[]): void {\n if (this.silent) return;\n const maxLength = Math.max(title.length, ...content.map((line) => line.length));\n const width = Math.min(maxLength + 4, 70);\n const border = '─'.repeat(width - 2);\n\n console.log();\n console.log(chalk.cyan(`┌${border}┐`));\n console.log(chalk.cyan('│') + chalk.bold(` ${title.padEnd(width - 3)}`) + chalk.cyan('│'));\n console.log(chalk.cyan(`├${border}┤`));\n for (const line of content) {\n console.log(`${chalk.cyan('│')} ${line.padEnd(width - 3)}${chalk.cyan('│')}`);\n }\n console.log(chalk.cyan(`└${border}┘`));\n console.log();\n }\n\n /**\n * Print a table\n */\n table(headers: string[], rows: string[][]): void {\n if (this.silent) return;\n\n // Calculate column widths\n const colWidths = headers.map((h, i) => {\n const maxRowWidth = Math.max(...rows.map((r) => (r[i] || '').length));\n return Math.max(h.length, maxRowWidth);\n });\n\n // Print header\n const headerRow = headers.map((h, i) => chalk.bold(h.padEnd(colWidths[i]))).join(' ');\n console.log(headerRow);\n console.log(chalk.dim(colWidths.map((w) => '─'.repeat(w)).join(' ')));\n\n // Print rows\n for (const row of rows) {\n const rowStr = row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' ');\n console.log(rowStr);\n }\n }\n\n /**\n * Print a colored status\n */\n status(label: string, status: 'success' | 'error' | 'warn' | 'pending' | 'skip'): void {\n if (this.silent) return;\n const statusColors = {\n success: chalk.green('✔ done'),\n error: chalk.red('✖ failed'),\n warn: chalk.yellow('⚠ warning'),\n pending: chalk.blue('◯ pending'),\n skip: chalk.dim('○ skipped'),\n };\n console.log(` ${label}: ${statusColors[status]}`);\n }\n\n /**\n * Print instructions\n */\n instructions(title: string, steps: string[]): void {\n if (this.silent) return;\n console.log();\n console.log(chalk.bold(chalk.cyan(title)));\n console.log();\n steps.forEach((step, index) => {\n console.log(` ${chalk.dim(`${index + 1}.`)} ${step}`);\n });\n console.log();\n }\n\n /**\n * Print a dimmed note\n */\n note(text: string): void {\n if (this.silent) return;\n console.log(chalk.dim(` ${text}`));\n }\n\n /**\n * Print raw text without formatting\n */\n raw(text: string): void {\n if (this.silent) return;\n console.log(text);\n }\n}\n\n// Export singleton instance\nexport const logger = new Logger();\n\n// Export color utilities for direct use\nexport const colors = {\n primary: chalk.cyan,\n secondary: chalk.blue,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n muted: chalk.dim,\n bold: chalk.bold,\n underline: chalk.underline,\n};\n","/**\n * Code style configuration file generators\n * Generates configuration files based on user options\n */\n\nimport type {\n BiomeOptions,\n CommitlintOptions,\n EditorConfigOptions,\n PrettierOptions,\n} from '../../types/config.js';\n\n/**\n * Generate .editorconfig content\n */\nexport function generateEditorConfig(options: EditorConfigOptions): string {\n const indent = options.indentStyle === 'tab' ? 'indent_style = tab' : 'indent_style = space';\n const indentSize =\n options.indentStyle === 'tab'\n ? `tab_width = ${options.indentSize}`\n : `indent_size = ${options.indentSize}`;\n\n const maxLine =\n options.maxLineLength === 'off' ? '' : `max_line_length = ${options.maxLineLength}`;\n\n return `# EditorConfig - https://editorconfig.org\nroot = true\n\n[*]\n${indent}\n${indentSize}\nend_of_line = ${options.endOfLine}\ncharset = ${options.charset}\ntrim_trailing_whitespace = ${options.trimTrailingWhitespace}\ninsert_final_newline = ${options.insertFinalNewline}\n${maxLine}\n\n[*.md]\ntrim_trailing_whitespace = false\n\n[*.{yml,yaml}]\nindent_size = 2\n\n[Makefile]\nindent_style = tab\n`.trim();\n}\n\n/**\n * Generate biome.json content\n */\nexport function generateBiomeConfig(options: BiomeOptions): string {\n const config = {\n $schema: 'https://biomejs.dev/schemas/1.9.4/schema.json',\n vcs: {\n enabled: true,\n clientKind: 'git',\n useIgnoreFile: true,\n },\n files: {\n ignoreUnknown: true,\n ignore: options.ignorePatterns,\n },\n formatter: {\n enabled: true,\n indentStyle: options.formatter.indentStyle,\n indentWidth: options.formatter.indentWidth,\n lineWidth: options.formatter.lineWidth,\n },\n organizeImports: {\n enabled: options.organizeImports,\n },\n linter: {\n enabled: true,\n rules: {\n recommended: options.linter.recommended,\n correctness: options.linter.correctness ? { recommended: true } : { recommended: false },\n suspicious: options.linter.suspicious ? { recommended: true } : { recommended: false },\n style: options.linter.style ? { recommended: true } : { recommended: false },\n complexity: options.linter.complexity ? { recommended: true } : { recommended: false },\n security: options.linter.security ? { recommended: true } : { recommended: false },\n performance: options.linter.performance ? { recommended: true } : { recommended: false },\n a11y: options.linter.a11y ? { recommended: true } : { recommended: false },\n },\n },\n javascript: {\n formatter: {\n quoteStyle: options.formatter.quoteStyle,\n semicolons: options.formatter.semicolons,\n trailingCommas: options.formatter.trailingCommas,\n quoteProperties: options.formatter.quoteProperties,\n bracketSpacing: options.formatter.bracketSpacing,\n bracketSameLine: options.formatter.bracketSameLine,\n arrowParentheses: options.formatter.arrowParentheses,\n },\n },\n json: {\n formatter: {\n indentStyle: options.formatter.indentStyle,\n indentWidth: options.formatter.indentWidth,\n lineWidth: options.formatter.lineWidth,\n },\n },\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate .prettierrc content\n */\nexport function generatePrettierConfig(options: PrettierOptions): string {\n const config = {\n printWidth: options.printWidth,\n tabWidth: options.tabWidth,\n useTabs: options.useTabs,\n semi: options.semi,\n singleQuote: options.singleQuote,\n jsxSingleQuote: options.jsxSingleQuote,\n trailingComma: options.trailingComma,\n bracketSpacing: options.bracketSpacing,\n bracketSameLine: options.bracketSameLine,\n arrowParens: options.arrowParens,\n endOfLine: options.endOfLine,\n proseWrap: options.proseWrap,\n htmlWhitespaceSensitivity: options.htmlWhitespaceSensitivity,\n singleAttributePerLine: options.singleAttributePerLine,\n };\n\n return JSON.stringify(config, null, 2);\n}\n\n/**\n * Generate .prettierignore content\n */\nexport function generatePrettierIgnore(): string {\n return `# Dependencies\nnode_modules/\n.pnpm-store/\n\n# Build outputs\ndist/\nbuild/\n.next/\n.nuxt/\n.output/\nout/\n\n# Cache\n.cache/\n.turbo/\n*.tsbuildinfo\n\n# Coverage\ncoverage/\n\n# IDE\n.idea/\n.vscode/\n\n# Misc\n*.min.js\n*.min.css\npackage-lock.json\npnpm-lock.yaml\nyarn.lock\n`;\n}\n\n/**\n * Generate commitlint.config.js content\n */\nexport function generateCommitlintConfig(options: CommitlintOptions): string {\n const extendsArray = options.extends.map((e) => `'${e}'`).join(', ');\n const typesArray = options.types.map((t) => `'${t}'`).join(', ');\n\n let scopeConfig = '';\n if (options.scopes.length > 0) {\n const scopesArray = options.scopes.map((s) => `'${s}'`).join(', ');\n scopeConfig = `\n 'scope-enum': [2, 'always', [${scopesArray}]],`;\n }\n\n const scopeRequired = options.scopeRequired\n ? `\n 'scope-empty': [2, 'never'],`\n : '';\n\n const bodyRequired = options.bodyRequired\n ? `\n 'body-empty': [2, 'never'],`\n : '';\n\n return `/** @type {import('@commitlint/types').UserConfig} */\nexport default {\n extends: [${extendsArray}],\n rules: {\n 'type-enum': [2, 'always', [${typesArray}]],\n 'header-max-length': [2, 'always', ${options.headerMaxLength}],\n 'body-max-line-length': [2, 'always', ${options.bodyMaxLineLength}],${scopeConfig}${scopeRequired}${bodyRequired}\n },\n};\n`;\n}\n\n/**\n * Generate Husky commit-msg hook content\n */\nexport function generateHuskyCommitMsgHook(): string {\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx --no -- commitlint --edit \"\\${1}\"\n`;\n}\n","/**\n * VSCode settings.json generator for code style tools\n */\n\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface VSCodeSettings {\n [key: string]: unknown;\n}\n\nexport interface VSCodeInstallResult {\n /** Whether settings file was created */\n created: boolean;\n /** Whether settings file was updated */\n updated: boolean;\n /** Whether settings file was skipped */\n skipped: boolean;\n /** Path to the file */\n path: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Generate VSCode settings for code style tools\n */\nexport function generateVSCodeSettings(config: CodeStyleConfig): VSCodeSettings {\n const settings: VSCodeSettings = {};\n\n if (config.biome) {\n // Set Biome as the default formatter\n settings['editor.defaultFormatter'] = 'biomejs.biome';\n settings['editor.formatOnSave'] = true;\n\n // Language-specific settings for Biome\n settings['[javascript]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[javascriptreact]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[typescript]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[typescriptreact]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[json]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n settings['[jsonc]'] = {\n 'editor.defaultFormatter': 'biomejs.biome',\n };\n\n // Disable ESLint if using Biome for linting\n settings['eslint.enable'] = false;\n\n // Biome extension settings\n settings['biome.enabled'] = true;\n settings['biome.lintOnSave'] = true;\n }\n\n if (config.prettier && !config.biome) {\n // Set Prettier as the default formatter (only if Biome is not enabled)\n settings['editor.defaultFormatter'] = 'esbenp.prettier-vscode';\n settings['editor.formatOnSave'] = true;\n\n // Language-specific settings for Prettier\n settings['[javascript]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[javascriptreact]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[typescript]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[typescriptreact]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[json]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n settings['[markdown]'] = {\n 'editor.defaultFormatter': 'esbenp.prettier-vscode',\n };\n }\n\n // EditorConfig is automatically picked up by VSCode with the extension\n if (config.editorconfig) {\n settings['editor.detectIndentation'] = false;\n }\n\n return settings;\n}\n\n/**\n * Generate VSCode extensions recommendations\n */\nexport function generateVSCodeExtensions(config: CodeStyleConfig): { recommendations: string[] } {\n const recommendations: string[] = [];\n\n if (config.biome) {\n recommendations.push('biomejs.biome');\n }\n\n if (config.prettier && !config.biome) {\n recommendations.push('esbenp.prettier-vscode');\n }\n\n if (config.editorconfig) {\n recommendations.push('EditorConfig.EditorConfig');\n }\n\n // Always recommend these for TypeScript projects\n recommendations.push('dbaeumer.vscode-eslint'); // In case they want to use it later\n\n return { recommendations };\n}\n\n/**\n * Install VSCode settings.json\n */\nexport async function installVSCodeSettings(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<VSCodeInstallResult> {\n if (!config.enabled) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: '',\n };\n }\n\n const vscodeDir = joinPath(projectPath, '.vscode');\n const settingsPath = joinPath(vscodeDir, 'settings.json');\n\n try {\n // Generate new settings\n const newSettings = generateVSCodeSettings(config);\n\n // Check if file exists\n const exists = await pathExists(settingsPath);\n\n if (exists) {\n if (options?.merge) {\n // Merge with existing settings\n const existingContent = await readFile(settingsPath);\n let existingSettings: VSCodeSettings = {};\n try {\n existingSettings = JSON.parse(existingContent);\n } catch {\n logger.warn('Could not parse existing settings.json, will overwrite');\n }\n\n const mergedSettings = { ...existingSettings, ...newSettings };\n await writeFile(settingsPath, JSON.stringify(mergedSettings, null, 2));\n\n return {\n created: false,\n updated: true,\n skipped: false,\n path: settingsPath,\n };\n }\n\n if (!options?.overwrite) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: settingsPath,\n };\n }\n }\n\n // Ensure .vscode directory exists\n await ensureDir(vscodeDir);\n\n // Write settings file\n await writeFile(settingsPath, JSON.stringify(newSettings, null, 2));\n\n return {\n created: !exists,\n updated: exists,\n skipped: false,\n path: settingsPath,\n };\n } catch (error) {\n return {\n created: false,\n updated: false,\n skipped: false,\n path: settingsPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Install VSCode extensions.json\n */\nexport async function installVSCodeExtensions(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<VSCodeInstallResult> {\n if (!config.enabled) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: '',\n };\n }\n\n const vscodeDir = joinPath(projectPath, '.vscode');\n const extensionsPath = joinPath(vscodeDir, 'extensions.json');\n\n try {\n // Generate extensions\n const newExtensions = generateVSCodeExtensions(config);\n\n // Check if file exists\n const exists = await pathExists(extensionsPath);\n\n if (exists) {\n if (options?.merge) {\n // Merge with existing extensions\n const existingContent = await readFile(extensionsPath);\n let existingExtensions: { recommendations: string[] } = { recommendations: [] };\n try {\n existingExtensions = JSON.parse(existingContent);\n } catch {\n logger.warn('Could not parse existing extensions.json, will overwrite');\n }\n\n const mergedRecommendations = [\n ...new Set([\n ...(existingExtensions.recommendations || []),\n ...newExtensions.recommendations,\n ]),\n ];\n await writeFile(\n extensionsPath,\n JSON.stringify({ recommendations: mergedRecommendations }, null, 2)\n );\n\n return {\n created: false,\n updated: true,\n skipped: false,\n path: extensionsPath,\n };\n }\n\n if (!options?.overwrite) {\n return {\n created: false,\n updated: false,\n skipped: true,\n path: extensionsPath,\n };\n }\n }\n\n // Ensure .vscode directory exists\n await ensureDir(vscodeDir);\n\n // Write extensions file\n await writeFile(extensionsPath, JSON.stringify(newExtensions, null, 2));\n\n return {\n created: !exists,\n updated: exists,\n skipped: false,\n path: extensionsPath,\n };\n } catch (error) {\n return {\n created: false,\n updated: false,\n skipped: false,\n path: extensionsPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Install all VSCode configuration files\n */\nexport async function installVSCodeConfig(\n projectPath: string,\n config: CodeStyleConfig,\n options?: { overwrite?: boolean; merge?: boolean }\n): Promise<{\n settings: VSCodeInstallResult;\n extensions: VSCodeInstallResult;\n}> {\n const [settingsResult, extensionsResult] = await Promise.all([\n installVSCodeSettings(projectPath, config, options),\n installVSCodeExtensions(projectPath, config, options),\n ]);\n\n return {\n settings: settingsResult,\n extensions: extensionsResult,\n };\n}\n","/**\n * Config exports\n */\n\n// Reader\nexport {\n readConfig,\n hasConfig,\n hasClaudeDir,\n getConfigPath,\n getClaudeDirPath,\n readPartialConfig,\n getInstalledModulesFromConfig,\n getConfigVersion,\n needsMigration,\n} from './reader.js';\n\n// Writer\nexport {\n writeConfig,\n updateConfig,\n mergeConfig,\n createDefaultConfig,\n addModulesToConfig,\n removeModulesFromConfig,\n updateMcpConfig,\n updateExtrasConfig,\n} from './writer.js';\n\n// Global Defaults\nexport {\n getGlobalDefaultsPath,\n readGlobalDefaults,\n writeGlobalDefaults,\n updateGlobalDefaults,\n mergeWithGlobalDefaults,\n hasGlobalDefaults,\n clearGlobalDefaults,\n getGlobalTemplateConfig,\n formatGlobalDefaults,\n} from './global-defaults.js';\n","/**\n * Configuration reader - reads Claude config files\n */\n\nimport type { ClaudeConfig, PartialClaudeConfig } from '../../types/config.js';\nimport { joinPath, pathExists, readJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst CONFIG_FILE = 'config.json';\nconst CLAUDE_DIR = '.claude';\n\n/**\n * Read Claude configuration from a project\n */\nexport async function readConfig(projectPath: string): Promise<ClaudeConfig | null> {\n const configPath = joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n\n if (!(await pathExists(configPath))) {\n return null;\n }\n\n try {\n return await readJson<ClaudeConfig>(configPath);\n } catch (error) {\n logger.debug(`Failed to read config: ${error}`);\n return null;\n }\n}\n\n/**\n * Check if a Claude configuration exists\n */\nexport async function hasConfig(projectPath: string): Promise<boolean> {\n const configPath = joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n return pathExists(configPath);\n}\n\n/**\n * Check if Claude directory exists\n */\nexport async function hasClaudeDir(projectPath: string): Promise<boolean> {\n const claudePath = joinPath(projectPath, CLAUDE_DIR);\n return pathExists(claudePath);\n}\n\n/**\n * Get config file path\n */\nexport function getConfigPath(projectPath: string): string {\n return joinPath(projectPath, CLAUDE_DIR, CONFIG_FILE);\n}\n\n/**\n * Get Claude directory path\n */\nexport function getClaudeDirPath(projectPath: string): string {\n return joinPath(projectPath, CLAUDE_DIR);\n}\n\n/**\n * Read partial config (for updates/merges)\n */\nexport async function readPartialConfig(projectPath: string): Promise<PartialClaudeConfig | null> {\n return readConfig(projectPath) as Promise<PartialClaudeConfig | null>;\n}\n\n/**\n * Get installed module IDs from config\n */\nexport function getInstalledModulesFromConfig(config: ClaudeConfig): Record<string, string[]> {\n return {\n agents: config.modules.agents.selected,\n skills: config.modules.skills.selected,\n commands: config.modules.commands.selected,\n docs: config.modules.docs.selected,\n };\n}\n\n/**\n * Get config version\n */\nexport function getConfigVersion(config: ClaudeConfig): string {\n return config.version;\n}\n\n/**\n * Check if config needs migration\n */\nexport function needsMigration(config: ClaudeConfig, currentVersion: string): boolean {\n const configVersion = config.version;\n\n // Simple semver comparison\n const [configMajor, configMinor] = configVersion.split('.').map(Number);\n const [currentMajor, currentMinor] = currentVersion.split('.').map(Number);\n\n return configMajor < currentMajor || (configMajor === currentMajor && configMinor < currentMinor);\n}\n","/**\n * Configuration writer - writes Claude config files\n */\n\nimport type { ClaudeConfig, PartialClaudeConfig } from '../../types/config.js';\nimport { backup, ensureDir, joinPath, pathExists, writeJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { readConfig } from './reader.js';\n\nconst CONFIG_FILE = 'config.json';\nconst CLAUDE_DIR = '.claude';\n\n/**\n * Write Claude configuration\n */\nexport async function writeConfig(\n projectPath: string,\n config: ClaudeConfig,\n options?: { backup?: boolean }\n): Promise<void> {\n const claudePath = joinPath(projectPath, CLAUDE_DIR);\n const configPath = joinPath(claudePath, CONFIG_FILE);\n\n // Create .claude directory if needed\n await ensureDir(claudePath);\n\n // Backup existing config if requested\n if (options?.backup && (await pathExists(configPath))) {\n const backupPath = await backup(configPath, `.backup.${Date.now()}`);\n logger.debug(`Config backed up to: ${backupPath}`);\n }\n\n // Write config\n await writeJson(configPath, config, { spaces: 2 });\n logger.debug(`Config written to: ${configPath}`);\n}\n\n/**\n * Update existing configuration (merge)\n */\nexport async function updateConfig(\n projectPath: string,\n updates: PartialClaudeConfig\n): Promise<ClaudeConfig | null> {\n const existing = await readConfig(projectPath);\n\n if (!existing) {\n logger.warn('No existing config to update');\n return null;\n }\n\n const updated = mergeConfig(existing, updates);\n updated.customizations.lastUpdated = new Date().toISOString();\n\n await writeConfig(projectPath, updated);\n return updated;\n}\n\n/**\n * Merge partial config into existing config\n */\nexport function mergeConfig(existing: ClaudeConfig, updates: PartialClaudeConfig): ClaudeConfig {\n return {\n version: updates.version || existing.version,\n templateSource: updates.templateSource || existing.templateSource,\n project: {\n ...existing.project,\n ...updates.project,\n },\n preferences: {\n ...existing.preferences,\n ...updates.preferences,\n },\n mcp: updates.mcp || existing.mcp,\n modules: {\n agents: updates.modules?.agents || existing.modules.agents,\n skills: updates.modules?.skills || existing.modules.skills,\n commands: updates.modules?.commands || existing.modules.commands,\n docs: updates.modules?.docs || existing.modules.docs,\n },\n extras: {\n ...existing.extras,\n ...updates.extras,\n hooks: updates.extras?.hooks || existing.extras.hooks,\n },\n scaffold: updates.scaffold || existing.scaffold,\n customizations: {\n ...existing.customizations,\n ...updates.customizations,\n lastUpdated: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Create a default configuration\n */\nexport function createDefaultConfig(options: {\n version: string;\n projectInfo: ClaudeConfig['project'];\n preferences: ClaudeConfig['preferences'];\n}): ClaudeConfig {\n return {\n version: options.version,\n templateSource: {\n type: 'local',\n installedAt: new Date().toISOString(),\n },\n project: options.projectInfo,\n preferences: options.preferences,\n mcp: {\n level: 'project',\n servers: [],\n },\n modules: {\n agents: { selected: [], excluded: [] },\n skills: { selected: [], excluded: [] },\n commands: { selected: [], excluded: [] },\n docs: { selected: [], excluded: [] },\n },\n extras: {\n schemas: false,\n scripts: false,\n hooks: { enabled: false },\n sessions: false,\n },\n scaffold: {\n type: 'claude-only',\n createdStructure: [],\n },\n customizations: {\n placeholdersReplaced: false,\n lastUpdated: new Date().toISOString(),\n customFiles: [],\n },\n };\n}\n\n/**\n * Add selected modules to config\n */\nexport function addModulesToConfig(\n config: ClaudeConfig,\n category: keyof ClaudeConfig['modules'],\n moduleIds: string[]\n): ClaudeConfig {\n const existing = new Set(config.modules[category].selected);\n\n for (const id of moduleIds) {\n existing.add(id);\n }\n\n return {\n ...config,\n modules: {\n ...config.modules,\n [category]: {\n ...config.modules[category],\n selected: Array.from(existing),\n },\n },\n };\n}\n\n/**\n * Remove modules from config\n */\nexport function removeModulesFromConfig(\n config: ClaudeConfig,\n category: keyof ClaudeConfig['modules'],\n moduleIds: string[]\n): ClaudeConfig {\n const toRemove = new Set(moduleIds);\n const remaining = config.modules[category].selected.filter((id) => !toRemove.has(id));\n\n return {\n ...config,\n modules: {\n ...config.modules,\n [category]: {\n ...config.modules[category],\n selected: remaining,\n excluded: [...config.modules[category].excluded, ...moduleIds],\n },\n },\n };\n}\n\n/**\n * Update MCP configuration\n */\nexport function updateMcpConfig(config: ClaudeConfig, mcp: ClaudeConfig['mcp']): ClaudeConfig {\n return {\n ...config,\n mcp,\n };\n}\n\n/**\n * Update extras configuration\n */\nexport function updateExtrasConfig(\n config: ClaudeConfig,\n extras: Partial<ClaudeConfig['extras']>\n): ClaudeConfig {\n return {\n ...config,\n extras: {\n ...config.extras,\n ...extras,\n },\n };\n}\n","/**\n * Global defaults management\n *\n * Manages global defaults stored in ~/.claude/defaults.json\n * These defaults are used as fallbacks for new projects.\n */\n\nimport * as fs from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport * as path from 'node:path';\nimport type { GlobalDefaults, TemplateConfig } from '../../types/template-config.js';\n\n/**\n * Get the path to the global defaults file\n */\nexport function getGlobalDefaultsPath(): string {\n return path.join(homedir(), '.claude', 'defaults.json');\n}\n\n/**\n * Ensure the ~/.claude directory exists\n */\nasync function ensureClaudeDir(): Promise<void> {\n const claudeDir = path.join(homedir(), '.claude');\n try {\n await fs.mkdir(claudeDir, { recursive: true });\n } catch {\n // Directory exists or can't be created\n }\n}\n\n/**\n * Read global defaults from ~/.claude/defaults.json\n */\nexport async function readGlobalDefaults(): Promise<GlobalDefaults> {\n const defaultsPath = getGlobalDefaultsPath();\n\n try {\n const content = await fs.readFile(defaultsPath, 'utf-8');\n return JSON.parse(content) as GlobalDefaults;\n } catch {\n // File doesn't exist or is invalid\n return {};\n }\n}\n\n/**\n * Write global defaults to ~/.claude/defaults.json\n */\nexport async function writeGlobalDefaults(defaults: GlobalDefaults): Promise<void> {\n await ensureClaudeDir();\n const defaultsPath = getGlobalDefaultsPath();\n\n const dataToWrite: GlobalDefaults = {\n ...defaults,\n lastUpdated: new Date().toISOString(),\n };\n\n await fs.writeFile(defaultsPath, JSON.stringify(dataToWrite, null, 2), 'utf-8');\n}\n\n/**\n * Update global defaults with new template config\n */\nexport async function updateGlobalDefaults(templateConfig: Partial<TemplateConfig>): Promise<void> {\n const existing = await readGlobalDefaults();\n\n const updated: GlobalDefaults = {\n ...existing,\n templateConfig: mergeTemplateConfigs(existing.templateConfig || {}, templateConfig),\n lastUpdated: new Date().toISOString(),\n };\n\n await writeGlobalDefaults(updated);\n}\n\n/**\n * Merge two template configs, with source taking precedence\n */\nfunction mergeTemplateConfigs(\n target: Partial<TemplateConfig>,\n source: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n return {\n commands: { ...target.commands, ...source.commands },\n paths: { ...target.paths, ...source.paths },\n targets: { ...target.targets, ...source.targets },\n tracking: { ...target.tracking, ...source.tracking },\n techStack: { ...target.techStack, ...source.techStack },\n environment: { ...target.environment, ...source.environment },\n brand: { ...target.brand, ...source.brand },\n };\n}\n\n/**\n * Merge detected values with global defaults\n * Priority: detected > global > hardcoded defaults\n */\nexport function mergeWithGlobalDefaults(\n detected: Partial<TemplateConfig>,\n globalDefaults: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n return {\n commands: {\n ...globalDefaults.commands,\n ...filterUndefined(detected.commands || {}),\n },\n paths: {\n ...globalDefaults.paths,\n ...filterUndefined(detected.paths || {}),\n },\n targets: {\n ...globalDefaults.targets,\n ...filterUndefined(detected.targets || {}),\n },\n tracking: {\n ...globalDefaults.tracking,\n ...filterUndefined(detected.tracking || {}),\n },\n techStack: {\n ...globalDefaults.techStack,\n ...filterUndefined(detected.techStack || {}),\n },\n environment: {\n ...globalDefaults.environment,\n ...filterUndefined(detected.environment || {}),\n },\n brand: {\n ...globalDefaults.brand,\n ...filterUndefined(detected.brand || {}),\n },\n };\n}\n\n/**\n * Filter out undefined values from an object\n */\nfunction filterUndefined<T extends object>(obj: T): Partial<T> {\n const result: Partial<T> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n (result as Record<string, unknown>)[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Check if global defaults exist\n */\nexport async function hasGlobalDefaults(): Promise<boolean> {\n try {\n const defaults = await readGlobalDefaults();\n return defaults.templateConfig !== undefined && Object.keys(defaults.templateConfig).length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Clear global defaults\n */\nexport async function clearGlobalDefaults(): Promise<void> {\n const defaultsPath = getGlobalDefaultsPath();\n try {\n await fs.unlink(defaultsPath);\n } catch {\n // File doesn't exist\n }\n}\n\n/**\n * Get template config from global defaults\n */\nexport async function getGlobalTemplateConfig(): Promise<Partial<TemplateConfig>> {\n const defaults = await readGlobalDefaults();\n return defaults.templateConfig || {};\n}\n\n/**\n * Format global defaults for display\n */\nexport function formatGlobalDefaults(defaults: GlobalDefaults): string {\n const lines: string[] = [];\n\n lines.push('Global Defaults');\n lines.push('─'.repeat(40));\n\n if (defaults.lastUpdated) {\n lines.push(`Last updated: ${new Date(defaults.lastUpdated).toLocaleString()}`);\n lines.push('');\n }\n\n if (!defaults.templateConfig || Object.keys(defaults.templateConfig).length === 0) {\n lines.push('No template configuration saved');\n return lines.join('\\n');\n }\n\n const config = defaults.templateConfig;\n\n if (config.commands && Object.keys(config.commands).length > 0) {\n lines.push('Commands:');\n for (const [key, value] of Object.entries(config.commands)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.paths && Object.keys(config.paths).length > 0) {\n lines.push('Paths:');\n for (const [key, value] of Object.entries(config.paths)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.targets && Object.keys(config.targets).length > 0) {\n lines.push('Targets:');\n for (const [key, value] of Object.entries(config.targets)) {\n if (value !== undefined) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.tracking && Object.keys(config.tracking).length > 0) {\n lines.push('Tracking:');\n for (const [key, value] of Object.entries(config.tracking)) {\n if (value !== undefined) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.techStack && Object.keys(config.techStack).length > 0) {\n lines.push('Tech Stack:');\n for (const [key, value] of Object.entries(config.techStack)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.environment && Object.keys(config.environment).length > 0) {\n lines.push('Environment:');\n for (const [key, value] of Object.entries(config.environment)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n if (config.brand && Object.keys(config.brand).length > 0) {\n lines.push('Brand:');\n for (const [key, value] of Object.entries(config.brand)) {\n if (value) lines.push(` ${key}: ${value}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Dependencies exports\n */\n\nexport {\n getCurrentPlatform,\n checkDependency,\n checkAllDependencies,\n checkFeatureDependencies,\n getInstallInstructions,\n formatDependencyReport,\n getRequiredFeatures,\n installDependency,\n installDependencies,\n formatManualInstallInstructions,\n type DependencyInstallResult,\n} from './checker.js';\n","/**\n * Dependency checker - checks system dependencies\n */\n\nimport { exec } from 'node:child_process';\nimport * as os from 'node:os';\nimport { promisify } from 'node:util';\nimport { DEPENDENCIES, getDependenciesForFeature } from '../../constants/dependencies.js';\nimport type {\n DependencyCheckResult,\n DependencyInfo,\n DependencyReport,\n Platform,\n} from '../../types/dependencies.js';\nimport { logger } from '../utils/logger.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Get current platform\n */\nexport function getCurrentPlatform(): Platform {\n const platform = os.platform();\n switch (platform) {\n case 'darwin':\n return 'macos';\n case 'win32':\n return 'windows';\n default:\n return 'linux';\n }\n}\n\n/**\n * Check if a single dependency is installed\n */\nexport async function checkDependency(dep: DependencyInfo): Promise<DependencyCheckResult> {\n try {\n const { stdout } = await execAsync(dep.checkCommand);\n const version = extractVersion(stdout);\n\n return {\n id: dep.id,\n installed: true,\n version,\n };\n } catch (error) {\n return {\n id: dep.id,\n installed: false,\n error: error instanceof Error ? error.message : 'Check failed',\n };\n }\n}\n\n/**\n * Extract version from command output\n */\nfunction extractVersion(output: string): string | undefined {\n // Common version patterns\n const patterns = [\n /(\\d+\\.\\d+\\.\\d+)/, // 1.2.3\n /v(\\d+\\.\\d+\\.\\d+)/, // v1.2.3\n /version\\s+(\\d+\\.\\d+\\.\\d+)/i, // version 1.2.3\n ];\n\n for (const pattern of patterns) {\n const match = output.match(pattern);\n if (match) {\n return match[1];\n }\n }\n\n return undefined;\n}\n\n/**\n * Check all dependencies\n */\nexport async function checkAllDependencies(): Promise<DependencyReport> {\n const platform = getCurrentPlatform();\n const checked: DependencyCheckResult[] = [];\n const missing: DependencyInfo[] = [];\n const instructions = new Map<string, NonNullable<DependencyInfo['platforms'][Platform]>>();\n\n for (const dep of DEPENDENCIES) {\n const result = await checkDependency(dep);\n checked.push(result);\n\n if (!result.installed) {\n missing.push(dep);\n\n const platformInstructions = dep.platforms[platform];\n if (platformInstructions) {\n instructions.set(dep.id, platformInstructions);\n }\n }\n }\n\n return {\n checked,\n missing,\n instructions,\n };\n}\n\n/**\n * Check dependencies for specific features\n */\nexport async function checkFeatureDependencies(features: string[]): Promise<DependencyReport> {\n const platform = getCurrentPlatform();\n const checked: DependencyCheckResult[] = [];\n const missing: DependencyInfo[] = [];\n const instructions = new Map<string, NonNullable<DependencyInfo['platforms'][Platform]>>();\n\n // Get unique dependencies for all features\n const deps = new Set<DependencyInfo>();\n for (const feature of features) {\n const featureDeps = getDependenciesForFeature(feature);\n for (const dep of featureDeps) {\n deps.add(dep);\n }\n }\n\n for (const dep of deps) {\n const result = await checkDependency(dep);\n checked.push(result);\n\n if (!result.installed) {\n missing.push(dep);\n\n const platformInstructions = dep.platforms[platform];\n if (platformInstructions) {\n instructions.set(dep.id, platformInstructions);\n }\n }\n }\n\n return {\n checked,\n missing,\n instructions,\n };\n}\n\n/**\n * Get installation instructions for a dependency\n */\nexport function getInstallInstructions(dep: DependencyInfo, platform?: Platform): string[] {\n const targetPlatform = platform || getCurrentPlatform();\n const instructions = dep.platforms[targetPlatform];\n\n if (!instructions) {\n return [`No installation instructions available for ${targetPlatform}`];\n }\n\n return instructions.commands;\n}\n\n/**\n * Format dependency report for display\n */\nexport function formatDependencyReport(report: DependencyReport): void {\n if (report.missing.length === 0) {\n logger.success('All dependencies are installed');\n return;\n }\n\n logger.warn(`Missing ${report.missing.length} dependencies:`);\n logger.newline();\n\n for (const dep of report.missing) {\n logger.subtitle(dep.name);\n logger.note(dep.description);\n logger.note(`Required for: ${dep.requiredFor.join(', ')}`);\n\n const instructions = report.instructions.get(dep.id);\n if (instructions) {\n logger.newline();\n logger.info('Installation:');\n for (const cmd of instructions.commands) {\n logger.raw(` ${cmd}`);\n }\n if (instructions.notes) {\n logger.note(instructions.notes);\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Get required features based on configuration\n */\nexport function getRequiredFeatures(config: {\n hooks?: { enabled?: boolean; notification?: { audio?: boolean; desktop?: boolean } };\n mcp?: { servers?: Array<{ serverId: string }> };\n}): string[] {\n const features: string[] = [];\n\n if (config.hooks?.enabled) {\n features.push('hooks');\n\n if (config.hooks.notification?.audio) {\n features.push('hook:notification:audio');\n }\n if (config.hooks.notification?.desktop) {\n features.push('hook:notification:desktop');\n }\n }\n\n if (config.mcp?.servers && config.mcp.servers.length > 0) {\n features.push('mcp-servers');\n }\n\n return features;\n}\n\n/**\n * Result of dependency installation attempt\n */\nexport interface DependencyInstallResult {\n dep: DependencyInfo;\n success: boolean;\n error?: string;\n}\n\n/**\n * Try to install a single dependency\n */\nexport async function installDependency(dep: DependencyInfo): Promise<DependencyInstallResult> {\n const platform = getCurrentPlatform();\n const platformInstructions = dep.platforms[platform];\n\n if (!platformInstructions) {\n return {\n dep,\n success: false,\n error: `No installation instructions for ${platform}`,\n };\n }\n\n // Get the first install command (usually the most common method)\n const installCommand = platformInstructions.commands[0];\n if (!installCommand) {\n return {\n dep,\n success: false,\n error: 'No install command available',\n };\n }\n\n try {\n await execAsync(installCommand, { timeout: 120000 }); // 2 min timeout\n\n // Verify installation\n const checkResult = await checkDependency(dep);\n if (checkResult.installed) {\n return { dep, success: true };\n }\n\n return {\n dep,\n success: false,\n error: 'Installation completed but dependency not found',\n };\n } catch (error) {\n return {\n dep,\n success: false,\n error: error instanceof Error ? error.message : 'Installation failed',\n };\n }\n}\n\n/**\n * Install multiple dependencies\n */\nexport async function installDependencies(\n deps: DependencyInfo[],\n options?: {\n onProgress?: (dep: DependencyInfo, index: number, total: number) => void;\n }\n): Promise<DependencyInstallResult[]> {\n const results: DependencyInstallResult[] = [];\n\n for (let i = 0; i < deps.length; i++) {\n const dep = deps[i];\n if (options?.onProgress) {\n options.onProgress(dep, i, deps.length);\n }\n\n const result = await installDependency(dep);\n results.push(result);\n }\n\n return results;\n}\n\n/**\n * Format installation instructions for manual installation\n */\nexport function formatManualInstallInstructions(report: DependencyReport): string[] {\n const lines: string[] = [];\n\n lines.push('');\n lines.push('To install the missing dependencies manually, run the following commands:');\n lines.push('');\n\n for (const dep of report.missing) {\n const instructions = report.instructions.get(dep.id);\n if (instructions) {\n lines.push(`# ${dep.name}`);\n for (const cmd of instructions.commands) {\n lines.push(cmd);\n }\n lines.push('');\n }\n }\n\n return lines;\n}\n","/**\n * System dependency definitions\n */\n\nimport type { DependencyInfo } from '../types/dependencies.js';\n\n/**\n * System dependencies required for various features\n */\nexport const DEPENDENCIES: DependencyInfo[] = [\n {\n id: 'piper-tts',\n name: 'Piper TTS',\n description: 'Text-to-speech for audio notifications',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v piper',\n platforms: {\n linux: {\n commands: [\n 'pip install piper-tts',\n 'mkdir -p ~/.local/share/piper/voices',\n 'wget -O ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx',\n 'wget -O ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/main/en/en_US/hfc_male/medium/en_US-hfc_male-medium.onnx.json',\n ],\n notes: 'Requires Python 3.9+ and pip',\n links: ['https://github.com/rhasspy/piper'],\n },\n macos: {\n commands: [\n 'pip3 install piper-tts',\n 'mkdir -p ~/.local/share/piper/voices',\n '# Download voice files from https://github.com/rhasspy/piper/releases',\n ],\n notes: 'May need to install portaudio: brew install portaudio',\n links: ['https://github.com/rhasspy/piper'],\n },\n },\n },\n {\n id: 'notify-send',\n name: 'libnotify',\n description: 'Desktop notifications for Linux',\n requiredFor: ['hook:notification:desktop'],\n checkCommand: 'command -v notify-send',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install libnotify-bin',\n '# Fedora:',\n 'sudo dnf install libnotify',\n '# Arch:',\n 'sudo pacman -S libnotify',\n ],\n },\n },\n },\n {\n id: 'terminal-notifier',\n name: 'terminal-notifier',\n description: 'Desktop notifications for macOS',\n requiredFor: ['hook:notification:desktop'],\n checkCommand: 'command -v terminal-notifier',\n platforms: {\n macos: {\n commands: ['brew install terminal-notifier'],\n links: ['https://github.com/julienXX/terminal-notifier'],\n },\n },\n },\n {\n id: 'jq',\n name: 'jq',\n description: 'JSON processor for hook scripts',\n requiredFor: ['hooks'],\n checkCommand: 'command -v jq',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install jq',\n '# Fedora:',\n 'sudo dnf install jq',\n '# Arch:',\n 'sudo pacman -S jq',\n ],\n },\n macos: {\n commands: ['brew install jq'],\n },\n windows: {\n commands: ['choco install jq', '# Or: winget install jqlang.jq'],\n },\n },\n },\n {\n id: 'aplay',\n name: 'ALSA Utils',\n description: 'Audio playback for Linux',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v aplay',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install alsa-utils',\n '# Fedora:',\n 'sudo dnf install alsa-utils',\n '# Arch:',\n 'sudo pacman -S alsa-utils',\n ],\n },\n },\n },\n {\n id: 'afplay',\n name: 'afplay',\n description: 'Audio playback for macOS (built-in)',\n requiredFor: ['hook:notification:audio'],\n checkCommand: 'command -v afplay',\n platforms: {\n macos: {\n commands: ['# Built-in on macOS, no installation needed'],\n notes: 'afplay is included with macOS by default',\n },\n },\n },\n {\n id: 'git',\n name: 'Git',\n description: 'Version control system',\n requiredFor: ['version-control', 'remote-templates'],\n checkCommand: 'git --version',\n platforms: {\n linux: {\n commands: [\n '# Ubuntu/Debian:',\n 'sudo apt install git',\n '# Fedora:',\n 'sudo dnf install git',\n '# Arch:',\n 'sudo pacman -S git',\n ],\n },\n macos: {\n commands: ['brew install git', '# Or: xcode-select --install'],\n },\n windows: {\n commands: ['choco install git', '# Or: winget install Git.Git'],\n links: ['https://git-scm.com/download/win'],\n },\n },\n },\n {\n id: 'node',\n name: 'Node.js',\n description: 'JavaScript runtime',\n requiredFor: ['cli', 'mcp-servers'],\n checkCommand: 'node --version',\n platforms: {\n linux: {\n commands: [\n '# Using nvm (recommended):',\n 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash',\n 'nvm install --lts',\n '# Or using package manager:',\n 'sudo apt install nodejs npm',\n ],\n links: ['https://nodejs.org/', 'https://github.com/nvm-sh/nvm'],\n },\n macos: {\n commands: [\n '# Using nvm (recommended):',\n 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash',\n 'nvm install --lts',\n '# Or using Homebrew:',\n 'brew install node',\n ],\n links: ['https://nodejs.org/', 'https://github.com/nvm-sh/nvm'],\n },\n windows: {\n commands: ['choco install nodejs-lts', '# Or: winget install OpenJS.NodeJS.LTS'],\n links: ['https://nodejs.org/'],\n },\n },\n },\n];\n\n/**\n * Get dependency by ID\n */\nexport function getDependency(id: string): DependencyInfo | undefined {\n return DEPENDENCIES.find((d) => d.id === id);\n}\n\n/**\n * Get dependencies required for a feature\n */\nexport function getDependenciesForFeature(feature: string): DependencyInfo[] {\n return DEPENDENCIES.filter((d) => d.requiredFor.includes(feature));\n}\n\n/**\n * Get all dependency IDs\n */\nexport function getDependencyIds(): string[] {\n return DEPENDENCIES.map((d) => d.id);\n}\n","/**\n * Git hooks module - Husky and related git hook utilities\n */\n\nexport {\n deriveHuskyConfigFromCodeStyle,\n getHuskyDependencies,\n getHuskySetupInstructions,\n getLintStagedConfig,\n installHusky,\n installHuskyWithSpinner,\n type HuskyConfig,\n type HuskyInstallResult,\n} from './husky-installer.js';\n","/**\n * Husky installer - creates git hooks for commit linting and other automation\n */\n\nimport type { CodeStyleConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, makeExecutable, pathExists, writeFile } from '../utils/fs.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface HuskyConfig {\n /** Enable commitlint hook */\n commitlint: boolean;\n /** Enable pre-commit hook for linting */\n preCommit: boolean;\n /** Linter command for pre-commit */\n lintCommand?: string;\n /** Enable pre-push hook */\n prePush: boolean;\n /** Test command for pre-push */\n testCommand?: string;\n}\n\nexport interface HuskyInstallResult {\n /** Files that were created */\n created: string[];\n /** Files that were skipped */\n skipped: string[];\n /** Errors encountered */\n errors: string[];\n /** Whether husky directory was initialized */\n initialized: boolean;\n}\n\n/**\n * Generate commit-msg hook content\n */\nfunction generateCommitMsgHook(): string {\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\nnpx --no -- commitlint --edit \"\\${1}\"\n`;\n}\n\n/**\n * Generate pre-commit hook content\n */\nfunction generatePreCommitHook(lintCommand?: string): string {\n const command = lintCommand || 'pnpm lint-staged';\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n${command}\n`;\n}\n\n/**\n * Generate pre-push hook content\n */\nfunction generatePrePushHook(testCommand?: string): string {\n const command = testCommand || 'pnpm test';\n return `#!/usr/bin/env sh\n. \"$(dirname -- \"$0\")/_/husky.sh\"\n\n${command}\n`;\n}\n\n/**\n * Generate husky.sh helper script\n */\nfunction generateHuskyScript(): string {\n return `#!/usr/bin/env sh\nif [ -z \"$husky_skip_init\" ]; then\n debug () {\n if [ \"$HUSKY_DEBUG\" = \"1\" ]; then\n echo \"husky (debug) - $1\"\n fi\n }\n\n readonly hook_name=\"\\$(basename -- \"$0\")\"\n debug \"starting $hook_name...\"\n\n if [ \"$HUSKY\" = \"0\" ]; then\n debug \"HUSKY env variable is set to 0, skipping hook\"\n exit 0\n fi\n\n if [ -f ~/.huskyrc ]; then\n debug \"sourcing ~/.huskyrc\"\n . ~/.huskyrc\n fi\n\n readonly husky_skip_init=1\n export husky_skip_init\n sh -e \"$0\" \"$@\"\n exitCode=\"$?\"\n\n if [ $exitCode != 0 ]; then\n echo \"husky - $hook_name hook exited with code $exitCode (error)\"\n fi\n\n if [ $exitCode = 127 ]; then\n echo \"husky - command not found in PATH=$PATH\"\n fi\n\n exit $exitCode\nfi\n`;\n}\n\n/**\n * Generate .gitignore for husky directory\n */\nfunction generateHuskyGitignore(): string {\n return `_\n`;\n}\n\n/**\n * Install Husky hooks\n */\nexport async function installHusky(\n projectPath: string,\n config: HuskyConfig,\n options?: { overwrite?: boolean }\n): Promise<HuskyInstallResult> {\n const result: HuskyInstallResult = {\n created: [],\n skipped: [],\n errors: [],\n initialized: false,\n };\n\n const huskyDir = joinPath(projectPath, '.husky');\n const huskyInternalDir = joinPath(huskyDir, '_');\n\n try {\n // Create .husky directory\n await ensureDir(huskyDir);\n await ensureDir(huskyInternalDir);\n result.initialized = true;\n\n // Create internal husky.sh script\n const huskyScriptPath = joinPath(huskyInternalDir, 'husky.sh');\n if (!(await pathExists(huskyScriptPath)) || options?.overwrite) {\n await writeFile(huskyScriptPath, generateHuskyScript());\n await makeExecutable(huskyScriptPath);\n result.created.push('_/husky.sh');\n } else {\n result.skipped.push('_/husky.sh');\n }\n\n // Create .gitignore in husky internal directory\n const gitignorePath = joinPath(huskyInternalDir, '.gitignore');\n if (!(await pathExists(gitignorePath)) || options?.overwrite) {\n await writeFile(gitignorePath, generateHuskyGitignore());\n result.created.push('_/.gitignore');\n }\n\n // Create commit-msg hook\n if (config.commitlint) {\n const commitMsgPath = joinPath(huskyDir, 'commit-msg');\n if (!(await pathExists(commitMsgPath)) || options?.overwrite) {\n await writeFile(commitMsgPath, generateCommitMsgHook());\n await makeExecutable(commitMsgPath);\n result.created.push('commit-msg');\n } else {\n result.skipped.push('commit-msg');\n }\n }\n\n // Create pre-commit hook\n if (config.preCommit) {\n const preCommitPath = joinPath(huskyDir, 'pre-commit');\n if (!(await pathExists(preCommitPath)) || options?.overwrite) {\n await writeFile(preCommitPath, generatePreCommitHook(config.lintCommand));\n await makeExecutable(preCommitPath);\n result.created.push('pre-commit');\n } else {\n result.skipped.push('pre-commit');\n }\n }\n\n // Create pre-push hook\n if (config.prePush) {\n const prePushPath = joinPath(huskyDir, 'pre-push');\n if (!(await pathExists(prePushPath)) || options?.overwrite) {\n await writeFile(prePushPath, generatePrePushHook(config.testCommand));\n await makeExecutable(prePushPath);\n result.created.push('pre-push');\n } else {\n result.skipped.push('pre-push');\n }\n }\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error));\n }\n\n return result;\n}\n\n/**\n * Install Husky with spinner\n */\nexport async function installHuskyWithSpinner(\n projectPath: string,\n config: HuskyConfig,\n options?: { overwrite?: boolean }\n): Promise<HuskyInstallResult> {\n return withSpinner(\n 'Installing Husky hooks...',\n () => installHusky(projectPath, config, options),\n {\n successText: 'Installed Husky hooks',\n }\n );\n}\n\n/**\n * Derive Husky config from code style config\n */\nexport function deriveHuskyConfigFromCodeStyle(codeStyle: CodeStyleConfig): HuskyConfig | null {\n if (!codeStyle.enabled) {\n return null;\n }\n\n // Only install husky if commitlint with husky integration is enabled\n const commitlintEnabled = codeStyle.commitlint && codeStyle.commitlintOptions?.huskyIntegration;\n\n if (!commitlintEnabled) {\n return null;\n }\n\n // Determine lint command based on tools\n let lintCommand: string | undefined;\n if (codeStyle.biome) {\n lintCommand = 'pnpm biome check --staged';\n } else if (codeStyle.prettier) {\n lintCommand = 'pnpm lint-staged';\n }\n\n return {\n commitlint: true,\n preCommit: !!lintCommand,\n lintCommand,\n prePush: false, // Don't run tests on push by default\n };\n}\n\n/**\n * Get lint-staged configuration for package.json\n */\nexport function getLintStagedConfig(\n codeStyle: CodeStyleConfig\n): Record<string, string | string[]> | null {\n if (!codeStyle.enabled) {\n return null;\n }\n\n const config: Record<string, string | string[]> = {};\n\n if (codeStyle.biome) {\n config['*.{js,jsx,ts,tsx,json}'] = ['biome check --write --no-errors-on-unmatched'];\n } else if (codeStyle.prettier) {\n config['*.{js,jsx,ts,tsx,json,md,css,scss}'] = ['prettier --write'];\n }\n\n if (Object.keys(config).length === 0) {\n return null;\n }\n\n return config;\n}\n\n/**\n * Get Husky dependencies for package.json\n */\nexport function getHuskyDependencies(): string[] {\n return ['husky'];\n}\n\n/**\n * Get Husky setup instructions\n */\nexport function getHuskySetupInstructions(): string[] {\n return ['Run `pnpm exec husky init` to initialize Husky (or hooks were pre-configured)'];\n}\n","/**\n * Hooks exports\n */\n\nexport { installHooks, getHooksStatus } from './configurator.js';\n","/**\n * Hook configurator - generates and installs hook scripts\n */\n\nimport type { HookConfig } from '../../types/config.js';\nimport { ensureDir, joinPath, makeExecutable, pathExists, writeFile } from '../utils/fs.js';\n\nconst HOOKS_DIR = '.claude/hooks';\n\n/**\n * Generate hook scripts based on configuration\n */\nexport async function installHooks(\n projectPath: string,\n config: HookConfig\n): Promise<{ installed: string[]; errors: string[] }> {\n const installed: string[] = [];\n const errors: string[] = [];\n\n if (!config.enabled) {\n return { installed, errors };\n }\n\n const hooksDir = joinPath(projectPath, HOOKS_DIR);\n await ensureDir(hooksDir);\n\n // Install notification hook\n if (config.notification) {\n try {\n const script = generateNotificationHook(config.notification);\n const scriptPath = joinPath(hooksDir, 'notification.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('notification.sh');\n } catch (error) {\n errors.push(`notification hook: ${error}`);\n }\n }\n\n // Install stop hook\n if (config.stop) {\n try {\n const script = generateStopHook(config.stop);\n const scriptPath = joinPath(hooksDir, 'stop.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('stop.sh');\n } catch (error) {\n errors.push(`stop hook: ${error}`);\n }\n }\n\n // Install subagent stop hook\n if (config.subagentStop) {\n try {\n const script = generateSubagentStopHook(config.subagentStop);\n const scriptPath = joinPath(hooksDir, 'subagent-stop.sh');\n await writeFile(scriptPath, script);\n await makeExecutable(scriptPath);\n installed.push('subagent-stop.sh');\n } catch (error) {\n errors.push(`subagent-stop hook: ${error}`);\n }\n }\n\n return { installed, errors };\n}\n\n/**\n * Generate notification hook script\n */\nfunction generateNotificationHook(config: HookConfig['notification']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code notification hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n 'MESSAGE=\"${1:-Claude needs your attention}\"',\n '',\n ];\n\n // Desktop notification\n if (config.desktop) {\n lines.push(\n '# Desktop notification',\n 'if command -v notify-send &> /dev/null; then',\n ' notify-send \"Claude Code\" \"$MESSAGE\" --icon=dialog-information',\n 'elif command -v terminal-notifier &> /dev/null; then',\n ' terminal-notifier -title \"Claude Code\" -message \"$MESSAGE\"',\n 'elif command -v osascript &> /dev/null; then',\n ' osascript -e \"display notification \\\\\"$MESSAGE\\\\\" with title \\\\\"Claude Code\\\\\"\"',\n 'fi',\n ''\n );\n }\n\n // Audio notification\n if (config.audio) {\n lines.push(\n '# Audio notification (text-to-speech)',\n 'if command -v piper &> /dev/null; then',\n ' echo \"$MESSAGE\" | piper --model ~/.local/share/piper/voices/en_US-hfc_male-medium.onnx --output-raw | aplay -r 22050 -f S16_LE -t raw - 2>/dev/null',\n 'elif command -v say &> /dev/null; then',\n ' say \"$MESSAGE\"',\n 'elif command -v espeak &> /dev/null; then',\n ' espeak \"$MESSAGE\"',\n 'fi',\n ''\n );\n }\n\n // Custom command\n if (config.customCommand) {\n lines.push('# Custom notification command', `${config.customCommand} \"$MESSAGE\"`, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate stop hook script\n */\nfunction generateStopHook(config: HookConfig['stop']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code stop hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n ];\n\n if (config.beep) {\n lines.push(\n '# Play beep sound',\n 'if command -v aplay &> /dev/null; then',\n ' # Generate a beep using speaker-test or beep command',\n ' ( speaker-test -t sine -f 1000 -l 1 ) &>/dev/null & pid=$!; sleep 0.2; kill -9 $pid &>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay /System/Library/Sounds/Glass.aiff',\n 'elif command -v powershell.exe &> /dev/null; then',\n ' powershell.exe -c \"[console]::beep(1000,200)\"',\n 'else',\n ' printf \"\\\\a\"',\n 'fi',\n ''\n );\n } else if (config.customSound) {\n lines.push(\n '# Play custom sound',\n `SOUND_FILE=\"${config.customSound}\"`,\n 'if command -v aplay &> /dev/null; then',\n ' aplay \"$SOUND_FILE\" 2>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay \"$SOUND_FILE\"',\n 'elif command -v paplay &> /dev/null; then',\n ' paplay \"$SOUND_FILE\"',\n 'fi',\n ''\n );\n } else if (config.customCommand) {\n lines.push('# Custom stop command', config.customCommand, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate subagent stop hook script\n */\nfunction generateSubagentStopHook(config: HookConfig['subagentStop']): string {\n if (!config) return '';\n\n const lines: string[] = [\n '#!/bin/bash',\n '# Claude Code subagent stop hook',\n '# Generated by @qazuor/claude-code-config',\n '',\n ];\n\n if (config.beep) {\n lines.push(\n '# Play short beep',\n 'if command -v aplay &> /dev/null; then',\n ' ( speaker-test -t sine -f 800 -l 1 ) &>/dev/null & pid=$!; sleep 0.1; kill -9 $pid &>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay /System/Library/Sounds/Pop.aiff',\n 'else',\n ' printf \"\\\\a\"',\n 'fi',\n ''\n );\n } else if (config.customSound) {\n lines.push(\n '# Play custom sound',\n `SOUND_FILE=\"${config.customSound}\"`,\n 'if command -v aplay &> /dev/null; then',\n ' aplay \"$SOUND_FILE\" 2>/dev/null',\n 'elif command -v afplay &> /dev/null; then',\n ' afplay \"$SOUND_FILE\"',\n 'fi',\n ''\n );\n } else if (config.customCommand) {\n lines.push('# Custom subagent stop command', config.customCommand, '');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Get hooks status\n */\nexport async function getHooksStatus(projectPath: string): Promise<{\n enabled: boolean;\n hooks: Array<{ name: string; exists: boolean; executable: boolean }>;\n}> {\n const hooksDir = joinPath(projectPath, HOOKS_DIR);\n const hookFiles = ['notification.sh', 'stop.sh', 'subagent-stop.sh'];\n const hooks: Array<{ name: string; exists: boolean; executable: boolean }> = [];\n\n for (const file of hookFiles) {\n const filePath = joinPath(hooksDir, file);\n const exists = await pathExists(filePath);\n\n let executable = false;\n if (exists) {\n try {\n const fs = await import('node:fs/promises');\n const stats = await fs.stat(filePath);\n executable = (stats.mode & 0o111) !== 0;\n } catch {\n // Ignore\n }\n }\n\n hooks.push({ name: file, exists, executable });\n }\n\n return {\n enabled: hooks.some((h) => h.exists),\n hooks,\n };\n}\n","/**\n * MCP exports\n */\n\nexport {\n installMcpServers,\n getInstalledMcpServers,\n removeMcpServer,\n getAvailableMcpServers,\n validateMcpConfig,\n} from './configurator.js';\n","/**\n * MCP configurator - generates MCP server configuration\n */\n\nimport * as os from 'node:os';\nimport { MCP_SERVERS, getMcpServer } from '../../constants/mcp-servers.js';\nimport type { McpConfig } from '../../types/config.js';\nimport type { McpInstallation, McpServerDefinition } from '../../types/mcp.js';\nimport { ensureDir, joinPath, pathExists, readJson, writeJson } from '../utils/fs.js';\n\nconst PROJECT_SETTINGS_FILE = '.claude/settings.local.json';\nconst USER_SETTINGS_FILE = '.claude/settings.json';\n\ninterface SettingsJson {\n mcpServers?: Record<string, McpServerEntry>;\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n [key: string]: unknown;\n}\n\ninterface McpServerEntry {\n command: string;\n args?: string[];\n env?: Record<string, string>;\n}\n\n/**\n * Install MCP servers configuration\n */\nexport async function installMcpServers(\n projectPath: string,\n config: McpConfig\n): Promise<{ success: boolean; path: string; errors: string[] }> {\n const errors: string[] = [];\n\n if (config.servers.length === 0) {\n return { success: true, path: '', errors };\n }\n\n // Determine settings file path\n const settingsPath =\n config.level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n // Ensure directory exists\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n // Read existing settings or create new\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start with empty settings\n }\n }\n\n // Initialize mcpServers if needed\n if (!settings.mcpServers) {\n settings.mcpServers = {};\n }\n\n // Add server configurations\n for (const installation of config.servers) {\n try {\n const entry = generateServerEntry(installation);\n if (entry) {\n settings.mcpServers[installation.serverId] = entry;\n }\n } catch (error) {\n errors.push(`${installation.serverId}: ${error}`);\n }\n }\n\n // Write settings\n await writeJson(settingsPath, settings, { spaces: 2 });\n\n return { success: errors.length === 0, path: settingsPath, errors };\n } catch (error) {\n return {\n success: false,\n path: settingsPath,\n errors: [`Failed to write settings: ${error}`],\n };\n }\n}\n\n/**\n * Generate MCP server entry for settings.json\n */\nfunction generateServerEntry(installation: McpInstallation): McpServerEntry | null {\n const serverDef = getMcpServer(installation.serverId);\n\n // For known servers, use the package name\n const packageName = serverDef?.package || (installation.config.package as string);\n\n if (!packageName) {\n return null;\n }\n\n const entry: McpServerEntry = {\n command: 'npx',\n args: ['-y', packageName],\n };\n\n // Add environment variables from config\n const env: Record<string, string> = {};\n\n if (serverDef?.configFields) {\n for (const field of serverDef.configFields) {\n const value = installation.config[field.name];\n if (value !== undefined && field.envVar) {\n env[field.envVar] = String(value);\n }\n }\n }\n\n // Add any additional config as env vars\n for (const [key, value] of Object.entries(installation.config)) {\n if (key === 'package') continue;\n\n // Convert config key to env var format if not already an env var\n const envKey = key.toUpperCase().replace(/[^A-Z0-9]/g, '_');\n if (!env[envKey] && value !== undefined) {\n env[envKey] = String(value);\n }\n }\n\n if (Object.keys(env).length > 0) {\n entry.env = env;\n }\n\n return entry;\n}\n\n/**\n * Get currently installed MCP servers\n */\nexport async function getInstalledMcpServers(\n projectPath: string\n): Promise<{ project: string[]; user: string[] }> {\n const result = { project: [] as string[], user: [] as string[] };\n\n // Check project settings\n const projectSettings = joinPath(projectPath, PROJECT_SETTINGS_FILE);\n if (await pathExists(projectSettings)) {\n try {\n const settings = await readJson<SettingsJson>(projectSettings);\n result.project = Object.keys(settings.mcpServers || {});\n } catch {\n // Ignore\n }\n }\n\n // Check user settings\n const userSettings = joinPath(os.homedir(), USER_SETTINGS_FILE);\n if (await pathExists(userSettings)) {\n try {\n const settings = await readJson<SettingsJson>(userSettings);\n result.user = Object.keys(settings.mcpServers || {});\n } catch {\n // Ignore\n }\n }\n\n return result;\n}\n\n/**\n * Remove MCP server from configuration\n */\nexport async function removeMcpServer(\n projectPath: string,\n serverId: string,\n level: 'user' | 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n if (!(await pathExists(settingsPath))) {\n return false;\n }\n\n try {\n const settings = await readJson<SettingsJson>(settingsPath);\n\n if (!settings.mcpServers || !settings.mcpServers[serverId]) {\n return false;\n }\n\n delete settings.mcpServers[serverId];\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get available MCP servers (grouped by category)\n */\nexport function getAvailableMcpServers(): Record<string, McpServerDefinition[]> {\n const grouped: Record<string, McpServerDefinition[]> = {};\n\n for (const server of MCP_SERVERS) {\n if (!grouped[server.category]) {\n grouped[server.category] = [];\n }\n grouped[server.category].push(server);\n }\n\n return grouped;\n}\n\n/**\n * Validate MCP server configuration\n */\nexport function validateMcpConfig(installation: McpInstallation): {\n valid: boolean;\n missing: string[];\n} {\n const serverDef = getMcpServer(installation.serverId);\n\n if (!serverDef) {\n // Custom server - just check it has a package\n return {\n valid: !!installation.config.package,\n missing: installation.config.package ? [] : ['package'],\n };\n }\n\n const missing: string[] = [];\n\n if (serverDef.requiresConfig && serverDef.configFields) {\n for (const field of serverDef.configFields) {\n if (field.required && !installation.config[field.name]) {\n missing.push(field.name);\n }\n }\n }\n\n return {\n valid: missing.length === 0,\n missing,\n };\n}\n","/**\n * MCP Server definitions\n * Only includes verified, real npm packages\n */\n\nimport type { McpServerDefinition } from '../types/mcp.js';\n\n/**\n * Available MCP servers - all packages verified to exist on npm\n */\nexport const MCP_SERVERS: McpServerDefinition[] = [\n // ============================================\n // DOCUMENTATION & AI TOOLS\n // ============================================\n {\n id: 'context7',\n name: 'Context7',\n description: 'Up-to-date documentation lookup for libraries and frameworks',\n package: '@upstash/context7-mcp',\n category: 'documentation',\n requiresConfig: false,\n installInstructions:\n 'API keys provide higher rate limits. Get one at https://context7.com/dashboard',\n },\n {\n id: 'perplexity',\n name: 'Perplexity',\n description: 'Web search without leaving the MCP ecosystem via Sonar API',\n package: '@chatmcp/server-perplexity-ask',\n category: 'search',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Perplexity/Sonar API Key',\n envVar: 'PERPLEXITY_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://www.perplexity.ai/settings/api',\n },\n {\n id: 'sequential-thinking',\n name: 'Sequential Thinking',\n description: 'Dynamic problem-solving through structured thinking process',\n package: '@modelcontextprotocol/server-sequential-thinking',\n category: 'ai',\n requiresConfig: false,\n installInstructions: 'Helps break down complex problems into manageable steps.',\n },\n\n // ============================================\n // TESTING & BROWSER AUTOMATION\n // ============================================\n {\n id: 'puppeteer',\n name: 'Puppeteer',\n description: 'Headless Chrome automation for testing and scraping',\n package: '@modelcontextprotocol/server-puppeteer',\n category: 'testing',\n requiresConfig: false,\n },\n {\n id: 'playwright',\n name: 'Playwright',\n description: 'Browser automation via accessibility snapshots, not screenshots',\n package: '@playwright/mcp',\n category: 'testing',\n requiresConfig: false,\n installInstructions: 'Requires Node.js 18+. Supports Chrome, Firefox, WebKit.',\n },\n {\n id: 'chrome-devtools',\n name: 'Chrome DevTools',\n description: 'Control and inspect live Chrome browser with DevTools Protocol',\n package: 'chrome-devtools-mcp',\n category: 'testing',\n requiresConfig: false,\n installInstructions:\n 'Requires Chrome installed. For Claude Code: claude mcp add chrome-devtools npx chrome-devtools-mcp@latest',\n },\n\n // ============================================\n // VERSION CONTROL\n // ============================================\n {\n id: 'github',\n name: 'GitHub',\n description: 'GitHub API integration (issues, PRs, repos, file operations)',\n package: '@modelcontextprotocol/server-github',\n category: 'version-control',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: false,\n description: 'GitHub Personal Access Token',\n envVar: 'GITHUB_TOKEN',\n },\n ],\n installInstructions:\n 'Create a Personal Access Token at https://github.com/settings/tokens with repo scope.',\n },\n {\n id: 'gitlab',\n name: 'GitLab',\n description: 'GitLab API for project management, issues, and merge requests',\n package: '@modelcontextprotocol/server-gitlab',\n category: 'version-control',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: true,\n description: 'GitLab Personal Access Token',\n envVar: 'GITLAB_PERSONAL_ACCESS_TOKEN',\n },\n {\n name: 'apiUrl',\n type: 'string',\n required: false,\n description: 'GitLab API URL (default: https://gitlab.com/api/v4)',\n envVar: 'GITLAB_API_URL',\n default: 'https://gitlab.com/api/v4',\n },\n ],\n installInstructions:\n 'Create PAT at GitLab User Settings > Access Tokens with api, read_repository, write_repository scopes.',\n },\n\n // ============================================\n // DATABASES\n // ============================================\n {\n id: 'postgres',\n name: 'PostgreSQL',\n description: 'Read-only PostgreSQL database access with schema inspection',\n package: '@modelcontextprotocol/server-postgres',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'connectionString',\n type: 'string',\n required: false,\n description: 'PostgreSQL connection string',\n envVar: 'DATABASE_URL',\n },\n ],\n installInstructions: 'Connection string format: postgresql://user:password@host:port/database',\n },\n {\n id: 'mysql',\n name: 'MySQL',\n description: 'Read-only MySQL/MariaDB database access',\n package: '@modelcontextprotocol/server-mysql',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'connectionString',\n type: 'string',\n required: true,\n description: 'MySQL connection URL',\n envVar: 'MYSQL_URL',\n },\n ],\n installInstructions: 'Connection format: mysql://user:password@host:port/database',\n },\n {\n id: 'neon',\n name: 'Neon',\n description: 'Neon serverless PostgreSQL with branch management',\n package: '@neondatabase/mcp-server-neon',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Neon API Key',\n envVar: 'NEON_API_KEY',\n },\n ],\n installInstructions: 'Get your API key from https://console.neon.tech/app/settings/api-keys',\n },\n {\n id: 'sqlite',\n name: 'SQLite',\n description: 'SQLite database interaction and business intelligence',\n package: '@modelcontextprotocol/server-sqlite',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'dbPath',\n type: 'string',\n required: false,\n description: 'Path to SQLite database file',\n default: './data.db',\n },\n ],\n },\n {\n id: 'supabase',\n name: 'Supabase',\n description: 'Supabase projects, database, Edge Functions, and type generation',\n package: '@supabase/mcp-server-supabase',\n category: 'database',\n requiresConfig: true,\n configFields: [\n {\n name: 'accessToken',\n type: 'string',\n required: false,\n description: 'Supabase Personal Access Token',\n envVar: 'SUPABASE_ACCESS_TOKEN',\n },\n ],\n installInstructions: 'Get your access token from https://supabase.com/dashboard/account/tokens',\n },\n\n // ============================================\n // CACHE & KEY-VALUE STORES\n // ============================================\n {\n id: 'redis',\n name: 'Redis',\n description: 'Redis key-value store operations (set, get, delete, list)',\n package: '@modelcontextprotocol/server-redis',\n category: 'cache',\n requiresConfig: true,\n configFields: [\n {\n name: 'url',\n type: 'string',\n required: false,\n description: 'Redis connection URL',\n envVar: 'REDIS_URL',\n default: 'redis://localhost:6379',\n },\n ],\n installInstructions:\n 'Pass Redis URL as argument: npx @modelcontextprotocol/server-redis redis://localhost:6379',\n },\n {\n id: 'upstash',\n name: 'Upstash',\n description: 'Upstash Redis database management and commands',\n package: '@upstash/mcp-server',\n category: 'cache',\n requiresConfig: true,\n configFields: [\n {\n name: 'email',\n type: 'string',\n required: false,\n description: 'Upstash account email',\n envVar: 'UPSTASH_EMAIL',\n },\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Upstash API Key',\n envVar: 'UPSTASH_API_KEY',\n },\n ],\n installInstructions: 'Get credentials from https://console.upstash.com',\n },\n\n // ============================================\n // DEPLOYMENT & INFRASTRUCTURE\n // ============================================\n {\n id: 'cloudflare',\n name: 'Cloudflare',\n description: 'Cloudflare Workers, D1, KV, R2, and DNS management',\n package: '@cloudflare/mcp-server-cloudflare',\n category: 'deployment',\n requiresConfig: true,\n configFields: [\n {\n name: 'accountId',\n type: 'string',\n required: false,\n description: 'Cloudflare Account ID',\n envVar: 'CLOUDFLARE_ACCOUNT_ID',\n },\n ],\n installInstructions: 'Run: npx @cloudflare/mcp-server-cloudflare init',\n },\n {\n id: 'vercel',\n name: 'Vercel',\n description: 'Vercel deployments, DNS records, and project management',\n package: 'vercel-mcp',\n category: 'deployment',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Vercel API Key',\n envVar: 'VERCEL_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://vercel.com/account/tokens',\n },\n {\n id: 'filesystem',\n name: 'Filesystem',\n description: 'Secure file operations with configurable access controls',\n package: '@modelcontextprotocol/server-filesystem',\n category: 'infrastructure',\n requiresConfig: false,\n },\n {\n id: 'memory',\n name: 'Memory',\n description: 'Knowledge graph-based persistent memory system',\n package: '@modelcontextprotocol/server-memory',\n category: 'infrastructure',\n requiresConfig: false,\n installInstructions: 'Memory is stored in memory.jsonl in the server directory by default.',\n },\n\n // ============================================\n // PROJECT MANAGEMENT & PRODUCTIVITY\n // ============================================\n {\n id: 'notion',\n name: 'Notion',\n description: 'Official Notion API for pages, databases, and workspace',\n package: '@notionhq/notion-mcp-server',\n category: 'project-mgmt',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: true,\n description: 'Notion Integration Token',\n envVar: 'NOTION_TOKEN',\n },\n ],\n installInstructions:\n 'Create integration at https://www.notion.so/profile/integrations and share pages with it.',\n },\n {\n id: 'obsidian',\n name: 'Obsidian',\n description: 'Read and search Obsidian vaults and Markdown directories',\n package: 'mcp-obsidian',\n category: 'project-mgmt',\n requiresConfig: true,\n configFields: [\n {\n name: 'vaultPath',\n type: 'string',\n required: true,\n description: 'Path to Obsidian vault',\n },\n ],\n installInstructions: 'Works with any Markdown directory. Point to your vault path.',\n },\n {\n id: 'n8n',\n name: 'n8n',\n description: 'n8n workflow automation node documentation and management',\n package: 'n8n-mcp',\n category: 'project-mgmt',\n requiresConfig: false,\n installInstructions: 'Provides access to 543 n8n nodes documentation.',\n },\n\n // ============================================\n // MONITORING & OBSERVABILITY\n // ============================================\n {\n id: 'sentry',\n name: 'Sentry',\n description: 'Query Sentry errors, issues, and project information',\n package: '@sentry/mcp-server',\n category: 'monitoring',\n requiresConfig: true,\n configFields: [\n {\n name: 'authToken',\n type: 'string',\n required: false,\n description: 'Sentry Auth Token',\n envVar: 'SENTRY_AUTH_TOKEN',\n },\n ],\n installInstructions:\n 'For Claude Code: claude mcp add --transport http sentry https://mcp.sentry.dev/mcp',\n },\n\n // ============================================\n // COMMUNICATION\n // ============================================\n {\n id: 'slack',\n name: 'Slack',\n description: 'Slack messaging, channels, and workspace interaction',\n package: '@modelcontextprotocol/server-slack',\n category: 'communication',\n requiresConfig: true,\n configFields: [\n {\n name: 'token',\n type: 'string',\n required: false,\n description: 'Slack Bot Token (xoxb-...)',\n envVar: 'SLACK_BOT_TOKEN',\n },\n ],\n installInstructions:\n 'Create a Slack app at https://api.slack.com/apps and install to your workspace.',\n },\n\n // ============================================\n // DESIGN\n // ============================================\n {\n id: 'figma',\n name: 'Figma',\n description: 'Figma layout information for AI coding agents',\n package: 'figma-developer-mcp',\n category: 'design',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: 'Figma Personal Access Token',\n envVar: 'FIGMA_API_KEY',\n },\n ],\n installInstructions: 'Create token at https://www.figma.com/developers/api#access-tokens',\n },\n {\n id: 'shadcn',\n name: 'shadcn/ui',\n description: 'shadcn/ui component docs, installation, and code generation',\n package: '@heilgar/shadcn-ui-mcp-server',\n category: 'ui-library',\n requiresConfig: false,\n installInstructions: 'Supports npm, pnpm, yarn, and bun package managers.',\n },\n {\n id: 'magic-ui',\n name: '21st.dev Magic',\n description: 'AI-driven UI component generation through natural language',\n package: '@21st-dev/magic',\n category: 'ui-library',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: true,\n description: '21st.dev Magic API Key',\n envVar: 'TWENTYFIRST_API_KEY',\n },\n ],\n installInstructions: 'Get API key at https://21st.dev/magic/console',\n },\n\n // ============================================\n // PAYMENTS\n // ============================================\n {\n id: 'stripe',\n name: 'Stripe',\n description: 'Stripe payments API with MCP support via Agent Toolkit',\n package: '@stripe/agent-toolkit',\n category: 'payments',\n requiresConfig: true,\n configFields: [\n {\n name: 'secretKey',\n type: 'string',\n required: false,\n description: 'Stripe Secret Key',\n envVar: 'STRIPE_SECRET_KEY',\n },\n ],\n installInstructions:\n 'Get API keys at https://dashboard.stripe.com/apikeys. Run: npx -y @stripe/mcp --tools=all --api-key=YOUR_KEY',\n },\n {\n id: 'mercadopago',\n name: 'Mercado Pago',\n description: 'Mercado Pago payments, refunds, and customer management',\n package: 'mercado-pago-mcp',\n category: 'payments',\n requiresConfig: true,\n configFields: [\n {\n name: 'accessToken',\n type: 'string',\n required: true,\n description: 'Mercado Pago Access Token',\n envVar: 'MERCADOPAGO_ACCESS_TOKEN',\n },\n {\n name: 'environment',\n type: 'string',\n required: false,\n description: 'Environment (sandbox or production)',\n default: 'sandbox',\n },\n ],\n installInstructions: 'Get credentials at https://www.mercadopago.com/developers/panel/app',\n },\n\n // ============================================\n // SEARCH\n // ============================================\n {\n id: 'brave-search',\n name: 'Brave Search',\n description: 'Web and local search using Brave Search API',\n package: '@modelcontextprotocol/server-brave-search',\n category: 'search',\n requiresConfig: true,\n configFields: [\n {\n name: 'apiKey',\n type: 'string',\n required: false,\n description: 'Brave Search API Key',\n envVar: 'BRAVE_API_KEY',\n },\n ],\n installInstructions: 'Get an API key at https://brave.com/search/api/',\n },\n];\n\n/**\n * Get MCP server by ID\n */\nexport function getMcpServer(id: string): McpServerDefinition | undefined {\n return MCP_SERVERS.find((s) => s.id === id);\n}\n\n/**\n * Get MCP servers by category\n */\nexport function getMcpServersByCategory(\n category: McpServerDefinition['category']\n): McpServerDefinition[] {\n return MCP_SERVERS.filter((s) => s.category === category);\n}\n\n/**\n * Get all MCP server IDs\n */\nexport function getMcpServerIds(): string[] {\n return MCP_SERVERS.map((s) => s.id);\n}\n","/**\n * Modules exports\n */\n\n// Registry\nexport {\n loadRegistry,\n getModule,\n getAllModules,\n getModulesByTag,\n filterModules,\n getModuleIds,\n validateModuleIds,\n} from './registry.js';\n\n// Resolver\nexport {\n resolveModules,\n resolveAllModules,\n getDependents,\n checkRemovalImpact,\n getSuggestedModules,\n sortByDependencies,\n type ResolvedModule,\n type ResolutionResult,\n} from './resolver.js';\n\n// Installer\nexport {\n installModules,\n installAllModules,\n uninstallModule,\n isModuleInstalled,\n getInstalledModules,\n installExtras,\n removeConfigRequiredFromFrontmatter,\n type InstallOptions,\n type InstallResult,\n} from './installer.js';\n","/**\n * Module registry - reads and manages module definitions from templates\n */\n\nimport type {\n ModuleCategory,\n ModuleDefinition,\n ModuleRegistry,\n RegistryFile,\n} from '../../types/modules.js';\nimport { joinPath, listDirs, pathExists, readJson } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\nconst REGISTRY_FILE = '_registry.json';\n\n/**\n * Load module registry from a templates directory\n */\nexport async function loadRegistry(templatesPath: string): Promise<ModuleRegistry> {\n const registry: ModuleRegistry = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const categoryPath = joinPath(templatesPath, category);\n\n if (!(await pathExists(categoryPath))) {\n logger.debug(`Category path not found: ${categoryPath}`);\n continue;\n }\n\n const modules = await loadCategoryModules(categoryPath, category);\n registry[category] = modules;\n }\n\n return registry;\n}\n\n/**\n * Load modules for a specific category\n */\nasync function loadCategoryModules(\n categoryPath: string,\n category: ModuleCategory\n): Promise<ModuleDefinition[]> {\n const registryPath = joinPath(categoryPath, REGISTRY_FILE);\n\n // Try to load from _registry.json first\n if (await pathExists(registryPath)) {\n try {\n const registryFile = await readJson<RegistryFile>(registryPath);\n return registryFile.modules.map((item) => ({\n id: item.id,\n name: item.name,\n description: item.description || '',\n category,\n file: item.file,\n dependencies: item.dependencies || [],\n tags: item.tags || [],\n }));\n } catch (error) {\n logger.debug(`Failed to load registry from ${registryPath}: ${error}`);\n }\n }\n\n // Fallback: scan directory for .md files\n return scanCategoryDirectory(categoryPath, category);\n}\n\n/**\n * Scan directory for module files when no registry exists\n */\nasync function scanCategoryDirectory(\n categoryPath: string,\n category: ModuleCategory\n): Promise<ModuleDefinition[]> {\n const modules: ModuleDefinition[] = [];\n\n // Get subdirectories (groups like 'engineering', 'quality', etc.)\n const subdirs = await listDirs('*', { cwd: categoryPath });\n\n for (const subdir of subdirs) {\n if (subdir.startsWith('_')) continue; // Skip special directories\n\n const subdirPath = joinPath(categoryPath, subdir);\n const files = await scanForModuleFiles(subdirPath);\n\n for (const file of files) {\n const id = file.replace('.md', '');\n modules.push({\n id,\n name: formatName(id),\n description: '',\n category,\n file: `${subdir}/${file}`,\n dependencies: [],\n tags: [subdir],\n });\n }\n }\n\n // Also scan root of category\n const rootFiles = await scanForModuleFiles(categoryPath);\n for (const file of rootFiles) {\n if (file === REGISTRY_FILE) continue;\n\n const id = file.replace('.md', '');\n modules.push({\n id,\n name: formatName(id),\n description: '',\n category,\n file,\n dependencies: [],\n tags: [],\n });\n }\n\n return modules;\n}\n\n/**\n * Scan a directory for module files (.md)\n */\nasync function scanForModuleFiles(dirPath: string): Promise<string[]> {\n const { glob } = await import('glob');\n const files = await glob('*.md', { cwd: dirPath });\n return files.filter((f) => !f.startsWith('_') && f !== 'README.md');\n}\n\n/**\n * Format ID to display name\n */\nfunction formatName(id: string): string {\n return id\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Get module by ID from registry\n */\nexport function getModule(\n registry: ModuleRegistry,\n category: ModuleCategory,\n id: string\n): ModuleDefinition | undefined {\n return registry[category].find((m) => m.id === id);\n}\n\n/**\n * Get all modules from registry\n */\nexport function getAllModules(registry: ModuleRegistry): ModuleDefinition[] {\n return [...registry.agents, ...registry.skills, ...registry.commands, ...registry.docs];\n}\n\n/**\n * Get modules by tag\n */\nexport function getModulesByTag(\n registry: ModuleRegistry,\n category: ModuleCategory,\n tag: string\n): ModuleDefinition[] {\n return registry[category].filter((m) => m.tags?.includes(tag));\n}\n\n/**\n * Filter modules by IDs or tags\n * Presets use tags (e.g., 'core', 'quality'), so we match both IDs and tags\n */\nexport function filterModules(\n registry: ModuleRegistry,\n category: ModuleCategory,\n idsOrTags: string[]\n): ModuleDefinition[] {\n const filterSet = new Set(idsOrTags);\n return registry[category].filter((m) => {\n // Match by ID\n if (filterSet.has(m.id)) return true;\n // Match by any tag\n if (m.tags?.some((tag) => filterSet.has(tag))) return true;\n return false;\n });\n}\n\n/**\n * Get module IDs for a category\n */\nexport function getModuleIds(registry: ModuleRegistry, category: ModuleCategory): string[] {\n return registry[category].map((m) => m.id);\n}\n\n/**\n * Validate that all requested modules exist\n */\nexport function validateModuleIds(\n registry: ModuleRegistry,\n category: ModuleCategory,\n ids: string[]\n): { valid: string[]; invalid: string[] } {\n const available = new Set(getModuleIds(registry, category));\n const valid: string[] = [];\n const invalid: string[] = [];\n\n for (const id of ids) {\n if (available.has(id)) {\n valid.push(id);\n } else {\n invalid.push(id);\n }\n }\n\n return { valid, invalid };\n}\n","/**\n * Module resolver - resolves module dependencies and order\n */\n\nimport type { ModuleCategory, ModuleDefinition, ModuleRegistry } from '../../types/modules.js';\nimport { getAllModules, getModule } from './registry.js';\n\nexport interface ResolvedModule extends ModuleDefinition {\n resolvedDependencies: string[];\n installOrder: number;\n}\n\nexport interface ResolutionResult {\n resolved: ResolvedModule[];\n unresolved: string[];\n circular: string[];\n}\n\n/**\n * Resolve dependencies for selected modules\n */\nexport function resolveModules(\n registry: ModuleRegistry,\n category: ModuleCategory,\n selectedIds: string[]\n): ResolutionResult {\n const resolved: Map<string, ResolvedModule> = new Map();\n const unresolved: string[] = [];\n const circular: string[] = [];\n const visiting = new Set<string>();\n let order = 0;\n\n function visit(id: string): boolean {\n if (resolved.has(id)) return true;\n\n if (visiting.has(id)) {\n circular.push(id);\n return false;\n }\n\n const module = getModule(registry, category, id);\n if (!module) {\n unresolved.push(id);\n return false;\n }\n\n visiting.add(id);\n\n // Resolve dependencies first\n const resolvedDeps: string[] = [];\n for (const depId of module.dependencies || []) {\n if (visit(depId)) {\n resolvedDeps.push(depId);\n }\n }\n\n visiting.delete(id);\n\n // Add this module\n resolved.set(id, {\n ...module,\n resolvedDependencies: resolvedDeps,\n installOrder: order++,\n });\n\n return true;\n }\n\n // Visit all selected modules\n for (const id of selectedIds) {\n visit(id);\n }\n\n return {\n resolved: Array.from(resolved.values()).sort((a, b) => a.installOrder - b.installOrder),\n unresolved,\n circular,\n };\n}\n\n/**\n * Resolve all dependencies for a set of modules across all categories\n */\nexport function resolveAllModules(\n registry: ModuleRegistry,\n selection: Record<ModuleCategory, string[]>\n): Record<ModuleCategory, ResolutionResult> {\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n const results: Record<ModuleCategory, ResolutionResult> = {} as Record<\n ModuleCategory,\n ResolutionResult\n >;\n\n for (const category of categories) {\n results[category] = resolveModules(registry, category, selection[category] || []);\n }\n\n return results;\n}\n\n/**\n * Get modules that depend on a given module\n */\nexport function getDependents(\n registry: ModuleRegistry,\n category: ModuleCategory,\n moduleId: string\n): ModuleDefinition[] {\n return registry[category].filter((m) => m.dependencies?.includes(moduleId));\n}\n\n/**\n * Check if removing a module would break dependencies\n */\nexport function checkRemovalImpact(\n registry: ModuleRegistry,\n category: ModuleCategory,\n moduleId: string,\n installedIds: string[]\n): { canRemove: boolean; blockedBy: string[] } {\n const dependents = getDependents(registry, category, moduleId);\n const blockedBy = dependents.filter((d) => installedIds.includes(d.id)).map((d) => d.id);\n\n return {\n canRemove: blockedBy.length === 0,\n blockedBy,\n };\n}\n\n/**\n * Get suggested modules based on installed ones\n */\nexport function getSuggestedModules(\n registry: ModuleRegistry,\n installedModules: Record<ModuleCategory, string[]>\n): ModuleDefinition[] {\n const suggestions: ModuleDefinition[] = [];\n const allInstalled = new Set<string>();\n\n // Collect all installed module IDs\n for (const ids of Object.values(installedModules)) {\n for (const id of ids) {\n allInstalled.add(id);\n }\n }\n\n // Find modules with tags that match installed modules\n const allModules = getAllModules(registry);\n const installedTags = new Set<string>();\n\n for (const module of allModules) {\n if (allInstalled.has(module.id)) {\n for (const tag of module.tags || []) {\n installedTags.add(tag);\n }\n }\n }\n\n // Suggest modules with matching tags that aren't installed\n for (const module of allModules) {\n if (allInstalled.has(module.id)) continue;\n\n const hasMatchingTag = (module.tags || []).some((tag) => installedTags.has(tag));\n if (hasMatchingTag) {\n suggestions.push(module);\n }\n }\n\n return suggestions;\n}\n\n/**\n * Sort modules by install order (dependencies first)\n */\nexport function sortByDependencies(modules: ModuleDefinition[]): ModuleDefinition[] {\n const sorted: ModuleDefinition[] = [];\n const visited = new Set<string>();\n const moduleMap = new Map(modules.map((m) => [m.id, m]));\n\n function visit(module: ModuleDefinition): void {\n if (visited.has(module.id)) return;\n visited.add(module.id);\n\n // Visit dependencies first\n for (const depId of module.dependencies || []) {\n const dep = moduleMap.get(depId);\n if (dep) {\n visit(dep);\n }\n }\n\n sorted.push(module);\n }\n\n for (const module of modules) {\n visit(module);\n }\n\n return sorted;\n}\n","/**\n * Module installer - copies and configures module files\n */\n\nimport type { ModuleCategory, ModuleDefinition } from '../../types/modules.js';\nimport {\n copy,\n dirname,\n ensureDir,\n joinPath,\n pathExists,\n readFile,\n writeFile,\n} from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Remove config_required section from YAML frontmatter in markdown files\n * This cleans up template files after installation\n */\nexport function removeConfigRequiredFromFrontmatter(content: string): string {\n // Match YAML frontmatter (starts with ---, ends with ---)\n const frontmatterRegex = /^---\\n([\\s\\S]*?)\\n---/;\n const match = content.match(frontmatterRegex);\n\n if (!match) {\n return content;\n }\n\n const frontmatter = match[1];\n\n // Remove config_required section from frontmatter\n // It can be multi-line with indented items like:\n // config_required:\n // - KEY: \"description\"\n // - KEY2: \"description2\"\n // The regex needs to match the key and all following indented lines\n const configRequiredRegex = /config_required:\\s*\\n(?:\\s+-\\s+[^\\n]+\\n?)*/g;\n const cleanedFrontmatter = frontmatter.replace(configRequiredRegex, '').trim();\n\n // Reconstruct the file\n const restOfFile = content.slice(match[0].length);\n\n // If frontmatter is now empty except for required fields, keep it minimal\n if (cleanedFrontmatter.trim() === '') {\n return restOfFile.trim();\n }\n\n return `---\\n${cleanedFrontmatter}\\n---${restOfFile}`;\n}\n\n/**\n * Process a module file after copying to clean up config_required\n */\nasync function processModuleFile(filePath: string): Promise<void> {\n // Only process markdown files\n if (!filePath.endsWith('.md')) {\n return;\n }\n\n try {\n const content = await readFile(filePath);\n const cleanedContent = removeConfigRequiredFromFrontmatter(content);\n\n // Only write if content changed\n if (cleanedContent !== content) {\n await writeFile(filePath, cleanedContent);\n logger.debug(`Cleaned config_required from: ${filePath}`);\n }\n } catch (error) {\n logger.debug(`Failed to process module file ${filePath}: ${error}`);\n }\n}\n\nexport interface InstallOptions {\n templatesPath: string;\n targetPath: string;\n overwrite?: boolean;\n dryRun?: boolean;\n}\n\nexport interface InstallResult {\n success: boolean;\n installed: string[];\n skipped: string[];\n failed: Array<{ id: string; error: string }>;\n}\n\n/**\n * Install modules for a category\n */\nexport async function installModules(\n category: ModuleCategory,\n modules: ModuleDefinition[],\n options: InstallOptions\n): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const categorySourcePath = joinPath(options.templatesPath, category);\n const categoryTargetPath = joinPath(options.targetPath, '.claude', category);\n\n // Ensure target directory exists\n if (!options.dryRun) {\n await ensureDir(categoryTargetPath);\n }\n\n for (const module of modules) {\n try {\n const sourcePath = joinPath(categorySourcePath, module.file);\n const targetPath = joinPath(categoryTargetPath, module.file);\n\n // Check if source exists\n if (!(await pathExists(sourcePath))) {\n result.failed.push({ id: module.id, error: `Source file not found: ${sourcePath}` });\n result.success = false;\n continue;\n }\n\n // Check if target exists\n const targetExists = await pathExists(targetPath);\n if (targetExists && !options.overwrite) {\n result.skipped.push(module.id);\n continue;\n }\n\n if (options.dryRun) {\n logger.debug(`Would install: ${module.id} -> ${targetPath}`);\n result.installed.push(module.id);\n continue;\n }\n\n // Ensure target directory exists\n await ensureDir(dirname(targetPath));\n\n // Copy file\n await copy(sourcePath, targetPath, { overwrite: options.overwrite });\n\n // Process the file to clean up config_required\n await processModuleFile(targetPath);\n\n result.installed.push(module.id);\n\n logger.debug(`Installed: ${module.id}`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failed.push({ id: module.id, error: errorMessage });\n result.success = false;\n }\n }\n\n return result;\n}\n\n/**\n * Install README file for a category\n */\nasync function installCategoryReadme(\n category: ModuleCategory,\n options: InstallOptions\n): Promise<void> {\n const sourceReadme = joinPath(options.templatesPath, category, 'README.md');\n const targetReadme = joinPath(options.targetPath, '.claude', category, 'README.md');\n\n // Check if source README exists\n if (!(await pathExists(sourceReadme))) {\n logger.debug(`No README found for category: ${category}`);\n return;\n }\n\n // Check if target exists\n const targetExists = await pathExists(targetReadme);\n if (targetExists && !options.overwrite) {\n logger.debug(`README already exists for ${category}, skipping`);\n return;\n }\n\n if (options.dryRun) {\n logger.debug(`Would install README for ${category}`);\n return;\n }\n\n try {\n await copy(sourceReadme, targetReadme, { overwrite: options.overwrite });\n logger.debug(`Installed README for ${category}`);\n } catch (error) {\n logger.debug(`Failed to install README for ${category}: ${error}`);\n }\n}\n\n/**\n * Install all modules with progress tracking\n */\nexport async function installAllModules(\n modulesByCategory: Record<ModuleCategory, ModuleDefinition[]>,\n options: InstallOptions\n): Promise<Record<ModuleCategory, InstallResult>> {\n const results: Record<ModuleCategory, InstallResult> = {} as Record<\n ModuleCategory,\n InstallResult\n >;\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const modules = modulesByCategory[category] || [];\n if (modules.length === 0) {\n results[category] = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n continue;\n }\n\n results[category] = await withSpinner(\n `Installing ${category} (${modules.length} modules)...`,\n () => installModules(category, modules, options),\n {\n successText: `Installed ${modules.length} ${category}`,\n silent: options.dryRun,\n }\n );\n\n // Install README for this category\n await installCategoryReadme(category, options);\n }\n\n return results;\n}\n\n/**\n * Uninstall a module\n */\nexport async function uninstallModule(\n category: ModuleCategory,\n moduleId: string,\n targetPath: string\n): Promise<{ success: boolean; error?: string }> {\n const { remove } = await import('../utils/fs.js');\n\n try {\n const modulePath = joinPath(targetPath, '.claude', category, `${moduleId}.md`);\n\n if (!(await pathExists(modulePath))) {\n return { success: false, error: 'Module file not found' };\n }\n\n await remove(modulePath);\n return { success: true };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Check if a module is installed\n */\nexport async function isModuleInstalled(\n category: ModuleCategory,\n moduleId: string,\n targetPath: string\n): Promise<boolean> {\n // Try common file patterns\n const patterns = [\n joinPath(targetPath, '.claude', category, `${moduleId}.md`),\n joinPath(targetPath, '.claude', category, '**', `${moduleId}.md`),\n ];\n\n for (const pattern of patterns) {\n if (await pathExists(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Get installed modules for a category\n */\nexport async function getInstalledModules(\n category: ModuleCategory,\n targetPath: string\n): Promise<string[]> {\n const { listFiles } = await import('../utils/fs.js');\n\n const categoryPath = joinPath(targetPath, '.claude', category);\n if (!(await pathExists(categoryPath))) {\n return [];\n }\n\n const files = await listFiles('**/*.md', { cwd: categoryPath });\n return files\n .filter((f) => !f.startsWith('_') && f !== 'README.md')\n .map((f) => {\n const parts = f.replace(/\\.md$/, '').split('/');\n return parts[parts.length - 1] ?? '';\n })\n .filter(Boolean);\n}\n\n/**\n * Copy extra files (schemas, scripts, hooks, sessions)\n */\nexport async function installExtras(\n extras: { schemas?: boolean; scripts?: boolean; hooks?: boolean; sessions?: boolean },\n options: InstallOptions\n): Promise<InstallResult> {\n const result: InstallResult = {\n success: true,\n installed: [],\n skipped: [],\n failed: [],\n };\n\n const extraDirs = [\n { name: 'schemas', enabled: extras.schemas },\n { name: 'scripts', enabled: extras.scripts },\n { name: 'hooks', enabled: extras.hooks },\n { name: 'sessions', enabled: extras.sessions },\n ];\n\n for (const { name, enabled } of extraDirs) {\n if (!enabled) continue;\n\n const sourcePath = joinPath(options.templatesPath, name);\n const targetPath = joinPath(options.targetPath, '.claude', name);\n\n if (!(await pathExists(sourcePath))) {\n logger.debug(`Extra directory not found: ${sourcePath}`);\n continue;\n }\n\n try {\n if (options.dryRun) {\n logger.debug(`Would copy: ${name} -> ${targetPath}`);\n result.installed.push(name);\n continue;\n }\n\n const targetExists = await pathExists(targetPath);\n if (targetExists && !options.overwrite) {\n result.skipped.push(name);\n continue;\n }\n\n await copy(sourcePath, targetPath, { overwrite: options.overwrite });\n result.installed.push(name);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n result.failed.push({ id: name, error: errorMessage });\n result.success = false;\n }\n }\n\n return result;\n}\n","/**\n * NPM package.json management module\n */\n\nexport {\n readPackageJson,\n writePackageJson,\n createMinimalPackageJson,\n generatePackageJsonChanges,\n updatePackageJson,\n getInstallCommand,\n formatPackageManagerField,\n deriveToolSelectionFromCodeStyle,\n getSetupInstructions,\n} from './package-manager.js';\n","/**\n * Package.json management utilities\n */\n\nimport {\n COMMITLINT_DEPENDENCIES,\n HUSKY_DEPENDENCIES,\n TYPESCRIPT_DEPENDENCIES,\n getFormatterDependencies,\n getLinterDependencies,\n getTestRunnerDependencies,\n mergeToolDependencies,\n} from '../../constants/npm-dependencies.js';\nimport type {\n DependencyGenerationConfig,\n PackageJson,\n PackageJsonChanges,\n PackageJsonUpdateOptions,\n PackageJsonUpdateResult,\n ToolSelection,\n} from '../../types/package-json.js';\nimport type { PackageManager } from '../../types/scaffold.js';\nimport { joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Read package.json from a directory\n */\nexport async function readPackageJson(projectPath: string): Promise<PackageJson | null> {\n const packageJsonPath = joinPath(projectPath, 'package.json');\n\n if (!(await pathExists(packageJsonPath))) {\n return null;\n }\n\n try {\n const content = await readFile(packageJsonPath);\n return JSON.parse(content) as PackageJson;\n } catch (error) {\n logger.debug(`Failed to parse package.json: ${error}`);\n return null;\n }\n}\n\n/**\n * Write package.json to a directory\n */\nexport async function writePackageJson(\n projectPath: string,\n packageJson: PackageJson\n): Promise<void> {\n const packageJsonPath = joinPath(projectPath, 'package.json');\n const content = `${JSON.stringify(packageJson, null, 2)}\\n`;\n await writeFile(packageJsonPath, content);\n}\n\n/**\n * Create a minimal package.json\n */\nexport function createMinimalPackageJson(options: {\n name?: string;\n description?: string;\n version?: string;\n type?: 'module' | 'commonjs';\n author?: string;\n license?: string;\n}): PackageJson {\n return {\n name: options.name || 'my-project',\n version: options.version || '0.0.1',\n description: options.description || '',\n type: options.type || 'module',\n scripts: {},\n dependencies: {},\n devDependencies: {},\n ...(options.author ? { author: options.author } : {}),\n ...(options.license ? { license: options.license } : {}),\n };\n}\n\n/**\n * Generate package.json changes based on tool selection\n */\nexport function generatePackageJsonChanges(config: DependencyGenerationConfig): PackageJsonChanges {\n const { tools, project } = config;\n const changes: PackageJsonChanges = {\n scripts: {},\n dependencies: {},\n devDependencies: {},\n };\n\n // Collect all tool dependencies\n const toolDeps = mergeToolDependencies(\n tools.linter && tools.linter !== 'none' ? getLinterDependencies(tools.linter) : undefined,\n tools.formatter && tools.formatter !== 'none'\n ? getFormatterDependencies(tools.formatter)\n : undefined,\n tools.testRunner && tools.testRunner !== 'none'\n ? getTestRunnerDependencies(tools.testRunner)\n : undefined,\n tools.commitlint ? COMMITLINT_DEPENDENCIES : undefined,\n tools.husky ? HUSKY_DEPENDENCIES : undefined,\n tools.typescript ? TYPESCRIPT_DEPENDENCIES : undefined\n );\n\n // Add packages to changes\n for (const pkg of toolDeps.packages) {\n if (pkg.isDev) {\n if (changes.devDependencies) {\n changes.devDependencies[pkg.name] = pkg.version;\n }\n } else {\n if (changes.dependencies) {\n changes.dependencies[pkg.name] = pkg.version;\n }\n }\n }\n\n // Add scripts to changes\n for (const script of toolDeps.scripts) {\n if (changes.scripts) {\n changes.scripts[script.name] = script.command;\n }\n }\n\n // Add metadata if provided\n if (project) {\n changes.metadata = {\n name: project.name,\n description: project.description,\n author: project.author,\n license: project.license,\n repository: project.repository,\n };\n }\n\n return changes;\n}\n\n/**\n * Apply changes to package.json\n */\nexport async function updatePackageJson(\n projectPath: string,\n changes: PackageJsonChanges,\n options: PackageJsonUpdateOptions = {}\n): Promise<PackageJsonUpdateResult> {\n const {\n scriptsMerge = 'skip-existing',\n dependenciesMerge = 'skip-existing',\n createIfMissing = true,\n backup = false,\n dryRun = false,\n } = options;\n\n const result: PackageJsonUpdateResult = {\n success: false,\n path: joinPath(projectPath, 'package.json'),\n created: false,\n modified: false,\n addedScripts: [],\n skippedScripts: [],\n addedDependencies: [],\n skippedDependencies: [],\n addedDevDependencies: [],\n skippedDevDependencies: [],\n };\n\n try {\n let packageJson = await readPackageJson(projectPath);\n\n // Create if missing\n if (!packageJson) {\n if (!createIfMissing) {\n result.error = 'package.json not found and createIfMissing is false';\n return result;\n }\n packageJson = createMinimalPackageJson({\n name: changes.metadata?.name,\n description: changes.metadata?.description,\n author: typeof changes.metadata?.author === 'string' ? changes.metadata.author : undefined,\n license: changes.metadata?.license,\n });\n result.created = true;\n }\n\n // Backup if requested\n if (backup && !dryRun && !result.created) {\n const backupPath = joinPath(projectPath, 'package.json.backup');\n await writeFile(backupPath, JSON.stringify(packageJson, null, 2));\n }\n\n // Apply metadata changes\n if (changes.metadata) {\n if (changes.metadata.name && !packageJson.name) {\n packageJson.name = changes.metadata.name;\n result.modified = true;\n }\n if (changes.metadata.description && !packageJson.description) {\n packageJson.description = changes.metadata.description;\n result.modified = true;\n }\n if (changes.metadata.author && !packageJson.author) {\n packageJson.author = changes.metadata.author;\n result.modified = true;\n }\n if (changes.metadata.license && !packageJson.license) {\n packageJson.license = changes.metadata.license;\n result.modified = true;\n }\n if (changes.metadata.repository && !packageJson.repository) {\n packageJson.repository = changes.metadata.repository;\n result.modified = true;\n }\n if (changes.metadata.type && !packageJson.type) {\n packageJson.type = changes.metadata.type;\n result.modified = true;\n }\n if (changes.metadata.engines && !packageJson.engines) {\n packageJson.engines = changes.metadata.engines;\n result.modified = true;\n }\n if (changes.metadata.packageManager && !packageJson.packageManager) {\n packageJson.packageManager = changes.metadata.packageManager;\n result.modified = true;\n }\n }\n\n // Apply scripts\n if (changes.scripts) {\n packageJson.scripts = packageJson.scripts || {};\n for (const [name, command] of Object.entries(changes.scripts)) {\n const exists = name in packageJson.scripts;\n if (exists) {\n if (scriptsMerge === 'skip-existing') {\n result.skippedScripts.push(name);\n continue;\n }\n if (scriptsMerge === 'replace') {\n // Only add new ones, don't touch existing\n result.skippedScripts.push(name);\n continue;\n }\n }\n packageJson.scripts[name] = command;\n result.addedScripts.push(name);\n result.modified = true;\n }\n }\n\n // Apply dependencies\n if (changes.dependencies) {\n packageJson.dependencies = packageJson.dependencies || {};\n for (const [name, version] of Object.entries(changes.dependencies)) {\n const exists = name in packageJson.dependencies;\n if (exists) {\n if (dependenciesMerge === 'skip-existing') {\n result.skippedDependencies.push(name);\n continue;\n }\n if (dependenciesMerge === 'replace') {\n result.skippedDependencies.push(name);\n continue;\n }\n }\n packageJson.dependencies[name] = version;\n result.addedDependencies.push(name);\n result.modified = true;\n }\n }\n\n // Apply devDependencies\n if (changes.devDependencies) {\n packageJson.devDependencies = packageJson.devDependencies || {};\n for (const [name, version] of Object.entries(changes.devDependencies)) {\n const exists = name in packageJson.devDependencies;\n if (exists) {\n if (dependenciesMerge === 'skip-existing') {\n result.skippedDevDependencies.push(name);\n continue;\n }\n if (dependenciesMerge === 'replace') {\n result.skippedDevDependencies.push(name);\n continue;\n }\n }\n packageJson.devDependencies[name] = version;\n result.addedDevDependencies.push(name);\n result.modified = true;\n }\n }\n\n // Write changes\n if (!dryRun && (result.created || result.modified)) {\n await writePackageJson(projectPath, packageJson);\n }\n\n result.success = true;\n return result;\n } catch (error) {\n result.error = error instanceof Error ? error.message : String(error);\n return result;\n }\n}\n\n/**\n * Get install command for the package manager\n */\nexport function getInstallCommand(packageManager: PackageManager): string {\n switch (packageManager) {\n case 'npm':\n return 'npm install';\n case 'yarn':\n return 'yarn';\n case 'pnpm':\n return 'pnpm install';\n case 'bun':\n return 'bun install';\n default:\n return 'npm install';\n }\n}\n\n/**\n * Format package manager string for package.json\n */\nexport function formatPackageManagerField(\n packageManager: PackageManager,\n version?: string\n): string {\n const versions: Record<PackageManager, string> = {\n npm: version || '10.0.0',\n yarn: version || '4.0.0',\n pnpm: version || '9.0.0',\n bun: version || '1.0.0',\n };\n return `${packageManager}@${versions[packageManager]}`;\n}\n\n/**\n * Derive tool selection from code style config\n */\nexport function deriveToolSelectionFromCodeStyle(codeStyle: {\n biome?: boolean;\n prettier?: boolean;\n commitlint?: boolean;\n}): Partial<ToolSelection> {\n const selection: Partial<ToolSelection> = {};\n\n if (codeStyle.biome) {\n selection.linter = 'biome';\n selection.formatter = 'biome';\n }\n\n if (codeStyle.prettier) {\n // If both biome and prettier are enabled, prettier takes formatter role\n selection.formatter = 'prettier';\n }\n\n if (codeStyle.commitlint) {\n selection.commitlint = true;\n selection.husky = true; // Commitlint typically needs husky\n }\n\n return selection;\n}\n\n/**\n * Get setup instructions for tools\n */\nexport function getSetupInstructions(tools: ToolSelection): string[] {\n const instructions: string[] = [];\n\n const toolDeps = mergeToolDependencies(\n tools.linter && tools.linter !== 'none' ? getLinterDependencies(tools.linter) : undefined,\n tools.formatter && tools.formatter !== 'none'\n ? getFormatterDependencies(tools.formatter)\n : undefined,\n tools.testRunner && tools.testRunner !== 'none'\n ? getTestRunnerDependencies(tools.testRunner)\n : undefined,\n tools.commitlint ? COMMITLINT_DEPENDENCIES : undefined,\n tools.husky ? HUSKY_DEPENDENCIES : undefined,\n tools.typescript ? TYPESCRIPT_DEPENDENCIES : undefined\n );\n\n if (toolDeps.setupInstructions) {\n instructions.push(...toolDeps.setupInstructions);\n }\n\n return instructions;\n}\n","/**\n * NPM dependencies configuration for code style and development tools\n */\n\n/**\n * NPM package definition\n */\nexport interface NpmPackage {\n /** Package name */\n name: string;\n /** Recommended version (semver range) */\n version: string;\n /** Whether it's a dev dependency */\n isDev: boolean;\n /** Description of what it does */\n description: string;\n}\n\n/**\n * Scripts definition for package.json\n */\nexport interface PackageScript {\n /** Script name */\n name: string;\n /** Script command */\n command: string;\n /** Description of what it does */\n description: string;\n}\n\n/**\n * Tool configuration with its dependencies and scripts\n */\nexport interface ToolDependencies {\n /** Packages required for this tool */\n packages: NpmPackage[];\n /** Scripts to add to package.json */\n scripts: PackageScript[];\n /** Additional setup instructions */\n setupInstructions?: string[];\n}\n\n/**\n * Linter dependencies\n */\nexport const LINTER_DEPENDENCIES: Record<string, ToolDependencies> = {\n biome: {\n packages: [\n {\n name: '@biomejs/biome',\n version: '^1.9.0',\n isDev: true,\n description: 'Fast linter and formatter',\n },\n ],\n scripts: [\n { name: 'lint', command: 'biome check .', description: 'Run linter' },\n { name: 'lint:fix', command: 'biome check --write .', description: 'Fix linting issues' },\n ],\n },\n eslint: {\n packages: [\n { name: 'eslint', version: '^9.0.0', isDev: true, description: 'JavaScript linter' },\n {\n name: 'typescript-eslint',\n version: '^8.0.0',\n isDev: true,\n description: 'TypeScript ESLint parser and plugin',\n },\n { name: 'globals', version: '^15.0.0', isDev: true, description: 'ESLint globals' },\n ],\n scripts: [\n { name: 'lint', command: 'eslint .', description: 'Run linter' },\n { name: 'lint:fix', command: 'eslint . --fix', description: 'Fix linting issues' },\n ],\n },\n oxlint: {\n packages: [\n { name: 'oxlint', version: '^0.10.0', isDev: true, description: 'Oxidation Compiler linter' },\n ],\n scripts: [{ name: 'lint', command: 'oxlint .', description: 'Run linter' }],\n },\n};\n\n/**\n * Formatter dependencies\n */\nexport const FORMATTER_DEPENDENCIES: Record<string, ToolDependencies> = {\n biome: {\n packages: [\n // Biome package is shared with linter, will be deduplicated\n {\n name: '@biomejs/biome',\n version: '^1.9.0',\n isDev: true,\n description: 'Fast linter and formatter',\n },\n ],\n scripts: [\n { name: 'format', command: 'biome format --write .', description: 'Format code' },\n { name: 'format:check', command: 'biome format .', description: 'Check formatting' },\n ],\n },\n prettier: {\n packages: [{ name: 'prettier', version: '^3.0.0', isDev: true, description: 'Code formatter' }],\n scripts: [\n { name: 'format', command: 'prettier --write .', description: 'Format code' },\n { name: 'format:check', command: 'prettier --check .', description: 'Check formatting' },\n ],\n },\n};\n\n/**\n * Test runner dependencies\n */\nexport const TEST_RUNNER_DEPENDENCIES: Record<string, ToolDependencies> = {\n vitest: {\n packages: [\n {\n name: 'vitest',\n version: '^2.0.0',\n isDev: true,\n description: 'Vite-native testing framework',\n },\n {\n name: '@vitest/coverage-v8',\n version: '^2.0.0',\n isDev: true,\n description: 'V8 coverage provider for Vitest',\n },\n ],\n scripts: [\n { name: 'test', command: 'vitest', description: 'Run tests in watch mode' },\n { name: 'test:run', command: 'vitest run', description: 'Run tests once' },\n {\n name: 'test:coverage',\n command: 'vitest run --coverage',\n description: 'Run tests with coverage',\n },\n ],\n },\n jest: {\n packages: [\n {\n name: 'jest',\n version: '^29.0.0',\n isDev: true,\n description: 'JavaScript testing framework',\n },\n {\n name: '@types/jest',\n version: '^29.0.0',\n isDev: true,\n description: 'Jest type definitions',\n },\n {\n name: 'ts-jest',\n version: '^29.0.0',\n isDev: true,\n description: 'TypeScript preprocessor for Jest',\n },\n ],\n scripts: [\n { name: 'test', command: 'jest', description: 'Run tests' },\n { name: 'test:watch', command: 'jest --watch', description: 'Run tests in watch mode' },\n { name: 'test:coverage', command: 'jest --coverage', description: 'Run tests with coverage' },\n ],\n setupInstructions: ['Create jest.config.js with ts-jest preset'],\n },\n playwright: {\n packages: [\n {\n name: '@playwright/test',\n version: '^1.45.0',\n isDev: true,\n description: 'Playwright Test framework',\n },\n ],\n scripts: [\n { name: 'test:e2e', command: 'playwright test', description: 'Run E2E tests' },\n {\n name: 'test:e2e:ui',\n command: 'playwright test --ui',\n description: 'Run E2E tests with UI',\n },\n ],\n setupInstructions: ['Run `npx playwright install` to install browsers'],\n },\n};\n\n/**\n * Commitlint dependencies\n */\nexport const COMMITLINT_DEPENDENCIES: ToolDependencies = {\n packages: [\n {\n name: '@commitlint/cli',\n version: '^19.0.0',\n isDev: true,\n description: 'Commit message linter',\n },\n {\n name: '@commitlint/config-conventional',\n version: '^19.0.0',\n isDev: true,\n description: 'Conventional commits config',\n },\n ],\n scripts: [],\n setupInstructions: [\n 'For git hooks integration, install Husky:',\n ' pnpm add -D husky',\n ' npx husky init',\n ' echo \"npx --no -- commitlint --edit ${1}\" > .husky/commit-msg',\n ],\n};\n\n/**\n * Husky dependencies\n */\nexport const HUSKY_DEPENDENCIES: ToolDependencies = {\n packages: [{ name: 'husky', version: '^9.0.0', isDev: true, description: 'Git hooks manager' }],\n scripts: [{ name: 'prepare', command: 'husky', description: 'Install git hooks' }],\n};\n\n/**\n * TypeScript dependencies\n */\nexport const TYPESCRIPT_DEPENDENCIES: ToolDependencies = {\n packages: [\n { name: 'typescript', version: '^5.5.0', isDev: true, description: 'TypeScript compiler' },\n {\n name: '@types/node',\n version: '^22.0.0',\n isDev: true,\n description: 'Node.js type definitions',\n },\n ],\n scripts: [\n { name: 'typecheck', command: 'tsc --noEmit', description: 'Type check without emitting' },\n { name: 'build', command: 'tsc', description: 'Compile TypeScript' },\n ],\n};\n\n/**\n * Get dependencies for a linter\n */\nexport function getLinterDependencies(linter: string): ToolDependencies | undefined {\n return LINTER_DEPENDENCIES[linter];\n}\n\n/**\n * Get dependencies for a formatter\n */\nexport function getFormatterDependencies(formatter: string): ToolDependencies | undefined {\n return FORMATTER_DEPENDENCIES[formatter];\n}\n\n/**\n * Get dependencies for a test runner\n */\nexport function getTestRunnerDependencies(testRunner: string): ToolDependencies | undefined {\n return TEST_RUNNER_DEPENDENCIES[testRunner];\n}\n\n/**\n * Merge multiple tool dependencies, deduplicating packages\n */\nexport function mergeToolDependencies(\n ...tools: (ToolDependencies | undefined)[]\n): ToolDependencies {\n const packageMap = new Map<string, NpmPackage>();\n const scriptMap = new Map<string, PackageScript>();\n const allInstructions: string[] = [];\n\n for (const tool of tools) {\n if (!tool) continue;\n\n // Add packages (deduplicate by name)\n for (const pkg of tool.packages) {\n if (!packageMap.has(pkg.name)) {\n packageMap.set(pkg.name, pkg);\n }\n }\n\n // Add scripts (deduplicate by name, later ones win)\n for (const script of tool.scripts) {\n scriptMap.set(script.name, script);\n }\n\n // Add setup instructions\n if (tool.setupInstructions) {\n allInstructions.push(...tool.setupInstructions);\n }\n }\n\n return {\n packages: Array.from(packageMap.values()),\n scripts: Array.from(scriptMap.values()),\n setupInstructions: allInstructions.length > 0 ? allInstructions : undefined,\n };\n}\n\n/**\n * Format packages as install command\n */\nexport function formatInstallCommand(\n packages: NpmPackage[],\n packageManager: 'npm' | 'yarn' | 'pnpm' | 'bun' = 'pnpm'\n): string {\n const devPackages = packages.filter((p) => p.isDev);\n const prodPackages = packages.filter((p) => !p.isDev);\n\n const commands: string[] = [];\n\n if (devPackages.length > 0) {\n const pkgNames = devPackages.map((p) => p.name).join(' ');\n switch (packageManager) {\n case 'npm':\n commands.push(`npm install -D ${pkgNames}`);\n break;\n case 'yarn':\n commands.push(`yarn add -D ${pkgNames}`);\n break;\n case 'pnpm':\n commands.push(`pnpm add -D ${pkgNames}`);\n break;\n case 'bun':\n commands.push(`bun add -D ${pkgNames}`);\n break;\n }\n }\n\n if (prodPackages.length > 0) {\n const pkgNames = prodPackages.map((p) => p.name).join(' ');\n switch (packageManager) {\n case 'npm':\n commands.push(`npm install ${pkgNames}`);\n break;\n case 'yarn':\n commands.push(`yarn add ${pkgNames}`);\n break;\n case 'pnpm':\n commands.push(`pnpm add ${pkgNames}`);\n break;\n case 'bun':\n commands.push(`bun add ${pkgNames}`);\n break;\n }\n }\n\n return commands.join('\\n');\n}\n","/**\n * Permissions exports\n */\n\nexport {\n installPermissions,\n getCurrentPermissions,\n setCoAuthorSetting,\n mergePermissions,\n resetPermissionsToPreset,\n analyzePermissions,\n} from './configurator.js';\n","/**\n * Permissions configurator - generates Claude Code permission settings\n */\n\nimport * as os from 'node:os';\nimport {\n PERMISSION_PRESETS,\n generateAllowRules,\n generateDenyRules,\n} from '../../constants/permissions.js';\nimport type { PermissionsConfig } from '../../types/permissions.js';\nimport { ensureDir, joinPath, pathExists, readJson, writeJson } from '../utils/fs.js';\n\nconst PROJECT_SETTINGS_FILE = '.claude/settings.local.json';\nconst USER_SETTINGS_FILE = '.claude/settings.json';\n\ninterface SettingsJson {\n mcpServers?: Record<string, unknown>;\n permissions?: {\n allow?: string[];\n deny?: string[];\n };\n includeCoAuthoredBy?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Install permissions configuration\n */\nexport async function installPermissions(\n projectPath: string,\n config: PermissionsConfig,\n level: 'user' | 'project' = 'project'\n): Promise<{ success: boolean; path: string; errors: string[] }> {\n const errors: string[] = [];\n\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n // Ensure directory exists\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n // Read existing settings or create new\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start with empty settings\n }\n }\n\n // Generate permission rules\n const allowRules = generateAllowRules(config);\n const denyRules = generateDenyRules(config);\n\n // Set permissions\n settings.permissions = {\n allow: allowRules,\n deny: denyRules,\n };\n\n // Write settings\n await writeJson(settingsPath, settings, { spaces: 2 });\n\n return { success: true, path: settingsPath, errors };\n } catch (error) {\n return {\n success: false,\n path: settingsPath,\n errors: [`Failed to write permissions: ${error}`],\n };\n }\n}\n\n/**\n * Get current permissions from settings\n */\nexport async function getCurrentPermissions(\n projectPath: string\n): Promise<{ project: SettingsJson['permissions']; user: SettingsJson['permissions'] }> {\n const result = {\n project: undefined as SettingsJson['permissions'],\n user: undefined as SettingsJson['permissions'],\n };\n\n // Check project settings\n const projectSettings = joinPath(projectPath, PROJECT_SETTINGS_FILE);\n if (await pathExists(projectSettings)) {\n try {\n const settings = await readJson<SettingsJson>(projectSettings);\n result.project = settings.permissions;\n } catch {\n // Ignore\n }\n }\n\n // Check user settings\n const userSettings = joinPath(os.homedir(), USER_SETTINGS_FILE);\n if (await pathExists(userSettings)) {\n try {\n const settings = await readJson<SettingsJson>(userSettings);\n result.user = settings.permissions;\n } catch {\n // Ignore\n }\n }\n\n return result;\n}\n\n/**\n * Set co-author setting\n */\nexport async function setCoAuthorSetting(\n projectPath: string,\n includeCoAuthor: boolean,\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n const dir = settingsPath.substring(0, settingsPath.lastIndexOf('/'));\n await ensureDir(dir);\n\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n try {\n settings = await readJson<SettingsJson>(settingsPath);\n } catch {\n // Start fresh\n }\n }\n\n settings.includeCoAuthoredBy = includeCoAuthor;\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Merge permissions with existing settings\n */\nexport async function mergePermissions(\n projectPath: string,\n additionalAllow: string[],\n additionalDeny: string[],\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const settingsPath =\n level === 'user'\n ? joinPath(os.homedir(), USER_SETTINGS_FILE)\n : joinPath(projectPath, PROJECT_SETTINGS_FILE);\n\n try {\n let settings: SettingsJson = {};\n if (await pathExists(settingsPath)) {\n settings = await readJson<SettingsJson>(settingsPath);\n }\n\n const existingAllow = settings.permissions?.allow || [];\n const existingDeny = settings.permissions?.deny || [];\n\n settings.permissions = {\n allow: [...new Set([...existingAllow, ...additionalAllow])],\n deny: [...new Set([...existingDeny, ...additionalDeny])],\n };\n\n await writeJson(settingsPath, settings, { spaces: 2 });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Reset permissions to a preset\n */\nexport async function resetPermissionsToPreset(\n projectPath: string,\n preset: keyof typeof PERMISSION_PRESETS,\n level: 'user' | 'project' = 'project'\n): Promise<boolean> {\n const presetConfig = PERMISSION_PRESETS[preset];\n\n const config: PermissionsConfig = {\n preset,\n files: presetConfig.files,\n git: presetConfig.git,\n bash: presetConfig.bash,\n web: presetConfig.web,\n custom: { allow: [], deny: [] },\n };\n\n const result = await installPermissions(projectPath, config, level);\n return result.success;\n}\n\n/**\n * Analyze current permissions and suggest improvements\n */\nexport function analyzePermissions(config: PermissionsConfig): {\n warnings: string[];\n suggestions: string[];\n} {\n const warnings: string[] = [];\n const suggestions: string[] = [];\n\n // Check for dangerous permissions\n if (config.bash.arbitrary) {\n warnings.push('Arbitrary bash commands are allowed - this gives Claude full shell access');\n }\n\n if (config.git.push) {\n warnings.push('Git push is allowed - Claude can push changes to remote repositories');\n }\n\n if (config.files.writeOther) {\n warnings.push('Writing to non-code files is allowed - includes CSS, HTML, SQL, etc.');\n }\n\n // Suggestions based on common patterns\n if (config.bash.testing && !config.bash.packageManager) {\n suggestions.push('Consider enabling package manager for installing test dependencies');\n }\n\n if (config.files.writeCode && !config.files.editTool) {\n suggestions.push('Consider enabling Edit tool for more efficient code modifications');\n }\n\n if (!config.git.readOnly) {\n suggestions.push('Git read operations are disabled - Claude cannot show diffs or status');\n }\n\n return { warnings, suggestions };\n}\n","/**\n * Permission preset definitions\n */\n\nimport type {\n BashPermissions,\n FilePermissions,\n GitPermissions,\n PermissionPreset,\n PermissionsConfig,\n WebPermissions,\n} from '../types/permissions.js';\n\n/**\n * Default file permissions\n */\nconst DEFAULT_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: true,\n writeConfig: true,\n writeMarkdown: true,\n writeOther: false,\n editTool: true,\n};\n\n/**\n * Trust file permissions\n */\nconst TRUST_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: true,\n writeConfig: true,\n writeMarkdown: true,\n writeOther: true,\n editTool: true,\n};\n\n/**\n * Restrictive file permissions\n */\nconst RESTRICTIVE_FILE_PERMISSIONS: FilePermissions = {\n readAll: true,\n writeCode: false,\n writeConfig: false,\n writeMarkdown: true,\n writeOther: false,\n editTool: false,\n};\n\n/**\n * Default git permissions\n */\nconst DEFAULT_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: false,\n commit: false,\n push: false,\n branching: false,\n};\n\n/**\n * Trust git permissions\n */\nconst TRUST_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: true,\n commit: true,\n push: false,\n branching: true,\n};\n\n/**\n * Restrictive git permissions\n */\nconst RESTRICTIVE_GIT_PERMISSIONS: GitPermissions = {\n readOnly: true,\n staging: false,\n commit: false,\n push: false,\n branching: false,\n};\n\n/**\n * Default bash permissions\n */\nconst DEFAULT_BASH_PERMISSIONS: BashPermissions = {\n packageManager: true,\n testing: true,\n building: true,\n docker: false,\n arbitrary: false,\n};\n\n/**\n * Trust bash permissions\n */\nconst TRUST_BASH_PERMISSIONS: BashPermissions = {\n packageManager: true,\n testing: true,\n building: true,\n docker: true,\n arbitrary: true,\n};\n\n/**\n * Restrictive bash permissions\n */\nconst RESTRICTIVE_BASH_PERMISSIONS: BashPermissions = {\n packageManager: false,\n testing: false,\n building: false,\n docker: false,\n arbitrary: false,\n};\n\n/**\n * Default web permissions\n */\nconst DEFAULT_WEB_PERMISSIONS: WebPermissions = {\n fetch: true,\n search: true,\n};\n\n/**\n * All permission presets\n */\nexport const PERMISSION_PRESETS: Record<\n PermissionPreset,\n Omit<PermissionsConfig, 'preset' | 'custom'>\n> = {\n default: {\n files: DEFAULT_FILE_PERMISSIONS,\n git: DEFAULT_GIT_PERMISSIONS,\n bash: DEFAULT_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n trust: {\n files: TRUST_FILE_PERMISSIONS,\n git: TRUST_GIT_PERMISSIONS,\n bash: TRUST_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n restrictive: {\n files: RESTRICTIVE_FILE_PERMISSIONS,\n git: RESTRICTIVE_GIT_PERMISSIONS,\n bash: RESTRICTIVE_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n custom: {\n files: DEFAULT_FILE_PERMISSIONS,\n git: DEFAULT_GIT_PERMISSIONS,\n bash: DEFAULT_BASH_PERMISSIONS,\n web: DEFAULT_WEB_PERMISSIONS,\n },\n};\n\n/**\n * Default deny rules (always applied)\n */\nexport const DEFAULT_DENY_RULES: string[] = [\n // Directories\n 'Write(node_modules/**)',\n 'Write(.git/**)',\n 'Write(dist/**)',\n 'Write(build/**)',\n 'Write(.next/**)',\n 'Write(.nuxt/**)',\n 'Write(.output/**)',\n\n // System files\n 'Write(/etc/**)',\n 'Write(/usr/**)',\n 'Write(/bin/**)',\n 'Write(/sbin/**)',\n 'Write(/var/**)',\n 'Write(/tmp/**)',\n\n // Dangerous commands\n 'Bash(rm -rf /)',\n 'Bash(sudo *)',\n 'Bash(chmod 777 *)',\n 'Bash(curl * | bash)',\n 'Bash(wget * | bash)',\n\n // Sensitive files\n 'Write(.env)',\n 'Write(.env.*)',\n 'Write(**/secrets/**)',\n 'Write(**/credentials/**)',\n 'Read(.env)',\n 'Read(.env.*)',\n];\n\n/**\n * Get permissions for a preset\n */\nexport function getPresetPermissions(\n preset: PermissionPreset\n): Omit<PermissionsConfig, 'preset' | 'custom'> {\n return PERMISSION_PRESETS[preset];\n}\n\n/**\n * Generate allow rules from permissions config\n */\nexport function generateAllowRules(config: PermissionsConfig): string[] {\n const rules: string[] = [];\n\n // File permissions\n if (config.files.readAll) {\n rules.push(\n 'Read(**/*)',\n 'Glob(**/*)',\n 'Grep(**/*)',\n 'LS(**/*)',\n 'TodoRead',\n 'WebFetch',\n 'WebSearch'\n );\n }\n if (config.files.writeCode) {\n rules.push(\n 'Write(**/*.ts)',\n 'Write(**/*.tsx)',\n 'Write(**/*.js)',\n 'Write(**/*.jsx)',\n 'Write(**/*.mts)',\n 'Write(**/*.mjs)',\n 'Write(**/*.vue)',\n 'Write(**/*.svelte)'\n );\n }\n if (config.files.writeConfig) {\n rules.push(\n 'Write(**/*.json)',\n 'Write(**/*.yaml)',\n 'Write(**/*.yml)',\n 'Write(**/*.toml)',\n 'Write(**/*.xml)',\n 'Write(**/.env.example)',\n 'Write(**/.gitignore)',\n 'Write(**/.npmrc)',\n 'Write(**/.nvmrc)'\n );\n }\n if (config.files.writeMarkdown) {\n rules.push('Write(**/*.md)', 'Write(**/*.mdx)');\n }\n if (config.files.writeOther) {\n rules.push(\n 'Write(**/*.css)',\n 'Write(**/*.scss)',\n 'Write(**/*.less)',\n 'Write(**/*.html)',\n 'Write(**/*.sql)',\n 'Write(**/*.graphql)',\n 'Write(**/*.prisma)'\n );\n }\n if (config.files.editTool) {\n rules.push('Edit(**/*)', 'MultiEdit(**/*)', 'NotebookEdit(**/*)', 'TodoWrite');\n }\n\n // Git permissions\n if (config.git.readOnly) {\n rules.push(\n 'Bash(git status*)',\n 'Bash(git diff*)',\n 'Bash(git log*)',\n 'Bash(git show*)',\n 'Bash(git branch*)'\n );\n }\n if (config.git.staging) {\n rules.push('Bash(git add*)');\n }\n if (config.git.commit) {\n rules.push('Bash(git commit*)');\n }\n if (config.git.push) {\n rules.push('Bash(git push*)');\n }\n if (config.git.branching) {\n rules.push('Bash(git checkout*)', 'Bash(git branch*)', 'Bash(git merge*)', 'Bash(git rebase*)');\n }\n\n // Bash permissions\n if (config.bash.packageManager) {\n rules.push(\n 'Bash(pnpm *)',\n 'Bash(npm *)',\n 'Bash(yarn *)',\n 'Bash(bun *)',\n 'Bash(npx *)',\n 'Bash(bunx *)'\n );\n }\n if (config.bash.testing) {\n rules.push(\n 'Bash(vitest*)',\n 'Bash(jest*)',\n 'Bash(playwright*)',\n 'Bash(cypress*)',\n 'Bash(pnpm test*)',\n 'Bash(npm test*)',\n 'Bash(pnpm run test*)',\n 'Bash(npm run test*)'\n );\n }\n if (config.bash.building) {\n rules.push(\n 'Bash(pnpm build*)',\n 'Bash(npm run build*)',\n 'Bash(pnpm run build*)',\n 'Bash(tsc*)',\n 'Bash(tsup*)',\n 'Bash(vite build*)',\n 'Bash(next build*)',\n 'Bash(astro build*)'\n );\n }\n if (config.bash.docker) {\n rules.push('Bash(docker *)', 'Bash(docker-compose *)');\n }\n if (config.bash.arbitrary) {\n rules.push('Bash(*)');\n }\n\n // Web permissions\n if (config.web.fetch) {\n rules.push('WebFetch');\n }\n if (config.web.search) {\n rules.push('WebSearch');\n }\n\n // Add custom allow rules\n if (config.custom?.allow) {\n rules.push(...config.custom.allow);\n }\n\n return [...new Set(rules)]; // Remove duplicates\n}\n\n/**\n * Generate deny rules from permissions config\n */\nexport function generateDenyRules(config: PermissionsConfig): string[] {\n const rules = [...DEFAULT_DENY_RULES];\n\n // Add custom deny rules\n if (config.custom?.deny) {\n rules.push(...config.custom.deny);\n }\n\n return [...new Set(rules)]; // Remove duplicates\n}\n\n/**\n * Preset descriptions for UI\n */\nexport const PRESET_DESCRIPTIONS: Record<PermissionPreset, { name: string; description: string }> =\n {\n default: {\n name: 'Default',\n description:\n 'Balanced permissions - read all, write code/config/docs, basic git, package manager & testing',\n },\n trust: {\n name: 'Trust',\n description:\n 'Extended permissions - full file access, git staging/commit/branching, docker, arbitrary bash',\n },\n restrictive: {\n name: 'Restrictive',\n description:\n 'Minimal permissions - read only, markdown writing, no git operations, no bash commands',\n },\n custom: {\n name: 'Custom',\n description: 'Configure each permission individually',\n },\n };\n","/**\n * Placeholders exports\n */\n\nexport {\n replaceInFile,\n replaceInDirectory,\n replacePlaceholders,\n showReplacementReport,\n} from './replacer.js';\n","/**\n * Placeholder replacer - finds and replaces placeholders in files\n */\n\nimport { PLACEHOLDERS, applyTransform } from '../../constants/placeholders.js';\nimport type { ProjectInfo } from '../../types/config.js';\nimport type {\n PlaceholderDefinition,\n PlaceholderReplacement,\n PlaceholderReport,\n} from '../../types/placeholders.js';\nimport { joinPath, listFiles, readFile, writeFile } from '../utils/fs.js';\nimport { logger } from '../utils/logger.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Replace placeholders in a single file\n */\nexport async function replaceInFile(\n filePath: string,\n projectInfo: ProjectInfo,\n placeholders: PlaceholderDefinition[] = PLACEHOLDERS\n): Promise<PlaceholderReplacement[]> {\n const replacements: PlaceholderReplacement[] = [];\n let content = await readFile(filePath);\n let modified = false;\n\n for (const placeholder of placeholders) {\n const value = projectInfo[placeholder.configKey];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const transformedValue = applyTransform(String(value), placeholder.transform);\n const pattern = placeholder.pattern;\n\n if (pattern instanceof RegExp) {\n const matches = content.matchAll(new RegExp(pattern.source, 'g'));\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n\n if (pattern.test(content)) {\n content = content.replace(pattern, transformedValue);\n modified = true;\n }\n } else {\n // String pattern\n const regex = new RegExp(escapeRegex(pattern), 'g');\n const matches = content.matchAll(regex);\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n\n if (content.includes(pattern)) {\n content = content.replace(regex, transformedValue);\n modified = true;\n }\n }\n }\n\n if (modified) {\n await writeFile(filePath, content);\n }\n\n return replacements;\n}\n\n/**\n * Replace placeholders in all files in a directory\n */\nexport async function replaceInDirectory(\n dirPath: string,\n projectInfo: ProjectInfo,\n options?: {\n extensions?: string[];\n exclude?: string[];\n dryRun?: boolean;\n }\n): Promise<PlaceholderReport> {\n const extensions = options?.extensions || ['md', 'json', 'yaml', 'yml', 'ts', 'js', 'tsx', 'jsx'];\n const exclude = options?.exclude || ['node_modules', '.git', 'dist', 'build'];\n\n const pattern = `**/*.{${extensions.join(',')}}`;\n const files = await listFiles(pattern, {\n cwd: dirPath,\n ignore: exclude.map((e) => `**/${e}/**`),\n });\n\n const report: PlaceholderReport = {\n totalFiles: files.length,\n filesModified: 0,\n replacements: [],\n unreplacedPlaceholders: [],\n };\n\n for (const file of files) {\n const filePath = joinPath(dirPath, file);\n\n try {\n const replacements = options?.dryRun\n ? await scanFile(filePath, projectInfo)\n : await replaceInFile(filePath, projectInfo);\n\n if (replacements.length > 0) {\n report.filesModified++;\n report.replacements.push(...replacements);\n }\n } catch (error) {\n logger.debug(`Failed to process ${file}: ${error}`);\n }\n }\n\n // Find unreplaced placeholders\n report.unreplacedPlaceholders = findUnreplacedPlaceholders(projectInfo);\n\n return report;\n}\n\n/**\n * Scan file for placeholders without replacing\n */\nasync function scanFile(\n filePath: string,\n projectInfo: ProjectInfo\n): Promise<PlaceholderReplacement[]> {\n const replacements: PlaceholderReplacement[] = [];\n const content = await readFile(filePath);\n\n for (const placeholder of PLACEHOLDERS) {\n const value = projectInfo[placeholder.configKey];\n\n if (value === undefined || value === null) {\n continue;\n }\n\n const transformedValue = applyTransform(String(value), placeholder.transform);\n const pattern = placeholder.pattern;\n\n const regex =\n pattern instanceof RegExp\n ? new RegExp(pattern.source, 'g')\n : new RegExp(escapeRegex(pattern), 'g');\n\n const matches = content.matchAll(regex);\n\n for (const match of matches) {\n const lineNumber = getLineNumber(content, match.index ?? 0);\n replacements.push({\n file: filePath,\n line: lineNumber,\n original: match[0],\n replacement: transformedValue,\n placeholder,\n });\n }\n }\n\n return replacements;\n}\n\n/**\n * Replace placeholders with spinner\n */\nexport async function replacePlaceholders(\n dirPath: string,\n projectInfo: ProjectInfo,\n options?: {\n extensions?: string[];\n exclude?: string[];\n dryRun?: boolean;\n silent?: boolean;\n }\n): Promise<PlaceholderReport> {\n return withSpinner(\n 'Replacing placeholders...',\n () => replaceInDirectory(dirPath, projectInfo, options),\n {\n successText: 'Placeholders replaced',\n silent: options?.silent || options?.dryRun,\n }\n );\n}\n\n/**\n * Find placeholders that couldn't be replaced due to missing values\n */\nfunction findUnreplacedPlaceholders(projectInfo: ProjectInfo): string[] {\n const unreplaced: string[] = [];\n\n for (const placeholder of PLACEHOLDERS) {\n if (!placeholder.required) continue;\n\n const value = projectInfo[placeholder.configKey];\n if (value === undefined || value === null || value === '') {\n const patternStr =\n placeholder.pattern instanceof RegExp ? placeholder.pattern.source : placeholder.pattern;\n unreplaced.push(patternStr);\n }\n }\n\n return unreplaced;\n}\n\n/**\n * Get line number from string index\n */\nfunction getLineNumber(content: string, index: number): number {\n return content.slice(0, index).split('\\n').length;\n}\n\n/**\n * Escape regex special characters\n */\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * Show replacement report\n */\nexport function showReplacementReport(report: PlaceholderReport): void {\n logger.newline();\n logger.subtitle('Placeholder Replacement Report');\n logger.keyValue('Files scanned', String(report.totalFiles));\n logger.keyValue('Files modified', String(report.filesModified));\n logger.keyValue('Replacements', String(report.replacements.length));\n\n if (report.unreplacedPlaceholders.length > 0) {\n logger.newline();\n logger.warn('Unreplaced placeholders (missing values):');\n for (const p of report.unreplacedPlaceholders) {\n logger.item(p);\n }\n }\n}\n","/**\n * Placeholder definitions for template processing\n */\n\nimport type { PlaceholderDefinition } from '../types/placeholders.js';\n\n/**\n * All placeholder patterns that can be replaced in templates\n */\nexport const PLACEHOLDERS: PlaceholderDefinition[] = [\n // Project info placeholders\n {\n pattern: /\\[Project Name\\]/g,\n configKey: 'name',\n transform: 'none',\n description: 'Project name',\n example: 'My Awesome Project',\n required: true,\n },\n {\n pattern: /\\[project-name\\]/g,\n configKey: 'name',\n transform: 'lowercase',\n description: 'Project name in lowercase with dashes',\n example: 'my-awesome-project',\n required: true,\n },\n {\n pattern: /\\[PROJECT_NAME\\]/g,\n configKey: 'name',\n transform: 'uppercase',\n description: 'Project name in uppercase with underscores',\n example: 'MY_AWESOME_PROJECT',\n required: true,\n },\n {\n pattern: /\\[Project Description\\]/g,\n configKey: 'description',\n transform: 'none',\n description: 'Project description',\n example: 'A powerful CLI tool for managing configurations',\n required: true,\n },\n {\n pattern: /your-org/g,\n configKey: 'org',\n transform: 'lowercase',\n description: 'GitHub organization or username',\n example: 'acme-corp',\n required: true,\n },\n {\n pattern: /your-repo/g,\n configKey: 'repo',\n transform: 'lowercase',\n description: 'Repository name',\n example: 'my-project',\n required: true,\n },\n {\n pattern: /example\\.com/g,\n configKey: 'domain',\n transform: 'lowercase',\n description: 'Project domain',\n example: 'myproject.com',\n required: false,\n },\n\n // Entity placeholders\n {\n pattern: /\\[Entity\\]/g,\n configKey: 'entityType',\n transform: 'capitalize',\n description: 'Primary entity type (capitalized)',\n example: 'Product',\n required: true,\n },\n {\n pattern: /\\[entity\\]/g,\n configKey: 'entityType',\n transform: 'lowercase',\n description: 'Primary entity type (lowercase)',\n example: 'product',\n required: true,\n },\n {\n pattern: /\\[Entities\\]/g,\n configKey: 'entityTypePlural',\n transform: 'capitalize',\n description: 'Primary entity type plural (capitalized)',\n example: 'Products',\n required: true,\n },\n {\n pattern: /\\[entities\\]/g,\n configKey: 'entityTypePlural',\n transform: 'lowercase',\n description: 'Primary entity type plural (lowercase)',\n example: 'products',\n required: true,\n },\n\n // Location placeholders\n {\n pattern: /\\[City Name\\]/g,\n configKey: 'location',\n transform: 'capitalize',\n description: 'City or location name',\n example: 'San Francisco',\n required: false,\n },\n {\n pattern: /\\[Your Region\\/Product\\]/g,\n configKey: 'location',\n transform: 'none',\n description: 'Region or product area',\n example: 'Bay Area',\n required: false,\n },\n {\n pattern: /\\[Your product\\/service tagline here\\]/g,\n configKey: 'description',\n transform: 'none',\n description: 'Product tagline',\n example: 'The best way to manage your projects',\n required: false,\n },\n];\n\n/**\n * Get placeholder by pattern string\n */\nexport function getPlaceholder(pattern: string): PlaceholderDefinition | undefined {\n return PLACEHOLDERS.find((p) => {\n if (p.pattern instanceof RegExp) {\n return p.pattern.source === pattern || p.pattern.source === new RegExp(pattern).source;\n }\n return p.pattern === pattern;\n });\n}\n\n/**\n * Get all required placeholders\n */\nexport function getRequiredPlaceholders(): PlaceholderDefinition[] {\n return PLACEHOLDERS.filter((p) => p.required);\n}\n\n/**\n * Get all optional placeholders\n */\nexport function getOptionalPlaceholders(): PlaceholderDefinition[] {\n return PLACEHOLDERS.filter((p) => !p.required);\n}\n\n/**\n * Apply transformation to a value\n */\nexport function applyTransform(\n value: string,\n transform: PlaceholderDefinition['transform']\n): string {\n switch (transform) {\n case 'lowercase':\n return value.toLowerCase().replace(/\\s+/g, '-');\n case 'uppercase':\n return value.toUpperCase().replace(/\\s+/g, '_');\n case 'capitalize':\n return value\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(' ');\n case 'pluralize':\n // Simple pluralization rules\n if (value.endsWith('y')) {\n return `${value.slice(0, -1)}ies`;\n }\n if (\n value.endsWith('s') ||\n value.endsWith('x') ||\n value.endsWith('ch') ||\n value.endsWith('sh')\n ) {\n return `${value}es`;\n }\n return `${value}s`;\n default:\n return value;\n }\n}\n","/**\n * CLAUDE.md generator - creates the main Claude instructions file in project root\n */\n\nimport type { ClaudeConfig, ProjectInfo } from '../../types/config.js';\nimport type {\n TemplateConfig,\n TemplateConfigCommands,\n TemplateConfigTechStack,\n} from '../../types/template-config.js';\nimport { joinPath, pathExists, readFile, writeFile } from '../utils/fs.js';\nimport { getTemplatesPath } from '../utils/paths.js';\nimport { withSpinner } from '../utils/spinner.js';\n\nexport interface ClaudeMdOptions {\n /** Whether to overwrite existing file */\n overwrite?: boolean;\n /** Custom template content (optional) */\n customTemplate?: string;\n /** Template configuration with tech stack info */\n templateConfig?: Partial<TemplateConfig>;\n /** Full claude config for additional context */\n claudeConfig?: ClaudeConfig;\n}\n\nexport interface ClaudeMdResult {\n /** Whether file was created */\n created: boolean;\n /** Whether file was skipped (already exists) */\n skipped: boolean;\n /** Path to the file */\n path: string;\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Generate CLAUDE.md file in project root\n */\nexport async function generateClaudeMd(\n projectPath: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): Promise<ClaudeMdResult> {\n const claudeMdPath = joinPath(projectPath, 'CLAUDE.md');\n\n // Check if file exists\n const exists = await pathExists(claudeMdPath);\n if (exists && !options?.overwrite) {\n return {\n created: false,\n skipped: true,\n path: claudeMdPath,\n };\n }\n\n try {\n // Get template content\n let template: string;\n if (options?.customTemplate) {\n template = options.customTemplate;\n } else {\n const templatePath = joinPath(getTemplatesPath(), 'CLAUDE.md.template');\n if (await pathExists(templatePath)) {\n template = await readFile(templatePath);\n } else {\n // Fallback to minimal template\n template = getMinimalTemplate();\n }\n }\n\n // Process template with all available data\n const content = processTemplate(template, projectInfo, options);\n\n // Write file\n await writeFile(claudeMdPath, content);\n\n return {\n created: true,\n skipped: false,\n path: claudeMdPath,\n };\n } catch (error) {\n return {\n created: false,\n skipped: false,\n path: claudeMdPath,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Generate CLAUDE.md with spinner\n */\nexport async function generateClaudeMdWithSpinner(\n projectPath: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): Promise<ClaudeMdResult> {\n return withSpinner(\n 'Generating CLAUDE.md...',\n () => generateClaudeMd(projectPath, projectInfo, options),\n {\n successText: 'Created CLAUDE.md',\n }\n );\n}\n\n/**\n * Process template with all available data\n */\nfunction processTemplate(\n template: string,\n projectInfo: ProjectInfo,\n options?: ClaudeMdOptions\n): string {\n let content = template;\n const techStack = options?.templateConfig?.techStack;\n const commands = options?.templateConfig?.commands;\n const targets = options?.templateConfig?.targets;\n const preferences = options?.claudeConfig?.preferences;\n\n // Basic project info replacements\n content = content\n .replace(/\\{\\{PROJECT_NAME\\}\\}/g, projectInfo.name)\n .replace(/\\{\\{PROJECT_DESCRIPTION\\}\\}/g, projectInfo.description)\n .replace(/\\{\\{ORG\\}\\}/g, projectInfo.org)\n .replace(/\\{\\{REPO\\}\\}/g, projectInfo.repo)\n .replace(/\\{\\{ENTITY_TYPE\\}\\}/g, projectInfo.entityType)\n .replace(/\\{\\{ENTITY_TYPE_PLURAL\\}\\}/g, projectInfo.entityTypePlural)\n .replace(/\\{\\{LOCATION\\}\\}/g, projectInfo.location || '');\n\n // Package manager\n const packageManager = preferences?.packageManager || 'pnpm';\n content = content.replace(/\\{\\{PACKAGE_MANAGER\\}\\}/g, packageManager);\n\n // Coverage target\n const coverageTarget = targets && 'coverage' in targets ? String(targets.coverage) : '90';\n content = content.replace(/\\{\\{COVERAGE_TARGET\\}\\}/g, coverageTarget);\n\n // Domain handling with conditional\n if (projectInfo.domain) {\n content = content\n .replace(/\\{\\{#if DOMAIN\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '')\n .replace(/\\{\\{DOMAIN\\}\\}/g, projectInfo.domain);\n } else {\n // Remove domain section if not provided\n content = content.replace(/\\{\\{#if DOMAIN\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Generate tech stack section\n if (techStack && Object.keys(techStack).length > 0) {\n const techStackContent = generateTechStackSection(techStack);\n content = content\n .replace(/\\{\\{#if TECH_STACK\\}\\}/g, '')\n .replace(/\\{\\{TECH_STACK\\}\\}\\n\\{\\{else\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, techStackContent);\n } else {\n // Use default tech stack section\n content = content\n .replace(/\\{\\{#if TECH_STACK\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Generate commands section\n if (commands && Object.keys(commands).length > 0) {\n const commandsContent = generateCommandsSection(commands, packageManager);\n content = content\n .replace(/\\{\\{#if COMMANDS\\}\\}/g, '')\n .replace(/\\{\\{COMMANDS\\}\\}\\n\\{\\{else\\}\\}[\\s\\S]*?\\{\\{\\/if\\}\\}/g, commandsContent);\n } else {\n // Use default commands section\n content = content\n .replace(/\\{\\{#if COMMANDS\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n }\n\n // Handle project structure conditional (use default for now)\n content = content\n .replace(/\\{\\{#if PROJECT_STRUCTURE\\}\\}[\\s\\S]*?\\{\\{else\\}\\}/g, '')\n .replace(/\\{\\{\\/if\\}\\}/g, '');\n\n return content;\n}\n\n/**\n * Generate tech stack section content\n */\nfunction generateTechStackSection(techStack: TemplateConfigTechStack): string {\n const lines: string[] = [];\n\n // Frontend\n if (techStack.frontendFramework && techStack.frontendFramework !== 'None') {\n lines.push('**Frontend:**');\n lines.push(`- Framework: ${techStack.frontendFramework}`);\n if (techStack.stateManagement && techStack.stateManagement !== 'None') {\n lines.push(`- State: ${techStack.stateManagement}`);\n }\n lines.push('');\n }\n\n // Backend\n if (techStack.apiFramework && techStack.apiFramework !== 'None') {\n lines.push('**Backend:**');\n lines.push(`- API: ${techStack.apiFramework}`);\n if (techStack.validationLibrary && techStack.validationLibrary !== 'None') {\n lines.push(`- Validation: ${techStack.validationLibrary}`);\n }\n lines.push('');\n }\n\n // Database\n if (techStack.databaseOrm && techStack.databaseOrm !== 'None') {\n lines.push('**Database:**');\n lines.push(`- ORM: ${techStack.databaseOrm}`);\n lines.push('');\n }\n\n // Auth\n if (techStack.authPattern && techStack.authPattern !== 'None') {\n lines.push('**Authentication:**');\n lines.push(`- Provider: ${techStack.authPattern}`);\n lines.push('');\n }\n\n // Testing\n if (techStack.testFramework && techStack.testFramework !== 'None') {\n lines.push('**Testing:**');\n lines.push(`- Framework: ${techStack.testFramework}`);\n lines.push('');\n }\n\n // Bundler\n if (techStack.bundler && techStack.bundler !== 'None') {\n lines.push('**Build:**');\n lines.push(`- Bundler: ${techStack.bundler}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate commands section content\n */\nfunction generateCommandsSection(commands: TemplateConfigCommands, packageManager: string): string {\n const lines: string[] = ['```bash'];\n\n // Development commands\n lines.push('# Development');\n lines.push(`${packageManager} dev # Start development server`);\n lines.push('');\n\n // Testing commands\n lines.push('# Testing');\n if (commands.test) {\n lines.push(`${commands.test} # Run tests`);\n } else {\n lines.push(`${packageManager} test # Run tests`);\n }\n if (commands.coverage) {\n lines.push(`${commands.coverage} # Run tests with coverage`);\n } else {\n lines.push(`${packageManager} test:coverage # Run tests with coverage`);\n }\n lines.push('');\n\n // Quality commands\n lines.push('# Quality');\n if (commands.lint) {\n lines.push(`${commands.lint} # Run linter`);\n } else {\n lines.push(`${packageManager} lint # Run linter`);\n }\n if (commands.typecheck) {\n lines.push(`${commands.typecheck} # Type checking`);\n } else {\n lines.push(`${packageManager} typecheck # Type checking`);\n }\n\n // Build command\n if (commands.build) {\n lines.push('');\n lines.push('# Build');\n lines.push(`${commands.build} # Build for production`);\n }\n\n lines.push('```');\n\n return lines.join('\\n');\n}\n\n/**\n * Get minimal fallback template\n */\nfunction getMinimalTemplate(): string {\n return `# CLAUDE.md\n\n## Project Overview\n\n**{{PROJECT_NAME}}** - {{PROJECT_DESCRIPTION}}\n\n## Repository\n\n- **GitHub:** https://github.com/{{ORG}}/{{REPO}}\n\n## Quick Commands\n\n\\`\\`\\`bash\n{{PACKAGE_MANAGER}} dev # Start development\n{{PACKAGE_MANAGER}} test # Run tests\n{{PACKAGE_MANAGER}} lint # Run linter\n{{PACKAGE_MANAGER}} build # Build project\n\\`\\`\\`\n\n## Claude Configuration\n\nThis project uses \\`@qazuor/claude-code-config\\` for AI-assisted development.\n\nSee \\`.claude/docs/quick-start.md\\` for getting started.\n\n---\n\n*Generated by [@qazuor/claude-code-config](https://github.com/qazuor/claude-code-config)*\n`;\n}\n","/**\n * Package path utilities\n * Handles resolving paths relative to the installed package\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Get the root directory of the installed package\n * Works both in development (src/) and when bundled (dist/)\n */\nexport function getPackageRoot(): string {\n const currentFilePath = fileURLToPath(import.meta.url);\n let currentDir = path.dirname(currentFilePath);\n\n // Walk up the directory tree until we find package.json\n // This works for both:\n // - Development: src/lib/utils/paths.ts -> walk up to find package.json\n // - Production: dist/bin.js -> walk up to find package.json\n while (currentDir !== path.dirname(currentDir)) {\n const packageJsonPath = path.join(currentDir, 'package.json');\n if (fs.existsSync(packageJsonPath)) {\n return currentDir;\n }\n currentDir = path.dirname(currentDir);\n }\n\n // Fallback: should not reach here in normal usage\n throw new Error('Could not find package root (no package.json found in parent directories)');\n}\n\n/**\n * Get the templates directory path\n * Templates are bundled with the package at package-root/templates/\n */\nexport function getTemplatesPath(): string {\n return path.join(getPackageRoot(), 'templates');\n}\n","/**\n * Scaffold exports\n */\n\n// Detector\nexport {\n detectProject,\n getProjectName,\n getProjectDescription,\n hasExistingClaudeConfig,\n} from './detector.js';\n\n// Generator\nexport {\n generateScaffold,\n generateScaffoldWithProgress,\n} from './generator.js';\n\n// CLAUDE.md generator\nexport {\n generateClaudeMd,\n generateClaudeMdWithSpinner,\n type ClaudeMdOptions,\n type ClaudeMdResult,\n} from './claude-md-generator.js';\n","/**\n * Project detector - detects existing project type and configuration\n */\n\nimport type {\n DetectionSignal,\n PackageManager,\n ProjectDetectionResult,\n ProjectType,\n} from '../../types/scaffold.js';\nimport { joinPath, pathExists, readJson } from '../utils/fs.js';\n\ninterface PackageJson {\n name?: string;\n description?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n workspaces?: string[] | { packages: string[] };\n}\n\n/**\n * Detect project type and configuration\n */\nexport async function detectProject(projectPath: string): Promise<ProjectDetectionResult> {\n const signals: DetectionSignal[] = [];\n\n // Check for package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n const hasPackageJson = await pathExists(packageJsonPath);\n\n if (!hasPackageJson) {\n return {\n detected: false,\n confidence: 'low',\n signals: [{ file: 'package.json', exists: false, indicates: 'not a Node.js project' }],\n };\n }\n\n signals.push({ file: 'package.json', exists: true, indicates: 'Node.js project' });\n\n // Read package.json\n const packageJson = await readJson<PackageJson>(packageJsonPath).catch(() => ({}) as PackageJson);\n\n // Detect package manager\n const packageManager = await detectPackageManager(projectPath);\n if (packageManager) {\n signals.push({\n file: `${packageManager}-lock`,\n exists: true,\n indicates: `${packageManager} package manager`,\n });\n }\n\n // Detect project type\n const typeResult = await detectProjectType(projectPath, packageJson);\n const projectType = typeResult.type;\n signals.push(...typeResult.signals);\n\n // Determine confidence\n const confidence: 'high' | 'medium' | 'low' =\n projectType && packageManager ? 'high' : projectType || packageManager ? 'medium' : 'low';\n\n // Suggest bundles based on project type\n const suggestedBundles = suggestBundles(projectType, packageJson);\n\n return {\n detected: true,\n projectType,\n packageManager,\n suggestedBundles,\n confidence,\n signals,\n };\n}\n\n/**\n * Detect package manager\n */\nasync function detectPackageManager(projectPath: string): Promise<PackageManager | undefined> {\n const lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'package-lock.json', manager: 'npm' },\n { file: 'bun.lockb', manager: 'bun' },\n ];\n\n for (const { file, manager } of lockFiles) {\n if (await pathExists(joinPath(projectPath, file))) {\n return manager;\n }\n }\n\n return undefined;\n}\n\n/**\n * Detect project type from configuration files\n */\nasync function detectProjectType(\n projectPath: string,\n packageJson: PackageJson\n): Promise<{ type: ProjectType | undefined; signals: DetectionSignal[] }> {\n const signals: DetectionSignal[] = [];\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n\n // Check for monorepo\n if (\n (await pathExists(joinPath(projectPath, 'turbo.json'))) ||\n (await pathExists(joinPath(projectPath, 'pnpm-workspace.yaml'))) ||\n packageJson.workspaces\n ) {\n signals.push({ file: 'turbo.json/pnpm-workspace.yaml', exists: true, indicates: 'monorepo' });\n return { type: 'monorepo', signals };\n }\n\n // Check for Astro\n if (\n (await pathExists(joinPath(projectPath, 'astro.config.mjs'))) ||\n (await pathExists(joinPath(projectPath, 'astro.config.ts'))) ||\n deps.astro\n ) {\n signals.push({ file: 'astro.config.*', exists: true, indicates: 'Astro project' });\n return { type: 'astro', signals };\n }\n\n // Check for Next.js\n if (\n (await pathExists(joinPath(projectPath, 'next.config.js'))) ||\n (await pathExists(joinPath(projectPath, 'next.config.mjs'))) ||\n (await pathExists(joinPath(projectPath, 'next.config.ts'))) ||\n deps.next\n ) {\n signals.push({ file: 'next.config.*', exists: true, indicates: 'Next.js project' });\n return { type: 'nextjs', signals };\n }\n\n // Check for Vite + React\n if (\n ((await pathExists(joinPath(projectPath, 'vite.config.ts'))) ||\n (await pathExists(joinPath(projectPath, 'vite.config.js')))) &&\n (deps.react || deps['react-dom'])\n ) {\n signals.push({ file: 'vite.config.*', exists: true, indicates: 'Vite project' });\n signals.push({ file: 'react dependency', exists: true, indicates: 'React project' });\n return { type: 'vite-react', signals };\n }\n\n // Check for Hono\n if (deps.hono) {\n signals.push({ file: 'hono dependency', exists: true, indicates: 'Hono API project' });\n return { type: 'hono', signals };\n }\n\n // Default to Node.js\n if (deps.typescript || (await pathExists(joinPath(projectPath, 'tsconfig.json')))) {\n signals.push({ file: 'tsconfig.json', exists: true, indicates: 'TypeScript project' });\n return { type: 'node', signals };\n }\n\n return { type: 'node', signals };\n}\n\n/**\n * Suggest bundles based on project type and dependencies\n */\nfunction suggestBundles(projectType: ProjectType | undefined, packageJson: PackageJson): string[] {\n const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };\n const suggestedBundles: string[] = [];\n\n // Detect backend framework\n const hasHono = deps.hono || deps['@hono/node-server'];\n const hasExpress = deps.express;\n const hasFastify = deps.fastify;\n const hasNestjs = deps['@nestjs/core'];\n\n // Detect database ORM\n const hasDrizzle = deps.drizzle || deps['drizzle-orm'];\n const hasPrisma = deps.prisma || deps['@prisma/client'];\n const hasMongoose = deps.mongoose;\n\n // Detect frontend framework\n const hasReact = deps.react;\n const hasTanstack = deps['@tanstack/react-router'] || deps['@tanstack/start'];\n\n // Stack bundles based on detected technologies\n switch (projectType) {\n case 'astro':\n suggestedBundles.push('astro-react-stack');\n break;\n\n case 'nextjs':\n if (hasPrisma) {\n suggestedBundles.push('nextjs-prisma-stack');\n } else {\n // Just React + TanStack for Next.js without Prisma\n suggestedBundles.push('react-tanstack-stack');\n }\n break;\n\n case 'vite-react':\n suggestedBundles.push('react-tanstack-stack');\n break;\n\n case 'hono':\n if (hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else if (hasPrisma) {\n suggestedBundles.push('hono-api');\n suggestedBundles.push('prisma-database');\n } else {\n suggestedBundles.push('hono-api');\n }\n break;\n\n case 'monorepo':\n // For monorepos, suggest based on detected technologies\n if (hasReact && hasTanstack) {\n suggestedBundles.push('react-tanstack-stack');\n }\n if (hasHono && hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else if (hasHono) {\n suggestedBundles.push('hono-api');\n }\n break;\n\n case 'node':\n // Detect API framework\n if (hasHono) {\n if (hasDrizzle) {\n suggestedBundles.push('hono-drizzle-stack');\n } else {\n suggestedBundles.push('hono-api');\n }\n } else if (hasExpress) {\n if (hasPrisma) {\n suggestedBundles.push('express-prisma-stack');\n } else {\n suggestedBundles.push('express-api');\n }\n } else if (hasFastify) {\n suggestedBundles.push('fastify-api');\n } else if (hasNestjs) {\n suggestedBundles.push('nestjs-api');\n }\n break;\n }\n\n // Add database bundle if ORM detected but not in a stack\n if (hasDrizzle && !suggestedBundles.some((b) => b.includes('drizzle'))) {\n suggestedBundles.push('drizzle-database');\n }\n if (hasPrisma && !suggestedBundles.some((b) => b.includes('prisma'))) {\n suggestedBundles.push('prisma-database');\n }\n if (hasMongoose) {\n suggestedBundles.push('mongoose-database');\n }\n\n // Always suggest minimal testing and quality\n if (suggestedBundles.length > 0) {\n suggestedBundles.push('testing-minimal');\n suggestedBundles.push('quality-minimal');\n }\n\n // Add git workflow for all projects\n suggestedBundles.push('git-workflow');\n\n return suggestedBundles;\n}\n\n/**\n * Get project name from package.json or directory\n */\nexport async function getProjectName(projectPath: string): Promise<string | undefined> {\n try {\n const packageJson = await readJson<PackageJson>(joinPath(projectPath, 'package.json'));\n return packageJson.name;\n } catch {\n // Return directory name\n const parts = projectPath.split('/');\n return parts[parts.length - 1];\n }\n}\n\n/**\n * Get project description from package.json\n */\nexport async function getProjectDescription(projectPath: string): Promise<string | undefined> {\n try {\n const packageJson = await readJson<PackageJson>(joinPath(projectPath, 'package.json'));\n return packageJson.description;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if project has existing Claude configuration\n */\nexport async function hasExistingClaudeConfig(projectPath: string): Promise<boolean> {\n return pathExists(joinPath(projectPath, '.claude'));\n}\n","/**\n * Project scaffold generator - creates project structure\n */\n\nimport type {\n PackageManager,\n ProjectType,\n ScaffoldOptions,\n ScaffoldResult,\n} from '../../types/scaffold.js';\nimport { ensureDir, joinPath, pathExists, writeFile, writeJson } from '../utils/fs.js';\nimport { initRepo } from '../utils/git.js';\nimport { withSpinner } from '../utils/spinner.js';\n\n/**\n * Generate project scaffold\n */\nexport async function generateScaffold(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const result: ScaffoldResult = {\n createdFiles: [],\n createdDirs: [],\n instructions: [],\n };\n\n // Create base .claude directory\n const claudeDir = joinPath(projectPath, '.claude');\n await ensureDir(claudeDir);\n result.createdDirs.push('.claude');\n\n // Create subdirectories\n const subdirs = ['agents', 'commands', 'skills', 'docs'];\n for (const dir of subdirs) {\n await ensureDir(joinPath(claudeDir, dir));\n result.createdDirs.push(`.claude/${dir}`);\n }\n\n // If claude-only, we're done with structure\n if (options.type === 'claude-only') {\n return result;\n }\n\n // Full project scaffold\n if (options.projectType) {\n const projectResult = await generateProjectStructure(projectPath, options);\n result.createdFiles.push(...projectResult.createdFiles);\n result.createdDirs.push(...projectResult.createdDirs);\n result.instructions.push(...projectResult.instructions);\n }\n\n // Init git if requested\n if (options.initGit) {\n const gitExists = await pathExists(joinPath(projectPath, '.git'));\n if (!gitExists) {\n await initRepo(projectPath);\n result.createdDirs.push('.git');\n }\n }\n\n // Create README\n if (options.createReadme) {\n const readmePath = joinPath(projectPath, 'README.md');\n if (!(await pathExists(readmePath))) {\n await writeFile(readmePath, generateReadme(options));\n result.createdFiles.push('README.md');\n }\n }\n\n // Create .gitignore\n if (options.createGitignore) {\n const gitignorePath = joinPath(projectPath, '.gitignore');\n if (!(await pathExists(gitignorePath))) {\n await writeFile(gitignorePath, generateGitignore(options.projectType));\n result.createdFiles.push('.gitignore');\n }\n }\n\n return result;\n}\n\n/**\n * Generate project-specific structure\n */\nasync function generateProjectStructure(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n const result: ScaffoldResult = {\n createdFiles: [],\n createdDirs: [],\n instructions: [],\n };\n\n const packageManager = options.packageManager || 'pnpm';\n\n switch (options.projectType) {\n case 'node':\n await generateNodeProject(projectPath, packageManager, result);\n break;\n\n case 'monorepo':\n await generateMonorepoProject(projectPath, packageManager, result);\n break;\n\n case 'hono':\n await generateHonoProject(projectPath, packageManager, result);\n break;\n\n // For framework projects, just provide instructions\n case 'astro':\n case 'nextjs':\n case 'vite-react':\n result.instructions.push(\n `Run: ${packageManager} create ${options.projectType === 'astro' ? 'astro@latest' : options.projectType === 'nextjs' ? 'next-app@latest' : 'vite@latest'}`\n );\n break;\n }\n\n return result;\n}\n\n/**\n * Generate basic Node.js TypeScript project\n */\nasync function generateNodeProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create src directory\n await ensureDir(joinPath(projectPath, 'src'));\n result.createdDirs.push('src');\n\n // Create test directory\n await ensureDir(joinPath(projectPath, 'test'));\n result.createdDirs.push('test');\n\n // Create package.json if it doesn't exist\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-project',\n version: '0.1.0',\n type: 'module',\n scripts: {\n build: 'tsc',\n dev: 'tsx watch src/index.ts',\n test: 'vitest',\n lint: 'biome check .',\n 'lint:fix': 'biome check --write .',\n },\n devDependencies: {\n typescript: '^5.0.0',\n tsx: '^4.0.0',\n vitest: '^2.0.0',\n '@biomejs/biome': '^1.9.0',\n '@types/node': '^22.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create tsconfig.json\n const tsconfigPath = joinPath(projectPath, 'tsconfig.json');\n if (!(await pathExists(tsconfigPath))) {\n await writeJson(tsconfigPath, {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n outDir: 'dist',\n rootDir: 'src',\n declaration: true,\n },\n include: ['src'],\n exclude: ['node_modules', 'dist'],\n });\n result.createdFiles.push('tsconfig.json');\n }\n\n // Create src/index.ts\n const indexPath = joinPath(projectPath, 'src/index.ts');\n if (!(await pathExists(indexPath))) {\n await writeFile(indexPath, `// Entry point\\nconsole.log('Hello, World!');\\n`);\n result.createdFiles.push('src/index.ts');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push(`Start development: ${packageManager} dev`);\n}\n\n/**\n * Generate monorepo structure\n */\nasync function generateMonorepoProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create directories\n const dirs = ['apps', 'packages', 'packages/shared'];\n for (const dir of dirs) {\n await ensureDir(joinPath(projectPath, dir));\n result.createdDirs.push(dir);\n }\n\n // Create package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-monorepo',\n private: true,\n scripts: {\n build: 'turbo build',\n dev: 'turbo dev',\n lint: 'turbo lint',\n test: 'turbo test',\n },\n devDependencies: {\n turbo: '^2.0.0',\n typescript: '^5.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create pnpm-workspace.yaml\n if (packageManager === 'pnpm') {\n const workspacePath = joinPath(projectPath, 'pnpm-workspace.yaml');\n if (!(await pathExists(workspacePath))) {\n await writeFile(workspacePath, 'packages:\\n - \"apps/*\"\\n - \"packages/*\"\\n');\n result.createdFiles.push('pnpm-workspace.yaml');\n }\n }\n\n // Create turbo.json\n const turboPath = joinPath(projectPath, 'turbo.json');\n if (!(await pathExists(turboPath))) {\n await writeJson(turboPath, {\n $schema: 'https://turbo.build/schema.json',\n tasks: {\n build: {\n dependsOn: ['^build'],\n outputs: ['dist/**'],\n },\n dev: {\n cache: false,\n persistent: true,\n },\n lint: {},\n test: {},\n },\n });\n result.createdFiles.push('turbo.json');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push('Create apps and packages in their respective directories');\n}\n\n/**\n * Generate Hono API project\n */\nasync function generateHonoProject(\n projectPath: string,\n packageManager: PackageManager,\n result: ScaffoldResult\n): Promise<void> {\n // Create directories\n const dirs = ['src', 'src/routes', 'test'];\n for (const dir of dirs) {\n await ensureDir(joinPath(projectPath, dir));\n result.createdDirs.push(dir);\n }\n\n // Create package.json\n const packageJsonPath = joinPath(projectPath, 'package.json');\n if (!(await pathExists(packageJsonPath))) {\n await writeJson(packageJsonPath, {\n name: 'my-api',\n version: '0.1.0',\n type: 'module',\n scripts: {\n dev: 'tsx watch src/index.ts',\n build: 'tsc',\n start: 'node dist/index.js',\n test: 'vitest',\n },\n dependencies: {\n hono: '^4.0.0',\n '@hono/node-server': '^1.0.0',\n },\n devDependencies: {\n typescript: '^5.0.0',\n tsx: '^4.0.0',\n vitest: '^2.0.0',\n '@types/node': '^22.0.0',\n },\n });\n result.createdFiles.push('package.json');\n }\n\n // Create src/index.ts\n const indexPath = joinPath(projectPath, 'src/index.ts');\n if (!(await pathExists(indexPath))) {\n await writeFile(\n indexPath,\n `import { Hono } from 'hono';\nimport { serve } from '@hono/node-server';\n\nconst app = new Hono();\n\napp.get('/', (c) => c.json({ message: 'Hello, World!' }));\n\nconst port = 3000;\nconsole.log(\\`Server running on http://localhost:\\${port}\\`);\n\nserve({ fetch: app.fetch, port });\n`\n );\n result.createdFiles.push('src/index.ts');\n }\n\n result.instructions.push(`Run: ${packageManager} install`);\n result.instructions.push(`Start server: ${packageManager} dev`);\n}\n\n/**\n * Generate README content\n */\nfunction generateReadme(options: ScaffoldOptions): string {\n return `# My Project\n\n## Description\n\nAdd your project description here.\n\n## Getting Started\n\n\\`\\`\\`bash\n${options.packageManager || 'pnpm'} install\n${options.packageManager || 'pnpm'} dev\n\\`\\`\\`\n\n## License\n\nMIT\n`;\n}\n\n/**\n * Generate .gitignore content\n */\nfunction generateGitignore(_projectType?: ProjectType): string {\n const common = `# Dependencies\nnode_modules/\n\n# Build outputs\ndist/\nbuild/\n.next/\n.nuxt/\n.output/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# Turbo\n.turbo/\n`;\n\n return common;\n}\n\n/**\n * Generate scaffold with progress\n */\nexport async function generateScaffoldWithProgress(\n projectPath: string,\n options: ScaffoldOptions\n): Promise<ScaffoldResult> {\n return withSpinner(\n 'Generating project structure...',\n () => generateScaffold(projectPath, options),\n { successText: 'Project structure created' }\n );\n}\n","/**\n * Git utility functions\n */\n\nimport { type SimpleGit, type SimpleGitOptions, simpleGit } from 'simple-git';\nimport { pathExists } from './fs.js';\n\n/**\n * Create a git instance for a directory\n */\nexport function createGit(baseDir: string): SimpleGit {\n const options: Partial<SimpleGitOptions> = {\n baseDir,\n binary: 'git',\n maxConcurrentProcesses: 6,\n };\n return simpleGit(options);\n}\n\n/**\n * Check if a directory is a git repository\n */\nexport async function isGitRepo(dir: string): Promise<boolean> {\n try {\n const git = createGit(dir);\n await git.status();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if git is installed\n */\nexport async function isGitInstalled(): Promise<boolean> {\n try {\n const git = simpleGit();\n await git.version();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Initialize a git repository\n */\nexport async function initRepo(dir: string): Promise<void> {\n const git = createGit(dir);\n await git.init();\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n url: string,\n dest: string,\n options?: {\n branch?: string;\n depth?: number;\n }\n): Promise<void> {\n const git = simpleGit();\n const cloneOptions: string[] = [];\n\n if (options?.branch) {\n cloneOptions.push('--branch', options.branch);\n }\n if (options?.depth) {\n cloneOptions.push('--depth', String(options.depth));\n }\n\n await git.clone(url, dest, cloneOptions);\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(dir: string): Promise<string> {\n const git = createGit(dir);\n const branch = await git.revparse(['--abbrev-ref', 'HEAD']);\n return branch.trim();\n}\n\n/**\n * Get list of remote branches\n */\nexport async function getRemoteBranches(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const result = await git.branch(['-r']);\n return result.all.map((b) => b.replace('origin/', ''));\n}\n\n/**\n * Get list of tags\n */\nexport async function getTags(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const result = await git.tags();\n return result.all;\n}\n\n/**\n * Fetch from remote\n */\nexport async function fetch(dir: string, options?: { tags?: boolean }): Promise<void> {\n const git = createGit(dir);\n const fetchOptions = options?.tags ? ['--tags'] : [];\n await git.fetch(fetchOptions);\n}\n\n/**\n * Pull from remote\n */\nexport async function pull(dir: string, remote = 'origin', branch?: string): Promise<void> {\n const git = createGit(dir);\n await git.pull(remote, branch);\n}\n\n/**\n * Checkout a branch or tag\n */\nexport async function checkout(dir: string, ref: string): Promise<void> {\n const git = createGit(dir);\n await git.checkout(ref);\n}\n\n/**\n * Get the remote URL\n */\nexport async function getRemoteUrl(dir: string, remote = 'origin'): Promise<string | null> {\n try {\n const git = createGit(dir);\n const remotes = await git.getRemotes(true);\n const remoteInfo = remotes.find((r) => r.name === remote);\n return remoteInfo?.refs.fetch || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get latest commit hash\n */\nexport async function getLatestCommit(dir: string): Promise<string> {\n const git = createGit(dir);\n const log = await git.log({ maxCount: 1 });\n return log.latest?.hash || '';\n}\n\n/**\n * Get list of changed files\n */\nexport async function getChangedFiles(dir: string): Promise<string[]> {\n const git = createGit(dir);\n const status = await git.status();\n return [\n ...status.modified,\n ...status.created,\n ...status.deleted,\n ...status.renamed.map((r) => r.to),\n ];\n}\n\n/**\n * Check if there are uncommitted changes\n */\nexport async function hasUncommittedChanges(dir: string): Promise<boolean> {\n const git = createGit(dir);\n const status = await git.status();\n return !status.isClean();\n}\n\n/**\n * Parse a git URL to extract owner and repo\n */\nexport function parseGitUrl(url: string): { owner: string; repo: string } | null {\n // Handle various git URL formats:\n // https://github.com/owner/repo.git\n // git@github.com:owner/repo.git\n // https://github.com/owner/repo\n\n const httpsMatch = url.match(/https?:\\/\\/[^/]+\\/([^/]+)\\/([^/.]+)(\\.git)?/);\n if (httpsMatch) {\n return { owner: httpsMatch[1], repo: httpsMatch[2] };\n }\n\n const sshMatch = url.match(/git@[^:]+:([^/]+)\\/([^/.]+)(\\.git)?/);\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n return null;\n}\n\n/**\n * Check if a remote URL is valid (can be accessed)\n */\nexport async function isValidRemoteUrl(url: string): Promise<boolean> {\n try {\n const git = simpleGit();\n await git.listRemote([url]);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get repository info from a directory\n */\nexport async function getRepoInfo(dir: string): Promise<{\n isRepo: boolean;\n branch?: string;\n remoteUrl?: string;\n hasChanges?: boolean;\n owner?: string;\n repo?: string;\n} | null> {\n if (!(await isGitRepo(dir))) {\n return { isRepo: false };\n }\n\n try {\n const [branch, remoteUrl, hasChanges] = await Promise.all([\n getCurrentBranch(dir),\n getRemoteUrl(dir),\n hasUncommittedChanges(dir),\n ]);\n\n const parsed = remoteUrl ? parseGitUrl(remoteUrl) : null;\n\n return {\n isRepo: true,\n branch,\n remoteUrl: remoteUrl || undefined,\n hasChanges,\n owner: parsed?.owner,\n repo: parsed?.repo,\n };\n } catch {\n return { isRepo: true };\n }\n}\n\n/**\n * Clone or update a repository for templates\n */\nexport async function cloneOrUpdateRepo(\n url: string,\n dest: string,\n options?: {\n branch?: string;\n forceUpdate?: boolean;\n }\n): Promise<{ cloned: boolean; updated: boolean }> {\n const exists = await pathExists(dest);\n\n if (!exists) {\n await cloneRepo(url, dest, { branch: options?.branch, depth: 1 });\n return { cloned: true, updated: false };\n }\n\n if (await isGitRepo(dest)) {\n if (options?.forceUpdate) {\n await fetch(dest, { tags: true });\n if (options?.branch) {\n await checkout(dest, options.branch);\n }\n await pull(dest);\n return { cloned: false, updated: true };\n }\n }\n\n return { cloned: false, updated: false };\n}\n","/**\n * Template configuration replacer\n *\n * Replaces {{PLACEHOLDER}} patterns in template files\n * with configured values from TemplateConfig.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport ora from 'ora';\nimport type {\n TemplateConfig,\n TemplatePlaceholderReport,\n} from '../../types/template-config.js';\nimport { TEMPLATE_PLACEHOLDERS } from '../../constants/template-placeholders.js';\n\n/**\n * File extensions to process\n */\nconst PROCESSABLE_EXTENSIONS = ['.md', '.json', '.yaml', '.yml', '.txt'];\n\n/**\n * Directories to skip\n */\nconst SKIP_DIRECTORIES = ['node_modules', '.git', 'dist', 'build', '.next', '.turbo'];\n\n/**\n * Flatten TemplateConfig into a key-value map for replacement\n */\nexport function flattenTemplateConfig(\n config: Partial<TemplateConfig>\n): Record<string, string> {\n const flattened: Record<string, string> = {};\n\n // Commands\n if (config.commands) {\n if (config.commands.typecheck)\n flattened['{{TYPECHECK_COMMAND}}'] = config.commands.typecheck;\n if (config.commands.lint)\n flattened['{{LINT_COMMAND}}'] = config.commands.lint;\n if (config.commands.test)\n flattened['{{TEST_COMMAND}}'] = config.commands.test;\n if (config.commands.coverage)\n flattened['{{COVERAGE_COMMAND}}'] = config.commands.coverage;\n if (config.commands.build)\n flattened['{{BUILD_COMMAND}}'] = config.commands.build;\n if (config.commands.format)\n flattened['{{FORMAT_COMMAND}}'] = config.commands.format;\n if (config.commands.securityScan)\n flattened['{{SECURITY_SCAN_COMMAND}}'] = config.commands.securityScan;\n if (config.commands.lighthouse)\n flattened['{{LIGHTHOUSE_COMMAND}}'] = config.commands.lighthouse;\n if (config.commands.bundleAnalyze)\n flattened['{{BUNDLE_ANALYZE_COMMAND}}'] = config.commands.bundleAnalyze;\n }\n\n // Paths\n if (config.paths) {\n if (config.paths.planningPath)\n flattened['{{PLANNING_PATH}}'] = config.paths.planningPath;\n if (config.paths.refactorPath)\n flattened['{{REFACTOR_PATH}}'] = config.paths.refactorPath;\n if (config.paths.archivePath)\n flattened['{{ARCHIVE_PATH}}'] = config.paths.archivePath;\n if (config.paths.schemasPath)\n flattened['{{SCHEMAS_PATH}}'] = config.paths.schemasPath;\n if (config.paths.projectRoot)\n flattened['{{PROJECT_ROOT}}'] = config.paths.projectRoot;\n }\n\n // Targets\n if (config.targets) {\n if (config.targets.coverageTarget !== undefined)\n flattened['{{COVERAGE_TARGET}}'] = String(config.targets.coverageTarget);\n if (config.targets.bundleSizeTarget !== undefined)\n flattened['{{BUNDLE_SIZE_TARGET}}'] = String(config.targets.bundleSizeTarget);\n if (config.targets.lcpTarget !== undefined)\n flattened['{{LCP_TARGET}}'] = String(config.targets.lcpTarget);\n if (config.targets.fidTarget !== undefined)\n flattened['{{FID_TARGET}}'] = String(config.targets.fidTarget);\n if (config.targets.clsTarget !== undefined)\n flattened['{{CLS_TARGET}}'] = String(config.targets.clsTarget);\n if (config.targets.apiResponseTarget !== undefined)\n flattened['{{API_RESPONSE_TARGET}}'] = String(config.targets.apiResponseTarget);\n if (config.targets.dbQueryTarget !== undefined)\n flattened['{{DB_QUERY_TARGET}}'] = String(config.targets.dbQueryTarget);\n if (config.targets.wcagLevel)\n flattened['{{WCAG_LEVEL}}'] = config.targets.wcagLevel;\n }\n\n // Tracking\n if (config.tracking) {\n if (config.tracking.issueTracker)\n flattened['{{ISSUE_TRACKER}}'] = config.tracking.issueTracker;\n if (config.tracking.trackingFile)\n flattened['{{TRACKING_FILE}}'] = config.tracking.trackingFile;\n if (config.tracking.registryFile)\n flattened['{{REGISTRY_FILE}}'] = config.tracking.registryFile;\n if (config.tracking.taskCodePattern)\n flattened['{{TASK_CODE_PATTERN}}'] = config.tracking.taskCodePattern;\n if (config.tracking.closedDays !== undefined)\n flattened['{{CLOSED_DAYS}}'] = String(config.tracking.closedDays);\n if (config.tracking.staleDays !== undefined)\n flattened['{{STALE_DAYS}}'] = String(config.tracking.staleDays);\n }\n\n // Tech Stack\n if (config.techStack) {\n if (config.techStack.frontendFramework)\n flattened['{{FRONTEND_FRAMEWORK}}'] = config.techStack.frontendFramework;\n if (config.techStack.databaseOrm)\n flattened['{{DATABASE_ORM}}'] = config.techStack.databaseOrm;\n if (config.techStack.validationLibrary)\n flattened['{{VALIDATION_LIBRARY}}'] = config.techStack.validationLibrary;\n if (config.techStack.authPattern)\n flattened['{{AUTH_PATTERN}}'] = config.techStack.authPattern;\n if (config.techStack.stateManagement)\n flattened['{{STATE_MANAGEMENT}}'] = config.techStack.stateManagement;\n if (config.techStack.testFramework)\n flattened['{{TEST_FRAMEWORK}}'] = config.techStack.testFramework;\n if (config.techStack.bundler)\n flattened['{{BUNDLER}}'] = config.techStack.bundler;\n if (config.techStack.apiFramework)\n flattened['{{API_FRAMEWORK}}'] = config.techStack.apiFramework;\n }\n\n // Environment\n if (config.environment) {\n if (config.environment.githubTokenEnv)\n flattened['{{GITHUB_TOKEN_ENV}}'] = config.environment.githubTokenEnv;\n if (config.environment.githubOwnerEnv)\n flattened['{{GITHUB_OWNER_ENV}}'] = config.environment.githubOwnerEnv;\n if (config.environment.githubRepoEnv)\n flattened['{{GITHUB_REPO_ENV}}'] = config.environment.githubRepoEnv;\n if (config.environment.issueTrackerTokenEnv)\n flattened['{{ISSUE_TRACKER_TOKEN_ENV}}'] = config.environment.issueTrackerTokenEnv;\n }\n\n // Brand\n if (config.brand) {\n if (config.brand.brandName)\n flattened['{{BRAND_NAME}}'] = config.brand.brandName;\n if (config.brand.primaryColor)\n flattened['{{PRIMARY_COLOR}}'] = config.brand.primaryColor;\n if (config.brand.secondaryColor)\n flattened['{{SECONDARY_COLOR}}'] = config.brand.secondaryColor;\n if (config.brand.fontFamily)\n flattened['{{FONT_FAMILY}}'] = config.brand.fontFamily;\n if (config.brand.toneOfVoice)\n flattened['{{TONE_OF_VOICE}}'] = config.brand.toneOfVoice;\n }\n\n return flattened;\n}\n\n/**\n * Check if file should be processed\n */\nfunction shouldProcessFile(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n return PROCESSABLE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Check if directory should be skipped\n */\nfunction shouldSkipDirectory(dirName: string): boolean {\n return SKIP_DIRECTORIES.includes(dirName) || dirName.startsWith('.');\n}\n\n/**\n * Get all files in directory recursively\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!shouldSkipDirectory(entry.name)) {\n const subFiles = await getAllFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile() && shouldProcessFile(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n\n/**\n * Replace placeholders in a single file\n */\nasync function replaceInFile(\n filePath: string,\n replacements: Record<string, string>\n): Promise<Array<{ placeholder: string; value: string }>> {\n const changes: Array<{ placeholder: string; value: string }> = [];\n\n try {\n let content = await fs.readFile(filePath, 'utf-8');\n let modified = false;\n\n for (const [placeholder, value] of Object.entries(replacements)) {\n if (content.includes(placeholder)) {\n content = content.split(placeholder).join(value);\n changes.push({ placeholder, value });\n modified = true;\n }\n }\n\n if (modified) {\n await fs.writeFile(filePath, content, 'utf-8');\n }\n } catch {\n // File can't be read/written, skip\n }\n\n return changes;\n}\n\n/**\n * Replace template placeholders in directory\n */\nexport async function replaceTemplatePlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<TemplatePlaceholderReport> {\n const replacements = flattenTemplateConfig(config);\n const files = await getAllFiles(dir);\n const report: TemplatePlaceholderReport = {\n totalFiles: files.length,\n filesModified: 0,\n replacements: [],\n unreplaced: [],\n };\n\n for (const file of files) {\n const changes = await replaceInFile(file, replacements);\n if (changes.length > 0) {\n report.filesModified++;\n for (const change of changes) {\n report.replacements.push({\n file: path.relative(dir, file),\n placeholder: change.placeholder,\n value: change.value,\n });\n }\n }\n }\n\n // Find unreplaced placeholders\n const allPatterns = TEMPLATE_PLACEHOLDERS.map((p) => p.pattern);\n const replacedPatterns = new Set(Object.keys(replacements));\n report.unreplaced = allPatterns.filter((p) => !replacedPatterns.has(p));\n\n return report;\n}\n\n/**\n * Replace template placeholders with spinner UI\n */\nexport async function replaceTemplateConfigWithSpinner(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<TemplatePlaceholderReport> {\n const spinner = ora('Applying template configuration...').start();\n\n try {\n const report = await replaceTemplatePlaceholders(dir, config);\n\n if (report.filesModified > 0) {\n spinner.succeed(\n `Applied ${report.replacements.length} replacements in ${report.filesModified} files`\n );\n } else {\n spinner.info('No template placeholders found to replace');\n }\n\n return report;\n } catch (error) {\n spinner.fail('Failed to apply template configuration');\n throw error;\n }\n}\n\n/**\n * Get a summary of the replacement report\n */\nexport function formatReplacementReport(\n report: TemplatePlaceholderReport\n): string {\n const lines: string[] = [];\n\n lines.push(`Template Configuration Applied`);\n lines.push(`${'─'.repeat(40)}`);\n lines.push(`Total files scanned: ${report.totalFiles}`);\n lines.push(`Files modified: ${report.filesModified}`);\n lines.push(`Total replacements: ${report.replacements.length}`);\n\n if (report.replacements.length > 0) {\n lines.push('');\n lines.push('Replacements:');\n\n // Group by file\n const byFile: Record<string, string[]> = {};\n for (const r of report.replacements) {\n if (!byFile[r.file]) {\n byFile[r.file] = [];\n }\n byFile[r.file].push(` ${r.placeholder} → ${r.value}`);\n }\n\n for (const [file, changes] of Object.entries(byFile)) {\n lines.push(` ${file}:`);\n for (const change of changes) {\n lines.push(change);\n }\n }\n }\n\n if (report.unreplaced.length > 0) {\n lines.push('');\n lines.push('Not configured (using defaults or runtime values):');\n for (const p of report.unreplaced.slice(0, 10)) {\n lines.push(` ${p}`);\n }\n if (report.unreplaced.length > 10) {\n lines.push(` ... and ${report.unreplaced.length - 10} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Preview replacements without making changes\n */\nexport async function previewReplacements(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<{ file: string; placeholder: string; value: string }[]> {\n const replacements = flattenTemplateConfig(config);\n const files = await getAllFiles(dir);\n const preview: Array<{ file: string; placeholder: string; value: string }> = [];\n\n for (const file of files) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n\n for (const [placeholder, value] of Object.entries(replacements)) {\n if (content.includes(placeholder)) {\n preview.push({\n file: path.relative(dir, file),\n placeholder,\n value,\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n\n return preview;\n}\n","/**\n * Template placeholder definitions for configurable values\n *\n * These placeholders use the {{PLACEHOLDER}} syntax and are configured\n * during installation or via the `configure` command.\n */\n\nimport type {\n TemplateConfigContext,\n TemplatePlaceholderDefinition,\n} from '../types/template-config.js';\n\n/**\n * Detect package manager command prefix\n */\nfunction getPackageManagerPrefix(context: TemplateConfigContext): string {\n switch (context.packageManager) {\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun run';\n case 'npm':\n return 'npm run';\n default:\n return 'pnpm';\n }\n}\n\n/**\n * Check if a script exists in package.json\n */\nfunction hasScript(context: TemplateConfigContext, name: string): boolean {\n return Boolean(context.scripts?.[name]);\n}\n\n/**\n * Get script command if it exists\n */\nfunction getScriptCommand(context: TemplateConfigContext, scriptName: string): string | undefined {\n if (!hasScript(context, scriptName)) return undefined;\n const prefix = getPackageManagerPrefix(context);\n return `${prefix} ${scriptName}`;\n}\n\n/**\n * Check if a dependency exists\n */\nfunction hasDependency(context: TemplateConfigContext, name: string): boolean {\n return Boolean(context.dependencies?.[name]);\n}\n\n/**\n * All configurable template placeholders\n */\nexport const TEMPLATE_PLACEHOLDERS: TemplatePlaceholderDefinition[] = [\n // ==========================================\n // COMMANDS CATEGORY\n // ==========================================\n {\n key: 'TYPECHECK_COMMAND',\n pattern: '{{TYPECHECK_COMMAND}}',\n category: 'commands',\n label: 'TypeScript Check Command',\n description: 'Command to run TypeScript type checking',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'typecheck') ||\n getScriptCommand(ctx, 'type-check') ||\n getScriptCommand(ctx, 'tsc') ||\n `${getPackageManagerPrefix(ctx)} typecheck`,\n required: true,\n example: 'pnpm typecheck',\n },\n {\n key: 'LINT_COMMAND',\n pattern: '{{LINT_COMMAND}}',\n category: 'commands',\n label: 'Lint Command',\n description: 'Command to run linting (ESLint, Biome, etc.)',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'lint') || `${getPackageManagerPrefix(ctx)} lint`,\n required: true,\n example: 'pnpm lint',\n },\n {\n key: 'LINT_FIX_COMMAND',\n pattern: '{{LINT_FIX_COMMAND}}',\n category: 'commands',\n label: 'Lint Fix Command',\n description: 'Command to run linting with auto-fix',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'lint:fix') || `${getPackageManagerPrefix(ctx)} lint --fix`,\n required: false,\n relatedTo: ['LINT_COMMAND'],\n example: 'pnpm lint --fix',\n },\n {\n key: 'TEST_COMMAND',\n pattern: '{{TEST_COMMAND}}',\n category: 'commands',\n label: 'Test Command',\n description: 'Command to run tests',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'test') || `${getPackageManagerPrefix(ctx)} test`,\n required: true,\n example: 'pnpm test',\n },\n {\n key: 'TEST_WATCH_COMMAND',\n pattern: '{{TEST_WATCH_COMMAND}}',\n category: 'commands',\n label: 'Test Watch Command',\n description: 'Command to run tests in watch mode',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'test:watch') || `${getPackageManagerPrefix(ctx)} test --watch`,\n required: false,\n relatedTo: ['TEST_COMMAND'],\n example: 'pnpm test --watch',\n },\n {\n key: 'COVERAGE_COMMAND',\n pattern: '{{COVERAGE_COMMAND}}',\n category: 'commands',\n label: 'Coverage Command',\n description: 'Command to run tests with coverage',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'test:coverage') ||\n getScriptCommand(ctx, 'coverage') ||\n `${getPackageManagerPrefix(ctx)} test --coverage`,\n required: true,\n relatedTo: ['TEST_COMMAND'],\n example: 'pnpm test:coverage',\n },\n {\n key: 'BUILD_COMMAND',\n pattern: '{{BUILD_COMMAND}}',\n category: 'commands',\n label: 'Build Command',\n description: 'Command to build the project',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'build') || `${getPackageManagerPrefix(ctx)} build`,\n required: false,\n example: 'pnpm build',\n },\n {\n key: 'FORMAT_COMMAND',\n pattern: '{{FORMAT_COMMAND}}',\n category: 'commands',\n label: 'Format Command',\n description: 'Command to format code (Prettier, Biome, etc.)',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'format') || `${getPackageManagerPrefix(ctx)} format`,\n required: false,\n example: 'pnpm format',\n },\n {\n key: 'SECURITY_SCAN_COMMAND',\n pattern: '{{SECURITY_SCAN_COMMAND}}',\n category: 'commands',\n label: 'Security Scan Command',\n description: 'Command to run security vulnerability scanning',\n inputType: 'text',\n default: (ctx) => getScriptCommand(ctx, 'audit') || `${getPackageManagerPrefix(ctx)} audit`,\n required: false,\n example: 'pnpm audit',\n },\n {\n key: 'LIGHTHOUSE_COMMAND',\n pattern: '{{LIGHTHOUSE_COMMAND}}',\n category: 'commands',\n label: 'Lighthouse Command',\n description: 'Command to run Lighthouse performance audit',\n inputType: 'text',\n default: 'npx lighthouse http://localhost:3000 --output=json',\n required: false,\n example: 'npx lighthouse http://localhost:3000 --output=json',\n },\n {\n key: 'BUNDLE_ANALYZE_COMMAND',\n pattern: '{{BUNDLE_ANALYZE_COMMAND}}',\n category: 'commands',\n label: 'Bundle Analyze Command',\n description: 'Command to analyze bundle size',\n inputType: 'text',\n default: (ctx) =>\n getScriptCommand(ctx, 'analyze') || `${getPackageManagerPrefix(ctx)} build --analyze`,\n required: false,\n example: 'pnpm build --analyze',\n },\n\n // ==========================================\n // PATHS CATEGORY\n // ==========================================\n {\n key: 'PLANNING_PATH',\n pattern: '{{PLANNING_PATH}}',\n category: 'paths',\n label: 'Planning Directory',\n description: 'Path for planning session documents',\n inputType: 'path',\n default: '.claude/sessions/planning',\n required: true,\n example: '.claude/sessions/planning',\n },\n {\n key: 'REFACTOR_PATH',\n pattern: '{{REFACTOR_PATH}}',\n category: 'paths',\n label: 'Refactor Directory',\n description: 'Path for refactoring session documents',\n inputType: 'path',\n default: '.claude/sessions/refactor',\n required: false,\n relatedTo: ['PLANNING_PATH'],\n example: '.claude/sessions/refactor',\n },\n {\n key: 'ARCHIVE_PATH',\n pattern: '{{ARCHIVE_PATH}}',\n category: 'paths',\n label: 'Archive Directory',\n description: 'Path for archived planning sessions',\n inputType: 'path',\n default: '.claude/sessions/archive',\n required: false,\n relatedTo: ['PLANNING_PATH'],\n example: '.claude/sessions/archive',\n },\n {\n key: 'SCHEMAS_PATH',\n pattern: '{{SCHEMAS_PATH}}',\n category: 'paths',\n label: 'Schemas Directory',\n description: 'Path for JSON schemas',\n inputType: 'path',\n default: '.claude/schemas',\n required: false,\n example: '.claude/schemas',\n },\n {\n key: 'PROJECT_ROOT',\n pattern: '{{PROJECT_ROOT}}',\n category: 'paths',\n label: 'Project Root',\n description: 'Root directory of the project',\n inputType: 'path',\n default: (ctx) => ctx.projectPath || '.',\n required: true,\n example: '.',\n },\n\n // ==========================================\n // TARGETS CATEGORY\n // ==========================================\n {\n key: 'COVERAGE_TARGET',\n pattern: '{{COVERAGE_TARGET}}',\n category: 'targets',\n label: 'Coverage Target (%)',\n description: 'Minimum test coverage percentage',\n inputType: 'number',\n default: '90',\n validate: (value) => {\n const num = Number.parseInt(value, 10);\n if (Number.isNaN(num) || num < 0 || num > 100) {\n return 'Coverage must be between 0 and 100';\n }\n return true;\n },\n required: true,\n example: '90',\n },\n {\n key: 'BUNDLE_SIZE_TARGET',\n pattern: '{{BUNDLE_SIZE_TARGET}}',\n category: 'targets',\n label: 'Bundle Size Target (KB)',\n description: 'Maximum bundle size in kilobytes',\n inputType: 'number',\n default: '500',\n validate: (value) => {\n const num = Number.parseInt(value, 10);\n if (Number.isNaN(num) || num < 0) {\n return 'Bundle size must be a positive number';\n }\n return true;\n },\n required: false,\n example: '500',\n },\n {\n key: 'LCP_TARGET',\n pattern: '{{LCP_TARGET}}',\n category: 'performance',\n label: 'LCP Target (ms)',\n description: 'Largest Contentful Paint target in milliseconds',\n inputType: 'number',\n default: '2500',\n required: false,\n example: '2500',\n },\n {\n key: 'FID_TARGET',\n pattern: '{{FID_TARGET}}',\n category: 'performance',\n label: 'FID Target (ms)',\n description: 'First Input Delay target in milliseconds',\n inputType: 'number',\n default: '100',\n required: false,\n example: '100',\n },\n {\n key: 'CLS_TARGET',\n pattern: '{{CLS_TARGET}}',\n category: 'performance',\n label: 'CLS Target',\n description: 'Cumulative Layout Shift target',\n inputType: 'number',\n default: '0.1',\n required: false,\n example: '0.1',\n },\n {\n key: 'API_RESPONSE_TARGET',\n pattern: '{{API_RESPONSE_TARGET}}',\n category: 'performance',\n label: 'API Response Target (ms)',\n description: 'Maximum API response time in milliseconds',\n inputType: 'number',\n default: '200',\n required: false,\n example: '200',\n },\n {\n key: 'DB_QUERY_TARGET',\n pattern: '{{DB_QUERY_TARGET}}',\n category: 'performance',\n label: 'DB Query Target (ms)',\n description: 'Maximum database query time in milliseconds',\n inputType: 'number',\n default: '50',\n required: false,\n example: '50',\n },\n {\n key: 'WCAG_LEVEL',\n pattern: '{{WCAG_LEVEL}}',\n category: 'targets',\n label: 'WCAG Compliance Level',\n description: 'Target WCAG accessibility compliance level',\n inputType: 'select',\n choices: [\n { name: 'Level A (Minimum)', value: 'A' },\n { name: 'Level AA (Recommended)', value: 'AA' },\n { name: 'Level AAA (Highest)', value: 'AAA' },\n ],\n default: 'AA',\n required: false,\n example: 'AA',\n },\n\n // ==========================================\n // TRACKING CATEGORY\n // ==========================================\n {\n key: 'ISSUE_TRACKER',\n pattern: '{{ISSUE_TRACKER}}',\n category: 'tracking',\n label: 'Issue Tracker',\n description: 'Issue tracking system to use',\n inputType: 'select',\n choices: [\n { name: 'GitHub Issues', value: 'github', description: 'Use GitHub Issues for tracking' },\n { name: 'Linear', value: 'linear', description: 'Use Linear for tracking' },\n { name: 'Jira', value: 'jira', description: 'Use Jira for tracking' },\n { name: 'None', value: 'none', description: 'No issue tracker integration' },\n ],\n default: (ctx) => (ctx.hasGitHubRemote ? 'github' : 'none'),\n required: true,\n example: 'github',\n },\n {\n key: 'TRACKING_FILE',\n pattern: '{{TRACKING_FILE}}',\n category: 'tracking',\n label: 'Tracking File',\n description: 'Path to the task tracking file',\n inputType: 'path',\n default: '.claude/tracking/tasks.json',\n required: false,\n example: '.claude/tracking/tasks.json',\n },\n {\n key: 'REGISTRY_FILE',\n pattern: '{{REGISTRY_FILE}}',\n category: 'tracking',\n label: 'Registry File',\n description: 'Path to the code registry file',\n inputType: 'path',\n default: '.claude/tracking/registry.json',\n required: false,\n example: '.claude/tracking/registry.json',\n },\n {\n key: 'TASK_CODE_PATTERN',\n pattern: '{{TASK_CODE_PATTERN}}',\n category: 'tracking',\n label: 'Task Code Pattern',\n description: 'Pattern for task codes (e.g., PROJ-XXX)',\n inputType: 'text',\n default: 'TASK-',\n required: false,\n example: 'TASK-',\n },\n {\n key: 'CLOSED_DAYS',\n pattern: '{{CLOSED_DAYS}}',\n category: 'tracking',\n label: 'Closed Days Threshold',\n description: 'Days after which closed issues can be cleaned up',\n inputType: 'number',\n default: '30',\n required: false,\n example: '30',\n },\n {\n key: 'STALE_DAYS',\n pattern: '{{STALE_DAYS}}',\n category: 'tracking',\n label: 'Stale Days Threshold',\n description: 'Days of inactivity before an issue is considered stale',\n inputType: 'number',\n default: '14',\n required: false,\n example: '14',\n },\n\n // ==========================================\n // TECH STACK CATEGORY\n // ==========================================\n {\n key: 'FRONTEND_FRAMEWORK',\n pattern: '{{FRONTEND_FRAMEWORK}}',\n category: 'techStack',\n label: 'Frontend Framework',\n description: 'Primary frontend framework',\n inputType: 'select',\n choices: [\n { name: 'React', value: 'React' },\n { name: 'Next.js', value: 'Next.js' },\n { name: 'TanStack Start', value: 'TanStack Start' },\n { name: 'Vue', value: 'Vue' },\n { name: 'Nuxt', value: 'Nuxt' },\n { name: 'Svelte', value: 'Svelte' },\n { name: 'SvelteKit', value: 'SvelteKit' },\n { name: 'Astro', value: 'Astro' },\n { name: 'SolidJS', value: 'SolidJS' },\n { name: 'Remix', value: 'Remix' },\n { name: 'Angular', value: 'Angular' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, '@tanstack/start')) return 'TanStack Start';\n if (hasDependency(ctx, 'next')) return 'Next.js';\n if (hasDependency(ctx, 'nuxt')) return 'Nuxt';\n if (hasDependency(ctx, 'vue')) return 'Vue';\n if (hasDependency(ctx, 'svelte')) return 'Svelte';\n if (hasDependency(ctx, '@sveltejs/kit')) return 'SvelteKit';\n if (hasDependency(ctx, 'astro')) return 'Astro';\n if (hasDependency(ctx, 'solid-js')) return 'SolidJS';\n if (hasDependency(ctx, '@remix-run/react')) return 'Remix';\n if (hasDependency(ctx, '@angular/core')) return 'Angular';\n if (hasDependency(ctx, 'react')) return 'React';\n return 'None';\n },\n required: false,\n example: 'React',\n },\n {\n key: 'DATABASE_ORM',\n pattern: '{{DATABASE_ORM}}',\n category: 'techStack',\n label: 'Database/ORM',\n description: 'Database ORM or query builder',\n inputType: 'select',\n choices: [\n { name: 'Drizzle', value: 'Drizzle' },\n { name: 'Prisma', value: 'Prisma' },\n { name: 'TypeORM', value: 'TypeORM' },\n { name: 'Sequelize', value: 'Sequelize' },\n { name: 'Knex', value: 'Knex' },\n { name: 'Kysely', value: 'Kysely' },\n { name: 'MongoDB/Mongoose', value: 'Mongoose' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'drizzle-orm')) return 'Drizzle';\n if (hasDependency(ctx, 'prisma') || hasDependency(ctx, '@prisma/client')) return 'Prisma';\n if (hasDependency(ctx, 'typeorm')) return 'TypeORM';\n if (hasDependency(ctx, 'sequelize')) return 'Sequelize';\n if (hasDependency(ctx, 'knex')) return 'Knex';\n if (hasDependency(ctx, 'kysely')) return 'Kysely';\n if (hasDependency(ctx, 'mongoose')) return 'Mongoose';\n return 'None';\n },\n required: false,\n example: 'Drizzle',\n },\n {\n key: 'VALIDATION_LIBRARY',\n pattern: '{{VALIDATION_LIBRARY}}',\n category: 'techStack',\n label: 'Validation Library',\n description: 'Schema validation library',\n inputType: 'select',\n choices: [\n { name: 'Zod', value: 'Zod' },\n { name: 'Yup', value: 'Yup' },\n { name: 'Joi', value: 'Joi' },\n { name: 'Valibot', value: 'Valibot' },\n { name: 'ArkType', value: 'ArkType' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'zod')) return 'Zod';\n if (hasDependency(ctx, 'yup')) return 'Yup';\n if (hasDependency(ctx, 'joi')) return 'Joi';\n if (hasDependency(ctx, 'valibot')) return 'Valibot';\n if (hasDependency(ctx, 'arktype')) return 'ArkType';\n return 'None';\n },\n required: false,\n example: 'Zod',\n },\n {\n key: 'AUTH_PATTERN',\n pattern: '{{AUTH_PATTERN}}',\n category: 'techStack',\n label: 'Authentication Pattern',\n description: 'Authentication approach',\n inputType: 'select',\n choices: [\n { name: 'Better Auth', value: 'Better Auth' },\n { name: 'Clerk', value: 'Clerk' },\n { name: 'Auth.js (NextAuth)', value: 'Auth.js' },\n { name: 'Lucia', value: 'Lucia' },\n { name: 'Firebase Auth', value: 'Firebase' },\n { name: 'Supabase Auth', value: 'Supabase' },\n { name: 'Kinde', value: 'Kinde' },\n { name: 'WorkOS', value: 'WorkOS' },\n { name: 'Custom JWT', value: 'JWT' },\n { name: 'Session-based', value: 'Session' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'better-auth')) return 'Better Auth';\n if (hasDependency(ctx, '@clerk/nextjs') || hasDependency(ctx, '@clerk/clerk-react'))\n return 'Clerk';\n if (hasDependency(ctx, 'next-auth') || hasDependency(ctx, '@auth/core')) return 'Auth.js';\n if (hasDependency(ctx, 'lucia')) return 'Lucia';\n if (hasDependency(ctx, 'firebase')) return 'Firebase';\n if (hasDependency(ctx, '@supabase/supabase-js')) return 'Supabase';\n if (hasDependency(ctx, '@kinde-oss/kinde-auth-nextjs')) return 'Kinde';\n if (hasDependency(ctx, '@workos-inc/authkit-nextjs')) return 'WorkOS';\n return 'None';\n },\n required: false,\n example: 'Better Auth',\n },\n {\n key: 'STATE_MANAGEMENT',\n pattern: '{{STATE_MANAGEMENT}}',\n category: 'techStack',\n label: 'State Management',\n description: 'Client-side state management',\n inputType: 'select',\n choices: [\n { name: 'TanStack Query', value: 'TanStack Query' },\n { name: 'Zustand', value: 'Zustand' },\n { name: 'Jotai', value: 'Jotai' },\n { name: 'Redux Toolkit', value: 'Redux' },\n { name: 'MobX', value: 'MobX' },\n { name: 'Recoil', value: 'Recoil' },\n { name: 'Pinia (Vue)', value: 'Pinia' },\n { name: 'None/Context', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, '@tanstack/react-query')) return 'TanStack Query';\n if (hasDependency(ctx, 'zustand')) return 'Zustand';\n if (hasDependency(ctx, 'jotai')) return 'Jotai';\n if (hasDependency(ctx, '@reduxjs/toolkit')) return 'Redux';\n if (hasDependency(ctx, 'mobx')) return 'MobX';\n if (hasDependency(ctx, 'recoil')) return 'Recoil';\n if (hasDependency(ctx, 'pinia')) return 'Pinia';\n return 'None';\n },\n required: false,\n example: 'TanStack Query',\n },\n {\n key: 'TEST_FRAMEWORK',\n pattern: '{{TEST_FRAMEWORK}}',\n category: 'techStack',\n label: 'Test Framework',\n description: 'Testing framework',\n inputType: 'select',\n choices: [\n { name: 'Vitest', value: 'Vitest' },\n { name: 'Jest', value: 'Jest' },\n { name: 'Mocha', value: 'Mocha' },\n { name: 'Ava', value: 'Ava' },\n { name: 'Node Test Runner', value: 'Node' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'vitest')) return 'Vitest';\n if (hasDependency(ctx, 'jest')) return 'Jest';\n if (hasDependency(ctx, 'mocha')) return 'Mocha';\n if (hasDependency(ctx, 'ava')) return 'Ava';\n return 'None';\n },\n required: false,\n example: 'Vitest',\n },\n {\n key: 'BUNDLER',\n pattern: '{{BUNDLER}}',\n category: 'techStack',\n label: 'Bundler',\n description: 'Build tool/bundler',\n inputType: 'select',\n choices: [\n { name: 'Vite', value: 'Vite' },\n { name: 'Webpack', value: 'Webpack' },\n { name: 'Rollup', value: 'Rollup' },\n { name: 'esbuild', value: 'esbuild' },\n { name: 'Parcel', value: 'Parcel' },\n { name: 'Turbopack', value: 'Turbopack' },\n { name: 'tsup', value: 'tsup' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'vite')) return 'Vite';\n if (hasDependency(ctx, 'webpack')) return 'Webpack';\n if (hasDependency(ctx, 'rollup')) return 'Rollup';\n if (hasDependency(ctx, 'esbuild')) return 'esbuild';\n if (hasDependency(ctx, 'parcel')) return 'Parcel';\n if (hasDependency(ctx, 'tsup')) return 'tsup';\n return 'None';\n },\n required: false,\n example: 'Vite',\n },\n {\n key: 'API_FRAMEWORK',\n pattern: '{{API_FRAMEWORK}}',\n category: 'techStack',\n label: 'API Framework',\n description: 'Backend API framework',\n inputType: 'select',\n choices: [\n { name: 'Hono', value: 'Hono' },\n { name: 'Express', value: 'Express' },\n { name: 'Fastify', value: 'Fastify' },\n { name: 'Koa', value: 'Koa' },\n { name: 'NestJS', value: 'NestJS' },\n { name: 'tRPC', value: 'tRPC' },\n { name: 'Next.js API Routes', value: 'Next.js API' },\n { name: 'None', value: 'None' },\n ],\n default: (ctx) => {\n if (hasDependency(ctx, 'hono')) return 'Hono';\n if (hasDependency(ctx, 'express')) return 'Express';\n if (hasDependency(ctx, 'fastify')) return 'Fastify';\n if (hasDependency(ctx, 'koa')) return 'Koa';\n if (hasDependency(ctx, '@nestjs/core')) return 'NestJS';\n if (hasDependency(ctx, '@trpc/server')) return 'tRPC';\n if (hasDependency(ctx, 'next')) return 'Next.js API';\n return 'None';\n },\n required: false,\n example: 'Hono',\n },\n\n // ==========================================\n // ENVIRONMENT CATEGORY\n // ==========================================\n {\n key: 'GITHUB_TOKEN_ENV',\n pattern: '{{GITHUB_TOKEN_ENV}}',\n category: 'environment',\n label: 'GitHub Token Env Var',\n description: 'Environment variable name for GitHub token',\n inputType: 'envVar',\n default: 'GITHUB_TOKEN',\n required: false,\n example: 'GITHUB_TOKEN',\n },\n {\n key: 'GITHUB_OWNER_ENV',\n pattern: '{{GITHUB_OWNER_ENV}}',\n category: 'environment',\n label: 'GitHub Owner Env Var',\n description: 'Environment variable name for GitHub owner/org',\n inputType: 'envVar',\n default: 'GITHUB_OWNER',\n required: false,\n example: 'GITHUB_OWNER',\n },\n {\n key: 'GITHUB_REPO_ENV',\n pattern: '{{GITHUB_REPO_ENV}}',\n category: 'environment',\n label: 'GitHub Repo Env Var',\n description: 'Environment variable name for GitHub repository',\n inputType: 'envVar',\n default: 'GITHUB_REPO',\n required: false,\n example: 'GITHUB_REPO',\n },\n {\n key: 'ISSUE_TRACKER_TOKEN_ENV',\n pattern: '{{ISSUE_TRACKER_TOKEN_ENV}}',\n category: 'environment',\n label: 'Issue Tracker Token Env Var',\n description: 'Environment variable for issue tracker API token',\n inputType: 'envVar',\n default: (ctx) => {\n // Set based on selected tracker\n const tracker = ctx.values.ISSUE_TRACKER;\n if (tracker === 'linear') return 'LINEAR_API_KEY';\n if (tracker === 'jira') return 'JIRA_API_TOKEN';\n return 'GITHUB_TOKEN';\n },\n dependsOn: ['ISSUE_TRACKER'],\n required: false,\n example: 'GITHUB_TOKEN',\n },\n\n // ==========================================\n // BRAND CATEGORY\n // ==========================================\n {\n key: 'BRAND_NAME',\n pattern: '{{BRAND_NAME}}',\n category: 'brand',\n label: 'Brand Name',\n description: 'Your brand or product name',\n inputType: 'text',\n default: '',\n required: false,\n example: 'MyProduct',\n },\n {\n key: 'PRIMARY_COLOR',\n pattern: '{{PRIMARY_COLOR}}',\n category: 'brand',\n label: 'Primary Color',\n description: 'Primary brand color (hex)',\n inputType: 'text',\n validate: (value) => {\n if (!value) return true;\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n return 'Must be a valid hex color (e.g., #3B82F6)';\n }\n return true;\n },\n default: '#3B82F6',\n required: false,\n example: '#3B82F6',\n },\n {\n key: 'SECONDARY_COLOR',\n pattern: '{{SECONDARY_COLOR}}',\n category: 'brand',\n label: 'Secondary Color',\n description: 'Secondary brand color (hex)',\n inputType: 'text',\n validate: (value) => {\n if (!value) return true;\n if (!/^#[0-9A-Fa-f]{6}$/.test(value)) {\n return 'Must be a valid hex color (e.g., #10B981)';\n }\n return true;\n },\n default: '#10B981',\n required: false,\n example: '#10B981',\n },\n {\n key: 'FONT_FAMILY',\n pattern: '{{FONT_FAMILY}}',\n category: 'brand',\n label: 'Font Family',\n description: 'Primary font family',\n inputType: 'text',\n default: 'Inter, system-ui, sans-serif',\n required: false,\n example: 'Inter, system-ui, sans-serif',\n },\n {\n key: 'TONE_OF_VOICE',\n pattern: '{{TONE_OF_VOICE}}',\n category: 'brand',\n label: 'Tone of Voice',\n description: 'Brand communication tone',\n inputType: 'select',\n choices: [\n { name: 'Professional', value: 'professional' },\n { name: 'Friendly', value: 'friendly' },\n { name: 'Casual', value: 'casual' },\n { name: 'Technical', value: 'technical' },\n { name: 'Playful', value: 'playful' },\n ],\n default: 'professional',\n required: false,\n example: 'professional',\n },\n];\n\n/**\n * Get placeholder definition by key\n */\nexport function getPlaceholderByKey(key: string): TemplatePlaceholderDefinition | undefined {\n return TEMPLATE_PLACEHOLDERS.find((p) => p.key === key);\n}\n\n/**\n * Get placeholder definition by pattern\n */\nexport function getPlaceholderByPattern(\n pattern: string\n): TemplatePlaceholderDefinition | undefined {\n return TEMPLATE_PLACEHOLDERS.find((p) => p.pattern === pattern);\n}\n\n/**\n * Get all placeholders for a category\n */\nexport function getPlaceholdersByCategory(category: string): TemplatePlaceholderDefinition[] {\n return TEMPLATE_PLACEHOLDERS.filter((p) => p.category === category);\n}\n\n/**\n * Get all required placeholders\n */\nexport function getRequiredPlaceholders(): TemplatePlaceholderDefinition[] {\n return TEMPLATE_PLACEHOLDERS.filter((p) => p.required);\n}\n\n/**\n * Get all placeholder keys\n */\nexport function getAllPlaceholderKeys(): string[] {\n return TEMPLATE_PLACEHOLDERS.map((p) => p.key);\n}\n\n/**\n * Get all placeholder patterns\n */\nexport function getAllPlaceholderPatterns(): string[] {\n return TEMPLATE_PLACEHOLDERS.map((p) => p.pattern);\n}\n\n/**\n * Check if a pattern is a configurable placeholder\n */\nexport function isConfigurablePlaceholder(pattern: string): boolean {\n return TEMPLATE_PLACEHOLDERS.some((p) => p.pattern === pattern);\n}\n\n/**\n * Compute default value for a placeholder\n */\nexport function computeDefaultValue(\n placeholder: TemplatePlaceholderDefinition,\n context: TemplateConfigContext\n): string | undefined {\n if (typeof placeholder.default === 'function') {\n return placeholder.default(context);\n }\n return placeholder.default;\n}\n","/**\n * Prompt cancellation utility with ESC key support\n *\n * Provides graceful cancellation handling for CLI prompts using AbortController.\n * - Handles Ctrl+C via ExitPromptError from @inquirer/prompts\n * - Handles ESC key by showing confirmation before cancelling\n * - Wraps all @inquirer/prompts functions to add ESC support\n */\n\nimport * as readline from 'node:readline';\nimport {\n checkbox as inquirerCheckbox,\n confirm as inquirerConfirm,\n input as inquirerInput,\n password as inquirerPassword,\n select as inquirerSelect,\n} from '@inquirer/prompts';\nimport type { Context } from '@inquirer/type';\nimport chalk from 'chalk';\n\n/**\n * Error thrown when user confirms cancellation via ESC\n */\nexport class UserCancelledError extends Error {\n constructor(message = 'Operation cancelled by user') {\n super(message);\n this.name = 'UserCancelledError';\n }\n}\n\n/**\n * Check if an error is a cancellation error (ESC confirmed, Ctrl+C, or abort)\n */\nexport function isCancellationError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'UserCancelledError' ||\n error.name === 'AbortPromptError'\n );\n}\n\n// Global state for ESC handling\nlet escHandlerActive = false;\nlet currentAbortController: AbortController | null = null;\nlet keypressHandler: ((str: string | undefined, key: readline.Key) => void) | null = null;\n\n/**\n * Start listening for ESC key presses\n */\nfunction startEscListener(): void {\n if (escHandlerActive || !process.stdin.isTTY) return;\n\n // Set up keypress events\n readline.emitKeypressEvents(process.stdin);\n\n keypressHandler = (_str: string | undefined, key: readline.Key) => {\n if (key.name === 'escape' && currentAbortController) {\n currentAbortController.abort();\n }\n };\n\n process.stdin.on('keypress', keypressHandler);\n escHandlerActive = true;\n}\n\n/**\n * Stop listening for ESC key presses\n */\nfunction stopEscListener(): void {\n if (!escHandlerActive || !keypressHandler) return;\n\n process.stdin.removeListener('keypress', keypressHandler);\n keypressHandler = null;\n escHandlerActive = false;\n}\n\n/**\n * Create an AbortController and start ESC listener\n */\nfunction setupAbortController(): AbortController {\n currentAbortController = new AbortController();\n startEscListener();\n return currentAbortController;\n}\n\n/**\n * Clean up after prompt completes\n */\nfunction cleanupAbortController(): void {\n currentAbortController = null;\n}\n\n/**\n * Check if error is from abort (ESC press)\n */\nfunction isAbortError(error: unknown): boolean {\n return error instanceof Error && error.name === 'AbortPromptError';\n}\n\n/**\n * Ask user to confirm cancellation\n * Uses inquirerConfirm directly to avoid recursion\n */\nasync function confirmCancellation(): Promise<boolean> {\n // Temporarily disable ESC listener for this prompt\n const wasActive = escHandlerActive;\n if (wasActive) {\n stopEscListener();\n }\n\n console.log(); // New line after aborted prompt\n\n try {\n const shouldCancel = await inquirerConfirm({\n message: chalk.yellow('Do you want to cancel the installation?'),\n default: false,\n });\n return shouldCancel;\n } catch (error) {\n // If user presses Ctrl+C during confirmation, treat as cancel\n if (isCancellationError(error)) {\n return true;\n }\n throw error;\n } finally {\n // Restore ESC listener if it was active\n if (wasActive) {\n startEscListener();\n }\n }\n}\n\n// Type definitions for prompt configs\ntype InputConfig = Parameters<typeof inquirerInput>[0];\ntype ConfirmConfig = Parameters<typeof inquirerConfirm>[0];\ntype SelectConfig<T> = Parameters<typeof inquirerSelect<T>>[0];\ntype CheckboxConfig<T> = Parameters<typeof inquirerCheckbox<T>>[0];\ntype PasswordConfig = Parameters<typeof inquirerPassword>[0];\n\n/**\n * Generic wrapper for prompts with ESC confirmation support\n */\nasync function withEscConfirmation<T, C>(\n promptFn: (config: C, context?: Context) => Promise<T>,\n config: C,\n context?: Context\n): Promise<T> {\n while (true) {\n const controller = setupAbortController();\n\n try {\n const result = await promptFn(config, { ...context, signal: controller.signal });\n cleanupAbortController();\n return result;\n } catch (error) {\n cleanupAbortController();\n\n // If ESC was pressed (AbortPromptError), ask for confirmation\n if (isAbortError(error)) {\n const shouldCancel = await confirmCancellation();\n\n if (shouldCancel) {\n throw new UserCancelledError('Cancelled with ESC');\n }\n\n // User chose not to cancel, show the prompt again\n console.log(chalk.dim(' Continuing...\\n'));\n continue;\n }\n\n // For other errors (including Ctrl+C), propagate them\n throw error;\n }\n }\n}\n\n/**\n * Input prompt with ESC confirmation support\n */\nexport async function input(config: InputConfig, context?: Context): Promise<string> {\n return withEscConfirmation(inquirerInput, config, context);\n}\n\n/**\n * Confirm prompt with ESC confirmation support\n */\nexport async function confirm(config: ConfirmConfig, context?: Context): Promise<boolean> {\n return withEscConfirmation(inquirerConfirm, config, context);\n}\n\n/**\n * Select prompt with ESC confirmation support\n */\nexport async function select<T>(config: SelectConfig<T>, context?: Context): Promise<T> {\n return withEscConfirmation(\n inquirerSelect as (config: SelectConfig<T>, context?: Context) => Promise<T>,\n config,\n context\n );\n}\n\n/**\n * Checkbox prompt with ESC confirmation support\n */\nexport async function checkbox<T>(config: CheckboxConfig<T>, context?: Context): Promise<T[]> {\n return withEscConfirmation(\n inquirerCheckbox as (config: CheckboxConfig<T>, context?: Context) => Promise<T[]>,\n config,\n context\n );\n}\n\n/**\n * Password prompt with ESC confirmation support\n */\nexport async function password(config: PasswordConfig, context?: Context): Promise<string> {\n return withEscConfirmation(inquirerPassword, config, context);\n}\n\n/**\n * Set up global handlers for graceful cancellation\n * This catches uncaught ExitPromptError from inquirer prompts\n */\nexport function setupGracefulCancellation(): void {\n // Handle uncaught ExitPromptError from inquirer (Ctrl+C during prompt)\n process.on('uncaughtException', (error) => {\n if (isCancellationError(error)) {\n stopEscListener();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n process.exit(0);\n }\n // Log and exit for other errors\n console.error(chalk.red('Unexpected error:'), error);\n process.exit(1);\n });\n\n // Handle unhandled promise rejections\n process.on('unhandledRejection', (reason) => {\n if (reason instanceof Error && isCancellationError(reason)) {\n stopEscListener();\n console.log(chalk.dim('\\n Cancelled.\\n'));\n process.exit(0);\n }\n console.error(chalk.red('Unhandled rejection:'), reason);\n process.exit(1);\n });\n\n // Handle SIGINT (Ctrl+C outside of prompt)\n process.on('SIGINT', () => {\n stopEscListener();\n console.log(chalk.dim('\\n Interrupted.\\n'));\n process.exit(0);\n });\n\n // Handle SIGTERM\n process.on('SIGTERM', () => {\n stopEscListener();\n console.log(chalk.dim('\\n Terminated.\\n'));\n process.exit(0);\n });\n}\n\n/**\n * Show a hint about how to cancel\n */\nexport function showCancelHint(): void {\n console.log(chalk.dim(' Press ESC or Ctrl+C to cancel at any time\\n'));\n}\n\n/**\n * Clean up resources when done\n */\nexport function cleanup(): void {\n stopEscListener();\n}\n\n/**\n * Print a cancellation message and exit\n */\nexport function exitWithCancel(message = 'Operation cancelled'): never {\n cleanup();\n console.log(chalk.yellow(`\\n ${message}\\n`));\n process.exit(0);\n}\n\n/**\n * Wrap an async function to handle cancellation gracefully\n */\nexport async function withCancellation<T>(\n fn: () => Promise<T>,\n options?: {\n onCancel?: () => void;\n exitOnCancel?: boolean;\n }\n): Promise<T | null> {\n try {\n return await fn();\n } catch (error) {\n if (isCancellationError(error)) {\n options?.onCancel?.();\n if (options?.exitOnCancel !== false) {\n exitWithCancel();\n }\n return null;\n }\n throw error;\n }\n}\n","/**\n * Wizard State Machine\n *\n * A reusable wizard engine for multi-step configuration flows with\n * back navigation, history tracking, and keep-or-reconfigure support.\n *\n * @example\n * ```typescript\n * import { runWizard, type WizardConfig } from './lib/wizard/index.js';\n *\n * interface MyWizardValues {\n * step1: string;\n * step2: number;\n * }\n *\n * const config: WizardConfig<MyWizardValues> = {\n * id: 'my-wizard',\n * title: 'My Configuration Wizard',\n * steps: [\n * {\n * id: 'step1',\n * definition: {\n * metadata: { id: 'step1', name: 'Step 1', description: '...', required: true },\n * computeDefaults: () => 'default',\n * execute: async (ctx, defaults) => ({\n * value: await promptForValue(defaults),\n * navigation: 'next',\n * wasModified: true,\n * }),\n * },\n * },\n * // ... more steps\n * ],\n * };\n *\n * const result = await runWizard(config);\n * if (!result.cancelled) {\n * console.log(result.values);\n * }\n * ```\n */\n\n// Types\nexport type {\n NavigationDirection,\n RevisitAction,\n StepHistoryEntry,\n StepMetadata,\n StepState,\n StepStatus,\n WizardChoice,\n WizardMetadata,\n WizardResult,\n WizardState,\n} from './types.js';\n\n// Step utilities\nexport type {\n DefaultsComputer,\n StepExecutionResult,\n StepExecutor,\n StepValidator,\n WizardStepDefinition,\n} from './step.js';\n\nexport {\n createStepState,\n getVisitCount,\n hasBeenVisited,\n recordStepHistory,\n shouldSkipStep,\n updateStepStatus,\n validateStep,\n} from './step.js';\n\n// Navigation\nexport type { BackOptionValue, NextStepResult } from './navigator.js';\n\nexport {\n applyNavigation,\n BACK_OPTION_VALUE,\n calculateNextStep,\n createBackOption,\n createBackSeparator,\n injectBackOption,\n isBackSelected,\n promptKeepOrReconfigure,\n showStepProgress,\n} from './navigator.js';\n\n// History tracking\nexport {\n formatDuration,\n getCompletedStepsCount,\n getHistorySummary,\n getInitialValue,\n getLastValue,\n getModifiedSteps,\n getRevisitedSteps,\n getStepHistory,\n getTimeOnStep,\n getTotalVisits,\n getWizardDuration,\n wasStepCompleted,\n} from './history.js';\n\n// Engine\nexport type { WizardConfig, WizardStepConfig } from './engine.js';\n\nexport { createWizardState, runWizard, showWizardSummary } from './engine.js';\n","/**\n * Wizard Step Definition and Utilities\n *\n * Provides the foundation for defining wizard steps and managing\n * their execution within the wizard engine.\n */\n\nimport type { NavigationDirection, StepHistoryEntry, StepMetadata, StepState } from './types.js';\n\n/**\n * Result of executing a step's prompt\n */\nexport interface StepExecutionResult<T> {\n /** The value collected from user */\n value: T;\n /** How user wants to proceed */\n navigation: NavigationDirection;\n /** Whether the value differs from default */\n wasModified: boolean;\n}\n\n/**\n * Function to compute default values for a step\n */\nexport type DefaultsComputer<T, TContext> = (context: TContext) => T | undefined;\n\n/**\n * Function to validate a step's value\n * Returns true if valid, or error message string if invalid\n */\nexport type StepValidator<T, TContext> = (value: T, context: TContext) => boolean | string;\n\n/**\n * Function to execute the step's prompts\n * Receives context (accumulated values) and optional defaults\n */\nexport type StepExecutor<T, TContext> = (\n context: TContext,\n defaults?: T\n) => Promise<StepExecutionResult<T>>;\n\n/**\n * Complete definition for a wizard step\n */\nexport interface WizardStepDefinition<T, TContext = Record<string, unknown>> {\n /** Step metadata (without index, which is assigned by wizard) */\n metadata: Omit<StepMetadata, 'index'>;\n\n /** Function to compute defaults from accumulated context */\n computeDefaults: DefaultsComputer<T, TContext>;\n\n /** Function to execute the step's prompts */\n execute: StepExecutor<T, TContext>;\n\n /** Optional validation function */\n validate?: StepValidator<T, TContext>;\n\n /** Optional: skip this step if condition returns true */\n skipCondition?: (context: TContext) => boolean;\n}\n\n/**\n * Create initial state for a step from its definition\n */\nexport function createStepState<T>(\n definition: WizardStepDefinition<T, unknown>,\n index: number\n): StepState<T> {\n return {\n metadata: {\n ...definition.metadata,\n index,\n },\n status: index === 0 ? 'current' : 'pending',\n value: undefined,\n history: [],\n isModified: false,\n };\n}\n\n/**\n * Record a new history entry for a step\n */\nexport function recordStepHistory<T>(\n state: StepState<T>,\n value: T,\n exitDirection: NavigationDirection\n): StepState<T> {\n const entry: StepHistoryEntry<T> = {\n timestamp: new Date(),\n value,\n exitDirection,\n visitCount: state.history.length + 1,\n };\n\n return {\n ...state,\n value,\n history: [...state.history, entry],\n isModified: true,\n };\n}\n\n/**\n * Update step status\n */\nexport function updateStepStatus<T>(\n state: StepState<T>,\n status: StepState<T>['status']\n): StepState<T> {\n return {\n ...state,\n status,\n };\n}\n\n/**\n * Check if step has been visited before\n */\nexport function hasBeenVisited<T>(state: StepState<T>): boolean {\n return state.history.length > 0 || state.status === 'completed';\n}\n\n/**\n * Get the number of times a step has been visited\n */\nexport function getVisitCount<T>(state: StepState<T>): number {\n return state.history.length;\n}\n\n/**\n * Check if step value passes validation\n */\nexport function validateStep<T, TContext>(\n definition: WizardStepDefinition<T, TContext>,\n value: T,\n context: TContext\n): { valid: boolean; error?: string } {\n if (!definition.validate) {\n return { valid: true };\n }\n\n const result = definition.validate(value, context);\n\n if (result === true) {\n return { valid: true };\n }\n\n if (result === false) {\n return { valid: false, error: 'Validation failed' };\n }\n\n return { valid: false, error: result };\n}\n\n/**\n * Check if step should be skipped based on context\n */\nexport function shouldSkipStep<T, TContext>(\n definition: WizardStepDefinition<T, TContext>,\n context: TContext\n): boolean {\n return definition.skipCondition?.(context) ?? false;\n}\n","/**\n * Wizard Navigation Logic\n *\n * Handles navigation between wizard steps, including back/forward movement,\n * computing next steps, and managing the \"keep or reconfigure\" flow.\n */\n\nimport { Separator } from '@inquirer/prompts';\nimport { colors, logger } from '../utils/logger.js';\nimport { select } from '../utils/prompt-cancel.js';\nimport type {\n NavigationDirection,\n RevisitAction,\n StepState,\n WizardChoice,\n WizardState,\n} from './types.js';\n\n/**\n * Special value used to detect \"Back\" selection in prompts\n */\nexport const BACK_OPTION_VALUE = '__wizard_back__' as const;\n\n/**\n * Type for the back option value\n */\nexport type BackOptionValue = typeof BACK_OPTION_VALUE;\n\n/**\n * Create the \"Back\" option to inject at the start of select/checkbox prompts\n */\nexport function createBackOption<T>(): WizardChoice<T | BackOptionValue> {\n return {\n name: `${colors.muted('←')} Back to previous step`,\n value: BACK_OPTION_VALUE as T | BackOptionValue,\n description: 'Return to the previous step',\n };\n}\n\n/**\n * Create a separator for visual distinction after the back option\n */\nexport function createBackSeparator(): { type: 'separator'; separator: string } {\n return {\n type: 'separator',\n separator: colors.muted('─'.repeat(30)),\n };\n}\n\n/**\n * Inject back option into choices array for select/checkbox prompts\n * Only adds if not on the first step\n */\ntype SeparatorItem = { type: 'separator'; separator?: string };\n\nfunction isSeparatorItem<T>(choice: WizardChoice<T> | SeparatorItem): choice is SeparatorItem {\n return 'type' in choice && choice.type === 'separator';\n}\n\nexport function injectBackOption<T>(\n choices: Array<WizardChoice<T> | SeparatorItem>,\n stepIndex: number\n): Array<WizardChoice<T | BackOptionValue> | Separator> {\n if (stepIndex === 0) {\n // First step, no back option\n return choices.map((c) => {\n if (isSeparatorItem(c)) {\n return new Separator(c.separator);\n }\n return c as WizardChoice<T | BackOptionValue>;\n });\n }\n\n const backOption = createBackOption<T>();\n const separator = new Separator(colors.muted('─'.repeat(30)));\n\n return [\n backOption,\n separator,\n ...choices.map((c) => {\n if (isSeparatorItem(c)) {\n return new Separator(c.separator);\n }\n return c as WizardChoice<T | BackOptionValue>;\n }),\n ];\n}\n\n/**\n * Check if the selected value is the back option\n */\nexport function isBackSelected<T>(value: T | BackOptionValue): value is BackOptionValue {\n return value === BACK_OPTION_VALUE;\n}\n\n/**\n * Result of calculating the next step\n */\nexport interface NextStepResult {\n /** ID of the next step, or null if wizard should end */\n nextStepId: string | null;\n /** New status for the current step */\n currentStepNewStatus: StepState<unknown>['status'];\n}\n\n/**\n * Calculate the next step based on navigation direction\n */\nexport function calculateNextStep(\n state: WizardState,\n direction: NavigationDirection\n): NextStepResult {\n const currentIndex = state.stepOrder.indexOf(state.currentStepId);\n const totalSteps = state.stepOrder.length;\n\n switch (direction) {\n case 'next': {\n if (currentIndex >= totalSteps - 1) {\n // Last step, wizard complete\n return {\n nextStepId: null,\n currentStepNewStatus: 'completed',\n };\n }\n return {\n nextStepId: state.stepOrder[currentIndex + 1],\n currentStepNewStatus: 'completed',\n };\n }\n\n case 'back': {\n if (currentIndex <= 0) {\n // First step, can't go back\n return {\n nextStepId: state.currentStepId,\n currentStepNewStatus: 'current',\n };\n }\n // When going back, don't mark as completed - the step wasn't finished\n return {\n nextStepId: state.stepOrder[currentIndex - 1],\n currentStepNewStatus: 'pending',\n };\n }\n\n case 'skip': {\n if (currentIndex >= totalSteps - 1) {\n // Last step, wizard complete\n return {\n nextStepId: null,\n currentStepNewStatus: 'skipped',\n };\n }\n return {\n nextStepId: state.stepOrder[currentIndex + 1],\n currentStepNewStatus: 'skipped',\n };\n }\n\n case 'cancel': {\n return {\n nextStepId: null,\n currentStepNewStatus: 'pending',\n };\n }\n }\n}\n\n/**\n * Apply navigation to the wizard state\n */\nexport function applyNavigation(\n state: WizardState,\n direction: NavigationDirection,\n currentValue: unknown\n): WizardState {\n const { nextStepId, currentStepNewStatus } = calculateNextStep(state, direction);\n\n // Update current step state\n const currentStepState = state.steps[state.currentStepId];\n const updatedCurrentStep: StepState<unknown> = {\n ...currentStepState,\n status: currentStepNewStatus,\n value: currentValue,\n };\n\n // Build updated steps\n const updatedSteps = {\n ...state.steps,\n [state.currentStepId]: updatedCurrentStep,\n };\n\n if (nextStepId === null) {\n // Wizard is ending\n return {\n ...state,\n steps: updatedSteps,\n isComplete: direction === 'next' || direction === 'skip',\n isCancelled: direction === 'cancel',\n };\n }\n\n // Update next step to current\n const nextStepState = state.steps[nextStepId];\n const updatedNextStep: StepState<unknown> = {\n ...nextStepState,\n status: 'current',\n };\n\n return {\n ...state,\n steps: {\n ...updatedSteps,\n [nextStepId]: updatedNextStep,\n },\n currentStepId: nextStepId,\n };\n}\n\n/**\n * Prompt user to keep existing values or reconfigure a previously completed step\n */\nexport async function promptKeepOrReconfigure(stepName: string): Promise<RevisitAction> {\n logger.newline();\n\n const result = await select<RevisitAction>({\n message: `\"${stepName}\" was already configured. What would you like to do?`,\n choices: [\n {\n name: 'Keep current values and continue',\n value: 'keep' as const,\n description: 'Skip this step and proceed to the next one',\n },\n {\n name: 'Re-configure this step',\n value: 'reconfigure' as const,\n description: 'Show the prompts again with your previous values as defaults',\n },\n ],\n default: 'keep',\n });\n\n return result;\n}\n\n/**\n * Show progress indicator for current step\n */\nexport function showStepProgress(state: WizardState, isRevisit: boolean): void {\n if (!state.metadata.showProgress) {\n return;\n }\n\n const currentIndex = state.stepOrder.indexOf(state.currentStepId);\n const total = state.metadata.totalSteps;\n const currentStep = state.steps[state.currentStepId];\n\n // Build progress bar\n const progressChars = state.stepOrder.map((_stepId, idx) => {\n if (idx < currentIndex) {\n return colors.success('●'); // Completed\n }\n if (idx === currentIndex) {\n return colors.primary('◉'); // Current\n }\n return colors.muted('○'); // Pending\n });\n\n const progressBar = progressChars.join(' ');\n const stepIndicator = `[${currentIndex + 1}/${total}]`;\n const revisitBadge = isRevisit ? colors.warning(' (revisiting)') : '';\n\n logger.newline();\n logger.info(`${colors.muted(stepIndicator)} ${progressBar}${revisitBadge}`);\n logger.subtitle(currentStep.metadata.name);\n\n if (currentStep.metadata.description) {\n logger.info(colors.muted(currentStep.metadata.description));\n }\n}\n","/**\n * Wizard History Tracking\n *\n * Utilities for tracking and querying the history of step modifications\n * throughout the wizard lifecycle.\n */\n\nimport type { StepHistoryEntry, StepState, WizardState } from './types.js';\n\n/**\n * Get the last recorded value for a step\n * Returns the most recent value from history, or the current value if no history\n */\nexport function getLastValue<T>(stepState: StepState<T>): T | undefined {\n if (stepState.history.length === 0) {\n return stepState.value;\n }\n return stepState.history[stepState.history.length - 1].value;\n}\n\n/**\n * Get the initial value that was first set for a step\n */\nexport function getInitialValue<T>(stepState: StepState<T>): T | undefined {\n if (stepState.history.length === 0) {\n return stepState.value;\n }\n return stepState.history[0].value;\n}\n\n/**\n * Get all steps that have been modified at least once\n */\nexport function getModifiedSteps(\n state: WizardState\n): Array<{ stepId: string; step: StepState<unknown> }> {\n return state.stepOrder\n .map((stepId) => ({\n stepId,\n step: state.steps[stepId],\n }))\n .filter(({ step }) => step.isModified);\n}\n\n/**\n * Get steps that have been visited more than once (went back and reconfigured)\n */\nexport function getRevisitedSteps(\n state: WizardState\n): Array<{ stepId: string; step: StepState<unknown> }> {\n return state.stepOrder\n .map((stepId) => ({\n stepId,\n step: state.steps[stepId],\n }))\n .filter(({ step }) => step.history.length > 1);\n}\n\n/**\n * Count total visits across all steps\n */\nexport function getTotalVisits(state: WizardState): number {\n return state.stepOrder.reduce((total, stepId) => {\n const step = state.steps[stepId];\n // Count history entries, minimum 1 if step has a value\n return total + Math.max(step.history.length, step.value !== undefined ? 1 : 0);\n }, 0);\n}\n\n/**\n * Get completed steps count\n */\nexport function getCompletedStepsCount(state: WizardState): number {\n return state.stepOrder.filter((stepId) => {\n const step = state.steps[stepId];\n return step.status === 'completed' || step.status === 'skipped';\n }).length;\n}\n\n/**\n * Generate a summary of the wizard history for display\n */\nexport function getHistorySummary(state: WizardState): string[] {\n const summary: string[] = [];\n const revisited = getRevisitedSteps(state);\n\n if (revisited.length === 0) {\n return summary;\n }\n\n summary.push('Steps that were reconfigured:');\n\n for (const { step } of revisited) {\n summary.push(` • ${step.metadata.name}: modified ${step.history.length} times`);\n }\n\n return summary;\n}\n\n/**\n * Get the full history for a specific step\n */\nexport function getStepHistory<T>(stepState: StepState<T>): StepHistoryEntry<T>[] {\n return [...stepState.history];\n}\n\n/**\n * Check if a step has been previously completed (has history or completed status)\n */\nexport function wasStepCompleted<T>(stepState: StepState<T>): boolean {\n return stepState.status === 'completed' || stepState.history.length > 0;\n}\n\n/**\n * Get the time spent on a step based on history timestamps\n * Returns milliseconds between first and last entry, or 0 if not enough data\n */\nexport function getTimeOnStep<T>(stepState: StepState<T>): number {\n if (stepState.history.length < 2) {\n return 0;\n }\n\n const firstEntry = stepState.history[0];\n const lastEntry = stepState.history[stepState.history.length - 1];\n\n return lastEntry.timestamp.getTime() - firstEntry.timestamp.getTime();\n}\n\n/**\n * Get wizard duration in milliseconds\n */\nexport function getWizardDuration(state: WizardState): number {\n return Date.now() - state.metadata.startTime.getTime();\n}\n\n/**\n * Format duration in human-readable format\n */\nexport function formatDuration(ms: number): string {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n\n if (minutes === 0) {\n return `${seconds}s`;\n }\n\n return `${minutes}m ${remainingSeconds}s`;\n}\n","/**\n * Wizard Engine\n *\n * Main orchestrator for running multi-step wizards with back navigation,\n * history tracking, and keep-or-reconfigure flows.\n */\n\nimport { logger } from '../utils/logger.js';\nimport { getLastValue, wasStepCompleted } from './history.js';\nimport { applyNavigation, promptKeepOrReconfigure, showStepProgress } from './navigator.js';\nimport {\n type WizardStepDefinition,\n createStepState,\n recordStepHistory,\n shouldSkipStep,\n} from './step.js';\nimport type { StepState, WizardMetadata, WizardResult, WizardState } from './types.js';\n\n/**\n * Step configuration for a wizard\n */\nexport interface WizardStepConfig<TContext = Record<string, unknown>> {\n /** Step ID */\n id: string;\n /** Step definition */\n definition: WizardStepDefinition<unknown, TContext>;\n}\n\n/**\n * Configuration for creating a wizard\n */\nexport interface WizardConfig<TContext = Record<string, unknown>> {\n /** Unique wizard identifier */\n id: string;\n /** Title displayed to user */\n title: string;\n /** Ordered list of step definitions */\n steps: WizardStepConfig<TContext>[];\n /** Allow skipping optional steps (default: true) */\n allowSkip?: boolean;\n /** Show progress indicator (default: true) */\n showProgress?: boolean;\n}\n\n/**\n * Create initial wizard state from configuration\n */\nexport function createWizardState<TContext>(config: WizardConfig<TContext>): WizardState {\n const stepOrder = config.steps.map((s) => s.id);\n\n // Create state for each step\n const steps: Record<string, StepState<unknown>> = {};\n for (let i = 0; i < config.steps.length; i++) {\n const step = config.steps[i];\n steps[step.id] = createStepState(step.definition as WizardStepDefinition<unknown, unknown>, i);\n }\n\n const metadata: WizardMetadata = {\n id: config.id,\n title: config.title,\n totalSteps: config.steps.length,\n startTime: new Date(),\n allowSkip: config.allowSkip ?? true,\n showProgress: config.showProgress ?? true,\n };\n\n return {\n steps,\n currentStepId: stepOrder[0],\n stepOrder,\n isComplete: false,\n isCancelled: false,\n metadata,\n };\n}\n\n/**\n * Run a wizard to completion\n *\n * @param config - Wizard configuration\n * @param initialContext - Optional initial values to seed the context\n * @returns Result containing all collected values and final state\n */\nexport async function runWizard<TValues extends Record<string, unknown>, TContext = TValues>(\n config: WizardConfig<TContext>,\n initialContext: Partial<TContext> = {}\n): Promise<WizardResult<TValues>> {\n // Initialize state\n let state = createWizardState(config);\n\n // Build step map for quick lookup\n const stepMap = new Map<string, WizardStepDefinition<unknown, TContext>>();\n for (const step of config.steps) {\n stepMap.set(step.id, step.definition);\n }\n\n // Accumulated context (starts with initial, grows as steps complete)\n let context = { ...initialContext } as TContext;\n\n // Track if we're moving forward from a back navigation\n let movingForwardAfterBack = false;\n\n // Main wizard loop\n while (!state.isComplete && !state.isCancelled) {\n const currentStepId = state.currentStepId;\n const stepDef = stepMap.get(currentStepId);\n if (!stepDef) {\n throw new Error(`Step definition not found for: ${currentStepId}`);\n }\n const stepState = state.steps[currentStepId];\n\n // Check if step should be skipped\n if (shouldSkipStep(stepDef, context)) {\n state = applyNavigation(state, 'skip', undefined);\n continue;\n }\n\n // Check if this is a previously completed step we're returning to while moving forward\n const previouslyCompleted = wasStepCompleted(stepState);\n\n if (movingForwardAfterBack && previouslyCompleted) {\n // Ask user if they want to keep or reconfigure\n const action = await promptKeepOrReconfigure(stepState.metadata.name);\n\n if (action === 'keep') {\n // Keep existing value and move to next step\n state = applyNavigation(state, 'next', stepState.value);\n continue;\n }\n // User chose to reconfigure, fall through to execute the step\n }\n\n // Determine if this is a revisit\n const isRevisit = stepState.history.length > 0;\n\n // Show progress indicator\n showStepProgress(state, isRevisit);\n\n // Compute defaults - use last value if revisiting, otherwise compute\n const previousValue = getLastValue(stepState);\n const defaults = previousValue ?? stepDef.computeDefaults(context);\n\n // Execute the step\n const result = await stepDef.execute(context, defaults);\n\n // Only update context and history if NOT going back\n // When going back, the step wasn't actually completed\n if (result.navigation !== 'back') {\n // Update context with result\n context = {\n ...context,\n [currentStepId]: result.value,\n };\n\n // Record in history\n const updatedStepState = recordStepHistory(stepState, result.value, result.navigation);\n\n state = {\n ...state,\n steps: {\n ...state.steps,\n [currentStepId]: updatedStepState,\n },\n };\n }\n\n // Track direction for next iteration\n if (result.navigation === 'back') {\n movingForwardAfterBack = false;\n } else if (result.navigation === 'next') {\n // If we're going forward and previously went back, we're now moving forward after back\n movingForwardAfterBack = isRevisit || movingForwardAfterBack;\n }\n\n // Apply navigation\n state = applyNavigation(state, result.navigation, result.value);\n }\n\n // Extract final values from state\n const values = {} as TValues;\n for (const stepId of state.stepOrder) {\n const step = state.steps[stepId];\n if (step.value !== undefined) {\n (values as Record<string, unknown>)[stepId] = step.value;\n }\n }\n\n return {\n values,\n state,\n cancelled: state.isCancelled,\n };\n}\n\n/**\n * Show wizard completion summary\n */\nexport function showWizardSummary(state: WizardState): void {\n const completed = state.stepOrder.filter((id) => {\n const step = state.steps[id];\n return step.status === 'completed';\n }).length;\n\n const skipped = state.stepOrder.filter((id) => {\n const step = state.steps[id];\n return step.status === 'skipped';\n }).length;\n\n const revisited = state.stepOrder.filter((id) => {\n const step = state.steps[id];\n return step.history.length > 1;\n }).length;\n\n logger.newline();\n logger.success(`Wizard completed: ${completed} steps configured`);\n\n if (skipped > 0) {\n logger.info(` ${skipped} steps skipped`);\n }\n\n if (revisited > 0) {\n logger.info(` ${revisited} steps were reconfigured`);\n }\n}\n","/**\n * Init Wizard Step Definitions\n *\n * Wraps existing prompt functions as wizard steps with back navigation support.\n * Each step definition integrates with the existing prompts while adding\n * wizard-specific behavior (defaults from history, navigation handling).\n */\n\nimport type { SkippedMcpConfig } from '../../cli/prompts/mcp-config.js';\nimport type { BundleSelectionResult } from '../../types/bundles.js';\nimport type {\n CodeStyleConfig,\n HookConfig,\n McpConfig,\n Preferences,\n ProjectInfo,\n} from '../../types/config.js';\nimport type { FolderPreferences } from '../../types/folder-preferences.js';\nimport type { PermissionsConfig } from '../../types/permissions.js';\nimport type { PackageManager, ScaffoldOptions } from '../../types/scaffold.js';\nimport type { TemplateConfig } from '../../types/template-config.js';\nimport type { CICDConfig } from '../ci-cd/index.js';\nimport type { WizardConfig, WizardStepConfig } from './engine.js';\nimport type { StepExecutionResult, WizardStepDefinition } from './step.js';\n\nimport {\n promptBundleMode,\n promptQuickBundleSelection,\n showBundlesSummary,\n} from '../../cli/prompts/bundle-select.js';\nimport { promptCICDConfig } from '../../cli/prompts/ci-cd-config.js';\nimport { promptCodeStyleConfig } from '../../cli/prompts/code-style.js';\nimport { promptQuickFolderPreferences } from '../../cli/prompts/folder-preferences.js';\nimport { promptHookConfig } from '../../cli/prompts/hook-config.js';\nimport { selectItemsFromCategory } from '../../cli/prompts/item-select.js';\nimport { promptMcpConfig } from '../../cli/prompts/mcp-config.js';\nimport { promptPermissionsConfig } from '../../cli/prompts/permissions.js';\nimport { promptPreferences } from '../../cli/prompts/preferences.js';\nimport { confirmProjectInfo, promptProjectInfo } from '../../cli/prompts/project-info.js';\nimport { promptScaffoldOptions } from '../../cli/prompts/scaffold.js';\nimport { buildConfigContext, promptTemplateConfig } from '../../cli/prompts/template-config.js';\nimport type { ModuleCategory, ModuleRegistry } from '../../types/modules.js';\nimport { resolveBundles } from '../bundles/resolver.js';\nimport { colors, logger } from '../utils/logger.js';\nimport { select } from '../utils/prompt-cancel.js';\nimport { BACK_OPTION_VALUE, type BackOptionValue } from './navigator.js';\n\n/**\n * All values collected during the init wizard\n */\nexport interface InitWizardValues {\n projectInfo: ProjectInfo;\n preferences: Preferences;\n scaffoldOptions: ScaffoldOptions;\n bundleSelection: BundleSelectionResult;\n hookConfig: HookConfig;\n mcpConfig: { config: McpConfig; skippedConfigs: SkippedMcpConfig[] };\n permissionsConfig: PermissionsConfig;\n codeStyleConfig: CodeStyleConfig;\n cicdConfig: CICDConfig;\n folderPreferences: FolderPreferences | null;\n templateConfig: Partial<TemplateConfig>;\n /** Index signature to satisfy Record<string, unknown> constraint */\n [key: string]: unknown;\n}\n\n/**\n * Context available to init wizard steps\n */\nexport interface InitWizardContext extends Partial<InitWizardValues> {\n projectPath: string;\n registry?: ModuleRegistry;\n detection: {\n detected: boolean;\n projectType?: string;\n packageManager?: PackageManager;\n suggestedBundles?: string[];\n detectedTechnologies?: string[];\n };\n}\n\n/**\n * Helper to create a step result with navigation\n */\nfunction createResult<T>(\n value: T,\n navigation: 'next' | 'back' | 'cancel' = 'next'\n): StepExecutionResult<T> {\n return {\n value,\n navigation,\n wasModified: true,\n };\n}\n\n/**\n * Prompt for back option at start of a step (for steps using input prompts)\n * Returns true if user wants to go back\n */\nasync function promptBackOption(stepIndex: number, stepName: string): Promise<boolean> {\n if (stepIndex === 0) {\n return false; // First step, no back option\n }\n\n const result = await select<'continue' | BackOptionValue>({\n message: `${stepName}`,\n choices: [\n {\n name: `${colors.muted('←')} Back to previous step`,\n value: BACK_OPTION_VALUE,\n description: 'Return to the previous step',\n },\n {\n name: 'Continue with this step',\n value: 'continue' as const,\n description: 'Proceed to configure this section',\n },\n ],\n default: 'continue',\n });\n\n return result === BACK_OPTION_VALUE;\n}\n\n// ============================================================================\n// Step Definitions\n// ============================================================================\n\n/**\n * Step 1: Project Information\n */\nfunction createProjectInfoStep(): WizardStepDefinition<ProjectInfo, InitWizardContext> {\n return {\n metadata: {\n id: 'projectInfo',\n name: 'Project Information',\n description: 'Basic project identification and metadata',\n required: true,\n },\n computeDefaults: (ctx) => ctx.projectInfo,\n execute: async (_ctx, defaults) => {\n // First step has no back option\n const value = await promptProjectInfo({ defaults });\n\n // Use existing confirmation flow\n const confirmed = await confirmProjectInfo(value);\n if (!confirmed) {\n // User wants to re-enter - execute again with current values as defaults\n return createResult(value, 'back');\n }\n\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 2: Preferences\n */\nfunction createPreferencesStep(): WizardStepDefinition<Preferences, InitWizardContext> {\n return {\n metadata: {\n id: 'preferences',\n name: 'Preferences',\n description: 'Language and package manager settings',\n required: true,\n },\n computeDefaults: (ctx) => ctx.preferences,\n execute: async (ctx, defaults) => {\n // Check if user wants to go back\n const goBack = await promptBackOption(1, 'Configure preferences or go back?');\n if (goBack) {\n return createResult(defaults as Preferences, 'back');\n }\n\n const value = await promptPreferences({\n detectedPackageManager: ctx.detection.packageManager,\n defaults,\n });\n\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 3: Scaffold Options\n */\nfunction createScaffoldStep(): WizardStepDefinition<ScaffoldOptions, InitWizardContext> {\n return {\n metadata: {\n id: 'scaffoldOptions',\n name: 'Scaffold Options',\n description: 'Project structure and scaffolding type',\n required: true,\n },\n computeDefaults: (ctx) => ctx.scaffoldOptions,\n execute: async (ctx, defaults) => {\n const goBack = await promptBackOption(2, 'Configure scaffold or go back?');\n if (goBack) {\n return createResult(defaults as ScaffoldOptions, 'back');\n }\n\n const value = await promptScaffoldOptions({\n existingProject: ctx.detection.detected,\n detectedType: ctx.detection.projectType as ScaffoldOptions['projectType'],\n detectedPackageManager: ctx.detection.packageManager,\n });\n\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 4: Bundle Selection\n */\nfunction createBundleSelectionStep(): WizardStepDefinition<\n BundleSelectionResult,\n InitWizardContext\n> {\n return {\n metadata: {\n id: 'bundleSelection',\n name: 'Module Bundles',\n description: 'Select pre-configured module bundles',\n required: true,\n },\n computeDefaults: (ctx) => ctx.bundleSelection,\n execute: async (ctx, defaults) => {\n const goBack = await promptBackOption(3, 'Select bundles or go back?');\n if (goBack) {\n return createResult(defaults as BundleSelectionResult, 'back');\n }\n\n // Show suggested bundles if available\n if (ctx.detection.suggestedBundles?.length) {\n logger.info(\n colors.muted(\n `Suggested bundles based on your project: ${ctx.detection.suggestedBundles.join(', ')}`\n )\n );\n }\n\n // Ask selection mode\n const mode = await promptBundleMode();\n\n const result: BundleSelectionResult = {\n selectedBundles: defaults?.selectedBundles || [],\n additionalModules: defaults?.additionalModules || {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n },\n };\n\n if (mode === 'bundles' || mode === 'both') {\n result.selectedBundles = await promptQuickBundleSelection();\n\n if (result.selectedBundles.length > 0) {\n showBundlesSummary(result.selectedBundles);\n }\n }\n\n if (mode === 'individual' || mode === 'both') {\n // Get preselected from bundles\n const preselectedFromBundles = resolveBundles(result.selectedBundles);\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n if (ctx.registry) {\n logger.newline();\n logger.subtitle('Individual Module Selection');\n\n for (const category of categories) {\n const preselected =\n mode === 'both'\n ? preselectedFromBundles[category as keyof typeof preselectedFromBundles]\n : [];\n\n const categoryResult = await selectItemsFromCategory(category, ctx.registry[category], {\n preselected,\n showDescriptions: true,\n });\n\n // Store additional modules (not from bundles)\n if (mode === 'both') {\n result.additionalModules[category] = categoryResult.selectedItems.filter(\n (id) => !preselected.includes(id)\n );\n } else {\n result.additionalModules[category] = categoryResult.selectedItems;\n }\n }\n }\n }\n\n return createResult(result, 'next');\n },\n };\n}\n\n/**\n * Step 5: Hook Configuration\n */\nfunction createHookConfigStep(): WizardStepDefinition<HookConfig, InitWizardContext> {\n return {\n metadata: {\n id: 'hookConfig',\n name: 'Notification Hooks',\n description: 'Configure notification and sound hooks',\n required: false,\n },\n computeDefaults: (ctx) => {\n if (ctx.hookConfig) return ctx.hookConfig;\n // Default based on bundle selection\n const hasTesting = ctx.bundleSelection?.selectedBundles.some((id) => id.includes('testing'));\n return hasTesting ? { enabled: true } : { enabled: false };\n },\n execute: async (_ctx, defaults) => {\n const goBack = await promptBackOption(4, 'Configure hooks or go back?');\n if (goBack) {\n return createResult(defaults as HookConfig, 'back');\n }\n\n const value = await promptHookConfig({ defaults });\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 6: MCP Configuration\n */\nfunction createMcpConfigStep(): WizardStepDefinition<\n { config: McpConfig; skippedConfigs: SkippedMcpConfig[] },\n InitWizardContext\n> {\n return {\n metadata: {\n id: 'mcpConfig',\n name: 'MCP Servers',\n description: 'Configure Model Context Protocol servers',\n required: false,\n },\n computeDefaults: (ctx) => ctx.mcpConfig,\n execute: async (_ctx, defaults) => {\n const goBack = await promptBackOption(5, 'Configure MCP servers or go back?');\n if (goBack) {\n return createResult(\n defaults as { config: McpConfig; skippedConfigs: SkippedMcpConfig[] },\n 'back'\n );\n }\n\n const result = await promptMcpConfig();\n return createResult(result, 'next');\n },\n };\n}\n\n/**\n * Step 7: Permissions Configuration\n */\nfunction createPermissionsStep(): WizardStepDefinition<PermissionsConfig, InitWizardContext> {\n return {\n metadata: {\n id: 'permissionsConfig',\n name: 'Permissions',\n description: 'Configure file, git, and bash permissions',\n required: true,\n },\n computeDefaults: (ctx) => ctx.permissionsConfig,\n execute: async (_ctx, defaults) => {\n const goBack = await promptBackOption(6, 'Configure permissions or go back?');\n if (goBack) {\n return createResult(defaults as PermissionsConfig, 'back');\n }\n\n const value = await promptPermissionsConfig();\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 8: Code Style Configuration\n */\nfunction createCodeStyleStep(): WizardStepDefinition<CodeStyleConfig, InitWizardContext> {\n return {\n metadata: {\n id: 'codeStyleConfig',\n name: 'Code Style',\n description: 'Configure EditorConfig, Biome, Prettier, Commitlint',\n required: false,\n },\n computeDefaults: (ctx) => ctx.codeStyleConfig,\n execute: async (_ctx, defaults) => {\n const goBack = await promptBackOption(7, 'Configure code style or go back?');\n if (goBack) {\n return createResult(defaults as CodeStyleConfig, 'back');\n }\n\n const value = await promptCodeStyleConfig({ defaults });\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 9: CI/CD Configuration\n */\nfunction createCICDStep(): WizardStepDefinition<CICDConfig, InitWizardContext> {\n return {\n metadata: {\n id: 'cicdConfig',\n name: 'CI/CD',\n description: 'Configure GitHub Actions workflows',\n required: false,\n },\n computeDefaults: (ctx) => ctx.cicdConfig,\n execute: async (ctx, defaults) => {\n const goBack = await promptBackOption(8, 'Configure CI/CD or go back?');\n if (goBack) {\n return createResult(defaults as CICDConfig, 'back');\n }\n\n const value = await promptCICDConfig({\n packageManager: ctx.preferences?.packageManager,\n defaults,\n });\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 10: Folder Preferences\n */\nfunction createFolderPreferencesStep(): WizardStepDefinition<\n FolderPreferences | null,\n InitWizardContext\n> {\n return {\n metadata: {\n id: 'folderPreferences',\n name: 'Folder Structure',\n description: 'Configure test, planning, and documentation locations',\n required: false,\n dependsOn: ['bundleSelection'],\n },\n computeDefaults: (ctx) => ctx.folderPreferences ?? null,\n execute: async (ctx, defaults) => {\n const goBack = await promptBackOption(9, 'Configure folder preferences or go back?');\n if (goBack) {\n return createResult(defaults ?? null, 'back');\n }\n\n const value = await promptQuickFolderPreferences({\n selectedBundles: ctx.bundleSelection?.selectedBundles || [],\n technologies: ctx.detection.detectedTechnologies || [],\n });\n return createResult(value, 'next');\n },\n };\n}\n\n/**\n * Step 11: Template Configuration\n */\nfunction createTemplateConfigStep(): WizardStepDefinition<\n Partial<TemplateConfig>,\n InitWizardContext\n> {\n return {\n metadata: {\n id: 'templateConfig',\n name: 'Template Placeholders',\n description: 'Configure template placeholder values',\n required: false,\n },\n computeDefaults: (ctx) => ctx.templateConfig ?? {},\n execute: async (ctx, defaults) => {\n const goBack = await promptBackOption(10, 'Configure templates or go back?');\n if (goBack) {\n return createResult(defaults ?? {}, 'back');\n }\n\n logger.newline();\n const configContext = await buildConfigContext(ctx.projectPath);\n const value = await promptTemplateConfig({\n context: configContext,\n mode: 'quick',\n });\n return createResult(value ?? {}, 'next');\n },\n };\n}\n\n// ============================================================================\n// Wizard Configuration Builder\n// ============================================================================\n\n/**\n * Create the complete init wizard configuration\n */\nexport function createInitWizardConfig(\n projectPath: string,\n detection: InitWizardContext['detection'],\n registry?: ModuleRegistry\n): WizardConfig<InitWizardContext> {\n // Note: projectPath, detection, and registry are passed to runWizard as initialContext\n // These parameters are kept for reference but not used directly here\n void projectPath;\n void detection;\n void registry;\n\n // Cast step definitions to the expected type\n const steps: WizardStepConfig<InitWizardContext>[] = [\n {\n id: 'projectInfo',\n definition: createProjectInfoStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'preferences',\n definition: createPreferencesStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'scaffoldOptions',\n definition: createScaffoldStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'bundleSelection',\n definition: createBundleSelectionStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'hookConfig',\n definition: createHookConfigStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'mcpConfig',\n definition: createMcpConfigStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'permissionsConfig',\n definition: createPermissionsStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'codeStyleConfig',\n definition: createCodeStyleStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'cicdConfig',\n definition: createCICDStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'folderPreferences',\n definition: createFolderPreferencesStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n {\n id: 'templateConfig',\n definition: createTemplateConfigStep() as WizardStepDefinition<unknown, InitWizardContext>,\n },\n ];\n\n return {\n id: 'init-wizard',\n title: 'Claude Code Configuration',\n allowSkip: true,\n showProgress: true,\n steps,\n };\n}\n","/**\n * Bundle selection prompts\n */\n\nimport {\n formatBundleCompact,\n printBundleDisplay,\n printValidationWarnings,\n} from '../../lib/bundles/display.js';\nimport {\n formatBundleDetailedDescription,\n formatBundleForDisplay,\n getAllBundles,\n getBundleById,\n getBundleCategoryName,\n getBundlesGroupedByCategory,\n resolveBundles,\n} from '../../lib/bundles/resolver.js';\nimport { validateModuleDependencies } from '../../lib/bundles/validator.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BundleDefinition,\n BundleSelectionResult,\n BundleValidationResult,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\n\nexport type BundleSelectionMode = 'bundles' | 'individual' | 'both';\n\n/**\n * Prompt for bundle selection mode\n */\nexport async function promptBundleMode(): Promise<BundleSelectionMode> {\n const choice = await select<BundleSelectionMode>({\n message: 'How would you like to select modules?',\n choices: [\n {\n name: 'Use bundles (recommended)',\n value: 'bundles',\n description: 'Select pre-configured module bundles for common use cases',\n },\n {\n name: 'Select individual modules',\n value: 'individual',\n description: 'Choose modules one by one',\n },\n {\n name: 'Bundles + individual customization',\n value: 'both',\n description: 'Start with bundles, then add/remove individual modules',\n },\n ],\n default: 'bundles',\n });\n\n return choice;\n}\n\n/**\n * Prompt for bundle selection by category (internal, doesn't show summary)\n */\nasync function promptBundleSelectionByCategory(): Promise<string[]> {\n const grouped = getBundlesGroupedByCategory();\n const categories = Object.keys(grouped);\n\n logger.section('Module Bundles', '📦');\n logger.info('Select bundles to install. Use arrow keys to see details for each bundle.');\n logger.newline();\n\n const selectedBundles: string[] = [];\n\n for (const category of categories) {\n const bundles = grouped[category];\n const categoryName = getBundleCategoryName(category);\n\n logger.newline();\n logger.info(colors.primary(`${categoryName}:`));\n\n const choices = bundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n }));\n\n const selected = await checkbox({\n message: `Select ${categoryName.toLowerCase()} bundles:`,\n choices,\n required: false,\n });\n\n selectedBundles.push(...selected);\n }\n\n return selectedBundles;\n}\n\n/**\n * Prompt for bundle selection\n * Description shows detailed info when hovering over each choice\n * Shows summary with totals at the end with option to edit\n */\nexport async function promptBundleSelection(): Promise<string[]> {\n let selectedBundles = await promptBundleSelectionByCategory();\n\n // Show summary with totals and allow editing\n if (selectedBundles.length > 0) {\n let confirmed = false;\n while (!confirmed) {\n const action = await confirmBundleSelectionWithEdit(selectedBundles);\n\n if (action === 'confirm') {\n confirmed = true;\n } else if (action === 'edit') {\n selectedBundles = await editBundleSelection(selectedBundles);\n // If all bundles were removed, break the loop\n if (selectedBundles.length === 0) {\n break;\n }\n } else {\n // cancel\n return [];\n }\n }\n }\n\n return selectedBundles;\n}\n\n// Special values for checkbox options\nconst BROWSE_ALL_VALUE = '__browse_all__';\nconst SKIP_VALUE = '__skip__';\n\n/**\n * Prompt for quick bundle selection (multi-select from popular bundles)\n * Description shows detailed info when hovering over each choice\n */\nexport async function promptQuickBundleSelection(): Promise<string[]> {\n const allBundles = getAllBundles();\n\n // Top 6 most common bundles\n const featuredBundleIds = [\n 'react-tanstack-stack',\n 'hono-drizzle-stack',\n 'nextjs-prisma-stack',\n 'testing-complete',\n 'quality-complete',\n 'planning-complete',\n ];\n\n const featuredBundles = featuredBundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Bundle Selection');\n logger.info('Use arrow keys to navigate, Space to select, Enter to confirm.');\n logger.info(\n colors.muted(\n `Showing ${featuredBundles.length} popular bundles. ${allBundles.length} total available.`\n )\n );\n logger.newline();\n\n const choices = [\n // Featured bundles\n ...featuredBundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n })),\n // Actions\n {\n name: colors.primary(`Ver todos (${allBundles.length} bundles)`),\n value: BROWSE_ALL_VALUE,\n description:\n 'Browse all bundles organized by category: Stacks, Testing, Database, API, Frontend, Workflow',\n },\n {\n name: colors.muted('Omitir'),\n value: SKIP_VALUE,\n description: 'Continue without bundles - you can select individual modules later',\n },\n ];\n\n const selected = await checkbox({\n message: 'Select bundles (Space to toggle, Enter to confirm):',\n choices,\n required: false,\n });\n\n // Check if user selected \"Browse all\"\n if (selected.includes(BROWSE_ALL_VALUE)) {\n // Remove special values and keep any real bundles selected\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE && id !== SKIP_VALUE);\n const additional = await promptBundleSelection();\n // Merge without duplicates\n return [...realBundles, ...additional.filter((id) => !realBundles.includes(id))];\n }\n\n // Check if user selected \"Skip\"\n if (selected.includes(SKIP_VALUE)) {\n // If only skip was selected, return empty\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE && id !== SKIP_VALUE);\n if (realBundles.length === 0) {\n return [];\n }\n // If they selected bundles AND skip, just use the bundles\n return realBundles;\n }\n\n // If nothing selected, ask what to do\n if (selected.length === 0) {\n const action = await select<'browse' | 'skip'>({\n message: 'No bundles selected. What would you like to do?',\n choices: [\n {\n name: 'Browse all bundles by category',\n value: 'browse',\n description: `See all ${allBundles.length} available bundles organized by category`,\n },\n {\n name: 'Skip bundles',\n value: 'skip',\n description: 'Continue without selecting any bundles',\n },\n ],\n });\n\n if (action === 'browse') {\n return promptBundleSelection();\n }\n return [];\n }\n\n // Ask if they want to add more from other categories\n const addMore = await confirm({\n message: 'Would you like to browse additional bundles by category?',\n default: false,\n });\n\n let finalSelection = selected;\n if (addMore) {\n const additional = await promptBundleSelection();\n // Merge without duplicates\n finalSelection = [...selected, ...additional.filter((id) => !selected.includes(id))];\n }\n\n // Show summary with totals and allow editing\n if (finalSelection.length > 0) {\n let confirmed = false;\n while (!confirmed) {\n const action = await confirmBundleSelectionWithEdit(finalSelection);\n\n if (action === 'confirm') {\n confirmed = true;\n } else if (action === 'edit') {\n finalSelection = await editBundleSelection(finalSelection);\n // If all bundles were removed, break the loop\n if (finalSelection.length === 0) {\n break;\n }\n } else {\n // cancel\n return [];\n }\n }\n }\n\n return finalSelection;\n}\n\n/**\n * Show bundle contents preview using visual display\n */\nexport function showBundleContents(bundle: BundleDefinition): void {\n logger.newline();\n printBundleDisplay(bundle);\n}\n\n/**\n * Show detailed bundle information for a specific bundle by ID\n */\nexport async function showBundleDetails(bundleId: string): Promise<void> {\n const bundle = getBundleById(bundleId);\n if (!bundle) {\n logger.error(`Bundle not found: ${bundleId}`);\n return;\n }\n\n showBundleContents(bundle);\n}\n\n/**\n * Show validation warnings and auto-included modules\n */\nexport function showValidationResults(validation: BundleValidationResult): void {\n if (validation.errors.length === 0 && validation.warnings.length === 0) {\n return;\n }\n\n logger.newline();\n printValidationWarnings(validation);\n\n if (validation.autoIncluded.length > 0) {\n logger.newline();\n logger.info(colors.primary('Auto-included modules:'));\n for (const module of validation.autoIncluded) {\n logger.info(` ${colors.muted('•')} ${module.id} (${module.category})`);\n }\n }\n}\n\n/**\n * Module totals from resolved bundles\n */\nexport interface ModuleTotals {\n agents: number;\n skills: number;\n commands: number;\n docs: number;\n total: number;\n}\n\n/**\n * Calculate module totals from bundle selection\n */\nexport function calculateModuleTotals(bundleIds: string[]): ModuleTotals {\n const resolved = resolveBundles(bundleIds);\n return {\n agents: resolved.agents.length,\n skills: resolved.skills.length,\n commands: resolved.commands.length,\n docs: resolved.docs.length,\n total:\n resolved.agents.length +\n resolved.skills.length +\n resolved.commands.length +\n resolved.docs.length,\n };\n}\n\n/**\n * Show selected bundles summary with compact format and module totals\n */\nexport function showBundlesSummary(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Selected Bundles');\n\n for (const bundle of selectedBundles) {\n logger.success(`• ${formatBundleCompact(bundle)}`);\n }\n}\n\n/**\n * Show selected bundles summary with totals\n */\nexport function showBundlesSummaryWithTotals(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const totals = calculateModuleTotals(bundleIds);\n\n logger.newline();\n logger.subtitle(`Selected Bundles (${selectedBundles.length})`);\n\n for (const bundle of selectedBundles) {\n logger.success(` • ${formatBundleCompact(bundle)}`);\n }\n\n // Show totals box\n const border = colors.primary('│');\n logger.newline();\n logger.info(colors.primary('┌─────────────────────────────────────┐'));\n logger.info(`${border} Module Totals ${border}`);\n logger.info(colors.primary('├─────────────────────────────────────┤'));\n logger.info(\n `${border} 🤖 Agents: ${String(totals.agents).padStart(3)} ${border}`\n );\n logger.info(\n `${border} ⚡ Skills: ${String(totals.skills).padStart(3)} ${border}`\n );\n logger.info(\n `${border} 💻 Commands: ${String(totals.commands).padStart(3)} ${border}`\n );\n logger.info(\n `${border} 📚 Docs: ${String(totals.docs).padStart(3)} ${border}`\n );\n logger.info(colors.primary('├─────────────────────────────────────┤'));\n logger.info(\n `${border}${colors.success(` Total: ${String(totals.total).padStart(3)} modules `)}${border}`\n );\n logger.info(colors.primary('└─────────────────────────────────────┘'));\n}\n\n/**\n * Show detailed summary of all selected bundles with visual display\n */\nexport function showBundlesDetailedSummary(bundleIds: string[]): void {\n if (bundleIds.length === 0) {\n logger.info('No bundles selected');\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle(`Selected Bundles (${selectedBundles.length})`);\n\n for (const bundle of selectedBundles) {\n showBundleContents(bundle);\n }\n}\n\n/**\n * Validate bundle selection and show any dependency issues\n */\nexport function validateAndShowDependencies(\n bundleIds: string[],\n selectedModules: ModuleSelectionResult\n): BundleValidationResult {\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const validation = validateModuleDependencies(selectedModules, selectedBundles);\n showValidationResults(validation);\n\n return validation;\n}\n\n/**\n * Action options for bundle selection confirmation\n */\nexport type BundleConfirmAction = 'confirm' | 'edit' | 'cancel';\n\n/**\n * Confirm bundle selection with option to edit\n */\nexport async function confirmBundleSelection(bundleIds: string[]): Promise<boolean> {\n showBundlesSummary(bundleIds);\n logger.newline();\n\n return confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n}\n\n/**\n * Confirm bundle selection with totals and option to go back and edit\n * Returns the action the user wants to take\n */\nexport async function confirmBundleSelectionWithEdit(\n bundleIds: string[]\n): Promise<BundleConfirmAction> {\n showBundlesSummaryWithTotals(bundleIds);\n logger.newline();\n\n const action = await select<BundleConfirmAction>({\n message: 'What would you like to do?',\n choices: [\n {\n name: colors.success('✓ Confirm selection'),\n value: 'confirm',\n description: 'Continue with the selected bundles',\n },\n {\n name: colors.warning('← Edit selection'),\n value: 'edit',\n description: 'Go back and modify your bundle selection',\n },\n {\n name: colors.muted('✕ Cancel'),\n value: 'cancel',\n description: 'Cancel and start over',\n },\n ],\n default: 'confirm',\n });\n\n return action;\n}\n\n/**\n * Edit bundle selection - allows removing bundles from current selection\n */\nexport async function editBundleSelection(currentBundleIds: string[]): Promise<string[]> {\n const allBundles = getAllBundles();\n const selectedBundles = currentBundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n logger.newline();\n logger.subtitle('Edit Bundle Selection');\n logger.info('Uncheck bundles you want to remove, or add new ones.');\n logger.newline();\n\n const choices = selectedBundles.map((bundle) => ({\n name: formatBundleForDisplay(bundle),\n value: bundle.id,\n description: formatBundleDetailedDescription(bundle),\n checked: true, // All currently selected bundles are checked\n }));\n\n // Add option to browse more bundles\n choices.push({\n name: colors.primary('+ Add more bundles...'),\n value: BROWSE_ALL_VALUE,\n description: 'Browse all available bundles to add more',\n checked: false,\n });\n\n const selected = await checkbox({\n message: 'Current bundles (uncheck to remove):',\n choices,\n required: false,\n });\n\n // Check if user wants to add more\n if (selected.includes(BROWSE_ALL_VALUE)) {\n const realBundles = selected.filter((id) => id !== BROWSE_ALL_VALUE);\n const additional = await promptBundleSelection();\n // Merge without duplicates\n return [...realBundles, ...additional.filter((id) => !realBundles.includes(id))];\n }\n\n return selected;\n}\n\n/**\n * Confirm bundle selection with detailed view and validation\n */\nexport async function confirmBundleSelectionDetailed(\n bundleIds: string[],\n selectedModules: ModuleSelectionResult\n): Promise<{ confirmed: boolean; validation: BundleValidationResult }> {\n // Show compact summary first\n showBundlesSummary(bundleIds);\n\n // Validate and show any dependency issues\n const validation = validateAndShowDependencies(bundleIds, selectedModules);\n\n // Ask if user wants to see detailed view\n if (bundleIds.length > 0) {\n const showDetails = await confirm({\n message: 'Would you like to see detailed bundle information?',\n default: false,\n });\n\n if (showDetails) {\n showBundlesDetailedSummary(bundleIds);\n }\n }\n\n logger.newline();\n const confirmed = await confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n\n return { confirmed, validation };\n}\n\n/**\n * Prompt user to view bundle details during selection\n */\nexport async function promptBundlePreview(bundleIds: string[]): Promise<void> {\n if (bundleIds.length === 0) {\n return;\n }\n\n const allBundles = getAllBundles();\n const selectedBundles = bundleIds\n .map((id) => allBundles.find((b) => b.id === id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n if (selectedBundles.length === 0) {\n return;\n }\n\n const choices = [\n ...selectedBundles.map((bundle) => ({\n name: formatBundleCompact(bundle),\n value: bundle.id,\n description: 'View detailed information',\n })),\n {\n name: 'Done viewing',\n value: 'done',\n description: 'Continue with selection',\n },\n ];\n\n let viewing = true;\n while (viewing) {\n const selected = await select<string>({\n message: 'Select a bundle to view details (or Done to continue):',\n choices,\n default: 'done',\n });\n\n if (selected === 'done') {\n viewing = false;\n } else {\n const bundle = selectedBundles.find((b) => b.id === selected);\n if (bundle) {\n showBundleContents(bundle);\n }\n }\n }\n}\n\n/**\n * Create empty bundle selection result\n */\nexport function createEmptyBundleResult(): BundleSelectionResult {\n return {\n selectedBundles: [],\n additionalModules: {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n },\n };\n}\n","/**\n * Bundle display utilities with ASCII box formatting\n * Provides rich visual display of bundle information\n */\n\nimport type { BundleDefinition, BundleValidationResult } from '../../types/bundles.js';\nimport { colors } from '../utils/logger.js';\nimport { resolveBundle } from './resolver.js';\n\n// Box drawing characters\nconst BOX = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n horizontalDown: '┬',\n horizontalUp: '┴',\n verticalRight: '├',\n verticalLeft: '┤',\n cross: '┼',\n};\n\n// Icons for different sections\nconst ICONS = {\n bundle: '📦',\n responsibilities: '🎯',\n useCases: '📋',\n agents: '🤖',\n skills: '⚡',\n commands: '💻',\n docs: '📚',\n tags: '🏷️',\n complexity: '📊',\n tech: '🔧',\n warning: '⚠️',\n error: '🔴',\n recommended: '🟡',\n check: '✓',\n bullet: '•',\n};\n\n/**\n * Default terminal width for box formatting\n */\nconst DEFAULT_WIDTH = 70;\n\n/**\n * Create a horizontal line for boxes\n */\nfunction horizontalLine(width: number, left: string, right: string, fill = BOX.horizontal): string {\n return left + fill.repeat(width - 2) + right;\n}\n\n/**\n * Pad a string to fit within box width\n */\nfunction padLine(content: string, width: number): string {\n const visibleLength = stripAnsi(content).length;\n const padding = Math.max(0, width - 2 - visibleLength);\n return `${BOX.vertical} ${content}${' '.repeat(padding)}${BOX.vertical}`;\n}\n\n/**\n * Strip ANSI codes for length calculation\n */\nfunction stripAnsi(str: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape codes use control characters\n return str.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\n/**\n * Wrap text to fit within a maximum width\n */\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n if (currentLine.length + word.length + 1 <= maxWidth) {\n currentLine += (currentLine ? ' ' : '') + word;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n if (currentLine) lines.push(currentLine);\n\n return lines;\n}\n\n/**\n * Format complexity level with color\n */\nfunction formatComplexity(complexity?: string): string {\n switch (complexity) {\n case 'minimal':\n return colors.success('Minimal');\n case 'standard':\n return colors.primary('Standard');\n case 'comprehensive':\n return colors.warning('Comprehensive');\n default:\n return colors.muted('Standard');\n }\n}\n\n/**\n * Format a bundle for rich visual display\n * Returns an array of lines to be printed\n */\nexport function formatBundleVisualDisplay(\n bundle: BundleDefinition,\n width: number = DEFAULT_WIDTH\n): string[] {\n const lines: string[] = [];\n const contentWidth = width - 4; // Account for box borders and padding\n const resolved = resolveBundle(bundle);\n\n // Top border with title\n lines.push(horizontalLine(width, BOX.topLeft, BOX.topRight));\n\n // Bundle name with icon\n const title = `${ICONS.bundle} ${colors.primary(bundle.name)}`;\n lines.push(padLine(title, width));\n\n // Separator\n lines.push(horizontalLine(width, BOX.verticalRight, BOX.verticalLeft));\n\n // Description (wrapped)\n const descLines = wrapText(bundle.description, contentWidth);\n for (const line of descLines) {\n lines.push(padLine(line, width));\n }\n\n // Tech stack if available\n if (bundle.techStack && bundle.techStack.length > 0) {\n lines.push(padLine('', width)); // Empty line\n lines.push(\n padLine(`${ICONS.tech} ${colors.muted('Tech:')} ${bundle.techStack.join(', ')}`, width)\n );\n }\n\n // Responsibilities if available\n if (bundle.responsibilities && bundle.responsibilities.length > 0) {\n lines.push(padLine('', width));\n lines.push(padLine(`${ICONS.responsibilities} ${colors.primary('RESPONSIBILITIES:')}`, width));\n for (const resp of bundle.responsibilities) {\n const respLines = wrapText(`${ICONS.bullet} ${resp}`, contentWidth - 2);\n for (const line of respLines) {\n lines.push(padLine(` ${line}`, width));\n }\n }\n }\n\n // Use cases if available\n if (bundle.useCases && bundle.useCases.length > 0) {\n lines.push(padLine('', width));\n lines.push(padLine(`${ICONS.useCases} ${colors.primary('USE CASES:')}`, width));\n for (const useCase of bundle.useCases) {\n const ucLines = wrapText(`${ICONS.bullet} ${useCase}`, contentWidth - 2);\n for (const line of ucLines) {\n lines.push(padLine(` ${line}`, width));\n }\n }\n }\n\n // Agents section\n if (resolved.modules.agents.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.agents} ${colors.primary('AGENTS')} (${resolved.modules.agents.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.agents) {\n for (const agent of bundle.moduleDetails.agents) {\n lines.push(\n padLine(` ${ICONS.bullet} ${colors.secondary(agent.id)} - ${agent.role}`, width)\n );\n }\n } else {\n lines.push(padLine(` ${resolved.modules.agents.join(', ')}`, width));\n }\n }\n\n // Skills section\n if (resolved.modules.skills.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.skills} ${colors.primary('SKILLS')} (${resolved.modules.skills.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.skills) {\n for (const skill of bundle.moduleDetails.skills) {\n lines.push(\n padLine(` ${ICONS.bullet} ${colors.secondary(skill.id)} - ${skill.purpose}`, width)\n );\n }\n } else {\n lines.push(padLine(` ${resolved.modules.skills.join(', ')}`, width));\n }\n }\n\n // Commands section\n if (resolved.modules.commands.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(\n `${ICONS.commands} ${colors.primary('COMMANDS')} (${resolved.modules.commands.length}):`,\n width\n )\n );\n\n if (bundle.moduleDetails?.commands) {\n for (const cmd of bundle.moduleDetails.commands) {\n lines.push(padLine(` ${ICONS.bullet} ${colors.secondary(cmd.usage)}`, width));\n }\n } else {\n const cmdList = resolved.modules.commands.map((c) => `/${c}`).join(', ');\n lines.push(padLine(` ${cmdList}`, width));\n }\n }\n\n // Docs section\n if (resolved.modules.docs.length > 0) {\n lines.push(padLine('', width));\n lines.push(\n padLine(`${ICONS.docs} ${colors.primary('DOCS')} (${resolved.modules.docs.length}):`, width)\n );\n\n if (bundle.moduleDetails?.docs) {\n for (const doc of bundle.moduleDetails.docs) {\n lines.push(padLine(` ${ICONS.bullet} ${colors.secondary(doc.id)} - ${doc.topic}`, width));\n }\n } else {\n // Show first few and indicate more\n const maxShow = 5;\n const docsToShow = resolved.modules.docs.slice(0, maxShow);\n const remaining = resolved.modules.docs.length - maxShow;\n let docsText = docsToShow.join(', ');\n if (remaining > 0) {\n docsText += `, +${remaining} more`;\n }\n lines.push(padLine(` ${docsText}`, width));\n }\n }\n\n // Tags and complexity footer\n lines.push(padLine('', width));\n const footerParts: string[] = [];\n if (bundle.tags && bundle.tags.length > 0) {\n footerParts.push(`${ICONS.tags} ${colors.muted('Tags:')} ${bundle.tags.join(', ')}`);\n }\n footerParts.push(\n `${ICONS.complexity} ${colors.muted('Complexity:')} ${formatComplexity(bundle.complexity)}`\n );\n lines.push(padLine(footerParts.join(' '), width));\n\n // Bottom border\n lines.push(horizontalLine(width, BOX.bottomLeft, BOX.bottomRight));\n\n return lines;\n}\n\n/**\n * Format validation warnings for display\n */\nexport function formatValidationWarnings(\n validation: BundleValidationResult,\n width: number = DEFAULT_WIDTH\n): string[] {\n if (validation.errors.length === 0 && validation.warnings.length === 0) {\n return [];\n }\n\n const lines: string[] = [];\n\n // Top border\n lines.push(horizontalLine(width, BOX.topLeft, BOX.topRight));\n lines.push(padLine(`${ICONS.warning} ${colors.warning('DEPENDENCY WARNINGS')}`, width));\n lines.push(horizontalLine(width, BOX.verticalRight, BOX.verticalLeft));\n\n // Required (will be auto-included)\n if (validation.errors.length > 0) {\n lines.push(\n padLine(`${ICONS.error} ${colors.error('REQUIRED (will be auto-included):')}`, width)\n );\n for (const error of validation.errors) {\n lines.push(padLine(` ${ICONS.bullet} ${error.message}`, width));\n }\n }\n\n // Recommended (optional)\n if (validation.warnings.length > 0) {\n if (validation.errors.length > 0) {\n lines.push(padLine('', width));\n }\n lines.push(padLine(`${ICONS.recommended} ${colors.warning('RECOMMENDED (optional):')}`, width));\n for (const warning of validation.warnings) {\n lines.push(padLine(` ${ICONS.bullet} ${warning.message}`, width));\n }\n }\n\n // Bottom border\n lines.push(horizontalLine(width, BOX.bottomLeft, BOX.bottomRight));\n\n return lines;\n}\n\n/**\n * Format a compact bundle summary for list views\n */\nexport function formatBundleCompact(bundle: BundleDefinition): string {\n const resolved = resolveBundle(bundle);\n const counts: string[] = [];\n\n if (resolved.modules.agents.length > 0) {\n counts.push(`${resolved.modules.agents.length} agents`);\n }\n if (resolved.modules.skills.length > 0) {\n counts.push(`${resolved.modules.skills.length} skills`);\n }\n if (resolved.modules.commands.length > 0) {\n counts.push(`${resolved.modules.commands.length} commands`);\n }\n if (resolved.modules.docs.length > 0) {\n counts.push(`${resolved.modules.docs.length} docs`);\n }\n\n return `${bundle.name} (${counts.join(', ')})`;\n}\n\n/**\n * Print bundle visual display to console\n */\nexport function printBundleDisplay(bundle: BundleDefinition, width?: number): void {\n const lines = formatBundleVisualDisplay(bundle, width);\n for (const line of lines) {\n console.log(line);\n }\n}\n\n/**\n * Print validation warnings to console\n */\nexport function printValidationWarnings(validation: BundleValidationResult, width?: number): void {\n const lines = formatValidationWarnings(validation, width);\n for (const line of lines) {\n console.log(line);\n }\n}\n","/**\n * Bundle dependency validation system\n * Validates module dependencies and bundle prerequisites/conflicts\n */\n\nimport type {\n BundleConflict,\n BundleDefinition,\n BundleModuleRef,\n BundlePrerequisiteMissing,\n BundleValidationResult,\n DependencyError,\n DependencyWarning,\n} from '../../types/bundles.js';\nimport type { ModuleSelectionResult } from '../../types/modules.js';\nimport { getBundleById } from './resolver.js';\n\n/**\n * Validate module dependencies within a bundle selection\n * Checks that all required modules are present and warns about optional ones\n */\nexport function validateModuleDependencies(\n selectedModules: ModuleSelectionResult,\n bundles: BundleDefinition[]\n): BundleValidationResult {\n const errors: DependencyError[] = [];\n const warnings: DependencyWarning[] = [];\n const autoIncluded: BundleModuleRef[] = [];\n\n // Build a set of all selected module IDs for quick lookup\n const selectedIds = new Set([\n ...selectedModules.agents,\n ...selectedModules.skills,\n ...selectedModules.commands,\n ...selectedModules.docs,\n ]);\n\n // Check each bundle's module dependencies\n for (const bundle of bundles) {\n for (const moduleRef of bundle.modules) {\n // Skip if this module has no requiredBy dependencies\n if (!moduleRef.requiredBy || moduleRef.requiredBy.length === 0) {\n continue;\n }\n\n // Check if any module that requires this one is selected\n for (const requiringModuleId of moduleRef.requiredBy) {\n if (!selectedIds.has(requiringModuleId)) {\n continue; // The requiring module isn't selected, so no dependency issue\n }\n\n // The requiring module is selected - check if the dependency is also selected\n if (!selectedIds.has(moduleRef.id)) {\n if (moduleRef.optional) {\n // Optional dependency - just warn\n warnings.push({\n moduleId: requiringModuleId,\n moduleCategory: findModuleCategory(requiringModuleId, bundle),\n dependencyId: moduleRef.id,\n dependencyCategory: moduleRef.category,\n message: `${requiringModuleId} works better with ${moduleRef.id}`,\n });\n } else {\n // Required dependency - error and auto-include\n errors.push({\n moduleId: requiringModuleId,\n moduleCategory: findModuleCategory(requiringModuleId, bundle),\n dependencyId: moduleRef.id,\n dependencyCategory: moduleRef.category,\n message: `${requiringModuleId} requires ${moduleRef.id}`,\n });\n\n // Auto-include the missing required module\n if (!autoIncluded.some((m) => m.id === moduleRef.id)) {\n autoIncluded.push({\n id: moduleRef.id,\n category: moduleRef.category,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n autoIncluded,\n };\n}\n\n/**\n * Find the category of a module within a bundle\n */\nfunction findModuleCategory(\n moduleId: string,\n bundle: BundleDefinition\n): 'agents' | 'skills' | 'commands' | 'docs' {\n const moduleRef = bundle.modules.find((m) => m.id === moduleId);\n return moduleRef?.category ?? 'agents';\n}\n\n/**\n * Validate bundle prerequisites\n * Checks that all prerequisite bundles are selected\n */\nexport function validateBundlePrerequisites(\n selectedBundleIds: string[]\n): BundlePrerequisiteMissing[] {\n const missing: BundlePrerequisiteMissing[] = [];\n const selectedSet = new Set(selectedBundleIds);\n\n for (const bundleId of selectedBundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle?.prerequisites) continue;\n\n for (const prereqId of bundle.prerequisites) {\n if (!selectedSet.has(prereqId)) {\n missing.push({\n bundleId,\n prerequisiteId: prereqId,\n message: `${bundle.name} requires ${prereqId} bundle`,\n });\n }\n }\n }\n\n return missing;\n}\n\n/**\n * Validate bundle conflicts\n * Checks for mutually exclusive bundles\n */\nexport function validateBundleConflicts(selectedBundleIds: string[]): BundleConflict[] {\n const conflicts: BundleConflict[] = [];\n const selectedSet = new Set(selectedBundleIds);\n\n for (const bundleId of selectedBundleIds) {\n const bundle = getBundleById(bundleId);\n if (!bundle?.conflicts) continue;\n\n for (const conflictId of bundle.conflicts) {\n if (selectedSet.has(conflictId)) {\n // Avoid duplicate conflicts (A conflicts with B, B conflicts with A)\n const existingConflict = conflicts.find(\n (c) =>\n (c.bundleId === bundleId && c.conflictsWith === conflictId) ||\n (c.bundleId === conflictId && c.conflictsWith === bundleId)\n );\n\n if (!existingConflict) {\n const conflictingBundle = getBundleById(conflictId);\n conflicts.push({\n bundleId,\n conflictsWith: conflictId,\n reason: `${bundle.name} and ${conflictingBundle?.name ?? conflictId} are mutually exclusive`,\n });\n }\n }\n }\n }\n\n return conflicts;\n}\n\n/**\n * Full validation of bundle selection\n * Combines prerequisite, conflict, and dependency validation\n */\nexport function validateBundleSelection(\n selectedBundleIds: string[],\n selectedModules: ModuleSelectionResult\n): {\n moduleDependencies: BundleValidationResult;\n prerequisites: BundlePrerequisiteMissing[];\n conflicts: BundleConflict[];\n isValid: boolean;\n} {\n const selectedBundles = selectedBundleIds\n .map((id) => getBundleById(id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const moduleDependencies = validateModuleDependencies(selectedModules, selectedBundles);\n const prerequisites = validateBundlePrerequisites(selectedBundleIds);\n const conflicts = validateBundleConflicts(selectedBundleIds);\n\n return {\n moduleDependencies,\n prerequisites,\n conflicts,\n isValid: moduleDependencies.valid && prerequisites.length === 0 && conflicts.length === 0,\n };\n}\n\n/**\n * Get all modules that should be auto-included based on dependencies\n */\nexport function getAutoIncludedModules(\n selectedModules: ModuleSelectionResult,\n selectedBundleIds: string[]\n): ModuleSelectionResult {\n const selectedBundles = selectedBundleIds\n .map((id) => getBundleById(id))\n .filter((b): b is BundleDefinition => b !== undefined);\n\n const validation = validateModuleDependencies(selectedModules, selectedBundles);\n\n const result: ModuleSelectionResult = {\n agents: [...selectedModules.agents],\n skills: [...selectedModules.skills],\n commands: [...selectedModules.commands],\n docs: [...selectedModules.docs],\n };\n\n // Add auto-included modules\n for (const module of validation.autoIncluded) {\n const targetArray = result[module.category];\n if (!targetArray.includes(module.id)) {\n targetArray.push(module.id);\n }\n }\n\n return result;\n}\n","/**\n * CI/CD configuration prompts\n */\n\nimport type { CICDConfig } from '../../lib/ci-cd/index.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { PackageManager } from '../../types/scaffold.js';\n\n/**\n * Prompt for CI/CD configuration\n */\nexport async function promptCICDConfig(options?: {\n packageManager?: PackageManager;\n defaults?: Partial<CICDConfig>;\n}): Promise<CICDConfig> {\n logger.section('CI/CD Configuration', '🚀');\n logger.info('Configure continuous integration and deployment workflows');\n logger.newline();\n\n // Ask if user wants to configure CI/CD\n const enableCICD = await confirm({\n message: 'Would you like to set up GitHub Actions workflows?',\n default: true,\n });\n\n if (!enableCICD) {\n return {\n enabled: false,\n provider: 'github-actions',\n ci: false,\n cd: false,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n }\n\n // Select which workflows to create\n const workflows = await checkbox<'ci' | 'cd'>({\n message: 'Which workflows would you like to create?',\n choices: [\n {\n name: 'CI (Continuous Integration) - Lint, test, build on PRs',\n value: 'ci',\n checked: true,\n },\n {\n name: 'Release - Create releases on version tags',\n value: 'cd',\n checked: false,\n },\n ],\n });\n\n if (workflows.length === 0) {\n return {\n enabled: false,\n provider: 'github-actions',\n ci: false,\n cd: false,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: '22',\n enableCaching: true,\n runTests: true,\n runLint: true,\n runTypecheck: true,\n runBuild: true,\n };\n }\n\n const hasCi = workflows.includes('ci');\n const hasCd = workflows.includes('cd');\n\n // CI configuration\n let runTests = true;\n let runLint = true;\n let runTypecheck = true;\n let runBuild = true;\n\n if (hasCi) {\n const ciSteps = await checkbox<'tests' | 'lint' | 'typecheck' | 'build'>({\n message: 'Which steps should the CI workflow run?',\n choices: [\n { name: 'Lint', value: 'lint', checked: true },\n { name: 'Type checking', value: 'typecheck', checked: true },\n { name: 'Tests', value: 'tests', checked: true },\n { name: 'Build', value: 'build', checked: true },\n ],\n });\n\n runTests = ciSteps.includes('tests');\n runLint = ciSteps.includes('lint');\n runTypecheck = ciSteps.includes('typecheck');\n runBuild = ciSteps.includes('build');\n }\n\n // Node.js version\n const nodeVersion = await select<string>({\n message: 'Node.js version:',\n choices: [\n { name: '22 (LTS - Recommended)', value: '22' },\n { name: '20 (LTS)', value: '20' },\n { name: '18 (LTS)', value: '18' },\n { name: 'Custom', value: 'custom' },\n ],\n default: '22',\n });\n\n let finalNodeVersion = nodeVersion;\n if (nodeVersion === 'custom') {\n finalNodeVersion = await input({\n message: 'Enter Node.js version:',\n default: '22',\n validate: (v) => {\n if (!/^\\d+(\\.\\d+)?$/.test(v)) {\n return 'Please enter a valid version (e.g., \"20\" or \"20.10\")';\n }\n return true;\n },\n });\n }\n\n // Caching\n const enableCaching = await confirm({\n message: 'Enable dependency caching for faster builds?',\n default: true,\n });\n\n return {\n enabled: true,\n provider: 'github-actions',\n ci: hasCi,\n cd: hasCd,\n packageManager: options?.packageManager || 'pnpm',\n nodeVersion: finalNodeVersion,\n enableCaching,\n runTests,\n runLint,\n runTypecheck,\n runBuild,\n };\n}\n\n/**\n * Show CI/CD configuration summary\n */\nexport function showCICDSummary(config: CICDConfig): void {\n if (!config.enabled) {\n logger.item('CI/CD: Not configured');\n return;\n }\n\n const workflows: string[] = [];\n if (config.ci) workflows.push('CI');\n if (config.cd) workflows.push('Release');\n\n logger.item(`CI/CD: ${workflows.join(', ')}`);\n\n if (config.ci) {\n const steps: string[] = [];\n if (config.runLint) steps.push('lint');\n if (config.runTypecheck) steps.push('typecheck');\n if (config.runTests) steps.push('test');\n if (config.runBuild) steps.push('build');\n logger.info(` CI steps: ${steps.join(', ')}`);\n }\n\n logger.info(` Node.js: ${config.nodeVersion}`);\n logger.info(` Caching: ${config.enableCaching ? 'enabled' : 'disabled'}`);\n}\n","/**\n * Code style configuration prompts\n */\n\nimport {\n CODE_STYLE_PRESETS,\n type CodeStylePreset,\n DEFAULT_BIOME_OPTIONS,\n DEFAULT_COMMITLINT_OPTIONS,\n DEFAULT_EDITORCONFIG_OPTIONS,\n DEFAULT_PRETTIER_OPTIONS,\n} from '../../constants/code-style-defaults.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BiomeOptions,\n CodeStyleConfig,\n CommitlintOptions,\n EditorConfigOptions,\n IndentStyle,\n PrettierOptions,\n QuoteStyle,\n} from '../../types/config.js';\n\ntype CodeStyleTool = 'editorconfig' | 'commitlint' | 'biome' | 'prettier';\n\ninterface CodeStyleChoice {\n name: string;\n value: CodeStyleTool;\n description: string;\n checked: boolean;\n}\n\nconst CODE_STYLE_TOOLS: CodeStyleChoice[] = [\n {\n name: 'EditorConfig',\n value: 'editorconfig',\n description: 'Consistent coding styles across editors',\n checked: true,\n },\n {\n name: 'Commitlint',\n value: 'commitlint',\n description: 'Lint commit messages (conventional commits)',\n checked: true,\n },\n {\n name: 'Biome',\n value: 'biome',\n description: 'Fast linter and formatter (ESLint + Prettier alternative)',\n checked: false,\n },\n {\n name: 'Prettier',\n value: 'prettier',\n description: 'Code formatter (use if not using Biome)',\n checked: false,\n },\n];\n\n/**\n * Prompt for code style configuration\n */\nexport async function promptCodeStyleConfig(options?: {\n defaults?: Partial<CodeStyleConfig>;\n}): Promise<CodeStyleConfig> {\n logger.section('Code Style', '🎨');\n logger.info('Configure code formatting and linting tools');\n logger.newline();\n\n // First, ask if user wants to install code style tools\n const enableCodeStyle = await confirm({\n message: 'Would you like to install code style configuration files?',\n default: true,\n });\n\n if (!enableCodeStyle) {\n return {\n enabled: false,\n editorconfig: false,\n commitlint: false,\n biome: false,\n prettier: false,\n };\n }\n\n // Select which tools to install\n const selectedTools = await checkbox<CodeStyleTool>({\n message: 'Select the tools to configure:',\n choices: CODE_STYLE_TOOLS.map((tool) => ({\n name: `${tool.name} - ${tool.description}`,\n value: tool.value,\n checked: options?.defaults?.[tool.value] ?? tool.checked,\n })),\n });\n\n // Warn if both Biome and Prettier are selected\n if (selectedTools.includes('biome') && selectedTools.includes('prettier')) {\n logger.warn('Note: Both Biome and Prettier selected. Biome can replace Prettier.');\n\n const keepBoth = await confirm({\n message: 'Keep both? (Prettier may conflict with Biome)',\n default: false,\n });\n\n if (!keepBoth) {\n const preferred = await select<'biome' | 'prettier'>({\n message: 'Which formatter would you prefer?',\n choices: [\n { name: 'Biome (faster, all-in-one)', value: 'biome' },\n { name: 'Prettier (more plugins)', value: 'prettier' },\n ],\n });\n\n // Remove the non-preferred one\n const indexToRemove =\n preferred === 'biome' ? selectedTools.indexOf('prettier') : selectedTools.indexOf('biome');\n if (indexToRemove > -1) {\n selectedTools.splice(indexToRemove, 1);\n }\n }\n }\n\n // If no tools selected, return early\n if (selectedTools.length === 0) {\n return {\n enabled: false,\n editorconfig: false,\n commitlint: false,\n biome: false,\n prettier: false,\n };\n }\n\n // Ask if user wants to customize settings or use defaults\n const customizeSettings = await confirm({\n message: 'Would you like to customize code style settings? (No = use standard defaults)',\n default: false,\n });\n\n let editorconfigOptions: EditorConfigOptions | undefined;\n let biomeOptions: BiomeOptions | undefined;\n let prettierOptions: PrettierOptions | undefined;\n let commitlintOptions: CommitlintOptions | undefined;\n\n if (customizeSettings) {\n // First, offer preset selection if editorconfig, biome, or prettier is selected\n const hasFormatter =\n selectedTools.includes('editorconfig') ||\n selectedTools.includes('biome') ||\n selectedTools.includes('prettier');\n\n if (hasFormatter) {\n const preset = await promptStylePreset();\n\n if (preset !== 'custom') {\n const presetConfig = CODE_STYLE_PRESETS[preset];\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = presetConfig.editorconfig;\n }\n if (selectedTools.includes('biome') && presetConfig.biome) {\n biomeOptions = {\n ...DEFAULT_BIOME_OPTIONS,\n formatter: presetConfig.biome,\n };\n }\n if (selectedTools.includes('prettier') && presetConfig.prettier) {\n prettierOptions = presetConfig.prettier;\n }\n } else {\n // Custom configuration - prompt for each tool\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = await promptEditorConfigOptions();\n }\n if (selectedTools.includes('biome')) {\n biomeOptions = await promptBiomeOptions();\n }\n if (selectedTools.includes('prettier')) {\n prettierOptions = await promptPrettierOptions();\n }\n }\n }\n\n // Commitlint configuration (always separate)\n if (selectedTools.includes('commitlint')) {\n commitlintOptions = await promptCommitlintOptions();\n }\n } else {\n // Use defaults\n if (selectedTools.includes('editorconfig')) {\n editorconfigOptions = DEFAULT_EDITORCONFIG_OPTIONS;\n }\n if (selectedTools.includes('biome')) {\n biomeOptions = DEFAULT_BIOME_OPTIONS;\n }\n if (selectedTools.includes('prettier')) {\n prettierOptions = DEFAULT_PRETTIER_OPTIONS;\n }\n if (selectedTools.includes('commitlint')) {\n commitlintOptions = DEFAULT_COMMITLINT_OPTIONS;\n }\n }\n\n return {\n enabled: selectedTools.length > 0,\n editorconfig: selectedTools.includes('editorconfig'),\n editorconfigOptions,\n commitlint: selectedTools.includes('commitlint'),\n commitlintOptions,\n biome: selectedTools.includes('biome'),\n biomeOptions,\n prettier: selectedTools.includes('prettier'),\n prettierOptions,\n };\n}\n\n/**\n * Prompt for style preset selection\n */\nasync function promptStylePreset(): Promise<CodeStylePreset> {\n logger.newline();\n logger.info('Choose a code style preset:');\n\n return select<CodeStylePreset>({\n message: 'Style preset:',\n choices: Object.entries(CODE_STYLE_PRESETS).map(([key, preset]) => ({\n name: `${preset.name} - ${preset.description}`,\n value: key as CodeStylePreset,\n })),\n default: 'standard',\n });\n}\n\n/**\n * Prompt for EditorConfig options\n */\nasync function promptEditorConfigOptions(): Promise<EditorConfigOptions> {\n logger.newline();\n logger.subtitle('EditorConfig Options');\n\n const indentStyle = await select<IndentStyle>({\n message: 'Indent style:',\n choices: [\n { name: 'Spaces', value: 'space' },\n { name: 'Tabs', value: 'tab' },\n ],\n default: DEFAULT_EDITORCONFIG_OPTIONS.indentStyle,\n });\n\n const indentSizeStr = await input({\n message: 'Indent size:',\n default: String(DEFAULT_EDITORCONFIG_OPTIONS.indentSize),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const indentSize = Number(indentSizeStr);\n\n const endOfLine = await select<'lf' | 'crlf' | 'cr'>({\n message: 'Line endings:',\n choices: [\n { name: 'LF (Unix/Mac)', value: 'lf' },\n { name: 'CRLF (Windows)', value: 'crlf' },\n { name: 'CR (Old Mac)', value: 'cr' },\n ],\n default: DEFAULT_EDITORCONFIG_OPTIONS.endOfLine,\n });\n\n const maxLineLengthStr = await input({\n message: 'Max line length (or \"off\"):',\n default: String(DEFAULT_EDITORCONFIG_OPTIONS.maxLineLength),\n validate: (v) => {\n if (v.toLowerCase() === 'off') return true;\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200)\n return 'Enter a number between 40 and 200, or \"off\"';\n return true;\n },\n });\n const maxLineLength = maxLineLengthStr.toLowerCase() === 'off' ? 'off' : Number(maxLineLengthStr);\n\n return {\n indentStyle,\n indentSize,\n endOfLine,\n insertFinalNewline: true,\n trimTrailingWhitespace: true,\n charset: 'utf-8',\n maxLineLength,\n };\n}\n\n/**\n * Prompt for Biome options\n */\nasync function promptBiomeOptions(): Promise<BiomeOptions> {\n logger.newline();\n logger.subtitle('Biome Options');\n\n // Formatter options\n const indentStyle = await select<IndentStyle>({\n message: 'Indent style:',\n choices: [\n { name: 'Spaces', value: 'space' },\n { name: 'Tabs', value: 'tab' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.indentStyle,\n });\n\n const indentWidthStr = await input({\n message: 'Indent width:',\n default: String(DEFAULT_BIOME_OPTIONS.formatter.indentWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const indentWidth = Number(indentWidthStr);\n\n const lineWidthStr = await input({\n message: 'Line width:',\n default: String(DEFAULT_BIOME_OPTIONS.formatter.lineWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200) return 'Enter a number between 40 and 200';\n return true;\n },\n });\n const lineWidth = Number(lineWidthStr);\n\n const quoteStyle = await select<QuoteStyle>({\n message: 'Quote style:',\n choices: [\n { name: 'Single quotes', value: 'single' },\n { name: 'Double quotes', value: 'double' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.quoteStyle,\n });\n\n const semicolons = await select<'always' | 'asNeeded'>({\n message: 'Semicolons:',\n choices: [\n { name: 'Always', value: 'always' },\n { name: 'As needed (ASI)', value: 'asNeeded' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.semicolons,\n });\n\n const trailingCommas = await select<'all' | 'es5' | 'none'>({\n message: 'Trailing commas:',\n choices: [\n { name: 'All', value: 'all' },\n { name: 'ES5 (only where valid in ES5)', value: 'es5' },\n { name: 'None', value: 'none' },\n ],\n default: DEFAULT_BIOME_OPTIONS.formatter.trailingCommas,\n });\n\n // Linter options (simplified)\n const enableRecommended = await confirm({\n message: 'Enable recommended linter rules?',\n default: true,\n });\n\n return {\n formatter: {\n indentStyle,\n indentWidth,\n lineWidth,\n quoteStyle,\n semicolons,\n trailingCommas,\n quoteProperties: 'asNeeded',\n bracketSpacing: true,\n bracketSameLine: false,\n arrowParentheses: 'always',\n },\n linter: {\n recommended: enableRecommended,\n correctness: enableRecommended,\n suspicious: enableRecommended,\n style: enableRecommended,\n complexity: enableRecommended,\n security: enableRecommended,\n performance: enableRecommended,\n a11y: enableRecommended,\n },\n organizeImports: true,\n ignorePatterns: DEFAULT_BIOME_OPTIONS.ignorePatterns,\n };\n}\n\n/**\n * Prompt for Prettier options\n */\nasync function promptPrettierOptions(): Promise<PrettierOptions> {\n logger.newline();\n logger.subtitle('Prettier Options');\n\n const printWidthStr = await input({\n message: 'Print width:',\n default: String(DEFAULT_PRETTIER_OPTIONS.printWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 40 || num > 200) return 'Enter a number between 40 and 200';\n return true;\n },\n });\n const printWidth = Number(printWidthStr);\n\n const tabWidthStr = await input({\n message: 'Tab width:',\n default: String(DEFAULT_PRETTIER_OPTIONS.tabWidth),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 1 || num > 8) return 'Enter a number between 1 and 8';\n return true;\n },\n });\n const tabWidth = Number(tabWidthStr);\n\n const useTabs = await confirm({\n message: 'Use tabs instead of spaces?',\n default: DEFAULT_PRETTIER_OPTIONS.useTabs,\n });\n\n const semi = await confirm({\n message: 'Use semicolons?',\n default: DEFAULT_PRETTIER_OPTIONS.semi,\n });\n\n const singleQuote = await confirm({\n message: 'Use single quotes?',\n default: DEFAULT_PRETTIER_OPTIONS.singleQuote,\n });\n\n const trailingComma = await select<'all' | 'es5' | 'none'>({\n message: 'Trailing commas:',\n choices: [\n { name: 'All', value: 'all' },\n { name: 'ES5', value: 'es5' },\n { name: 'None', value: 'none' },\n ],\n default: DEFAULT_PRETTIER_OPTIONS.trailingComma,\n });\n\n const bracketSpacing = await confirm({\n message: 'Bracket spacing? ({ foo: bar })',\n default: DEFAULT_PRETTIER_OPTIONS.bracketSpacing,\n });\n\n const arrowParens = await select<'always' | 'avoid'>({\n message: 'Arrow function parentheses:',\n choices: [\n { name: 'Always (x) => x', value: 'always' },\n { name: 'Avoid x => x', value: 'avoid' },\n ],\n default: DEFAULT_PRETTIER_OPTIONS.arrowParens,\n });\n\n return {\n printWidth,\n tabWidth,\n useTabs,\n semi,\n singleQuote,\n jsxSingleQuote: false,\n trailingComma,\n bracketSpacing,\n bracketSameLine: false,\n arrowParens,\n endOfLine: 'lf',\n proseWrap: 'preserve',\n htmlWhitespaceSensitivity: 'css',\n singleAttributePerLine: false,\n };\n}\n\n/**\n * Prompt for Commitlint options\n */\nasync function promptCommitlintOptions(): Promise<CommitlintOptions> {\n logger.newline();\n logger.subtitle('Commitlint Options');\n\n const useDefaults = await confirm({\n message: 'Use conventional commits defaults?',\n default: true,\n });\n\n if (useDefaults) {\n const huskyIntegration = await confirm({\n message: 'Enable Husky integration (git hooks)?',\n default: true,\n });\n\n return {\n ...DEFAULT_COMMITLINT_OPTIONS,\n huskyIntegration,\n };\n }\n\n // Custom commit types\n const typesInput = await input({\n message: 'Commit types (comma-separated):',\n default: DEFAULT_COMMITLINT_OPTIONS.types.join(', '),\n });\n const types = typesInput\n .split(',')\n .map((t) => t.trim())\n .filter((t) => t.length > 0);\n\n // Custom scopes\n const scopesInput = await input({\n message: 'Allowed scopes (comma-separated, empty for any):',\n default: '',\n });\n const scopes = scopesInput\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const headerMaxLengthStr = await input({\n message: 'Maximum header length:',\n default: String(DEFAULT_COMMITLINT_OPTIONS.headerMaxLength),\n validate: (v) => {\n const num = Number(v);\n if (Number.isNaN(num) || num < 20 || num > 200) return 'Enter a number between 20 and 200';\n return true;\n },\n });\n const headerMaxLength = Number(headerMaxLengthStr);\n\n const scopeRequired = await confirm({\n message: 'Require scope in commit messages?',\n default: false,\n });\n\n const huskyIntegration = await confirm({\n message: 'Enable Husky integration (git hooks)?',\n default: true,\n });\n\n return {\n extends: ['@commitlint/config-conventional'],\n types,\n scopes,\n headerMaxLength,\n scopeRequired,\n bodyRequired: false,\n bodyMaxLineLength: 100,\n huskyIntegration,\n };\n}\n\n/**\n * Show code style configuration summary\n */\nexport function showCodeStyleSummary(config: CodeStyleConfig): void {\n if (!config.enabled) {\n logger.item('Code style: Not configured');\n return;\n }\n\n const tools: string[] = [];\n if (config.editorconfig) tools.push('EditorConfig');\n if (config.commitlint) tools.push('Commitlint');\n if (config.biome) tools.push('Biome');\n if (config.prettier) tools.push('Prettier');\n\n logger.item(`Code style: ${tools.join(', ')}`);\n\n // Show key settings\n if (config.editorconfigOptions) {\n const ec = config.editorconfigOptions;\n logger.info(\n colors.muted(\n ` EditorConfig: ${ec.indentStyle === 'space' ? `${ec.indentSize} spaces` : 'tabs'}, ${ec.endOfLine.toUpperCase()}`\n )\n );\n }\n\n if (config.biomeOptions) {\n const bf = config.biomeOptions.formatter;\n logger.info(\n colors.muted(\n ` Biome: ${bf.indentStyle === 'space' ? `${bf.indentWidth} spaces` : 'tabs'}, ${bf.quoteStyle} quotes, ${bf.semicolons === 'always' ? 'semicolons' : 'no semicolons'}`\n )\n );\n }\n\n if (config.prettierOptions) {\n const pr = config.prettierOptions;\n logger.info(\n colors.muted(\n ` Prettier: ${pr.useTabs ? 'tabs' : `${pr.tabWidth} spaces`}, ${pr.singleQuote ? 'single' : 'double'} quotes, ${pr.semi ? 'semicolons' : 'no semicolons'}`\n )\n );\n }\n\n if (config.commitlintOptions) {\n const cl = config.commitlintOptions;\n logger.info(\n colors.muted(\n ` Commitlint: ${cl.types.length} types, ${cl.huskyIntegration ? 'Husky enabled' : 'no Husky'}`\n )\n );\n }\n}\n\n/**\n * Confirm code style configuration\n */\nexport async function confirmCodeStyleConfig(config: CodeStyleConfig): Promise<boolean> {\n if (!config.enabled) {\n return true;\n }\n\n showCodeStyleSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Install these code style configurations?',\n default: true,\n });\n}\n","/**\n * Folder structure preferences prompts\n */\n\nimport {\n DOCS_LOCATION_OPTIONS,\n GITHUB_WORKFLOW_TEMPLATES,\n PLANNING_LOCATION_OPTIONS,\n TEST_LOCATION_OPTIONS,\n TEST_PATTERN_OPTIONS,\n getFolderRecommendationsForBundles,\n getRecommendedWorkflows,\n mergeFolderPreferences,\n} from '../../constants/folder-preferences.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n DocsFileLocation,\n FolderPreferences,\n GithubWorkflowTemplate,\n PlanningFileLocation,\n TestFileLocation,\n} from '../../types/folder-preferences.js';\n\n/**\n * Prompt for test file location preference\n */\nexport async function promptTestLocation(options?: {\n recommended?: TestFileLocation;\n}): Promise<{ location: TestFileLocation; pattern: string }> {\n const choices = TEST_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<TestFileLocation>({\n message: 'Where should test files be located?',\n choices,\n default: options?.recommended || 'test-folder-root',\n });\n\n const patternChoices = TEST_PATTERN_OPTIONS.map((opt) => ({\n name: opt.name,\n value: opt.value,\n description: opt.description,\n }));\n\n const pattern = await select<string>({\n message: 'Test file naming pattern:',\n choices: patternChoices,\n default: '*.test.ts',\n });\n\n return { location, pattern };\n}\n\n/**\n * Prompt for planning file location preference\n */\nexport async function promptPlanningLocation(options?: {\n recommended?: PlanningFileLocation;\n}): Promise<{ location: PlanningFileLocation; commitToGit: boolean }> {\n const choices = PLANNING_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<PlanningFileLocation>({\n message: 'Where should planning files (PDR, tech-analysis, TODOs) be stored?',\n choices,\n default: options?.recommended || 'claude-sessions',\n });\n\n const commitToGit = await confirm({\n message: 'Should planning files be committed to git?',\n default: false,\n });\n\n if (!commitToGit) {\n logger.info(\n colors.muted(' Planning files will be added to .gitignore. You can change this later.')\n );\n }\n\n return { location, commitToGit };\n}\n\n/**\n * Prompt for documentation file location preference\n */\nexport async function promptDocsLocation(options?: {\n recommended?: DocsFileLocation;\n}): Promise<{ location: DocsFileLocation }> {\n const choices = DOCS_LOCATION_OPTIONS.map((opt) => ({\n name: opt.name + (opt.value === options?.recommended ? ' ⭐' : ''),\n value: opt.value,\n description: opt.description,\n }));\n\n const location = await select<DocsFileLocation>({\n message: 'Where should documentation files be stored?',\n choices,\n default: options?.recommended || 'docs-root',\n });\n\n return { location };\n}\n\n/**\n * Prompt for GitHub Actions workflow selection\n */\nexport async function promptGithubWorkflows(options?: {\n recommended?: string[];\n technologies?: string[];\n}): Promise<string[]> {\n // Get recommended workflows\n const recommendedWorkflows = options?.technologies\n ? getRecommendedWorkflows(options.technologies)\n : [];\n const recommendedIds = new Set([\n ...(options?.recommended || []),\n ...recommendedWorkflows.map((w) => w.id),\n ]);\n\n // Group by category\n const categories: Array<{ name: string; workflows: GithubWorkflowTemplate[] }> = [\n {\n name: 'CI (Continuous Integration)',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'ci'),\n },\n {\n name: 'Quality',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'quality'),\n },\n {\n name: 'Security',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'security'),\n },\n {\n name: 'CD (Deployment)',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'cd'),\n },\n {\n name: 'Release',\n workflows: GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === 'release'),\n },\n ];\n\n logger.newline();\n logger.subtitle('GitHub Actions Workflows');\n logger.info('Select workflows to create. Use Space to toggle, Enter to confirm.');\n if (recommendedIds.size > 0) {\n logger.info(colors.muted('⭐ indicates recommended workflows for your stack.'));\n }\n logger.newline();\n\n const selectedWorkflows: string[] = [];\n\n for (const category of categories) {\n if (category.workflows.length === 0) continue;\n\n const choices = category.workflows.map((workflow) => ({\n name: workflow.name + (recommendedIds.has(workflow.id) ? ` ${colors.primary('⭐')}` : ''),\n value: workflow.id,\n description: workflow.description,\n checked: recommendedIds.has(workflow.id),\n }));\n\n const selected = await checkbox({\n message: `${category.name}:`,\n choices,\n required: false,\n });\n\n selectedWorkflows.push(...selected);\n }\n\n return selectedWorkflows;\n}\n\n/**\n * Prompt for folder preferences based on selected bundles\n */\nexport async function promptFolderPreferences(options: {\n selectedBundles: string[];\n technologies?: string[];\n}): Promise<FolderPreferences> {\n const { selectedBundles, technologies = [] } = options;\n\n // Get recommendations based on bundles\n const recommendations = getFolderRecommendationsForBundles(selectedBundles);\n const mergedDefaults = mergeFolderPreferences(recommendations);\n\n // Determine which sections to show based on bundles\n const hasTestingBundle = selectedBundles.some(\n (id) => id.includes('testing') || id.includes('quality')\n );\n const hasPlanningBundle = selectedBundles.some((id) => id.includes('planning'));\n const hasDocsBundle = selectedBundles.some((id) => id.includes('documentation'));\n const hasCiCdBundle = selectedBundles.some((id) => id.includes('cicd') || id.includes('ci-cd'));\n\n // Show recommendations if any\n if (recommendations.length > 0) {\n logger.newline();\n logger.subtitle('Folder Structure Recommendations');\n logger.info(colors.muted('Based on your selected bundles, we recommend:'));\n for (const rec of recommendations) {\n logger.info(` ${colors.primary('•')} ${rec.reason}`);\n }\n logger.newline();\n }\n\n const preferences: FolderPreferences = {};\n\n // Tests configuration\n if (hasTestingBundle) {\n logger.newline();\n logger.subtitle('Test Files Configuration');\n preferences.tests = await promptTestLocation({\n recommended: mergedDefaults.tests?.location,\n });\n }\n\n // Planning configuration\n if (hasPlanningBundle) {\n logger.newline();\n logger.subtitle('Planning Files Configuration');\n preferences.planning = await promptPlanningLocation({\n recommended: mergedDefaults.planning?.location,\n });\n }\n\n // Docs configuration\n if (hasDocsBundle) {\n logger.newline();\n logger.subtitle('Documentation Configuration');\n preferences.docs = await promptDocsLocation({\n recommended: mergedDefaults.docs?.location,\n });\n }\n\n // CI/CD configuration - ask if they want to set it up\n const setupCiCd =\n hasCiCdBundle ||\n (await confirm({\n message: 'Would you like to set up GitHub Actions workflows?',\n default: true,\n }));\n\n if (setupCiCd) {\n const workflows = await promptGithubWorkflows({\n recommended: mergedDefaults.cicd?.workflows,\n technologies,\n });\n\n if (workflows.length > 0) {\n preferences.cicd = {\n location: 'github-workflows',\n workflows,\n };\n }\n }\n\n return preferences;\n}\n\n/**\n * Show folder preferences summary\n */\nexport function showFolderPreferencesSummary(preferences: FolderPreferences): void {\n logger.newline();\n logger.subtitle('Folder Structure Summary');\n\n if (preferences.tests) {\n const testOpt = TEST_LOCATION_OPTIONS.find((o) => o.value === preferences.tests?.location);\n logger.keyValue('Tests', testOpt?.name || preferences.tests.location);\n logger.keyValue('Test Pattern', preferences.tests.pattern);\n }\n\n if (preferences.planning) {\n const planOpt = PLANNING_LOCATION_OPTIONS.find(\n (o) => o.value === preferences.planning?.location\n );\n logger.keyValue('Planning', planOpt?.name || preferences.planning.location);\n logger.keyValue(\n 'Commit Planning',\n preferences.planning.commitToGit ? 'Yes' : 'No (will be in .gitignore)'\n );\n }\n\n if (preferences.docs) {\n const docsOpt = DOCS_LOCATION_OPTIONS.find((o) => o.value === preferences.docs?.location);\n logger.keyValue('Documentation', docsOpt?.name || preferences.docs.location);\n }\n\n if (preferences.cicd && preferences.cicd.workflows.length > 0) {\n logger.keyValue('CI/CD Location', '.github/workflows/');\n logger.info(` ${colors.muted('Workflows:')} ${preferences.cicd.workflows.join(', ')}`);\n }\n}\n\n/**\n * Confirm folder preferences\n */\nexport async function confirmFolderPreferences(preferences: FolderPreferences): Promise<boolean> {\n showFolderPreferencesSummary(preferences);\n logger.newline();\n\n return confirm({\n message: 'Are these folder structure preferences correct?',\n default: true,\n });\n}\n\n/**\n * Quick folder preferences with smart defaults\n */\nexport async function promptQuickFolderPreferences(options: {\n selectedBundles: string[];\n technologies?: string[];\n}): Promise<FolderPreferences | null> {\n const recommendations = getFolderRecommendationsForBundles(options.selectedBundles);\n const mergedDefaults = mergeFolderPreferences(recommendations);\n\n // If we have recommendations, show them and ask if user wants to customize\n if (recommendations.length > 0) {\n logger.section('Folder Structure', '📁');\n logger.info(colors.muted('Based on your bundles, we have recommended folder settings.'));\n\n showFolderPreferencesSummary(mergedDefaults);\n\n const customize = await confirm({\n message: 'Would you like to customize these folder preferences?',\n default: false,\n });\n\n if (!customize) {\n return mergedDefaults;\n }\n }\n\n // Full customization\n return promptFolderPreferences(options);\n}\n","/**\n * Folder preferences constants and defaults\n */\n\nimport type {\n BundleFolderRecommendations,\n FolderPreferences,\n GithubWorkflowTemplate,\n} from '../types/folder-preferences.js';\n\n/**\n * Default folder preferences\n */\nexport const DEFAULT_FOLDER_PREFERENCES: FolderPreferences = {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n planning: {\n location: 'claude-sessions',\n commitToGit: false,\n },\n docs: {\n location: 'docs-root',\n },\n cicd: {\n location: 'github-workflows',\n workflows: [],\n },\n};\n\n/**\n * Test file location options with descriptions\n */\nexport const TEST_LOCATION_OPTIONS = [\n {\n value: 'colocated' as const,\n name: 'Colocated with source files',\n description:\n 'Tests next to source files (e.g., src/utils/foo.ts → src/utils/foo.test.ts). Good for small projects.',\n },\n {\n value: 'test-folder-root' as const,\n name: 'Root test/ folder (Recommended)',\n description:\n 'Tests in test/ folder mirroring src structure (e.g., test/utils/foo.test.ts). Best for medium-large projects.',\n },\n {\n value: 'test-folder-src' as const,\n name: 'Inside src/__tests__/',\n description:\n 'Tests in src/__tests__/ folder (e.g., src/__tests__/utils/foo.test.ts). Common in Create React App.',\n },\n];\n\n/**\n * Planning file location options\n */\nexport const PLANNING_LOCATION_OPTIONS = [\n {\n value: 'claude-sessions' as const,\n name: '.claude/sessions/planning/ (Recommended)',\n description:\n 'Planning files in .claude/sessions/planning/. Keeps Claude-specific files organized.',\n },\n {\n value: 'docs-planning' as const,\n name: 'docs/planning/',\n description:\n 'Planning files in docs/planning/. Good if you want planning docs alongside other docs.',\n },\n {\n value: 'root-planning' as const,\n name: 'planning/ at root',\n description: 'Planning files in planning/ at project root. Maximum visibility.',\n },\n];\n\n/**\n * Documentation file location options\n */\nexport const DOCS_LOCATION_OPTIONS = [\n {\n value: 'docs-root' as const,\n name: 'docs/ at project root (Recommended)',\n description: 'Documentation in docs/ folder. Standard location for most projects.',\n },\n {\n value: 'claude-docs' as const,\n name: '.claude/docs/',\n description: 'Documentation in .claude/docs/. Keeps all Claude-related files together.',\n },\n {\n value: 'readme-only' as const,\n name: 'README files only',\n description: 'Only README.md files, no separate docs folder. Good for simple projects.',\n },\n];\n\n/**\n * Test file naming pattern options\n */\nexport const TEST_PATTERN_OPTIONS = [\n {\n value: '*.test.ts',\n name: '*.test.ts (Recommended)',\n description: 'Standard test pattern (foo.test.ts)',\n },\n {\n value: '*.spec.ts',\n name: '*.spec.ts',\n description: 'Spec pattern common in Angular (foo.spec.ts)',\n },\n {\n value: '*.test.tsx',\n name: '*.test.tsx',\n description: 'For React component tests (Component.test.tsx)',\n },\n];\n\n/**\n * GitHub Actions workflow templates\n */\nexport const GITHUB_WORKFLOW_TEMPLATES: GithubWorkflowTemplate[] = [\n // CI Workflows\n {\n id: 'ci-node',\n name: 'Node.js CI',\n description: 'Run tests, lint, and type-check on push and PR',\n filename: 'ci.yml',\n category: 'ci',\n suitedFor: ['node', 'typescript', 'javascript'],\n recommended: true,\n },\n {\n id: 'ci-node-matrix',\n name: 'Node.js CI (Matrix)',\n description: 'Test across multiple Node.js versions (18, 20, 22)',\n filename: 'ci-matrix.yml',\n category: 'ci',\n suitedFor: ['node', 'typescript', 'library'],\n },\n {\n id: 'ci-pnpm',\n name: 'PNPM CI',\n description: 'CI workflow optimized for PNPM with caching',\n filename: 'ci-pnpm.yml',\n category: 'ci',\n suitedFor: ['pnpm', 'monorepo'],\n recommended: true,\n },\n {\n id: 'ci-turborepo',\n name: 'Turborepo CI',\n description: 'CI for Turborepo monorepos with remote caching',\n filename: 'ci-turborepo.yml',\n category: 'ci',\n suitedFor: ['turborepo', 'monorepo'],\n },\n\n // Quality Workflows\n {\n id: 'quality-biome',\n name: 'Biome Quality Check',\n description: 'Run Biome linter and formatter checks',\n filename: 'quality-biome.yml',\n category: 'quality',\n suitedFor: ['biome', 'typescript'],\n },\n {\n id: 'quality-eslint-prettier',\n name: 'ESLint + Prettier',\n description: 'Run ESLint and Prettier checks',\n filename: 'quality-eslint.yml',\n category: 'quality',\n suitedFor: ['eslint', 'prettier'],\n },\n {\n id: 'quality-typecheck',\n name: 'TypeScript Type Check',\n description: 'Run TypeScript type checking only',\n filename: 'typecheck.yml',\n category: 'quality',\n suitedFor: ['typescript'],\n },\n\n // Security Workflows\n {\n id: 'security-codeql',\n name: 'CodeQL Analysis',\n description: 'GitHub CodeQL security scanning',\n filename: 'codeql.yml',\n category: 'security',\n suitedFor: ['javascript', 'typescript'],\n },\n {\n id: 'security-dependency-review',\n name: 'Dependency Review',\n description: 'Review dependencies for vulnerabilities on PRs',\n filename: 'dependency-review.yml',\n category: 'security',\n },\n {\n id: 'security-audit',\n name: 'NPM Audit',\n description: 'Run npm audit for security vulnerabilities',\n filename: 'npm-audit.yml',\n category: 'security',\n suitedFor: ['node', 'npm'],\n },\n\n // CD Workflows\n {\n id: 'cd-vercel',\n name: 'Vercel Deploy',\n description: 'Deploy to Vercel on push to main',\n filename: 'deploy-vercel.yml',\n category: 'cd',\n suitedFor: ['nextjs', 'react', 'vercel'],\n },\n {\n id: 'cd-cloudflare-pages',\n name: 'Cloudflare Pages Deploy',\n description: 'Deploy to Cloudflare Pages',\n filename: 'deploy-cloudflare.yml',\n category: 'cd',\n suitedFor: ['astro', 'cloudflare'],\n },\n {\n id: 'cd-docker',\n name: 'Docker Build & Push',\n description: 'Build and push Docker image to registry',\n filename: 'docker-build.yml',\n category: 'cd',\n suitedFor: ['docker', 'api'],\n },\n\n // Release Workflows\n {\n id: 'release-npm',\n name: 'NPM Publish',\n description: 'Publish package to NPM on release',\n filename: 'npm-publish.yml',\n category: 'release',\n suitedFor: ['library', 'npm'],\n },\n {\n id: 'release-changesets',\n name: 'Changesets Release',\n description: 'Automated versioning with Changesets',\n filename: 'changesets.yml',\n category: 'release',\n suitedFor: ['monorepo', 'library'],\n },\n {\n id: 'release-semantic',\n name: 'Semantic Release',\n description: 'Automated semantic versioning and changelog',\n filename: 'semantic-release.yml',\n category: 'release',\n suitedFor: ['library'],\n },\n];\n\n/**\n * Bundle-specific folder recommendations\n */\nexport const BUNDLE_FOLDER_RECOMMENDATIONS: BundleFolderRecommendations[] = [\n // Testing bundles\n {\n trigger: 'testing-complete',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n },\n reason:\n 'Complete testing suite works best with a dedicated test/ folder to organize unit, integration, and E2E tests separately.',\n },\n {\n trigger: 'testing-minimal',\n recommendations: {\n tests: {\n location: 'colocated',\n pattern: '*.test.ts',\n },\n },\n reason:\n 'Minimal testing with colocated tests keeps test files close to source for simpler projects.',\n },\n\n // Planning bundles\n {\n trigger: 'planning-complete',\n recommendations: {\n planning: {\n location: 'claude-sessions',\n commitToGit: false,\n },\n },\n reason:\n 'Complete planning workflow uses .claude/sessions/planning/ to keep PDRs, tech-analysis, and TODOs organized.',\n },\n\n // Documentation bundles\n {\n trigger: 'documentation-complete',\n recommendations: {\n docs: {\n location: 'docs-root',\n },\n },\n reason:\n 'Documentation bundle uses standard docs/ folder for maximum compatibility with documentation tools.',\n },\n\n // Stack-specific recommendations\n {\n trigger: 'react-tanstack-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.tsx',\n },\n },\n reason: 'React projects benefit from *.test.tsx pattern for component tests with JSX support.',\n },\n {\n trigger: 'nextjs-prisma-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n cicd: {\n location: 'github-workflows',\n workflows: ['ci-node', 'cd-vercel'],\n },\n },\n reason: 'Next.js projects typically deploy to Vercel with standard Node.js CI.',\n },\n {\n trigger: 'hono-drizzle-stack',\n recommendations: {\n tests: {\n location: 'test-folder-root',\n pattern: '*.test.ts',\n },\n cicd: {\n location: 'github-workflows',\n workflows: ['ci-pnpm', 'security-audit'],\n },\n },\n reason: 'API stacks benefit from security audits and optimized PNPM CI.',\n },\n];\n\n/**\n * Get workflow templates by category\n */\nexport function getWorkflowsByCategory(\n category: GithubWorkflowTemplate['category']\n): GithubWorkflowTemplate[] {\n return GITHUB_WORKFLOW_TEMPLATES.filter((w) => w.category === category);\n}\n\n/**\n * Get recommended workflows based on detected technologies\n */\nexport function getRecommendedWorkflows(technologies: string[]): GithubWorkflowTemplate[] {\n const techSet = new Set(technologies.map((t) => t.toLowerCase()));\n\n return GITHUB_WORKFLOW_TEMPLATES.filter((workflow) => {\n if (workflow.recommended) return true;\n if (!workflow.suitedFor) return false;\n return workflow.suitedFor.some((tech) => techSet.has(tech.toLowerCase()));\n });\n}\n\n/**\n * Get folder recommendations for selected bundles\n */\nexport function getFolderRecommendationsForBundles(\n bundleIds: string[]\n): BundleFolderRecommendations[] {\n const bundleSet = new Set(bundleIds);\n return BUNDLE_FOLDER_RECOMMENDATIONS.filter((rec) => bundleSet.has(rec.trigger));\n}\n\n/**\n * Merge folder recommendations with defaults\n */\nexport function mergeFolderPreferences(\n recommendations: BundleFolderRecommendations[]\n): FolderPreferences {\n const merged = { ...DEFAULT_FOLDER_PREFERENCES };\n\n for (const rec of recommendations) {\n if (rec.recommendations.tests) {\n merged.tests = { ...merged.tests, ...rec.recommendations.tests };\n }\n if (rec.recommendations.planning) {\n merged.planning = { ...merged.planning, ...rec.recommendations.planning };\n }\n if (rec.recommendations.docs) {\n merged.docs = { ...merged.docs, ...rec.recommendations.docs };\n }\n if (rec.recommendations.cicd) {\n merged.cicd = {\n ...merged.cicd,\n ...rec.recommendations.cicd,\n // Merge workflows without duplicates\n workflows: [\n ...new Set([\n ...(merged.cicd?.workflows || []),\n ...(rec.recommendations.cicd.workflows || []),\n ]),\n ],\n };\n }\n }\n\n return merged;\n}\n","/**\n * Hook configuration prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { HookConfig } from '../../types/config.js';\n\ntype HookType = 'notification' | 'stop' | 'subagentStop' | 'custom';\n\ninterface HookPromptOptions {\n defaults?: Partial<HookConfig>;\n}\n\n/**\n * Prompt for hook configuration\n */\nexport async function promptHookConfig(options?: HookPromptOptions): Promise<HookConfig> {\n logger.section('Hook Configuration', '🪝');\n\n const enableHooks = await confirm({\n message: 'Do you want to configure hooks?',\n default: true,\n });\n\n if (!enableHooks) {\n return {\n enabled: false,\n };\n }\n\n // Select which hooks to configure\n const selectedHooks = await checkbox({\n message: 'Which hooks do you want to configure?',\n choices: [\n {\n name: 'Notification hook (alerts when Claude needs attention)',\n value: 'notification' as HookType,\n checked: true,\n },\n {\n name: 'Stop hook (plays sound when Claude stops)',\n value: 'stop' as HookType,\n checked: false,\n },\n {\n name: 'Subagent stop hook (plays sound when subagent completes)',\n value: 'subagentStop' as HookType,\n checked: false,\n },\n ],\n });\n\n const config: HookConfig = {\n enabled: true,\n };\n\n // Configure notification hook\n if (selectedHooks.includes('notification')) {\n config.notification = await promptNotificationHook(options?.defaults?.notification);\n }\n\n // Configure stop hook\n if (selectedHooks.includes('stop')) {\n config.stop = await promptStopHook();\n }\n\n // Configure subagent stop hook\n if (selectedHooks.includes('subagentStop')) {\n config.subagentStop = await promptSubagentStopHook();\n }\n\n return config;\n}\n\n/**\n * Prompt for notification hook configuration\n */\nasync function promptNotificationHook(\n defaults?: HookConfig['notification']\n): Promise<HookConfig['notification']> {\n logger.newline();\n logger.info('Notification Hook Configuration');\n\n const notificationTypes = await checkbox({\n message: 'Select notification types:',\n choices: [\n {\n name: 'Desktop notifications (notify-send / terminal-notifier)',\n value: 'desktop',\n checked: defaults?.desktop ?? true,\n },\n {\n name: 'Audio notifications (text-to-speech)',\n value: 'audio',\n checked: defaults?.audio ?? false,\n },\n ],\n });\n\n let customCommand: string | undefined;\n const wantCustom = await confirm({\n message: 'Do you want to add a custom notification command?',\n default: false,\n });\n\n if (wantCustom) {\n customCommand = await input({\n message: 'Custom command (receives notification text as argument):',\n default: defaults?.customCommand,\n });\n }\n\n return {\n desktop: notificationTypes.includes('desktop'),\n audio: notificationTypes.includes('audio'),\n customCommand: customCommand || undefined,\n };\n}\n\n/**\n * Prompt for stop hook configuration\n */\nasync function promptStopHook(): Promise<HookConfig['stop']> {\n logger.newline();\n logger.info('Stop Hook Configuration');\n\n const soundType = await select({\n message: 'What should happen when Claude stops?',\n choices: [\n { name: 'Play beep sound', value: 'beep' },\n { name: 'Play custom sound', value: 'custom' },\n { name: 'Run custom command', value: 'command' },\n ],\n default: 'beep',\n });\n\n if (soundType === 'beep') {\n return { beep: true };\n }\n\n if (soundType === 'custom') {\n const soundPath = await input({\n message: 'Path to sound file:',\n validate: (v) => (v.trim() ? true : 'Please enter a valid path'),\n });\n return { customSound: soundPath };\n }\n\n const customCommand = await input({\n message: 'Custom command to run:',\n validate: (v) => (v.trim() ? true : 'Please enter a command'),\n });\n return { customCommand };\n}\n\n/**\n * Prompt for subagent stop hook configuration\n */\nasync function promptSubagentStopHook(): Promise<HookConfig['subagentStop']> {\n logger.newline();\n logger.info('Subagent Stop Hook Configuration');\n\n const soundType = await select({\n message: 'What should happen when a subagent completes?',\n choices: [\n { name: 'Play short beep', value: 'beep' },\n { name: 'Play custom sound', value: 'custom' },\n { name: 'Run custom command', value: 'command' },\n ],\n default: 'beep',\n });\n\n if (soundType === 'beep') {\n return { beep: true };\n }\n\n if (soundType === 'custom') {\n const soundPath = await input({\n message: 'Path to sound file:',\n validate: (v) => (v.trim() ? true : 'Please enter a valid path'),\n });\n return { customSound: soundPath };\n }\n\n const customCommand = await input({\n message: 'Custom command to run:',\n validate: (v) => (v.trim() ? true : 'Please enter a command'),\n });\n return { customCommand };\n}\n\n/**\n * Show hook configuration summary\n */\nexport function showHookSummary(config: HookConfig): void {\n logger.newline();\n logger.subtitle('Hook Configuration Summary');\n\n if (!config.enabled) {\n logger.info('Hooks: Disabled');\n return;\n }\n\n if (config.notification) {\n const notifTypes: string[] = [];\n if (config.notification.desktop) notifTypes.push('desktop');\n if (config.notification.audio) notifTypes.push('audio');\n if (config.notification.customCommand) notifTypes.push('custom');\n logger.keyValue('Notification', notifTypes.join(', ') || 'none');\n }\n\n if (config.stop) {\n if (config.stop.beep) logger.keyValue('Stop', 'beep');\n else if (config.stop.customSound) logger.keyValue('Stop', `sound: ${config.stop.customSound}`);\n else if (config.stop.customCommand)\n logger.keyValue('Stop', `command: ${config.stop.customCommand}`);\n }\n\n if (config.subagentStop) {\n if (config.subagentStop.beep) logger.keyValue('Subagent Stop', 'beep');\n else if (config.subagentStop.customSound)\n logger.keyValue('Subagent Stop', `sound: ${config.subagentStop.customSound}`);\n else if (config.subagentStop.customCommand)\n logger.keyValue('Subagent Stop', `command: ${config.subagentStop.customCommand}`);\n }\n}\n\n/**\n * Confirm hook configuration\n */\nexport async function confirmHookConfig(config: HookConfig): Promise<boolean> {\n showHookSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this hook configuration correct?',\n default: true,\n });\n}\n","/**\n * Granular item-by-item selection prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory, ModuleDefinition } from '../../types/modules.js';\n\nexport type ItemAction = 'install' | 'skip';\nexport type BatchAction = 'all' | 'none' | 'preset' | 'continue';\n\ninterface CategorySelectionResult {\n category: ModuleCategory;\n selectedItems: string[];\n skippedItems: string[];\n}\n\n/**\n * Prompt for a single item installation\n */\nexport async function promptSingleItem(\n item: ModuleDefinition,\n options?: {\n defaultInstall?: boolean;\n showDescription?: boolean;\n }\n): Promise<ItemAction> {\n const defaultValue = options?.defaultInstall ?? true;\n\n if (options?.showDescription && item.description) {\n logger.note(item.description);\n }\n\n const install = await confirm({\n message: `Install ${colors.primary(item.name)}?`,\n default: defaultValue,\n });\n\n return install ? 'install' : 'skip';\n}\n\n/**\n * Prompt for batch action before starting category selection\n */\nexport async function promptBatchAction(\n category: ModuleCategory,\n totalItems: number,\n hasPreset?: boolean\n): Promise<BatchAction> {\n const choices: Array<{ name: string; value: BatchAction; description: string }> = [\n {\n name: 'Install all (recommended)',\n value: 'all',\n description: `Install all ${totalItems} ${category}`,\n },\n {\n name: 'Select one by one',\n value: 'continue',\n description: `Review each of the ${totalItems} items`,\n },\n {\n name: 'Skip all',\n value: 'none',\n description: `Skip all ${category}`,\n },\n ];\n\n if (hasPreset) {\n choices.splice(1, 0, {\n name: 'Use preset for this category',\n value: 'preset',\n description: 'Use the preset selection for this category',\n });\n }\n\n return select<BatchAction>({\n message: `${capitalize(category)} selection (${totalItems} available):`,\n choices,\n default: 'all',\n });\n}\n\n/**\n * Select items from a category one by one\n */\nexport async function selectItemsFromCategory(\n category: ModuleCategory,\n items: ModuleDefinition[],\n options?: {\n preselected?: string[];\n showDescriptions?: boolean;\n }\n): Promise<CategorySelectionResult> {\n const selectedItems: string[] = [];\n const skippedItems: string[] = [];\n\n logger.newline();\n logger.subtitle(`${capitalize(category)} Selection`);\n logger.info(`${items.length} ${category} available`);\n logger.newline();\n\n // Check for batch action first\n const batchAction = await promptBatchAction(\n category,\n items.length,\n options?.preselected && options.preselected.length > 0\n );\n\n if (batchAction === 'all') {\n return {\n category,\n selectedItems: items.map((i) => i.id),\n skippedItems: [],\n };\n }\n\n if (batchAction === 'none') {\n return {\n category,\n selectedItems: [],\n skippedItems: items.map((i) => i.id),\n };\n }\n\n if (batchAction === 'preset' && options?.preselected) {\n const preselectedSet = new Set(options.preselected);\n return {\n category,\n selectedItems: items.filter((i) => preselectedSet.has(i.id)).map((i) => i.id),\n skippedItems: items.filter((i) => !preselectedSet.has(i.id)).map((i) => i.id),\n };\n }\n\n // One by one selection\n const remainingItems = [...items];\n let currentIndex = 0;\n\n while (currentIndex < remainingItems.length) {\n const item = remainingItems[currentIndex];\n const remaining = remainingItems.length - currentIndex - 1;\n const isPreselected = options?.preselected?.includes(item.id);\n\n // Show progress\n const progress = colors.muted(`[${currentIndex + 1}/${remainingItems.length}]`);\n console.log(`\\n${progress} ${colors.bold(item.name)}`);\n\n if (options?.showDescriptions && item.description) {\n logger.note(item.description);\n }\n\n // Ask with shortcuts\n const action = await promptItemWithShortcuts(item, {\n defaultInstall: isPreselected,\n remainingCount: remaining,\n });\n\n switch (action) {\n case 'install':\n selectedItems.push(item.id);\n currentIndex++;\n break;\n\n case 'skip':\n skippedItems.push(item.id);\n currentIndex++;\n break;\n\n case 'install-rest':\n selectedItems.push(item.id);\n // Install all remaining\n for (let i = currentIndex + 1; i < remainingItems.length; i++) {\n selectedItems.push(remainingItems[i].id);\n }\n currentIndex = remainingItems.length;\n break;\n\n case 'skip-rest':\n skippedItems.push(item.id);\n // Skip all remaining\n for (let i = currentIndex + 1; i < remainingItems.length; i++) {\n skippedItems.push(remainingItems[i].id);\n }\n currentIndex = remainingItems.length;\n break;\n }\n }\n\n return {\n category,\n selectedItems,\n skippedItems,\n };\n}\n\ntype ItemActionExtended = 'install' | 'skip' | 'install-rest' | 'skip-rest';\n\n/**\n * Prompt for item with keyboard shortcuts\n */\nasync function promptItemWithShortcuts(\n item: ModuleDefinition,\n options: {\n defaultInstall?: boolean;\n remainingCount: number;\n }\n): Promise<ItemActionExtended> {\n const choices: Array<{ name: string; value: ItemActionExtended }> = [\n { name: 'Yes, install', value: 'install' },\n { name: 'No, skip', value: 'skip' },\n ];\n\n if (options.remainingCount > 0) {\n choices.push(\n {\n name: `Install all remaining (${options.remainingCount + 1} items)`,\n value: 'install-rest',\n },\n {\n name: `Skip all remaining (${options.remainingCount + 1} items)`,\n value: 'skip-rest',\n }\n );\n }\n\n return select<ItemActionExtended>({\n message: `Install ${item.name}?`,\n choices,\n default: options.defaultInstall !== false ? 'install' : 'skip',\n });\n}\n\n/**\n * Show selection summary for a category\n */\nexport function showCategorySelectionSummary(result: CategorySelectionResult): void {\n const { category, selectedItems, skippedItems } = result;\n\n logger.newline();\n logger.subtitle(`${capitalize(category)} Summary`);\n\n if (selectedItems.length > 0) {\n logger.success(`Selected (${selectedItems.length}): ${selectedItems.join(', ')}`);\n }\n\n if (skippedItems.length > 0) {\n logger.info(`Skipped (${skippedItems.length}): ${colors.muted(skippedItems.join(', '))}`);\n }\n}\n\n/**\n * Confirm category selection\n */\nexport async function confirmCategorySelection(result: CategorySelectionResult): Promise<boolean> {\n showCategorySelectionSummary(result);\n logger.newline();\n\n return confirm({\n message: 'Is this selection correct?',\n default: true,\n });\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * MCP server configuration prompts\n */\n\nimport { MCP_SERVERS, getMcpServer } from '../../constants/mcp-servers.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, input, password, select } from '../../lib/utils/prompt-cancel.js';\nimport type { McpConfig } from '../../types/config.js';\nimport type { McpConfigField, McpInstallation, McpServerDefinition } from '../../types/mcp.js';\n\ninterface McpPromptOptions {\n defaults?: Partial<McpConfig>;\n}\n\n/** Track servers with skipped configuration */\nexport interface McpConfigResult {\n config: McpConfig;\n skippedConfigs: SkippedMcpConfig[];\n}\n\n/** Information about a skipped MCP server configuration */\nexport interface SkippedMcpConfig {\n serverId: string;\n serverName: string;\n skippedFields: SkippedField[];\n installInstructions?: string;\n}\n\n/** A single skipped configuration field */\nexport interface SkippedField {\n name: string;\n description: string;\n envVar?: string;\n howToGet?: string;\n}\n\n/**\n * Prompt for MCP configuration\n * Returns both the config and information about any skipped configurations\n */\nexport async function promptMcpConfig(options?: McpPromptOptions): Promise<McpConfigResult> {\n logger.section('MCP Servers', '🔌');\n\n const enableMcp = await confirm({\n message: 'Do you want to configure MCP servers?',\n default: true,\n });\n\n if (!enableMcp) {\n return {\n config: {\n level: 'project',\n servers: [],\n },\n skippedConfigs: [],\n };\n }\n\n // Select installation level\n const level = await select({\n message: 'Where should MCP servers be configured?',\n choices: [\n {\n name: 'Project level (.claude/settings.local.json)',\n value: 'project' as const,\n description: 'Specific to this project',\n },\n {\n name: 'User level (~/.claude/settings.json)',\n value: 'user' as const,\n description: 'Available in all projects',\n },\n ],\n default: options?.defaults?.level || 'project',\n });\n\n // Group servers by category for display\n const serversByCategory = groupServersByCategory();\n const selectedServerIds: string[] = [];\n\n logger.newline();\n logger.info('Select MCP servers to install:');\n logger.newline();\n\n // Show grouped selection\n for (const [category, servers] of Object.entries(serversByCategory)) {\n const choices = servers.map((s) => ({\n name: `${s.name} - ${s.description}`,\n value: s.id,\n checked: options?.defaults?.servers?.some((i) => i.serverId === s.id) ?? false,\n }));\n\n const categoryLabel = formatCategory(category);\n const selected = await checkbox({\n message: `${categoryLabel}:`,\n choices,\n });\n\n selectedServerIds.push(...selected);\n }\n\n // Ask about custom server\n const wantCustom = await confirm({\n message: 'Do you want to add a custom MCP server?',\n default: false,\n });\n\n const installations: McpInstallation[] = [];\n const skippedConfigs: SkippedMcpConfig[] = [];\n\n // Configure selected servers\n for (const serverId of selectedServerIds) {\n const server = getMcpServer(serverId);\n if (server) {\n const result = await configureServer(server, level);\n installations.push(result.installation);\n if (result.skippedConfig) {\n skippedConfigs.push(result.skippedConfig);\n }\n }\n }\n\n // Configure custom server\n if (wantCustom) {\n const customInstallation = await promptCustomServer(level);\n if (customInstallation) {\n installations.push(customInstallation);\n }\n }\n\n return {\n config: {\n level,\n servers: installations,\n },\n skippedConfigs,\n };\n}\n\n/**\n * Group servers by category\n */\nfunction groupServersByCategory(): Record<string, McpServerDefinition[]> {\n const groups: Record<string, McpServerDefinition[]> = {};\n\n for (const server of MCP_SERVERS) {\n if (!groups[server.category]) {\n groups[server.category] = [];\n }\n groups[server.category].push(server);\n }\n\n return groups;\n}\n\n/**\n * Format category name for display\n */\nfunction formatCategory(category: string): string {\n const labels: Record<string, string> = {\n documentation: '📚 Documentation',\n database: '🗄️ Database',\n cache: '💾 Cache & Key-Value',\n 'version-control': '🔄 Version Control',\n deployment: '🚀 Deployment',\n infrastructure: '🏗️ Infrastructure',\n 'project-mgmt': '📋 Project Management',\n monitoring: '📊 Monitoring',\n testing: '🧪 Testing & Browser',\n security: '🔐 Security',\n communication: '💬 Communication',\n design: '🎨 Design',\n payments: '💳 Payments',\n search: '🔍 Search',\n ai: '🤖 AI & ML',\n custom: '⚙️ Custom',\n };\n return labels[category] || category;\n}\n\n/** Result from configuring a single server */\ninterface ConfigureServerResult {\n installation: McpInstallation;\n skippedConfig: SkippedMcpConfig | null;\n}\n\n/**\n * Configure a single MCP server\n * Fields are optional - skipped fields are tracked for post-install instructions\n */\nasync function configureServer(\n server: McpServerDefinition,\n level: 'user' | 'project'\n): Promise<ConfigureServerResult> {\n const config: Record<string, unknown> = {};\n const skippedFields: SkippedField[] = [];\n\n if (server.requiresConfig && server.configFields) {\n logger.newline();\n logger.info(`Configuring ${colors.primary(server.name)}...`);\n logger.info(\n colors.muted(\n ' (Press Enter to skip optional fields - instructions will be shown at the end)'\n )\n );\n\n for (const field of server.configFields) {\n const result = await promptConfigFieldOptional(field);\n if (result.value !== undefined && result.value !== '') {\n config[field.name] = result.value;\n } else if (result.skipped) {\n skippedFields.push({\n name: field.name,\n description: field.description,\n envVar: field.envVar,\n });\n }\n }\n }\n\n const installation: McpInstallation = {\n serverId: server.id,\n level,\n config,\n };\n\n const skippedConfig: SkippedMcpConfig | null =\n skippedFields.length > 0\n ? {\n serverId: server.id,\n serverName: server.name,\n skippedFields,\n installInstructions: server.installInstructions,\n }\n : null;\n\n return { installation, skippedConfig };\n}\n\n/** Result from prompting a config field */\ninterface PromptFieldResult {\n value: string | boolean | number | undefined;\n skipped: boolean;\n}\n\n/**\n * Prompt for a config field value (all fields are optional)\n * Returns both the value and whether it was skipped\n */\nasync function promptConfigFieldOptional(field: McpConfigField): Promise<PromptFieldResult> {\n const envHint = field.envVar ? colors.muted(` (env: ${field.envVar})`) : '';\n const optionalHint = colors.muted(' [optional]');\n\n // Try to get from environment\n const envValue = field.envVar ? process.env[field.envVar] : undefined;\n\n if (field.type === 'boolean') {\n const value = await confirm({\n message: `${field.description}${envHint}:`,\n default: (field.default as boolean) ?? false,\n });\n return { value, skipped: false };\n }\n\n if (field.type === 'number') {\n const value = await input({\n message: `${field.description}${envHint}${optionalHint}:`,\n default: envValue || (field.default as string) || '',\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n if (Number.isNaN(Number(value))) {\n logger.warn('Invalid number, skipping field');\n return { value: undefined, skipped: true };\n }\n return { value: Number(value), skipped: false };\n }\n\n // String type - use password input for sensitive fields\n const isSensitive =\n field.name.toLowerCase().includes('token') ||\n field.name.toLowerCase().includes('key') ||\n field.name.toLowerCase().includes('secret') ||\n field.name.toLowerCase().includes('password');\n\n if (isSensitive) {\n if (envValue) {\n const useEnv = await confirm({\n message: `Found ${field.envVar} in environment. Use it?`,\n default: true,\n });\n if (useEnv) return { value: envValue, skipped: false };\n }\n\n const value = await password({\n message: `${field.description}${envHint}${optionalHint}:`,\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n return { value, skipped: false };\n }\n\n const value = await input({\n message: `${field.description}${envHint}${optionalHint}:`,\n default: envValue || (field.default as string) || '',\n });\n if (!value.trim()) {\n return { value: undefined, skipped: true };\n }\n return { value, skipped: false };\n}\n\n/**\n * Prompt for custom MCP server\n */\nasync function promptCustomServer(level: 'user' | 'project'): Promise<McpInstallation | null> {\n logger.newline();\n logger.info('Configure custom MCP server');\n\n const serverId = await input({\n message: 'Server ID (unique identifier):',\n validate: (v) => {\n if (!v.trim()) return 'Server ID is required';\n if (!/^[a-z0-9-]+$/.test(v)) return 'Use lowercase letters, numbers, and dashes only';\n return true;\n },\n });\n\n const packageName = await input({\n message: 'NPM package or command:',\n validate: (v) => (v.trim() ? true : 'Package name is required'),\n });\n\n const hasConfig = await confirm({\n message: 'Does this server require configuration?',\n default: false,\n });\n\n const config: Record<string, unknown> = {\n package: packageName,\n };\n\n if (hasConfig) {\n let addMore = true;\n while (addMore) {\n const fieldName = await input({\n message: 'Config field name:',\n });\n\n if (fieldName.trim()) {\n const fieldValue = await input({\n message: `Value for ${fieldName}:`,\n });\n config[fieldName] = fieldValue;\n }\n\n addMore = await confirm({\n message: 'Add another config field?',\n default: false,\n });\n }\n }\n\n return {\n serverId,\n level,\n config,\n };\n}\n\n/**\n * Show MCP configuration summary\n */\nexport function showMcpSummary(config: McpConfig): void {\n logger.newline();\n logger.subtitle('MCP Configuration Summary');\n\n if (config.servers.length === 0) {\n logger.info('No MCP servers configured');\n return;\n }\n\n logger.keyValue('Level', config.level === 'user' ? 'User (~/.claude/)' : 'Project (.claude/)');\n logger.newline();\n\n for (const installation of config.servers) {\n const server = getMcpServer(installation.serverId);\n const name = server?.name || installation.serverId;\n logger.item(name);\n\n // Show non-sensitive config\n for (const [key, value] of Object.entries(installation.config)) {\n if (\n key.toLowerCase().includes('token') ||\n key.toLowerCase().includes('key') ||\n key.toLowerCase().includes('secret')\n ) {\n logger.keyValue(key, '***', 1);\n } else {\n logger.keyValue(key, String(value), 1);\n }\n }\n }\n}\n\n/**\n * Confirm MCP configuration\n */\nexport async function confirmMcpConfig(config: McpConfig): Promise<boolean> {\n showMcpSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this MCP configuration correct?',\n default: true,\n });\n}\n\n/**\n * Show post-install instructions for skipped MCP configurations\n * This should be called at the end of the installation process\n */\nexport function showSkippedMcpInstructions(\n skippedConfigs: SkippedMcpConfig[],\n mcpLevel: 'user' | 'project'\n): void {\n if (skippedConfigs.length === 0) {\n return;\n }\n\n logger.newline();\n logger.title('MCP Server Configuration Required');\n logger.newline();\n logger.info('Some MCP servers need additional configuration.');\n logger.info('Add the required values to complete the setup:');\n\n const configFile =\n mcpLevel === 'user'\n ? colors.primary('~/.claude/settings.json')\n : colors.primary('.claude/settings.local.json');\n\n logger.newline();\n logger.keyValue('Config file', configFile);\n\n for (const skipped of skippedConfigs) {\n logger.newline();\n logger.subtitle(skipped.serverName);\n\n if (skipped.installInstructions) {\n logger.info(skipped.installInstructions);\n }\n\n logger.newline();\n logger.info('Missing configuration:');\n\n for (const field of skipped.skippedFields) {\n const envInfo = field.envVar ? colors.muted(` (or set env: ${field.envVar})`) : '';\n logger.item(`${colors.warning(field.name)}: ${field.description}${envInfo}`);\n }\n\n // Show example JSON snippet\n logger.newline();\n logger.info('Add to mcpServers in your config file:');\n logger.raw(colors.muted(' {'));\n logger.raw(colors.muted(` \"${skipped.serverId}\": {`));\n for (const field of skipped.skippedFields) {\n logger.raw(colors.muted(` \"${field.name}\": \"<your-${field.name}>\",`));\n }\n logger.raw(colors.muted(' }'));\n logger.raw(colors.muted(' }'));\n }\n\n logger.newline();\n logger.info(\n colors.muted(\n 'Tip: You can also use environment variables for sensitive values like tokens and keys.'\n )\n );\n}\n","/**\n * Permission configuration prompts\n */\n\nimport {\n PERMISSION_PRESETS,\n PRESET_DESCRIPTIONS,\n generateAllowRules,\n generateDenyRules,\n} from '../../constants/permissions.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n BashPermissions,\n CustomPermissions,\n FilePermissions,\n GitPermissions,\n PermissionPreset,\n PermissionsConfig,\n WebPermissions,\n} from '../../types/permissions.js';\n\ninterface PermissionsPromptOptions {\n defaults?: Partial<PermissionsConfig>;\n}\n\n/**\n * Prompt for permissions configuration\n */\nexport async function promptPermissionsConfig(\n options?: PermissionsPromptOptions\n): Promise<PermissionsConfig> {\n logger.section('Permissions', '🔐');\n\n const configurePermissions = await confirm({\n message: 'Do you want to configure Claude Code permissions?',\n default: true,\n });\n\n if (!configurePermissions) {\n return {\n preset: 'default',\n ...PERMISSION_PRESETS.default,\n custom: { allow: [], deny: [] },\n };\n }\n\n // Select preset or custom\n const preset = await promptPresetSelection();\n\n if (preset !== 'custom') {\n const presetConfig = PERMISSION_PRESETS[preset];\n\n // Ask if they want to customize the preset\n const customize = await confirm({\n message: 'Do you want to customize these permissions?',\n default: false,\n });\n\n if (!customize) {\n return {\n preset,\n ...presetConfig,\n custom: { allow: [], deny: [] },\n };\n }\n }\n\n // Custom configuration\n logger.newline();\n logger.info('Configure permissions for each category:');\n\n const files = await promptFilePermissions(options?.defaults?.files);\n const git = await promptGitPermissions(options?.defaults?.git);\n const bash = await promptBashPermissions(options?.defaults?.bash);\n const web = await promptWebPermissions(options?.defaults?.web);\n const custom = await promptCustomPermissions(options?.defaults?.custom);\n\n return {\n preset: 'custom',\n files,\n git,\n bash,\n web,\n custom,\n };\n}\n\n/**\n * Prompt for permission preset selection\n */\nasync function promptPresetSelection(): Promise<PermissionPreset> {\n const choices = Object.entries(PRESET_DESCRIPTIONS).map(([key, info]) => ({\n name: info.name,\n value: key as PermissionPreset,\n description: info.description,\n }));\n\n return select({\n message: 'Select a permission preset:',\n choices,\n default: 'default',\n });\n}\n\n/**\n * Prompt for file permissions\n */\nasync function promptFilePermissions(\n defaults?: Partial<FilePermissions>\n): Promise<FilePermissions> {\n logger.newline();\n logger.info(colors.bold('📁 File Operations'));\n\n const readAll = await confirm({\n message: 'Allow Read on all files?',\n default: defaults?.readAll ?? true,\n });\n\n const writeCode = await confirm({\n message: 'Allow Write on code files (*.ts, *.js, *.tsx, *.jsx, etc.)?',\n default: defaults?.writeCode ?? true,\n });\n\n const writeConfig = await confirm({\n message: 'Allow Write on config files (*.json, *.yaml, *.toml)?',\n default: defaults?.writeConfig ?? true,\n });\n\n const writeMarkdown = await confirm({\n message: 'Allow Write on markdown files (*.md)?',\n default: defaults?.writeMarkdown ?? true,\n });\n\n const writeOther = await confirm({\n message: 'Allow Write on other files (*.css, *.html, *.sql, etc.)?',\n default: defaults?.writeOther ?? false,\n });\n\n const editTool = await confirm({\n message: 'Allow Edit tool (inline file editing)?',\n default: defaults?.editTool ?? true,\n });\n\n return {\n readAll,\n writeCode,\n writeConfig,\n writeMarkdown,\n writeOther,\n editTool,\n };\n}\n\n/**\n * Prompt for git permissions\n */\nasync function promptGitPermissions(defaults?: Partial<GitPermissions>): Promise<GitPermissions> {\n logger.newline();\n logger.info(colors.bold('🔄 Git Operations'));\n\n const readOnly = await confirm({\n message: 'Allow git read operations (status, diff, log)?',\n default: defaults?.readOnly ?? true,\n });\n\n const staging = await confirm({\n message: 'Allow git add (staging)?',\n default: defaults?.staging ?? false,\n });\n\n const commit = await confirm({\n message: 'Allow git commit?',\n default: defaults?.commit ?? false,\n });\n\n let push = false;\n if (commit) {\n push = await confirm({\n message: '⚠️ Allow git push? (use with caution)',\n default: defaults?.push ?? false,\n });\n }\n\n const branching = await confirm({\n message: 'Allow git branching (checkout, branch, merge)?',\n default: defaults?.branching ?? false,\n });\n\n return {\n readOnly,\n staging,\n commit,\n push,\n branching,\n };\n}\n\n/**\n * Prompt for bash permissions\n */\nasync function promptBashPermissions(\n defaults?: Partial<BashPermissions>\n): Promise<BashPermissions> {\n logger.newline();\n logger.info(colors.bold('💻 Bash/Terminal Operations'));\n\n const packageManager = await confirm({\n message: 'Allow package manager commands (pnpm, npm, yarn)?',\n default: defaults?.packageManager ?? true,\n });\n\n const testing = await confirm({\n message: 'Allow test commands (vitest, jest, playwright)?',\n default: defaults?.testing ?? true,\n });\n\n const building = await confirm({\n message: 'Allow build commands (tsc, vite build, etc.)?',\n default: defaults?.building ?? true,\n });\n\n const docker = await confirm({\n message: 'Allow docker commands?',\n default: defaults?.docker ?? false,\n });\n\n const arbitrary = await confirm({\n message: '⚠️ Allow arbitrary bash commands? (dangerous)',\n default: defaults?.arbitrary ?? false,\n });\n\n return {\n packageManager,\n testing,\n building,\n docker,\n arbitrary,\n };\n}\n\n/**\n * Prompt for web permissions\n */\nasync function promptWebPermissions(defaults?: Partial<WebPermissions>): Promise<WebPermissions> {\n logger.newline();\n logger.info(colors.bold('🌐 Web Operations'));\n\n const fetch = await confirm({\n message: 'Allow WebFetch (fetch web pages)?',\n default: defaults?.fetch ?? true,\n });\n\n const search = await confirm({\n message: 'Allow WebSearch?',\n default: defaults?.search ?? true,\n });\n\n return {\n fetch,\n search,\n };\n}\n\n/**\n * Prompt for custom permissions\n */\nasync function promptCustomPermissions(\n defaults?: Partial<CustomPermissions>\n): Promise<CustomPermissions> {\n logger.newline();\n logger.info(colors.bold('⚙️ Custom Rules'));\n\n const wantCustom = await confirm({\n message: 'Do you want to add custom allow/deny rules?',\n default: false,\n });\n\n if (!wantCustom) {\n return {\n allow: defaults?.allow ?? [],\n deny: defaults?.deny ?? [],\n };\n }\n\n const allow: string[] = [...(defaults?.allow ?? [])];\n const deny: string[] = [...(defaults?.deny ?? [])];\n\n // Add allow rules\n let addMoreAllow = true;\n while (addMoreAllow) {\n const rule = await input({\n message: 'Add allow rule (e.g., \"Bash(npm run *)\"):',\n });\n\n if (rule.trim()) {\n allow.push(rule.trim());\n }\n\n addMoreAllow = await confirm({\n message: 'Add another allow rule?',\n default: false,\n });\n }\n\n // Add deny rules\n let addMoreDeny = await confirm({\n message: 'Do you want to add custom deny rules?',\n default: false,\n });\n\n while (addMoreDeny) {\n const rule = await input({\n message: 'Add deny rule (e.g., \"Write(secrets/*)\"):',\n });\n\n if (rule.trim()) {\n deny.push(rule.trim());\n }\n\n addMoreDeny = await confirm({\n message: 'Add another deny rule?',\n default: false,\n });\n }\n\n return { allow, deny };\n}\n\n/**\n * Show permissions summary\n */\nexport function showPermissionsSummary(config: PermissionsConfig): void {\n logger.newline();\n logger.subtitle('Permissions Summary');\n\n logger.keyValue('Preset', PRESET_DESCRIPTIONS[config.preset].name);\n logger.newline();\n\n // Files\n logger.info('📁 Files:');\n logger.keyValue(' Read all', config.files.readAll ? '✔' : '✖');\n logger.keyValue(' Write code', config.files.writeCode ? '✔' : '✖');\n logger.keyValue(' Write config', config.files.writeConfig ? '✔' : '✖');\n logger.keyValue(' Write markdown', config.files.writeMarkdown ? '✔' : '✖');\n logger.keyValue(' Write other', config.files.writeOther ? '✔' : '✖');\n logger.keyValue(' Edit tool', config.files.editTool ? '✔' : '✖');\n\n // Git\n logger.newline();\n logger.info('🔄 Git:');\n logger.keyValue(' Read only', config.git.readOnly ? '✔' : '✖');\n logger.keyValue(' Staging', config.git.staging ? '✔' : '✖');\n logger.keyValue(' Commit', config.git.commit ? '✔' : '✖');\n logger.keyValue(' Push', config.git.push ? '✔' : '✖');\n logger.keyValue(' Branching', config.git.branching ? '✔' : '✖');\n\n // Bash\n logger.newline();\n logger.info('💻 Bash:');\n logger.keyValue(' Package manager', config.bash.packageManager ? '✔' : '✖');\n logger.keyValue(' Testing', config.bash.testing ? '✔' : '✖');\n logger.keyValue(' Building', config.bash.building ? '✔' : '✖');\n logger.keyValue(' Docker', config.bash.docker ? '✔' : '✖');\n logger.keyValue(' Arbitrary', config.bash.arbitrary ? '✔' : '✖');\n\n // Web\n logger.newline();\n logger.info('🌐 Web:');\n logger.keyValue(' Fetch', config.web.fetch ? '✔' : '✖');\n logger.keyValue(' Search', config.web.search ? '✔' : '✖');\n\n // Custom rules\n if (config.custom?.allow?.length || config.custom?.deny?.length) {\n logger.newline();\n logger.info('⚙️ Custom rules:');\n if (config.custom?.allow?.length) {\n logger.keyValue(' Allow', config.custom.allow.join(', '));\n }\n if (config.custom?.deny?.length) {\n logger.keyValue(' Deny', config.custom.deny.join(', '));\n }\n }\n}\n\n/**\n * Confirm permissions configuration\n */\nexport async function confirmPermissionsConfig(config: PermissionsConfig): Promise<boolean> {\n showPermissionsSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Is this permission configuration correct?',\n default: true,\n });\n}\n\n/**\n * Generate the rules that will be written to settings.json\n */\nexport function generatePermissionRules(config: PermissionsConfig): {\n allow: string[];\n deny: string[];\n} {\n return {\n allow: generateAllowRules(config),\n deny: generateDenyRules(config),\n };\n}\n","/**\n * User preferences prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type { Preferences } from '../../types/config.js';\nimport type { PackageManager } from '../../types/scaffold.js';\n\ninterface PreferencesOptions {\n defaults?: Partial<Preferences>;\n detectedPackageManager?: PackageManager;\n}\n\n/**\n * Prompt for user preferences\n */\nexport async function promptPreferences(options?: PreferencesOptions): Promise<Preferences> {\n logger.section('Preferences', '⚙️');\n\n const language = await select({\n message: 'Working language (for documentation and comments):',\n choices: [\n { name: 'English', value: 'en' as const },\n { name: 'Español', value: 'es' as const },\n ],\n default: options?.defaults?.language || 'en',\n });\n\n const responseLanguage = await select({\n message: 'Claude response language:',\n choices: [\n { name: 'English', value: 'en' as const },\n { name: 'Español', value: 'es' as const },\n ],\n default: options?.defaults?.responseLanguage || language,\n });\n\n const includeCoAuthor = await confirm({\n message: 'Include Claude as commit co-author?',\n default: options?.defaults?.includeCoAuthor ?? true,\n });\n\n // Package manager selection\n const packageManager = await promptPackageManagerPreference(options?.detectedPackageManager);\n\n return {\n language,\n responseLanguage,\n includeCoAuthor,\n packageManager,\n };\n}\n\n/**\n * Prompt for package manager preference\n */\nexport async function promptPackageManagerPreference(\n detected?: PackageManager\n): Promise<PackageManager> {\n const choices = [\n {\n name: 'pnpm (recommended)',\n value: 'pnpm' as const,\n description: 'Fast, disk space efficient package manager',\n },\n {\n name: 'npm',\n value: 'npm' as const,\n description: 'Node.js default package manager',\n },\n {\n name: 'yarn',\n value: 'yarn' as const,\n description: 'Fast, reliable dependency management',\n },\n {\n name: 'bun',\n value: 'bun' as const,\n description: 'All-in-one JavaScript runtime & toolkit',\n },\n ];\n\n // Mark detected package manager\n if (detected) {\n const detectedChoice = choices.find((c) => c.value === detected);\n if (detectedChoice) {\n detectedChoice.name = `${detectedChoice.name} (detected)`;\n }\n }\n\n return select({\n message: 'Preferred package manager:',\n choices,\n default: detected || 'pnpm',\n });\n}\n\n/**\n * Confirm preferences summary\n */\nexport async function confirmPreferences(prefs: Preferences): Promise<boolean> {\n logger.newline();\n logger.subtitle('Preferences Summary');\n logger.keyValue('Working language', prefs.language === 'en' ? 'English' : 'Español');\n logger.keyValue('Response language', prefs.responseLanguage === 'en' ? 'English' : 'Español');\n logger.keyValue('Co-author', prefs.includeCoAuthor ? 'Yes' : 'No');\n logger.keyValue('Package manager', prefs.packageManager || 'pnpm');\n logger.newline();\n\n return confirm({\n message: 'Are these preferences correct?',\n default: true,\n });\n}\n","/**\n * Project information prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, input } from '../../lib/utils/prompt-cancel.js';\nimport type { ProjectInfo } from '../../types/config.js';\n\ninterface ProjectInfoOptions {\n defaults?: Partial<ProjectInfo>;\n skipOptional?: boolean;\n}\n\n/**\n * Prompt for project information\n */\nexport async function promptProjectInfo(options?: ProjectInfoOptions): Promise<ProjectInfo> {\n logger.section('Project Information', '📋');\n\n const name = await input({\n message: 'Project name:',\n default: options?.defaults?.name,\n validate: (value) => {\n if (!value.trim()) return 'Project name is required';\n if (!/^[a-zA-Z0-9-_\\s]+$/.test(value)) {\n return 'Project name can only contain letters, numbers, dashes, underscores, and spaces';\n }\n return true;\n },\n });\n\n const description = await input({\n message: 'Project description:',\n default: options?.defaults?.description || '',\n validate: (value) => {\n if (!value.trim()) return 'Description is required';\n return true;\n },\n });\n\n const org = await input({\n message: 'GitHub organization/username:',\n default: options?.defaults?.org || '',\n validate: (value) => {\n if (!value.trim()) return 'Organization is required';\n if (!/^[a-zA-Z0-9-]+$/.test(value)) {\n return 'Organization can only contain letters, numbers, and dashes';\n }\n return true;\n },\n });\n\n const repo = await input({\n message: 'Repository name:',\n default: options?.defaults?.repo || name.toLowerCase().replace(/\\s+/g, '-'),\n validate: (value) => {\n if (!value.trim()) return 'Repository name is required';\n if (!/^[a-zA-Z0-9-_]+$/.test(value)) {\n return 'Repository name can only contain letters, numbers, dashes, and underscores';\n }\n return true;\n },\n });\n\n // Ask for author (optional)\n const author = await input({\n message: 'Author (name or \"Name <email>\"):',\n default: options?.defaults?.author || '',\n });\n\n // Ask if user wants to configure entity type\n let entityType = 'item';\n let entityTypePlural = 'items';\n\n const wantEntityConfig = await confirm({\n message: 'Configure primary entity type? (Used for code examples and templates)',\n default: false,\n });\n\n if (wantEntityConfig) {\n logger.info('The entity type is used in code examples and templates throughout the project.');\n logger.info(\n 'For example, if your project manages \"products\", code examples will use product-related names.'\n );\n logger.newline();\n\n entityType = await input({\n message: 'Primary entity type (e.g., product, article, user, listing):',\n default: options?.defaults?.entityType || 'item',\n validate: (value) => {\n if (!value.trim()) return 'Entity type is required';\n return true;\n },\n });\n\n entityTypePlural = await input({\n message: 'Entity type plural:',\n default: options?.defaults?.entityTypePlural || pluralize(entityType),\n });\n } else if (options?.defaults?.entityType) {\n entityType = options.defaults.entityType;\n entityTypePlural = options.defaults.entityTypePlural || pluralize(entityType);\n }\n\n let domain: string | undefined;\n let location: string | undefined;\n\n if (!options?.skipOptional) {\n const wantDomain = await confirm({\n message: 'Do you want to specify a domain?',\n default: false,\n });\n\n if (wantDomain) {\n domain = await input({\n message: 'Domain (e.g., myproject.com):',\n default: options?.defaults?.domain || '',\n validate: (value) => {\n if (value && !/^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$/.test(value)) {\n return 'Please enter a valid domain';\n }\n return true;\n },\n });\n }\n\n const wantLocation = await confirm({\n message: 'Do you want to specify a location/region?',\n default: false,\n });\n\n if (wantLocation) {\n location = await input({\n message: 'Location/Region:',\n default: options?.defaults?.location || '',\n });\n }\n }\n\n return {\n name: name.trim(),\n description: description.trim(),\n org: org.trim(),\n repo: repo.trim(),\n domain,\n entityType: entityType.trim().toLowerCase(),\n entityTypePlural: entityTypePlural.trim().toLowerCase(),\n location,\n author: author.trim() || undefined,\n };\n}\n\n/**\n * Simple pluralization helper\n */\nfunction pluralize(word: string): string {\n const lower = word.toLowerCase();\n if (lower.endsWith('y')) {\n return `${lower.slice(0, -1)}ies`;\n }\n if (lower.endsWith('s') || lower.endsWith('x') || lower.endsWith('ch') || lower.endsWith('sh')) {\n return `${lower}es`;\n }\n return `${lower}s`;\n}\n\n/**\n * Confirm project info summary\n */\nexport async function confirmProjectInfo(info: ProjectInfo): Promise<boolean> {\n logger.newline();\n logger.subtitle('Project Summary');\n logger.keyValue('Name', info.name);\n logger.keyValue('Description', info.description);\n logger.keyValue('GitHub', `${info.org}/${info.repo}`);\n if (info.author) logger.keyValue('Author', info.author);\n logger.keyValue('Entity', `${info.entityType} / ${info.entityTypePlural}`);\n if (info.domain) logger.keyValue('Domain', info.domain);\n if (info.location) logger.keyValue('Location', info.location);\n logger.newline();\n\n return confirm({\n message: 'Is this information correct?',\n default: true,\n });\n}\n","/**\n * Project scaffold prompts\n */\n\nimport { logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n PackageManager,\n ProjectType,\n ScaffoldOptions,\n ScaffoldType,\n} from '../../types/scaffold.js';\n\ninterface ScaffoldPromptOptions {\n existingProject?: boolean;\n detectedType?: ProjectType;\n detectedPackageManager?: PackageManager;\n}\n\n/**\n * Prompt for scaffold type\n */\nexport async function promptScaffoldType(options?: ScaffoldPromptOptions): Promise<ScaffoldType> {\n logger.section('Configuration Scope', '🏗️');\n\n if (options?.existingProject) {\n logger.info('Existing project detected');\n logger.newline();\n\n const choice = await select({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'Add Claude config only (recommended)',\n value: 'claude-only' as const,\n description: 'Creates .claude/ folder without touching existing files',\n },\n {\n name: 'Full project setup (⚠️ may overwrite files)',\n value: 'full-project' as const,\n description: 'Includes project scaffolding - use with caution',\n },\n ],\n default: 'claude-only',\n });\n\n if (choice === 'full-project') {\n const confirmed = await confirm({\n message: '⚠️ This may overwrite existing files. Are you sure?',\n default: false,\n });\n if (!confirmed) {\n return 'claude-only';\n }\n }\n\n return choice;\n }\n\n return select({\n message: 'What would you like to configure?',\n choices: [\n {\n name: 'Claude configuration only',\n value: 'claude-only' as const,\n description: 'Only creates .claude/ folder with agents, commands, skills, docs',\n },\n {\n name: 'Full project setup',\n value: 'full-project' as const,\n description: 'Creates project structure + Claude configuration',\n },\n ],\n default: 'claude-only',\n });\n}\n\n/**\n * Prompt for project type\n */\nexport async function promptProjectType(detectedType?: ProjectType): Promise<ProjectType> {\n const choices = [\n {\n name: 'Node.js (TypeScript)',\n value: 'node' as const,\n description: 'Basic Node.js project with TypeScript',\n },\n {\n name: 'Monorepo (TurboRepo + pnpm)',\n value: 'monorepo' as const,\n description: 'Multi-package monorepo setup',\n },\n {\n name: 'Astro',\n value: 'astro' as const,\n description: 'Astro static/SSR site',\n },\n {\n name: 'Next.js',\n value: 'nextjs' as const,\n description: 'Next.js full-stack React framework',\n },\n {\n name: 'Vite + React',\n value: 'vite-react' as const,\n description: 'Vite bundled React SPA',\n },\n {\n name: 'Hono API',\n value: 'hono' as const,\n description: 'Hono lightweight API server',\n },\n {\n name: 'Custom',\n value: 'custom' as const,\n description: 'Define your own project structure',\n },\n ];\n\n if (detectedType) {\n const detected = choices.find((c) => c.value === detectedType);\n if (detected) {\n detected.name = `${detected.name} (detected)`;\n }\n }\n\n return select({\n message: 'Project type:',\n choices,\n default: detectedType || 'node',\n });\n}\n\n/**\n * Prompt for package manager\n */\nexport async function promptPackageManager(detected?: PackageManager): Promise<PackageManager> {\n const choices = [\n { name: 'pnpm (recommended)', value: 'pnpm' as const },\n { name: 'npm', value: 'npm' as const },\n { name: 'yarn', value: 'yarn' as const },\n { name: 'bun', value: 'bun' as const },\n ];\n\n if (detected) {\n const detectedChoice = choices.find((c) => c.value === detected);\n if (detectedChoice) {\n detectedChoice.name = `${detectedChoice.name} (detected)`;\n }\n }\n\n return select({\n message: 'Package manager:',\n choices,\n default: detected || 'pnpm',\n });\n}\n\n/**\n * Prompt for scaffold options\n */\nexport async function promptScaffoldOptions(\n options?: ScaffoldPromptOptions\n): Promise<ScaffoldOptions> {\n const type = await promptScaffoldType(options);\n\n if (type === 'claude-only') {\n return { type };\n }\n\n const projectType = await promptProjectType(options?.detectedType);\n const packageManager = await promptPackageManager(options?.detectedPackageManager);\n\n logger.newline();\n logger.subtitle('Additional Options');\n\n const additionalOptions = await checkbox({\n message: 'Select additional options:',\n choices: [\n { name: 'Initialize git repository', value: 'initGit', checked: true },\n { name: 'Create README.md', value: 'createReadme', checked: true },\n { name: 'Create .gitignore', value: 'createGitignore', checked: true },\n ],\n });\n\n return {\n type,\n projectType,\n packageManager,\n initGit: additionalOptions.includes('initGit'),\n createReadme: additionalOptions.includes('createReadme'),\n createGitignore: additionalOptions.includes('createGitignore'),\n };\n}\n\n/**\n * Confirm scaffold options\n */\nexport async function confirmScaffoldOptions(scaffoldOptions: ScaffoldOptions): Promise<boolean> {\n logger.newline();\n logger.subtitle('Scaffold Summary');\n logger.keyValue(\n 'Type',\n scaffoldOptions.type === 'claude-only' ? 'Claude config only' : 'Full project'\n );\n\n if (scaffoldOptions.type === 'full-project') {\n logger.keyValue('Project type', scaffoldOptions.projectType || 'node');\n logger.keyValue('Package manager', scaffoldOptions.packageManager || 'pnpm');\n logger.keyValue('Init git', scaffoldOptions.initGit ? 'Yes' : 'No');\n logger.keyValue('Create README', scaffoldOptions.createReadme ? 'Yes' : 'No');\n logger.keyValue('Create .gitignore', scaffoldOptions.createGitignore ? 'Yes' : 'No');\n }\n\n logger.newline();\n\n return confirm({\n message: 'Proceed with these options?',\n default: true,\n });\n}\n","/**\n * Template configuration prompts\n *\n * Interactive prompts for configuring template placeholders\n * with auto-detection and smart defaults.\n */\n\nimport {\n TEMPLATE_PLACEHOLDERS,\n computeDefaultValue,\n getPlaceholdersByCategory,\n} from '../../constants/template-placeholders.js';\nimport {\n getGlobalTemplateConfig,\n hasGlobalDefaults,\n mergeWithGlobalDefaults,\n updateGlobalDefaults,\n} from '../../lib/config/global-defaults.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type {\n TemplateConfig,\n TemplateConfigContext,\n TemplateConfigSetupMode,\n TemplatePlaceholderCategory,\n TemplatePlaceholderDefinition,\n} from '../../types/template-config.js';\n\n/**\n * Category display names and order\n */\nconst CATEGORY_INFO: Record<TemplatePlaceholderCategory, { name: string; order: number }> = {\n commands: { name: 'CLI Commands', order: 1 },\n paths: { name: 'Directory Paths', order: 2 },\n targets: { name: 'Quality Targets', order: 3 },\n tracking: { name: 'Issue Tracking', order: 4 },\n techStack: { name: 'Technology Stack', order: 5 },\n performance: { name: 'Performance Targets', order: 6 },\n environment: { name: 'Environment Variables', order: 7 },\n brand: { name: 'Brand Identity', order: 8 },\n};\n\n/**\n * Options for template config prompts\n */\nexport interface TemplateConfigPromptOptions {\n /** Context for computing defaults */\n context: TemplateConfigContext;\n /** Setup mode */\n mode?: TemplateConfigSetupMode;\n /** Specific category to configure */\n category?: TemplatePlaceholderCategory;\n /** Only configure required placeholders */\n requiredOnly?: boolean;\n /** Skip confirmation */\n skipConfirm?: boolean;\n}\n\n/**\n * Prompt for setup mode selection\n */\nexport async function promptSetupMode(): Promise<TemplateConfigSetupMode> {\n const mode = await select<TemplateConfigSetupMode>({\n message: 'Configuration mode:',\n choices: [\n {\n name: 'Quick Setup (recommended)',\n value: 'quick',\n description: 'Auto-detect values, confirm all at once',\n },\n {\n name: 'Guided Setup',\n value: 'guided',\n description: 'Step through each category',\n },\n {\n name: 'Advanced Setup',\n value: 'advanced',\n description: 'Configure all options individually',\n },\n ],\n default: 'quick',\n });\n\n return mode;\n}\n\n/**\n * Build context for computing defaults\n */\nexport async function buildConfigContext(projectPath: string): Promise<TemplateConfigContext> {\n const context: TemplateConfigContext = {\n projectPath,\n values: {},\n };\n\n try {\n // Read package.json for scripts and dependencies\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const pkgPath = path.join(projectPath, 'package.json');\n\n const pkgContent = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent) as {\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n context.scripts = pkg.scripts || {};\n context.dependencies = {\n ...(pkg.dependencies || {}),\n ...(pkg.devDependencies || {}),\n };\n\n // Detect TypeScript\n context.hasTypeScript =\n Boolean(context.dependencies.typescript) ||\n (await fileExists(path.join(projectPath, 'tsconfig.json')));\n\n // Detect package manager\n if (await fileExists(path.join(projectPath, 'pnpm-lock.yaml'))) {\n context.packageManager = 'pnpm';\n } else if (await fileExists(path.join(projectPath, 'yarn.lock'))) {\n context.packageManager = 'yarn';\n } else if (await fileExists(path.join(projectPath, 'bun.lockb'))) {\n context.packageManager = 'bun';\n } else {\n context.packageManager = 'npm';\n }\n\n // Detect git\n context.isGitRepo = await fileExists(path.join(projectPath, '.git'));\n\n // Detect GitHub remote\n if (context.isGitRepo) {\n try {\n const { execSync } = await import('node:child_process');\n const remotes = execSync('git remote -v', {\n cwd: projectPath,\n encoding: 'utf-8',\n });\n context.hasGitHubRemote = remotes.includes('github.com');\n } catch {\n context.hasGitHubRemote = false;\n }\n }\n } catch {\n // Default context if package.json doesn't exist\n }\n\n return context;\n}\n\n/**\n * Check if a file exists\n */\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n const fs = await import('node:fs/promises');\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Prompt for a single placeholder value\n */\nasync function promptPlaceholder(\n placeholder: TemplatePlaceholderDefinition,\n context: TemplateConfigContext,\n detectedValue?: string\n): Promise<string> {\n const defaultValue = detectedValue || computeDefaultValue(placeholder, context) || '';\n\n switch (placeholder.inputType) {\n case 'select': {\n if (!placeholder.choices || placeholder.choices.length === 0) {\n // Fall back to text input\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n });\n }\n\n const choices = placeholder.choices.map((c) => ({\n name: c.name,\n value: c.value,\n description: c.description,\n }));\n\n return select({\n message: `${placeholder.label}:`,\n choices,\n default: defaultValue || choices[0].value,\n });\n }\n\n case 'number': {\n const result = await input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n const num = Number(value);\n if (Number.isNaN(num)) {\n return 'Please enter a valid number';\n }\n return true;\n },\n });\n return result;\n }\n\n case 'path': {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return 'This path is required';\n }\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n return true;\n },\n });\n }\n\n case 'envVar': {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return 'This environment variable is required';\n }\n if (value && !/^[A-Z][A-Z0-9_]*$/.test(value)) {\n return 'Environment variable should be UPPER_SNAKE_CASE';\n }\n return true;\n },\n });\n }\n\n default: {\n return input({\n message: `${placeholder.label}:`,\n default: defaultValue,\n validate: (value) => {\n if (placeholder.required && !value.trim()) {\n return `${placeholder.label} is required`;\n }\n if (placeholder.validate) {\n return placeholder.validate(value, context);\n }\n return true;\n },\n });\n }\n }\n}\n\n/**\n * Compute all default values for quick setup\n */\nfunction computeAllDefaults(\n context: TemplateConfigContext,\n globalDefaults?: Partial<TemplateConfig>\n): Partial<TemplateConfig> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n for (const placeholder of TEMPLATE_PLACEHOLDERS) {\n const defaultValue = computeDefaultValue(placeholder, context);\n if (defaultValue) {\n setConfigValue(config, placeholder, defaultValue);\n }\n }\n\n // Merge with global defaults (global takes lower priority)\n if (globalDefaults) {\n return mergeWithGlobalDefaults(config, globalDefaults);\n }\n\n return config;\n}\n\n/**\n * Set a value in the config based on placeholder definition\n */\nfunction setConfigValue(\n config: Partial<TemplateConfig>,\n placeholder: TemplatePlaceholderDefinition,\n value: string\n): void {\n const key = placeholderKeyToConfigKey(placeholder.key, placeholder.category);\n\n switch (placeholder.category) {\n case 'commands':\n if (!config.commands) config.commands = {};\n (config.commands as Record<string, string>)[key] = value;\n break;\n case 'paths':\n if (!config.paths) config.paths = {};\n (config.paths as Record<string, string>)[key] = value;\n break;\n case 'targets':\n case 'performance': {\n if (!config.targets) config.targets = {};\n const numValue = Number(value);\n if (!Number.isNaN(numValue)) {\n (config.targets as Record<string, number | string>)[key] = numValue;\n } else {\n (config.targets as Record<string, number | string>)[key] = value;\n }\n break;\n }\n case 'tracking':\n if (!config.tracking) config.tracking = {};\n (config.tracking as Record<string, string | number>)[key] = key.endsWith('Days')\n ? Number(value)\n : value;\n break;\n case 'techStack':\n if (!config.techStack) config.techStack = {};\n (config.techStack as Record<string, string>)[key] = value;\n break;\n case 'environment':\n if (!config.environment) config.environment = {};\n (config.environment as Record<string, string>)[key] = value;\n break;\n case 'brand':\n if (!config.brand) config.brand = {};\n (config.brand as Record<string, string>)[key] = value;\n break;\n }\n}\n\n/**\n * Convert PLACEHOLDER_KEY to configKey\n */\nfunction placeholderKeyToConfigKey(key: string, category: string): string {\n let cleanKey = key;\n\n // Remove common suffixes\n if (category === 'commands' && key.endsWith('_COMMAND')) {\n cleanKey = key.slice(0, -8);\n } else if (category === 'environment' && key.endsWith('_ENV')) {\n cleanKey = key.slice(0, -4);\n } else if (key.endsWith('_TARGET')) {\n cleanKey = key.slice(0, -7);\n }\n\n // Convert SNAKE_CASE to camelCase\n return cleanKey.toLowerCase().replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Main template configuration prompt\n */\nexport async function promptTemplateConfig(\n options: TemplateConfigPromptOptions\n): Promise<Partial<TemplateConfig>> {\n const { context, mode = 'quick', category, requiredOnly = false } = options;\n\n logger.section('Template Configuration', '📝');\n\n // Explain why this is important\n logger.newline();\n logger.info('This step personalizes all Claude Code configuration files for YOUR project.');\n logger.info('Your answers will be used to:');\n logger.newline();\n logger.item('Replace {{PLACEHOLDERS}} in agents, commands, and skills');\n logger.item('Configure CLAUDE.md with your tech stack and commands');\n logger.item('Set up quality targets (coverage, performance, accessibility)');\n logger.item('Customize code examples to match your project structure');\n logger.newline();\n logger.info('Accurate configuration means better AI assistance tailored to your codebase!');\n logger.newline();\n\n // Get global defaults if available\n const hasDefaults = await hasGlobalDefaults();\n const globalDefaults = hasDefaults ? await getGlobalTemplateConfig() : undefined;\n\n if (mode === 'quick') {\n return promptQuickSetup(context, globalDefaults);\n }\n\n if (category) {\n return promptCategory(category, context, requiredOnly);\n }\n\n if (mode === 'guided') {\n return promptGuidedSetup(context, requiredOnly);\n }\n\n return promptAdvancedSetup(context);\n}\n\n/**\n * Quick setup: auto-detect and confirm\n */\nasync function promptQuickSetup(\n context: TemplateConfigContext,\n globalDefaults?: Partial<TemplateConfig>\n): Promise<Partial<TemplateConfig>> {\n logger.info('Auto-detecting configuration from project...');\n logger.newline();\n\n const detected = computeAllDefaults(context, globalDefaults);\n\n // Display detected values by category\n displayDetectedConfig(detected, context);\n\n // Allow editing\n const wantEdit = await confirm({\n message: 'Would you like to modify any values?',\n default: false,\n });\n\n let finalConfig = detected;\n\n if (wantEdit) {\n finalConfig = await promptEditConfig(detected, context);\n }\n\n return finalConfig;\n}\n\n/**\n * Display detected configuration\n */\nfunction displayDetectedConfig(\n config: Partial<TemplateConfig>,\n _context: TemplateConfigContext\n): void {\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n for (const category of categories) {\n const placeholders = getPlaceholdersByCategory(category);\n if (placeholders.length === 0) continue;\n\n const values = getCategoryValues(config, category);\n if (Object.keys(values).length === 0) continue;\n\n logger.subtitle(CATEGORY_INFO[category].name);\n\n for (const [key, value] of Object.entries(values)) {\n if (value !== undefined) {\n const placeholder = TEMPLATE_PLACEHOLDERS.find(\n (p) => placeholderKeyToConfigKey(p.key, p.category) === key\n );\n const label = placeholder?.label || key;\n logger.keyValue(label, String(value));\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Get values for a specific category\n */\nfunction getCategoryValues(\n config: Partial<TemplateConfig>,\n category: TemplatePlaceholderCategory\n): Record<string, unknown> {\n switch (category) {\n case 'commands':\n return (config.commands as Record<string, unknown>) || {};\n case 'paths':\n return (config.paths as Record<string, unknown>) || {};\n case 'targets':\n case 'performance':\n return (config.targets as Record<string, unknown>) || {};\n case 'tracking':\n return (config.tracking as Record<string, unknown>) || {};\n case 'techStack':\n return (config.techStack as Record<string, unknown>) || {};\n case 'environment':\n return (config.environment as Record<string, unknown>) || {};\n case 'brand':\n return (config.brand as Record<string, unknown>) || {};\n default:\n return {};\n }\n}\n\n/**\n * Prompt to edit specific values\n */\nasync function promptEditConfig(\n config: Partial<TemplateConfig>,\n context: TemplateConfigContext\n): Promise<Partial<TemplateConfig>> {\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n const categoryToEdit = await select<TemplatePlaceholderCategory | 'done'>({\n message: 'Which category would you like to edit?',\n choices: [\n ...categories.map((cat) => ({\n name: CATEGORY_INFO[cat].name,\n value: cat,\n })),\n { name: 'Done editing', value: 'done' as const },\n ],\n });\n\n if (categoryToEdit === 'done') {\n return config;\n }\n\n const editedCategory = await promptCategory(categoryToEdit, context, false);\n\n // Merge edited values\n const merged = { ...config };\n switch (categoryToEdit) {\n case 'commands':\n merged.commands = { ...config.commands, ...editedCategory.commands };\n break;\n case 'paths':\n merged.paths = { ...config.paths, ...editedCategory.paths };\n break;\n case 'targets':\n case 'performance':\n merged.targets = { ...config.targets, ...editedCategory.targets };\n break;\n case 'tracking':\n merged.tracking = { ...config.tracking, ...editedCategory.tracking };\n break;\n case 'techStack':\n merged.techStack = { ...config.techStack, ...editedCategory.techStack };\n break;\n case 'environment':\n merged.environment = { ...config.environment, ...editedCategory.environment };\n break;\n case 'brand':\n merged.brand = { ...config.brand, ...editedCategory.brand };\n break;\n }\n\n // Ask if they want to edit more\n const editMore = await confirm({\n message: 'Edit another category?',\n default: false,\n });\n\n if (editMore) {\n return promptEditConfig(merged, context);\n }\n\n return merged;\n}\n\n/**\n * Prompt for a specific category\n */\nasync function promptCategory(\n category: TemplatePlaceholderCategory,\n context: TemplateConfigContext,\n requiredOnly: boolean\n): Promise<Partial<TemplateConfig>> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n logger.subtitle(CATEGORY_INFO[category].name);\n\n let placeholders = getPlaceholdersByCategory(category);\n\n if (requiredOnly) {\n placeholders = placeholders.filter((p) => p.required);\n }\n\n // Update context with already configured values\n const updatedContext = { ...context };\n\n for (const placeholder of placeholders) {\n const value = await promptPlaceholder(placeholder, updatedContext);\n if (value) {\n setConfigValue(config, placeholder, value);\n // Update context for dependent placeholders\n updatedContext.values[placeholder.key] = value;\n }\n }\n\n return config;\n}\n\n/**\n * Guided setup: step through each category\n */\nasync function promptGuidedSetup(\n context: TemplateConfigContext,\n requiredOnly: boolean\n): Promise<Partial<TemplateConfig>> {\n const config: Partial<TemplateConfig> = {\n commands: {},\n paths: {},\n targets: {},\n tracking: {},\n techStack: {},\n environment: {},\n brand: {},\n };\n\n const categories = Object.entries(CATEGORY_INFO)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([key]) => key as TemplatePlaceholderCategory);\n\n const updatedContext = { ...context };\n\n for (const category of categories) {\n const placeholders = getPlaceholdersByCategory(category);\n const relevantPlaceholders = requiredOnly\n ? placeholders.filter((p) => p.required)\n : placeholders;\n\n if (relevantPlaceholders.length === 0) continue;\n\n const configureCategory = await confirm({\n message: `Configure ${CATEGORY_INFO[category].name}? (${relevantPlaceholders.length} options)`,\n default: true,\n });\n\n if (!configureCategory) continue;\n\n const categoryConfig = await promptCategory(category, updatedContext, requiredOnly);\n\n // Merge into main config\n switch (category) {\n case 'commands':\n config.commands = { ...config.commands, ...categoryConfig.commands };\n break;\n case 'paths':\n config.paths = { ...config.paths, ...categoryConfig.paths };\n break;\n case 'targets':\n case 'performance':\n config.targets = { ...config.targets, ...categoryConfig.targets };\n break;\n case 'tracking':\n config.tracking = { ...config.tracking, ...categoryConfig.tracking };\n break;\n case 'techStack':\n config.techStack = { ...config.techStack, ...categoryConfig.techStack };\n break;\n case 'environment':\n config.environment = { ...config.environment, ...categoryConfig.environment };\n break;\n case 'brand':\n config.brand = { ...config.brand, ...categoryConfig.brand };\n break;\n }\n\n // Update context\n for (const [key, value] of Object.entries(getCategoryValues(categoryConfig, category))) {\n if (value !== undefined) {\n updatedContext.values[key.toUpperCase()] = String(value);\n }\n }\n }\n\n return config;\n}\n\n/**\n * Advanced setup: configure all options\n */\nasync function promptAdvancedSetup(\n context: TemplateConfigContext\n): Promise<Partial<TemplateConfig>> {\n return promptGuidedSetup(context, false);\n}\n\n/**\n * Confirm template configuration\n */\nexport async function confirmTemplateConfig(\n config: Partial<TemplateConfig>,\n context: TemplateConfigContext\n): Promise<boolean> {\n logger.newline();\n logger.subtitle('Configuration Summary');\n displayDetectedConfig(config, context);\n\n return confirm({\n message: 'Apply this configuration?',\n default: true,\n });\n}\n\n/**\n * Prompt to save as global defaults\n */\nexport async function promptSaveGlobalDefaults(config: Partial<TemplateConfig>): Promise<boolean> {\n const save = await confirm({\n message: 'Save these values as global defaults for future projects?',\n default: false,\n });\n\n if (save) {\n await updateGlobalDefaults(config);\n logger.success('Global defaults saved to ~/.claude/defaults.json');\n }\n\n return save;\n}\n","/**\n * Prompts exports\n */\n\n// Project info\nexport {\n promptProjectInfo,\n confirmProjectInfo,\n} from './project-info.js';\n\n// Preferences\nexport {\n promptPreferences,\n promptPackageManagerPreference,\n confirmPreferences,\n} from './preferences.js';\n\n// Scaffold\nexport {\n promptScaffoldType,\n promptProjectType,\n promptPackageManager,\n promptScaffoldOptions,\n confirmScaffoldOptions,\n} from './scaffold.js';\n\n// Bundle selection\nexport {\n promptBundleMode,\n promptBundleSelection,\n promptQuickBundleSelection,\n showBundleContents,\n showBundlesSummary,\n showBundlesSummaryWithTotals,\n confirmBundleSelection,\n confirmBundleSelectionWithEdit,\n editBundleSelection,\n calculateModuleTotals,\n createEmptyBundleResult,\n type BundleSelectionMode,\n type BundleConfirmAction,\n type ModuleTotals,\n} from './bundle-select.js';\n\n// Item selection (granular)\nexport {\n promptSingleItem,\n promptBatchAction,\n selectItemsFromCategory,\n showCategorySelectionSummary,\n confirmCategorySelection,\n type ItemAction,\n type BatchAction,\n} from './item-select.js';\n\n// Hook configuration\nexport {\n promptHookConfig,\n showHookSummary,\n confirmHookConfig,\n} from './hook-config.js';\n\n// MCP configuration\nexport {\n promptMcpConfig,\n showMcpSummary,\n confirmMcpConfig,\n showSkippedMcpInstructions,\n type McpConfigResult,\n type SkippedMcpConfig,\n type SkippedField,\n} from './mcp-config.js';\n\n// Permissions configuration\nexport {\n promptPermissionsConfig,\n showPermissionsSummary,\n confirmPermissionsConfig,\n generatePermissionRules,\n} from './permissions.js';\n\n// Update prompts\nexport {\n promptUpdateAction,\n showUpdateReport,\n promptNewModules,\n promptUpdatedModules,\n promptConflictResolution,\n promptReconfigureOptions,\n confirmUpdate,\n promptBackup,\n type UpdateAction,\n type ModuleUpdate,\n type ConflictResolution,\n} from './update.js';\n\n// Confirmation prompts\nexport {\n confirmOverwrite,\n promptExistingProjectAction,\n showFinalSummary,\n confirmFinalConfiguration,\n confirmDestructiveAction,\n showPostInstallInstructions,\n showDependencyInstructions,\n} from './confirm.js';\n\n// Code style prompts\nexport {\n promptCodeStyleConfig,\n showCodeStyleSummary,\n confirmCodeStyleConfig,\n} from './code-style.js';\n\n// Folder preferences prompts\nexport {\n promptTestLocation,\n promptPlanningLocation,\n promptDocsLocation,\n promptGithubWorkflows,\n promptFolderPreferences,\n promptQuickFolderPreferences,\n showFolderPreferencesSummary,\n confirmFolderPreferences,\n} from './folder-preferences.js';\n\n// CI/CD configuration prompts\nexport { promptCICDConfig, showCICDSummary } from './ci-cd-config.js';\n","/**\n * Update prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { checkbox, confirm, select } from '../../lib/utils/prompt-cancel.js';\n\nexport type UpdateAction = 'check' | 'modules' | 'config' | 'all' | 'cancel';\n\nexport interface ModuleUpdate {\n id: string;\n name: string;\n category: string;\n type: 'new' | 'updated' | 'deprecated';\n hasLocalChanges?: boolean;\n}\n\nexport type ConflictResolution = 'keep' | 'update' | 'merge' | 'diff';\n\n/**\n * Prompt for update action\n */\nexport async function promptUpdateAction(): Promise<UpdateAction> {\n logger.subtitle('Update Options');\n\n return select({\n message: 'What would you like to update?',\n choices: [\n {\n name: 'Check for updates',\n value: 'check' as const,\n description: 'Show what has changed without modifying files',\n },\n {\n name: 'Update modules only',\n value: 'modules' as const,\n description: 'Update agents, skills, commands, docs',\n },\n {\n name: 'Reconfigure settings',\n value: 'config' as const,\n description: 'Re-run configuration for MCP, hooks, preferences',\n },\n {\n name: 'Full update',\n value: 'all' as const,\n description: 'Update everything',\n },\n {\n name: 'Cancel',\n value: 'cancel' as const,\n },\n ],\n default: 'check',\n });\n}\n\n/**\n * Show update report\n */\nexport function showUpdateReport(updates: {\n new: ModuleUpdate[];\n updated: ModuleUpdate[];\n deprecated: ModuleUpdate[];\n conflicts: ModuleUpdate[];\n}): void {\n logger.newline();\n logger.title('Update Report');\n\n if (updates.new.length === 0 && updates.updated.length === 0 && updates.deprecated.length === 0) {\n logger.success('Everything is up to date!');\n return;\n }\n\n if (updates.new.length > 0) {\n logger.newline();\n logger.info(colors.bold(`✚ New modules available (${updates.new.length}):`));\n for (const mod of updates.new) {\n logger.item(`${mod.category}: ${colors.primary(mod.name)}`);\n }\n }\n\n if (updates.updated.length > 0) {\n logger.newline();\n logger.info(colors.bold(`↻ Updated modules (${updates.updated.length}):`));\n for (const mod of updates.updated) {\n const conflict = mod.hasLocalChanges ? colors.warning(' (local changes)') : '';\n logger.item(`${mod.category}: ${colors.primary(mod.name)}${conflict}`);\n }\n }\n\n if (updates.deprecated.length > 0) {\n logger.newline();\n logger.info(colors.bold(`✗ Deprecated modules (${updates.deprecated.length}):`));\n for (const mod of updates.deprecated) {\n logger.item(`${mod.category}: ${colors.muted(mod.name)}`);\n }\n }\n\n if (updates.conflicts.length > 0) {\n logger.newline();\n logger.warn(`⚠ Modules with conflicts (${updates.conflicts.length}):`);\n for (const mod of updates.conflicts) {\n logger.item(`${mod.category}: ${colors.warning(mod.name)} - has local modifications`);\n }\n }\n}\n\n/**\n * Prompt for new module installation\n */\nexport async function promptNewModules(modules: ModuleUpdate[]): Promise<string[]> {\n if (modules.length === 0) return [];\n\n logger.newline();\n const choices = modules.map((mod) => ({\n name: `${mod.category}: ${mod.name}`,\n value: mod.id,\n checked: false,\n }));\n\n return checkbox({\n message: 'Select new modules to install:',\n choices,\n });\n}\n\n/**\n * Prompt for updating existing modules\n */\nexport async function promptUpdatedModules(modules: ModuleUpdate[]): Promise<string[]> {\n if (modules.length === 0) return [];\n\n logger.newline();\n const choices = modules.map((mod) => ({\n name: `${mod.category}: ${mod.name}${mod.hasLocalChanges ? ' ⚠️' : ''}`,\n value: mod.id,\n checked: !mod.hasLocalChanges, // Don't check by default if has local changes\n }));\n\n return checkbox({\n message: 'Select modules to update:',\n choices,\n });\n}\n\n/**\n * Prompt for conflict resolution\n */\nexport async function promptConflictResolution(module: ModuleUpdate): Promise<ConflictResolution> {\n logger.newline();\n logger.warn(`Conflict: ${module.category}/${module.name} has local modifications`);\n\n return select({\n message: 'How do you want to resolve this conflict?',\n choices: [\n {\n name: 'Keep local version',\n value: 'keep' as const,\n description: 'Do not update this module',\n },\n {\n name: 'Use updated version',\n value: 'update' as const,\n description: 'Replace with new version (lose local changes)',\n },\n {\n name: 'Show diff',\n value: 'diff' as const,\n description: 'See what changed before deciding',\n },\n ],\n default: 'keep',\n });\n}\n\n/**\n * Prompt for reconfiguration options\n */\nexport async function promptReconfigureOptions(): Promise<string[]> {\n logger.newline();\n\n return checkbox({\n message: 'What would you like to reconfigure?',\n choices: [\n { name: 'MCP servers', value: 'mcp', checked: false },\n { name: 'Hooks', value: 'hooks', checked: false },\n { name: 'Preferences (language, co-author)', value: 'preferences', checked: false },\n { name: 'Permissions', value: 'permissions', checked: false },\n { name: 'Add/remove modules', value: 'modules', checked: false },\n ],\n });\n}\n\n/**\n * Confirm update\n */\nexport async function confirmUpdate(summary: {\n newModules: number;\n updatedModules: number;\n removedModules: number;\n reconfigurations: string[];\n}): Promise<boolean> {\n logger.newline();\n logger.subtitle('Update Summary');\n\n if (summary.newModules > 0) {\n logger.keyValue('New modules', String(summary.newModules));\n }\n if (summary.updatedModules > 0) {\n logger.keyValue('Updated modules', String(summary.updatedModules));\n }\n if (summary.removedModules > 0) {\n logger.keyValue('Removed modules', String(summary.removedModules));\n }\n if (summary.reconfigurations.length > 0) {\n logger.keyValue('Reconfigured', summary.reconfigurations.join(', '));\n }\n\n logger.newline();\n\n return confirm({\n message: 'Apply these updates?',\n default: true,\n });\n}\n\n/**\n * Prompt to create backup before update\n */\nexport async function promptBackup(): Promise<boolean> {\n return confirm({\n message: 'Create backup before updating?',\n default: true,\n });\n}\n","/**\n * General confirmation prompts\n */\n\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { confirm, input, select } from '../../lib/utils/prompt-cancel.js';\nimport type { ClaudeConfig } from '../../types/config.js';\n\n/**\n * Confirm overwrite of existing configuration\n */\nexport async function confirmOverwrite(existingPath: string): Promise<boolean> {\n logger.warn(`Existing configuration found at ${existingPath}`);\n\n return confirm({\n message: 'Do you want to overwrite the existing configuration?',\n default: false,\n });\n}\n\n/**\n * Prompt for action when existing project detected\n */\nexport async function promptExistingProjectAction(): Promise<'skip' | 'overwrite' | 'merge'> {\n return select({\n message: 'Existing .claude/ folder detected. What would you like to do?',\n choices: [\n {\n name: 'Skip (keep existing)',\n value: 'skip' as const,\n description: 'Do not modify existing configuration',\n },\n {\n name: 'Overwrite',\n value: 'overwrite' as const,\n description: 'Replace existing configuration',\n },\n {\n name: 'Merge',\n value: 'merge' as const,\n description: 'Add new items, keep existing',\n },\n ],\n default: 'skip',\n });\n}\n\n/**\n * Show final configuration summary\n */\nexport function showFinalSummary(config: ClaudeConfig): void {\n logger.newline();\n logger.title('Configuration Summary');\n\n // Project info\n logger.subtitle('Project');\n logger.keyValue('Name', config.project.name);\n logger.keyValue('GitHub', `${config.project.org}/${config.project.repo}`);\n if (config.project.domain) {\n logger.keyValue('Domain', config.project.domain);\n }\n\n // Preferences\n logger.newline();\n logger.subtitle('Preferences');\n logger.keyValue('Language', config.preferences.language === 'en' ? 'English' : 'Español');\n logger.keyValue('Co-author', config.preferences.includeCoAuthor ? 'Yes' : 'No');\n\n // Modules\n logger.newline();\n logger.subtitle('Modules');\n\n const moduleCategories = ['agents', 'skills', 'commands', 'docs'] as const;\n for (const category of moduleCategories) {\n const selected = config.modules[category].selected;\n if (selected.length > 0) {\n logger.keyValue(capitalize(category), `${selected.length} selected`);\n logger.note(selected.join(', '));\n }\n }\n\n // Extras\n logger.newline();\n logger.subtitle('Extras');\n const extras: string[] = [];\n if (config.extras.schemas) extras.push('schemas');\n if (config.extras.scripts) extras.push('scripts');\n if (config.extras.hooks.enabled) extras.push('hooks');\n if (config.extras.sessions) extras.push('sessions');\n logger.keyValue('Included', extras.join(', ') || 'none');\n\n // Code Style\n if (config.extras.codeStyle?.enabled) {\n const codeStyleTools: string[] = [];\n if (config.extras.codeStyle.editorconfig) codeStyleTools.push('EditorConfig');\n if (config.extras.codeStyle.commitlint) codeStyleTools.push('Commitlint');\n if (config.extras.codeStyle.biome) codeStyleTools.push('Biome');\n if (config.extras.codeStyle.prettier) codeStyleTools.push('Prettier');\n logger.keyValue('Code Style', codeStyleTools.join(', '));\n }\n\n // MCP\n if (config.mcp.servers.length > 0) {\n logger.newline();\n logger.subtitle('MCP Servers');\n logger.keyValue('Level', config.mcp.level);\n logger.keyValue('Servers', config.mcp.servers.map((s) => s.serverId).join(', '));\n }\n\n // Scaffold\n logger.newline();\n logger.subtitle('Scaffold');\n logger.keyValue(\n 'Type',\n config.scaffold.type === 'claude-only' ? 'Claude config only' : 'Full project'\n );\n}\n\n/**\n * Confirm final configuration\n */\nexport async function confirmFinalConfiguration(config: ClaudeConfig): Promise<boolean> {\n showFinalSummary(config);\n logger.newline();\n\n return confirm({\n message: 'Proceed with this configuration?',\n default: true,\n });\n}\n\n/**\n * Confirm destructive action\n */\nexport async function confirmDestructiveAction(action: string): Promise<boolean> {\n logger.warn(`⚠️ This action is destructive: ${action}`);\n\n const firstConfirm = await confirm({\n message: 'Are you sure you want to proceed?',\n default: false,\n });\n\n if (!firstConfirm) return false;\n\n const typeConfirm = await input({\n message: 'Type \"yes\" to confirm:',\n });\n\n return typeConfirm.toLowerCase() === 'yes';\n}\n\n/**\n * Show post-installation instructions\n */\nexport function showPostInstallInstructions(config: ClaudeConfig): void {\n logger.newline();\n logger.title('Installation Complete!');\n\n const steps: string[] = [];\n\n // Git steps\n if (config.scaffold.type === 'full-project') {\n steps.push('Review the generated project structure');\n }\n\n steps.push('Review .claude/CLAUDE.md for agent instructions');\n steps.push('Customize agents, commands, and skills as needed');\n\n // MCP steps\n if (config.mcp.servers.length > 0) {\n const mcpFile =\n config.mcp.level === 'user' ? '~/.claude/settings.json' : '.claude/settings.local.json';\n steps.push(`Configure MCP server credentials in ${mcpFile}`);\n }\n\n // Hook steps\n if (config.extras.hooks.enabled) {\n steps.push('Review hook scripts in .claude/hooks/');\n if (config.extras.hooks.notification?.audio) {\n steps.push('Install Piper TTS for audio notifications (see docs)');\n }\n }\n\n logger.instructions('Next Steps:', steps);\n\n // Show useful commands\n logger.subtitle('Useful Commands');\n logger.raw('');\n logger.raw(` ${colors.primary('claude-config status')} - Show current configuration`);\n logger.raw(` ${colors.primary('claude-config list')} - List available modules`);\n logger.raw(` ${colors.primary('claude-config add')} - Add a module`);\n logger.raw(` ${colors.primary('claude-config update')} - Update configuration`);\n logger.raw('');\n}\n\n/**\n * Show dependency installation instructions\n */\nexport function showDependencyInstructions(\n dependencies: Array<{ name: string; instructions: string[] }>\n): void {\n if (dependencies.length === 0) return;\n\n logger.newline();\n logger.title('Required Dependencies');\n logger.info('Some features require additional system dependencies:');\n\n for (const dep of dependencies) {\n logger.newline();\n logger.subtitle(dep.name);\n for (const instruction of dep.instructions) {\n logger.raw(` ${instruction}`);\n }\n }\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * List command - list available and installed modules\n */\n\nimport { Command } from 'commander';\nimport {\n BUNDLE_CATEGORY_NAMES,\n getAllBundles,\n getBundlesGroupedByCategory,\n} from '../../constants/bundles.js';\nimport { MCP_SERVERS } from '../../constants/mcp-servers.js';\nimport { formatBundleForDisplay, resolveBundle } from '../../lib/bundles/resolver.js';\nimport { readConfig } from '../../lib/config/index.js';\nimport { loadRegistry } from '../../lib/modules/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface ListOptions {\n installed?: boolean;\n available?: boolean;\n bundles?: boolean;\n mcp?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create list command\n */\nexport function createListCommand(): Command {\n const cmd = new Command('list')\n .description('List available modules, bundles, or MCP servers')\n .argument('[type]', 'Type to list (agents|skills|commands|docs|bundles|mcp)')\n .option('-i, --installed', 'Show only installed modules')\n .option('-a, --available', 'Show all available modules')\n .option('--bundles', 'List all bundles')\n .option('--mcp', 'List MCP servers')\n .option('-v, --verbose', 'Show detailed information')\n .action(runList);\n\n return cmd;\n}\n\n/**\n * Run list command\n */\nasync function runList(type: string | undefined, options: ListOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // List bundles\n if (options.bundles || type === 'bundles') {\n listBundles(options.verbose);\n return;\n }\n\n // List MCP servers\n if (options.mcp || type === 'mcp') {\n listMcpServers(options.verbose);\n return;\n }\n\n // Get templates path (bundled with package)\n const templatesPath = getTemplatesPath();\n\n // Load registry\n const registry = await loadRegistry(templatesPath);\n\n // Read current config\n const config = await readConfig(projectPath);\n\n // Determine what to list\n const categories: ModuleCategory[] = type\n ? [type as ModuleCategory]\n : ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n if (!registry[category]) continue;\n\n logger.newline();\n logger.title(capitalize(category));\n\n const allModules = registry[category];\n const installedIds = config?.modules[category].selected || [];\n const installedSet = new Set(installedIds);\n\n if (options.installed) {\n // Show only installed\n const installed = allModules.filter((m) => installedSet.has(m.id));\n if (installed.length === 0) {\n logger.info(`No ${category} installed`);\n } else {\n for (const mod of installed) {\n showModule(mod, true, options.verbose);\n }\n }\n } else {\n // Show all with installation status\n for (const mod of allModules) {\n const isInstalled = installedSet.has(mod.id);\n showModule(mod, isInstalled, options.verbose);\n }\n }\n\n logger.newline();\n logger.info(`Total: ${allModules.length} | Installed: ${installedIds.length}`);\n }\n } catch (error) {\n logger.error(`Failed to list modules: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show module info\n */\nfunction showModule(\n mod: { id: string; name: string; description?: string; tags?: string[] },\n isInstalled: boolean,\n verbose?: boolean\n): void {\n const status = isInstalled ? colors.success('✔') : colors.muted('○');\n const name = isInstalled ? colors.primary(mod.name) : mod.name;\n\n console.log(` ${status} ${name} ${colors.muted(`(${mod.id})`)}`);\n\n if (verbose && mod.description) {\n logger.note(` ${mod.description}`);\n }\n\n if (verbose && mod.tags && mod.tags.length > 0) {\n logger.note(` Tags: ${mod.tags.join(', ')}`);\n }\n}\n\n/**\n * List bundles\n */\nfunction listBundles(verbose?: boolean): void {\n logger.title('Available Bundles');\n logger.newline();\n\n const grouped = getBundlesGroupedByCategory();\n\n for (const [category, bundles] of Object.entries(grouped)) {\n const categoryName = BUNDLE_CATEGORY_NAMES[category] || category;\n logger.subtitle(categoryName);\n\n for (const bundle of bundles) {\n console.log(\n ` ${colors.primary(formatBundleForDisplay(bundle))} ${colors.muted(`(${bundle.id})`)}`\n );\n logger.note(` ${bundle.description}`);\n\n if (verbose) {\n const resolved = resolveBundle(bundle);\n\n if (bundle.longDescription) {\n logger.newline();\n logger.note(` ${bundle.longDescription}`);\n }\n\n logger.newline();\n logger.info(' Modules:');\n if (resolved.modules.agents.length > 0) {\n logger.note(` Agents: ${resolved.modules.agents.join(', ')}`);\n }\n if (resolved.modules.skills.length > 0) {\n logger.note(` Skills: ${resolved.modules.skills.join(', ')}`);\n }\n if (resolved.modules.commands.length > 0) {\n logger.note(` Commands: ${resolved.modules.commands.join(', ')}`);\n }\n if (resolved.modules.docs.length > 0) {\n logger.note(` Docs: ${resolved.modules.docs.join(', ')}`);\n }\n\n if (bundle.techStack && bundle.techStack.length > 0) {\n logger.newline();\n logger.note(` Tech stack: ${bundle.techStack.join(', ')}`);\n }\n\n if (bundle.alternativeTo && bundle.alternativeTo.length > 0) {\n logger.note(` Alternative to: ${bundle.alternativeTo.join(', ')}`);\n }\n }\n logger.newline();\n }\n }\n\n const allBundles = getAllBundles();\n logger.info(`Total bundles: ${allBundles.length}`);\n}\n\n/**\n * List MCP servers\n */\nfunction listMcpServers(verbose?: boolean): void {\n logger.title('Available MCP Servers');\n logger.newline();\n\n // Group by category\n const byCategory: Record<string, typeof MCP_SERVERS> = {};\n for (const server of MCP_SERVERS) {\n if (!byCategory[server.category]) {\n byCategory[server.category] = [];\n }\n byCategory[server.category].push(server);\n }\n\n for (const [category, servers] of Object.entries(byCategory)) {\n logger.subtitle(formatCategory(category));\n\n for (const server of servers) {\n console.log(` ${colors.primary(server.name)} ${colors.muted(`(${server.id})`)}`);\n logger.note(` ${server.description}`);\n\n if (verbose) {\n logger.note(` Package: ${server.package}`);\n if (server.requiresConfig) {\n logger.note(' Requires config: Yes');\n if (server.configFields) {\n const required = server.configFields.filter((f) => f.required).map((f) => f.name);\n if (required.length > 0) {\n logger.note(` Required fields: ${required.join(', ')}`);\n }\n }\n }\n }\n }\n logger.newline();\n }\n}\n\n/**\n * Format category name\n */\nfunction formatCategory(category: string): string {\n const labels: Record<string, string> = {\n documentation: 'Documentation',\n database: 'Database',\n 'version-control': 'Version Control',\n deployment: 'Deployment',\n infrastructure: 'Infrastructure',\n 'project-mgmt': 'Project Management',\n monitoring: 'Monitoring',\n };\n return labels[category] || category;\n}\n\n/**\n * Capitalize first letter\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","/**\n * Add command - add modules to configuration\n */\n\nimport { Command } from 'commander';\nimport { addModulesToConfig, readConfig, updateConfig } from '../../lib/config/index.js';\nimport { getModule, loadRegistry, resolveModules } from '../../lib/modules/index.js';\nimport { installModules } from '../../lib/modules/installer.js';\nimport { replacePlaceholders } from '../../lib/placeholders/index.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport { confirm } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface AddOptions {\n force?: boolean;\n noDeps?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create add command\n */\nexport function createAddCommand(): Command {\n const cmd = new Command('add')\n .description('Add a module to the configuration')\n .argument('<module>', 'Module to add (format: type:id, e.g., agents:tech-lead)')\n .option('-f, --force', 'Overwrite if already installed')\n .option('--no-deps', 'Skip dependency installation')\n .option('-v, --verbose', 'Detailed output')\n .action(runAdd);\n\n return cmd;\n}\n\n/**\n * Run add command\n */\nasync function runAdd(moduleSpec: string, options: AddOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Parse module spec\n const [category, moduleId] = parseModuleSpec(moduleSpec);\n\n if (!category || !moduleId) {\n logger.error('Invalid module format. Use: type:id (e.g., agents:tech-lead)');\n logger.info('Valid types: agents, skills, commands, docs');\n process.exit(1);\n }\n\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Load registry\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n\n // Find module\n const module = getModule(registry, category, moduleId);\n if (!module) {\n logger.error(`Module not found: ${moduleSpec}`);\n logger.info(`Run \"claude-config list ${category}\" to see available modules`);\n process.exit(1);\n }\n\n // Check if already installed\n const alreadyInstalled = config.modules[category].selected.includes(moduleId);\n if (alreadyInstalled && !options.force) {\n logger.warn(`Module ${colors.primary(module.name)} is already installed`);\n const overwrite = await confirm({\n message: 'Reinstall anyway?',\n default: false,\n });\n if (!overwrite) {\n return;\n }\n }\n\n // Resolve dependencies\n const modulesToInstall = [moduleId];\n if (!options.noDeps && module.dependencies && module.dependencies.length > 0) {\n const resolution = resolveModules(registry, category, [moduleId]);\n\n if (resolution.unresolved.length > 0) {\n logger.warn(`Some dependencies not found: ${resolution.unresolved.join(', ')}`);\n }\n\n // Add dependencies that aren't installed\n for (const dep of resolution.resolved) {\n if (dep.id !== moduleId && !config.modules[category].selected.includes(dep.id)) {\n modulesToInstall.push(dep.id);\n }\n }\n\n if (modulesToInstall.length > 1) {\n logger.info(`Will also install dependencies: ${modulesToInstall.slice(1).join(', ')}`);\n const proceed = await confirm({\n message: 'Continue?',\n default: true,\n });\n if (!proceed) {\n return;\n }\n }\n }\n\n // Install modules\n logger.newline();\n const moduleDefs = modulesToInstall\n .map((id) => getModule(registry, category, id))\n .filter(Boolean) as (typeof module)[];\n\n const result = await installModules(category, moduleDefs, {\n templatesPath,\n targetPath: projectPath,\n overwrite: options.force,\n });\n\n // Update config\n const updatedConfig = addModulesToConfig(config, category, modulesToInstall);\n await updateConfig(projectPath, updatedConfig);\n\n // Replace placeholders in new files\n const claudePath = joinPath(projectPath, '.claude');\n await replacePlaceholders(claudePath, config.project, {\n silent: !options.verbose,\n });\n\n // Show results\n if (result.installed.length > 0) {\n logger.success(`Installed: ${result.installed.join(', ')}`);\n }\n if (result.skipped.length > 0) {\n logger.info(`Skipped (already exists): ${result.skipped.join(', ')}`);\n }\n if (result.failed.length > 0) {\n logger.error(`Failed: ${result.failed.map((f) => `${f.id} (${f.error})`).join(', ')}`);\n }\n } catch (error) {\n logger.error(`Failed to add module: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Parse module specification\n */\nfunction parseModuleSpec(spec: string): [ModuleCategory | null, string | null] {\n const parts = spec.split(':');\n\n if (parts.length !== 2) {\n return [null, null];\n }\n\n const [type, id] = parts;\n const validTypes: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n if (!validTypes.includes(type as ModuleCategory)) {\n return [null, null];\n }\n\n return [type as ModuleCategory, id];\n}\n","/**\n * Remove command - remove modules from configuration\n */\n\nimport { Command } from 'commander';\nimport { readConfig, removeModulesFromConfig, updateConfig } from '../../lib/config/index.js';\nimport { checkRemovalImpact, getModule, loadRegistry } from '../../lib/modules/index.js';\nimport { uninstallModule } from '../../lib/modules/installer.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport { confirm } from '../../lib/utils/prompt-cancel.js';\nimport type { ModuleCategory } from '../../types/modules.js';\n\ninterface RemoveOptions {\n force?: boolean;\n keepFiles?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create remove command\n */\nexport function createRemoveCommand(): Command {\n const cmd = new Command('remove')\n .description('Remove a module from the configuration')\n .argument('<module>', 'Module to remove (format: type:id, e.g., agents:tech-lead)')\n .option('-f, --force', 'Remove without confirmation')\n .option('--keep-files', 'Keep module files, only remove from config')\n .option('-v, --verbose', 'Detailed output')\n .action(runRemove);\n\n return cmd;\n}\n\n/**\n * Run remove command\n */\nasync function runRemove(moduleSpec: string, options: RemoveOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Parse module spec\n const [category, moduleId] = parseModuleSpec(moduleSpec);\n\n if (!category || !moduleId) {\n logger.error('Invalid module format. Use: type:id (e.g., agents:tech-lead)');\n logger.info('Valid types: agents, skills, commands, docs');\n process.exit(1);\n }\n\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Check if installed\n const isInstalled = config.modules[category].selected.includes(moduleId);\n if (!isInstalled) {\n logger.warn(`Module ${moduleSpec} is not installed`);\n return;\n }\n\n // Load registry for module info\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n const module = getModule(registry, category, moduleId);\n\n // Check for dependents\n const impact = checkRemovalImpact(\n registry,\n category,\n moduleId,\n config.modules[category].selected\n );\n\n if (!impact.canRemove) {\n logger.warn(`Cannot remove ${moduleSpec}. The following modules depend on it:`);\n for (const dep of impact.blockedBy) {\n logger.item(dep);\n }\n\n if (!options.force) {\n const forceRemove = await confirm({\n message: 'Remove anyway? (dependent modules may break)',\n default: false,\n });\n if (!forceRemove) {\n return;\n }\n }\n }\n\n // Confirm removal\n if (!options.force) {\n const moduleName = module?.name || moduleId;\n const confirmed = await confirm({\n message: `Remove ${colors.primary(moduleName)}?`,\n default: false,\n });\n if (!confirmed) {\n return;\n }\n }\n\n // Remove file unless --keep-files\n if (!options.keepFiles) {\n const result = await uninstallModule(category, moduleId, projectPath);\n if (!result.success) {\n logger.warn(`Could not remove file: ${result.error}`);\n }\n }\n\n // Update config\n const updatedConfig = removeModulesFromConfig(config, category, [moduleId]);\n await updateConfig(projectPath, updatedConfig);\n\n logger.success(`Removed ${colors.primary(module?.name || moduleId)}`);\n\n if (options.keepFiles) {\n logger.info('Files were kept. Module removed from configuration only.');\n }\n } catch (error) {\n logger.error(`Failed to remove module: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Parse module specification\n */\nfunction parseModuleSpec(spec: string): [ModuleCategory | null, string | null] {\n const parts = spec.split(':');\n\n if (parts.length !== 2) {\n return [null, null];\n }\n\n const [type, id] = parts;\n const validTypes: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n if (!validTypes.includes(type as ModuleCategory)) {\n return [null, null];\n }\n\n return [type as ModuleCategory, id];\n}\n","/**\n * Status command - show current configuration status\n */\n\nimport { Command } from 'commander';\nimport { hasClaudeDir, readConfig } from '../../lib/config/index.js';\nimport { getHooksStatus } from '../../lib/hooks/index.js';\nimport { getInstalledMcpServers } from '../../lib/mcp/index.js';\nimport { getCurrentPermissions } from '../../lib/permissions/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\n\ninterface StatusOptions {\n json?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create status command\n */\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('Show current Claude configuration status')\n .option('--json', 'Output as JSON')\n .option('-v, --verbose', 'Show detailed information')\n .action(runStatus);\n\n return cmd;\n}\n\n/**\n * Run status command\n */\nasync function runStatus(options: StatusOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Check for .claude directory\n if (!(await hasClaudeDir(projectPath))) {\n logger.warn('No Claude configuration found in this directory');\n logger.info('Run \"claude-config init\" to initialize');\n process.exit(0);\n }\n\n // Read config\n const config = await readConfig(projectPath);\n\n if (!config) {\n logger.warn('.claude directory exists but config.json is missing');\n logger.info('Run \"claude-config init\" to initialize properly');\n process.exit(0);\n }\n\n // Get additional status info\n const hooksStatus = await getHooksStatus(projectPath);\n const mcpServers = await getInstalledMcpServers(projectPath);\n const permissions = await getCurrentPermissions(projectPath);\n\n if (options.json) {\n const status = {\n version: config.version,\n project: config.project,\n preferences: config.preferences,\n modules: {\n agents: config.modules.agents.selected,\n skills: config.modules.skills.selected,\n commands: config.modules.commands.selected,\n docs: config.modules.docs.selected,\n },\n extras: {\n schemas: config.extras.schemas,\n scripts: config.extras.scripts,\n hooks: hooksStatus,\n sessions: config.extras.sessions,\n },\n mcp: {\n level: config.mcp.level,\n project: mcpServers.project,\n user: mcpServers.user,\n },\n permissions: {\n project: permissions.project,\n user: permissions.user,\n },\n scaffold: config.scaffold,\n lastUpdated: config.customizations.lastUpdated,\n };\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n // Display status\n logger.title('Claude Configuration Status');\n\n // Project info\n logger.newline();\n logger.subtitle('Project');\n logger.keyValue('Name', config.project.name);\n logger.keyValue('Description', config.project.description);\n logger.keyValue('GitHub', `${config.project.org}/${config.project.repo}`);\n if (config.project.domain) {\n logger.keyValue('Domain', config.project.domain);\n }\n logger.keyValue('Entity', `${config.project.entityType} / ${config.project.entityTypePlural}`);\n\n // Preferences\n logger.newline();\n logger.subtitle('Preferences');\n logger.keyValue('Language', config.preferences.language === 'en' ? 'English' : 'Español');\n logger.keyValue(\n 'Response Language',\n config.preferences.responseLanguage === 'en' ? 'English' : 'Español'\n );\n logger.keyValue('Co-author', config.preferences.includeCoAuthor ? 'Yes' : 'No');\n\n // Modules\n logger.newline();\n logger.subtitle('Modules');\n showModuleStatus('Agents', config.modules.agents.selected, options.verbose);\n showModuleStatus('Skills', config.modules.skills.selected, options.verbose);\n showModuleStatus('Commands', config.modules.commands.selected, options.verbose);\n showModuleStatus('Docs', config.modules.docs.selected, options.verbose);\n\n // Extras\n logger.newline();\n logger.subtitle('Extras');\n logger.keyValue(\n 'Schemas',\n config.extras.schemas ? colors.success('enabled') : colors.muted('disabled')\n );\n logger.keyValue(\n 'Scripts',\n config.extras.scripts ? colors.success('enabled') : colors.muted('disabled')\n );\n logger.keyValue(\n 'Sessions',\n config.extras.sessions ? colors.success('enabled') : colors.muted('disabled')\n );\n\n // Hooks\n logger.newline();\n logger.keyValue(\n 'Hooks',\n hooksStatus.enabled ? colors.success('enabled') : colors.muted('disabled')\n );\n if (hooksStatus.enabled && options.verbose) {\n for (const hook of hooksStatus.hooks) {\n if (hook.exists) {\n const status = hook.executable ? colors.success('✔') : colors.warning('⚠ not executable');\n logger.item(`${hook.name}: ${status}`, 1);\n }\n }\n }\n\n // MCP Servers\n logger.newline();\n logger.subtitle('MCP Servers');\n logger.keyValue('Level', config.mcp.level);\n\n if (mcpServers.project.length > 0) {\n logger.keyValue('Project', mcpServers.project.join(', '));\n }\n if (mcpServers.user.length > 0) {\n logger.keyValue('User', mcpServers.user.join(', '));\n }\n if (mcpServers.project.length === 0 && mcpServers.user.length === 0) {\n logger.info('No MCP servers configured');\n }\n\n // Permissions\n if (options.verbose && (permissions.project || permissions.user)) {\n logger.newline();\n logger.subtitle('Permissions');\n if (permissions.project?.allow) {\n logger.keyValue('Project Allow', `${permissions.project.allow.length} rules`);\n }\n if (permissions.project?.deny) {\n logger.keyValue('Project Deny', `${permissions.project.deny.length} rules`);\n }\n if (permissions.user?.allow) {\n logger.keyValue('User Allow', `${permissions.user.allow.length} rules`);\n }\n if (permissions.user?.deny) {\n logger.keyValue('User Deny', `${permissions.user.deny.length} rules`);\n }\n }\n\n // Meta\n logger.newline();\n logger.subtitle('Configuration');\n logger.keyValue('Version', config.version);\n logger.keyValue('Template', config.templateSource.type);\n logger.keyValue('Last Updated', formatDate(config.customizations.lastUpdated));\n logger.keyValue(\n 'Placeholders',\n config.customizations.placeholdersReplaced ? 'Replaced' : 'Not replaced'\n );\n\n if (config.customizations.customFiles.length > 0) {\n logger.keyValue('Custom Files', String(config.customizations.customFiles.length));\n if (options.verbose) {\n for (const file of config.customizations.customFiles) {\n logger.item(file, 1);\n }\n }\n }\n } catch (error) {\n logger.error(`Failed to get status: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show module status\n */\nfunction showModuleStatus(label: string, modules: string[], verbose?: boolean): void {\n const count = modules.length;\n const status = count > 0 ? colors.success(`${count} installed`) : colors.muted('none');\n logger.keyValue(label, status);\n\n if (verbose && count > 0) {\n logger.note(` ${modules.join(', ')}`);\n }\n}\n\n/**\n * Format date\n */\nfunction formatDate(isoString: string): string {\n try {\n const date = new Date(isoString);\n return `${date.toLocaleDateString()} ${date.toLocaleTimeString()}`;\n } catch {\n return isoString;\n }\n}\n","/**\n * Update command - update configuration and modules\n */\n\nimport { Command } from 'commander';\nimport { readConfig, updateConfig } from '../../lib/config/index.js';\nimport { installHooks } from '../../lib/hooks/index.js';\nimport { installMcpServers } from '../../lib/mcp/index.js';\nimport { filterModules, getModule, loadRegistry } from '../../lib/modules/index.js';\nimport { getInstalledModules, installModules } from '../../lib/modules/installer.js';\nimport { installPermissions } from '../../lib/permissions/index.js';\nimport { replacePlaceholders } from '../../lib/placeholders/index.js';\nimport { resolvePath } from '../../lib/utils/fs.js';\nimport { logger } from '../../lib/utils/logger.js';\nimport { getTemplatesPath } from '../../lib/utils/paths.js';\nimport type { ModuleCategory } from '../../types/modules.js';\nimport {\n promptHookConfig,\n promptMcpConfig,\n promptPermissionsConfig,\n promptPreferences,\n showSkippedMcpInstructions,\n} from '../prompts/index.js';\nimport {\n type ModuleUpdate,\n promptConflictResolution,\n promptNewModules,\n promptReconfigureOptions,\n promptUpdateAction,\n promptUpdatedModules,\n showUpdateReport,\n} from '../prompts/update.js';\n\ninterface UpdateOptions {\n check?: boolean;\n modules?: boolean;\n config?: boolean;\n all?: boolean;\n force?: boolean;\n interactive?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create update command\n */\nexport function createUpdateCommand(): Command {\n const cmd = new Command('update')\n .description('Update configuration and modules')\n .option('--check', 'Only check for updates')\n .option('--modules', 'Update only modules')\n .option('--config', 'Reconfigure settings')\n .option('--all', 'Update everything')\n .option('-f, --force', 'Overwrite files without asking')\n .option('-i, --interactive', 'Ask for each change')\n .option('-v, --verbose', 'Detailed output')\n .action(runUpdate);\n\n return cmd;\n}\n\n/**\n * Run update command\n */\nasync function runUpdate(options: UpdateOptions): Promise<void> {\n const projectPath = resolvePath('.');\n\n try {\n // Read current config\n const config = await readConfig(projectPath);\n if (!config) {\n logger.error('No Claude configuration found. Run \"claude-config init\" first.');\n process.exit(1);\n }\n\n // Load registry\n const templatesPath = getTemplatesPath();\n const registry = await loadRegistry(templatesPath);\n\n // Determine action\n let action = options.check\n ? 'check'\n : options.modules\n ? 'modules'\n : options.config\n ? 'config'\n : options.all\n ? 'all'\n : null;\n\n if (!action) {\n const result = await promptUpdateAction();\n if (result === 'cancel') {\n return;\n }\n action = result;\n }\n\n // Check for updates\n const updates = await detectUpdates(registry, config, projectPath);\n\n if (action === 'check') {\n showUpdateReport(updates);\n return;\n }\n\n // Show update report\n showUpdateReport(updates);\n\n // Handle module updates\n if (action === 'modules' || action === 'all') {\n await handleModuleUpdates(projectPath, config, registry, updates, options);\n }\n\n // Handle configuration updates\n if (action === 'config' || action === 'all') {\n await handleConfigUpdates(projectPath, config, options);\n }\n } catch (error) {\n logger.error(`Update failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Detect updates\n */\nasync function detectUpdates(\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n config: Awaited<ReturnType<typeof readConfig>>,\n projectPath: string\n): Promise<{\n new: ModuleUpdate[];\n updated: ModuleUpdate[];\n deprecated: ModuleUpdate[];\n conflicts: ModuleUpdate[];\n}> {\n const result = {\n new: [] as ModuleUpdate[],\n updated: [] as ModuleUpdate[],\n deprecated: [] as ModuleUpdate[],\n conflicts: [] as ModuleUpdate[],\n };\n\n if (!config) return result;\n\n const categories: ModuleCategory[] = ['agents', 'skills', 'commands', 'docs'];\n\n for (const category of categories) {\n const installed = config.modules[category].selected;\n const installedSet = new Set(installed);\n const available = registry[category];\n\n // Find new modules\n for (const mod of available) {\n if (!installedSet.has(mod.id)) {\n result.new.push({\n id: mod.id,\n name: mod.name,\n category,\n type: 'new',\n });\n }\n }\n\n // Find updated/deprecated (would need version tracking)\n // For now, just check if files exist\n await getInstalledModules(category, projectPath);\n\n for (const id of installed) {\n const mod = available.find((m) => m.id === id);\n if (!mod) {\n // Module was removed from registry\n result.deprecated.push({\n id,\n name: id,\n category,\n type: 'deprecated',\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Handle module updates\n */\nasync function handleModuleUpdates(\n projectPath: string,\n config: NonNullable<Awaited<ReturnType<typeof readConfig>>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n updates: Awaited<ReturnType<typeof detectUpdates>>,\n options: UpdateOptions\n): Promise<void> {\n const templatesPath = getTemplatesPath();\n\n // Handle new modules\n if (updates.new.length > 0) {\n logger.newline();\n const newIds = options.interactive ? await promptNewModules(updates.new) : [];\n\n if (newIds.length > 0) {\n // Group by category\n const byCategory: Record<ModuleCategory, string[]> = {\n agents: [],\n skills: [],\n commands: [],\n docs: [],\n };\n\n for (const update of updates.new) {\n if (newIds.includes(update.id)) {\n byCategory[update.category as ModuleCategory].push(update.id);\n }\n }\n\n // Install new modules\n for (const [category, ids] of Object.entries(byCategory)) {\n if (ids.length === 0) continue;\n\n const modules = filterModules(registry, category as ModuleCategory, ids);\n await installModules(category as ModuleCategory, modules, {\n templatesPath,\n targetPath: projectPath,\n overwrite: false,\n });\n\n // Update config\n config.modules[category as ModuleCategory].selected.push(...ids);\n }\n }\n }\n\n // Handle updated modules\n if (updates.updated.length > 0 && options.interactive) {\n const updateIds = await promptUpdatedModules(updates.updated);\n\n for (const id of updateIds) {\n const update = updates.updated.find((u) => u.id === id);\n if (!update) continue;\n\n // Handle conflicts\n if (update.hasLocalChanges && !options.force) {\n const resolution = await promptConflictResolution(update);\n\n if (resolution === 'keep') continue;\n if (resolution === 'diff') {\n logger.info('Diff display not implemented yet');\n continue;\n }\n }\n\n // Update module\n const mod = getModule(registry, update.category as ModuleCategory, id);\n if (mod) {\n await installModules(update.category as ModuleCategory, [mod], {\n templatesPath,\n targetPath: projectPath,\n overwrite: true,\n });\n }\n }\n }\n\n // Replace placeholders in updated files\n const claudePath = resolvePath(projectPath, '.claude');\n await replacePlaceholders(claudePath, config.project, { silent: !options.verbose });\n\n // Save config\n config.customizations.lastUpdated = new Date().toISOString();\n await updateConfig(projectPath, config);\n}\n\n/**\n * Handle configuration updates\n */\nasync function handleConfigUpdates(\n projectPath: string,\n config: NonNullable<Awaited<ReturnType<typeof readConfig>>>,\n _options: UpdateOptions\n): Promise<void> {\n const reconfigureOptions = await promptReconfigureOptions();\n\n if (reconfigureOptions.includes('preferences')) {\n const preferences = await promptPreferences({\n defaults: config.preferences,\n });\n config.preferences = preferences;\n }\n\n if (reconfigureOptions.includes('hooks')) {\n const hookConfig = await promptHookConfig({\n defaults: config.extras.hooks,\n });\n config.extras.hooks = hookConfig;\n await installHooks(projectPath, hookConfig);\n }\n\n if (reconfigureOptions.includes('mcp')) {\n const mcpResult = await promptMcpConfig({\n defaults: config.mcp,\n });\n config.mcp = mcpResult.config;\n await installMcpServers(projectPath, mcpResult.config);\n\n // Show instructions for skipped configurations\n if (mcpResult.skippedConfigs.length > 0) {\n showSkippedMcpInstructions(mcpResult.skippedConfigs, mcpResult.config.level);\n }\n }\n\n if (reconfigureOptions.includes('permissions')) {\n const permissionsConfig = await promptPermissionsConfig();\n config.customizations.permissions = permissionsConfig;\n await installPermissions(projectPath, permissionsConfig, 'project');\n }\n\n // Save config\n config.customizations.lastUpdated = new Date().toISOString();\n await updateConfig(projectPath, config);\n\n logger.success('Configuration updated');\n}\n","/**\n * Configure command - configure template placeholders\n */\n\nimport { Command } from 'commander';\nimport {\n formatGlobalDefaults,\n getGlobalDefaultsPath,\n readGlobalDefaults,\n} from '../../lib/config/global-defaults.js';\nimport { readConfig, writeConfig } from '../../lib/config/index.js';\nimport {\n formatReplacementReport,\n previewReplacements,\n replaceTemplateConfigWithSpinner,\n} from '../../lib/templates/config-replacer.js';\nimport {\n formatScanSummary,\n getUnconfiguredPlaceholders,\n scanForPlaceholders,\n} from '../../lib/templates/scanner.js';\nimport { joinPath, resolvePath } from '../../lib/utils/fs.js';\nimport { colors, logger } from '../../lib/utils/logger.js';\nimport type { TemplatePlaceholderCategory } from '../../types/template-config.js';\nimport {\n buildConfigContext,\n confirmTemplateConfig,\n promptSaveGlobalDefaults,\n promptSetupMode,\n promptTemplateConfig,\n} from '../prompts/template-config.js';\n\ninterface ConfigureOptions {\n scan?: boolean;\n category?: TemplatePlaceholderCategory;\n preview?: boolean;\n showDefaults?: boolean;\n verbose?: boolean;\n}\n\n/**\n * Create configure command\n */\nexport function createConfigureCommand(): Command {\n const cmd = new Command('configure')\n .description('Configure template placeholders interactively')\n .argument('[path]', 'Project path (default: current directory)')\n .option('--scan', 'Scan for unconfigured placeholders only')\n .option(\n '-c, --category <name>',\n 'Configure specific category (commands|paths|targets|tracking|techStack|environment|brand)'\n )\n .option('--preview', 'Preview changes without applying')\n .option('--show-defaults', 'Show global defaults')\n .option('-v, --verbose', 'Detailed output')\n .action(runConfigure);\n\n return cmd;\n}\n\n/**\n * Run configure command\n */\nasync function runConfigure(path: string | undefined, options: ConfigureOptions): Promise<void> {\n const projectPath = resolvePath(path || '.');\n const claudePath = joinPath(projectPath, '.claude');\n\n logger.configure({ verbose: options.verbose, silent: false });\n\n logger.title('Template Configuration');\n\n try {\n // Show global defaults\n if (options.showDefaults) {\n await showGlobalDefaults();\n return;\n }\n\n // Scan mode - just show unconfigured placeholders\n if (options.scan) {\n await scanMode(claudePath, projectPath);\n return;\n }\n\n // Preview mode - show what would be replaced\n if (options.preview) {\n await previewMode(claudePath, projectPath);\n return;\n }\n\n // Interactive configuration\n await interactiveMode(claudePath, projectPath, options);\n } catch (error) {\n logger.error(`Configuration failed: ${error instanceof Error ? error.message : error}`);\n process.exit(1);\n }\n}\n\n/**\n * Show global defaults\n */\nasync function showGlobalDefaults(): Promise<void> {\n const defaults = await readGlobalDefaults();\n const formatted = formatGlobalDefaults(defaults);\n\n logger.info(`Path: ${colors.muted(getGlobalDefaultsPath())}`);\n logger.newline();\n logger.info(formatted);\n}\n\n/**\n * Scan mode - show unconfigured placeholders\n */\nasync function scanMode(claudePath: string, projectPath: string): Promise<void> {\n logger.info(`Scanning ${colors.primary(claudePath)} for placeholders...`);\n logger.newline();\n\n const scanResult = await scanForPlaceholders(claudePath);\n\n if (scanResult.placeholders.length === 0) {\n logger.success('No configurable placeholders found');\n return;\n }\n\n logger.info(formatScanSummary(scanResult));\n\n // Check for existing config\n const existingConfig = await readConfig(projectPath);\n\n if (existingConfig?.templateConfig) {\n const unconfigured = await getUnconfiguredPlaceholders(\n claudePath,\n existingConfig.templateConfig\n );\n\n if (unconfigured.length > 0) {\n logger.newline();\n logger.warn(`${unconfigured.length} placeholders not configured:`);\n for (const p of unconfigured) {\n logger.info(` ${p}`);\n }\n logger.newline();\n logger.info('Run `claude-config configure` to configure them');\n } else {\n logger.newline();\n logger.success('All placeholders are configured');\n }\n } else {\n logger.newline();\n logger.info('Run `claude-config configure` to configure placeholders');\n }\n}\n\n/**\n * Preview mode - show what would be replaced\n */\nasync function previewMode(claudePath: string, projectPath: string): Promise<void> {\n const existingConfig = await readConfig(projectPath);\n\n if (!existingConfig?.templateConfig) {\n logger.warn('No template configuration found');\n logger.info('Run `claude-config configure` first to set up configuration');\n return;\n }\n\n logger.info('Preview of replacements:');\n logger.newline();\n\n const replacements = await previewReplacements(claudePath, existingConfig.templateConfig);\n\n if (replacements.length === 0) {\n logger.info('No placeholders to replace');\n return;\n }\n\n // Group by file\n const byFile: Record<string, Array<{ placeholder: string; value: string }>> = {};\n for (const r of replacements) {\n if (!byFile[r.file]) {\n byFile[r.file] = [];\n }\n byFile[r.file].push({ placeholder: r.placeholder, value: r.value });\n }\n\n for (const [file, changes] of Object.entries(byFile)) {\n logger.subtitle(file);\n for (const change of changes) {\n logger.info(` ${change.placeholder} → ${colors.primary(change.value)}`);\n }\n logger.newline();\n }\n\n logger.success(\n `Total: ${replacements.length} replacements in ${Object.keys(byFile).length} files`\n );\n}\n\n/**\n * Interactive configuration mode\n */\nasync function interactiveMode(\n claudePath: string,\n projectPath: string,\n options: ConfigureOptions\n): Promise<void> {\n // Build context\n const context = await buildConfigContext(projectPath);\n\n // Select mode (unless category specified)\n let mode: 'quick' | 'guided' | 'advanced' = 'quick';\n if (!options.category) {\n mode = await promptSetupMode();\n }\n\n // Prompt for configuration\n const templateConfig = await promptTemplateConfig({\n context,\n mode,\n category: options.category as TemplatePlaceholderCategory | undefined,\n });\n\n // Show summary and confirm\n const confirmed = await confirmTemplateConfig(templateConfig, context);\n if (!confirmed) {\n logger.warn('Configuration cancelled');\n return;\n }\n\n // Apply replacements\n const report = await replaceTemplateConfigWithSpinner(claudePath, templateConfig);\n\n if (options.verbose) {\n logger.newline();\n logger.info(formatReplacementReport(report));\n }\n\n // Update project config\n const existingConfig = await readConfig(projectPath);\n if (existingConfig) {\n existingConfig.templateConfig = {\n commands: { ...existingConfig.templateConfig?.commands, ...templateConfig.commands },\n paths: { ...existingConfig.templateConfig?.paths, ...templateConfig.paths },\n targets: { ...existingConfig.templateConfig?.targets, ...templateConfig.targets },\n tracking: { ...existingConfig.templateConfig?.tracking, ...templateConfig.tracking },\n techStack: { ...existingConfig.templateConfig?.techStack, ...templateConfig.techStack },\n environment: {\n ...existingConfig.templateConfig?.environment,\n ...templateConfig.environment,\n },\n brand: { ...existingConfig.templateConfig?.brand, ...templateConfig.brand },\n };\n existingConfig.customizations.lastUpdated = new Date().toISOString();\n\n await writeConfig(projectPath, existingConfig);\n logger.success('Configuration saved to .claude/config.json');\n }\n\n // Offer to save as global defaults\n await promptSaveGlobalDefaults(templateConfig);\n\n logger.newline();\n logger.success('Template configuration complete!');\n}\n","/**\n * Template placeholder scanner\n *\n * Scans template files to discover {{PLACEHOLDER}} patterns\n * and returns information about which placeholders are used.\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n PlaceholderScanResult,\n TemplateConfig,\n TemplatePlaceholderCategory,\n} from '../../types/template-config.js';\nimport {\n getAllPlaceholderPatterns,\n getPlaceholderByPattern,\n isConfigurablePlaceholder,\n TEMPLATE_PLACEHOLDERS,\n} from '../../constants/template-placeholders.js';\n\n/**\n * Regex to match {{PLACEHOLDER}} patterns\n */\nconst PLACEHOLDER_REGEX = /\\{\\{([A-Z][A-Z0-9_]*)\\}\\}/g;\n\n/**\n * File extensions to scan\n */\nconst SCANNABLE_EXTENSIONS = ['.md', '.json', '.yaml', '.yml', '.txt'];\n\n/**\n * Directories to skip during scanning\n */\nconst SKIP_DIRECTORIES = ['node_modules', '.git', 'dist', 'build', '.next', '.turbo'];\n\n/**\n * Check if a path should be scanned\n */\nfunction shouldScanPath(filePath: string): boolean {\n const ext = path.extname(filePath).toLowerCase();\n return SCANNABLE_EXTENSIONS.includes(ext);\n}\n\n/**\n * Check if a directory should be skipped\n */\nfunction shouldSkipDirectory(dirName: string): boolean {\n return SKIP_DIRECTORIES.includes(dirName) || dirName.startsWith('.');\n}\n\n/**\n * Extract all placeholder patterns from content\n */\nexport function extractPlaceholders(content: string): string[] {\n const matches = content.matchAll(PLACEHOLDER_REGEX);\n const placeholders = new Set<string>();\n\n for (const match of matches) {\n placeholders.add(`{{${match[1]}}}`);\n }\n\n return Array.from(placeholders);\n}\n\n/**\n * Recursively get all files in a directory\n */\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!shouldSkipDirectory(entry.name)) {\n const subFiles = await getAllFiles(fullPath);\n files.push(...subFiles);\n }\n } else if (entry.isFile() && shouldScanPath(entry.name)) {\n files.push(fullPath);\n }\n }\n } catch {\n // Directory doesn't exist or can't be read\n }\n\n return files;\n}\n\n/**\n * Scan a directory for template placeholders\n */\nexport async function scanForPlaceholders(\n dir: string\n): Promise<PlaceholderScanResult> {\n const allPlaceholders = new Set<string>();\n const filesByPlaceholder: Record<string, string[]> = {};\n const counts: Record<string, number> = {};\n const byCategory: Record<TemplatePlaceholderCategory, string[]> = {\n commands: [],\n paths: [],\n targets: [],\n tracking: [],\n techStack: [],\n performance: [],\n brand: [],\n environment: [],\n };\n\n const files = await getAllFiles(dir);\n\n for (const file of files) {\n try {\n const content = await fs.readFile(file, 'utf-8');\n const placeholders = extractPlaceholders(content);\n\n for (const placeholder of placeholders) {\n // Only track configurable placeholders\n if (!isConfigurablePlaceholder(placeholder)) continue;\n\n allPlaceholders.add(placeholder);\n\n // Track files\n if (!filesByPlaceholder[placeholder]) {\n filesByPlaceholder[placeholder] = [];\n }\n filesByPlaceholder[placeholder].push(path.relative(dir, file));\n\n // Count occurrences\n const regex = new RegExp(\n placeholder.replace(/[{}]/g, '\\\\$&'),\n 'g'\n );\n const matchCount = (content.match(regex) || []).length;\n counts[placeholder] = (counts[placeholder] || 0) + matchCount;\n }\n } catch {\n // File can't be read, skip\n }\n }\n\n // Group by category\n for (const placeholder of allPlaceholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def) {\n byCategory[def.category].push(placeholder);\n }\n }\n\n return {\n placeholders: Array.from(allPlaceholders).sort(),\n byCategory,\n filesByPlaceholder,\n counts,\n };\n}\n\n/**\n * Get unconfigured placeholders (placeholders found but not in config)\n */\nexport async function getUnconfiguredPlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<string[]> {\n const scanResult = await scanForPlaceholders(dir);\n const unconfigured: string[] = [];\n\n // Flatten config to get configured keys\n const configuredKeys = new Set<string>();\n\n if (config.commands) {\n for (const [key] of Object.entries(config.commands)) {\n configuredKeys.add(key.toUpperCase() + '_COMMAND');\n }\n }\n if (config.paths) {\n for (const [key] of Object.entries(config.paths)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.targets) {\n for (const [key] of Object.entries(config.targets)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.tracking) {\n for (const [key] of Object.entries(config.tracking)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.techStack) {\n for (const [key] of Object.entries(config.techStack)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.environment) {\n for (const [key] of Object.entries(config.environment)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n if (config.brand) {\n for (const [key] of Object.entries(config.brand)) {\n configuredKeys.add(key.toUpperCase());\n }\n }\n\n // Check each found placeholder\n for (const placeholder of scanResult.placeholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def && !configuredKeys.has(def.key)) {\n unconfigured.push(placeholder);\n }\n }\n\n return unconfigured;\n}\n\n/**\n * Get placeholders that are required but not configured\n */\nexport async function getMissingRequiredPlaceholders(\n dir: string,\n config: Partial<TemplateConfig>\n): Promise<string[]> {\n const scanResult = await scanForPlaceholders(dir);\n const missing: string[] = [];\n\n for (const placeholder of scanResult.placeholders) {\n const def = getPlaceholderByPattern(placeholder);\n if (def?.required) {\n // Check if configured\n const isConfigured = isPlaceholderConfigured(def.key, config);\n if (!isConfigured) {\n missing.push(placeholder);\n }\n }\n }\n\n return missing;\n}\n\n/**\n * Check if a specific placeholder key is configured\n */\nfunction isPlaceholderConfigured(\n key: string,\n config: Partial<TemplateConfig>\n): boolean {\n const def = TEMPLATE_PLACEHOLDERS.find((p) => p.key === key);\n if (!def) return false;\n\n switch (def.category) {\n case 'commands': {\n const cmdKey = keyToConfigKey(key, 'commands');\n return Boolean(\n config.commands?.[cmdKey as keyof typeof config.commands]\n );\n }\n case 'paths': {\n const pathKey = keyToConfigKey(key, 'paths');\n return Boolean(config.paths?.[pathKey as keyof typeof config.paths]);\n }\n case 'targets':\n case 'performance': {\n const targetKey = keyToConfigKey(key, 'targets');\n return config.targets?.[targetKey as keyof typeof config.targets] !== undefined;\n }\n case 'tracking': {\n const trackKey = keyToConfigKey(key, 'tracking');\n return Boolean(\n config.tracking?.[trackKey as keyof typeof config.tracking]\n );\n }\n case 'techStack': {\n const techKey = keyToConfigKey(key, 'techStack');\n return Boolean(\n config.techStack?.[techKey as keyof typeof config.techStack]\n );\n }\n case 'environment': {\n const envKey = keyToConfigKey(key, 'environment');\n return Boolean(\n config.environment?.[envKey as keyof typeof config.environment]\n );\n }\n case 'brand': {\n const brandKey = keyToConfigKey(key, 'brand');\n return Boolean(config.brand?.[brandKey as keyof typeof config.brand]);\n }\n default:\n return false;\n }\n}\n\n/**\n * Convert placeholder key to config object key\n * e.g., TYPECHECK_COMMAND -> typecheck\n * COVERAGE_TARGET -> coverageTarget\n */\nfunction keyToConfigKey(key: string, category: string): string {\n // Remove category suffix if present\n let cleanKey = key;\n\n if (category === 'commands' && key.endsWith('_COMMAND')) {\n cleanKey = key.slice(0, -8);\n } else if (category === 'environment' && key.endsWith('_ENV')) {\n cleanKey = key.slice(0, -4);\n }\n\n // Convert SNAKE_CASE to camelCase\n return cleanKey\n .toLowerCase()\n .replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n}\n\n/**\n * Get scan summary as formatted string\n */\nexport function formatScanSummary(result: PlaceholderScanResult): string {\n const lines: string[] = [];\n\n lines.push(`Found ${result.placeholders.length} configurable placeholders:\\n`);\n\n const categories = Object.entries(result.byCategory).filter(\n ([, placeholders]) => placeholders.length > 0\n );\n\n for (const [category, placeholders] of categories) {\n lines.push(` ${category} (${placeholders.length}):`);\n for (const placeholder of placeholders) {\n const count = result.counts[placeholder] || 0;\n const files = result.filesByPlaceholder[placeholder]?.length || 0;\n lines.push(` ${placeholder} - ${count} uses in ${files} files`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n/**\n * List all known configurable placeholder patterns\n */\nexport function listAllConfigurablePlaceholders(): string[] {\n return getAllPlaceholderPatterns();\n}\n","/**\n * ASCII Banner utility using figlet and chalk\n */\n\nimport chalk from 'chalk';\nimport figlet from 'figlet';\n\n/**\n * Display the CLI banner\n */\nexport function showBanner(): void {\n const bannerText = figlet.textSync('Qazuor', {\n font: 'Standard',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n });\n\n // Create gradient effect with chalk\n const lines = bannerText.split('\\n');\n const colors = [\n chalk.hex('#FF6B6B'), // Coral red\n chalk.hex('#FF8E53'), // Orange\n chalk.hex('#FED330'), // Yellow\n chalk.hex('#26DE81'), // Green\n chalk.hex('#4BCFFA'), // Light blue\n chalk.hex('#A55EEA'), // Purple\n ];\n\n const coloredBanner = lines\n .map((line, index) => {\n const colorIndex = index % colors.length;\n return colors[colorIndex](line);\n })\n .join('\\n');\n\n console.log(coloredBanner);\n console.log(chalk.gray(' Claude Code Configuration & Project Setup'));\n console.log(chalk.gray(' ─────────────────────────────────────'));\n console.log();\n}\n\n/**\n * Display a smaller inline banner for commands\n */\nexport function showInlineBanner(): void {\n console.log();\n console.log(chalk.hex('#4BCFFA').bold(' ⚡ Qazuor Claude Config'));\n console.log(chalk.gray(' ─────────────────────────────────'));\n console.log();\n}\n"],"mappings":"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","names":["fs","path","os","import_commander","ora","pc","import_node_path","import_fs_extra","chalk","args","path","fse","CONFIG_FILE","CLAUDE_DIR","fs","path","platform","platform","platform","fs","os","glob","module","module","remove","listFiles","backup","getInstallCommand","os","PROJECT_SETTINGS_FILE","USER_SETTINGS_FILE","import_node_path","path","fs","fs","path","import_ora","replaceInFile","spinner","ora","import_chalk","inquirerConfirm","chalk","inquirerInput","inquirerSelect","inquirerCheckbox","inquirerPassword","import_prompts","huskyIntegration","value","hasConfig","writeConfig","fs","path","module","capitalize","capitalize","path","getInstallCommand","import_commander","capitalize","formatCategory","import_commander","module","import_commander","parseModuleSpec","module","import_commander","import_commander","import_commander","fs","path","SKIP_DIRECTORIES","shouldSkipDirectory","getAllFiles","path","VERSION","import_chalk","figlet","colors","chalk"]}
|