@girardmedia/bootspring 2.0.21 → 2.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/cli/preseed/index.js +16 -0
  2. package/cli/preseed/interactive.js +143 -0
  3. package/cli/preseed/templates.js +227 -0
  4. package/cli/seed/builders/ai-context-builder.js +85 -0
  5. package/cli/seed/builders/index.js +13 -0
  6. package/cli/seed/builders/seed-builder.js +272 -0
  7. package/cli/seed/extractors/content-extractors.js +383 -0
  8. package/cli/seed/extractors/index.js +47 -0
  9. package/cli/seed/extractors/metadata-extractors.js +167 -0
  10. package/cli/seed/extractors/section-extractor.js +54 -0
  11. package/cli/seed/extractors/stack-extractors.js +228 -0
  12. package/cli/seed/index.js +18 -0
  13. package/cli/seed/utils/folder-structure.js +84 -0
  14. package/cli/seed/utils/index.js +11 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.js +3220 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/context-McpJQa_2.d.ts +5710 -0
  19. package/dist/core/index.d.ts +635 -0
  20. package/dist/core/index.js +2593 -0
  21. package/dist/core/index.js.map +1 -0
  22. package/dist/index-QqbeEiDm.d.ts +857 -0
  23. package/dist/index-UiYCgwiH.d.ts +174 -0
  24. package/dist/index.d.ts +453 -0
  25. package/dist/index.js +44228 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/mcp/index.d.ts +1 -0
  28. package/dist/mcp/index.js +41173 -0
  29. package/dist/mcp/index.js.map +1 -0
  30. package/generators/index.ts +82 -0
  31. package/intelligence/orchestrator/config/failure-signatures.js +48 -0
  32. package/intelligence/orchestrator/config/index.js +20 -0
  33. package/intelligence/orchestrator/config/phases.js +111 -0
  34. package/intelligence/orchestrator/config/remediation.js +150 -0
  35. package/intelligence/orchestrator/config/workflows.js +168 -0
  36. package/intelligence/orchestrator/core/index.js +16 -0
  37. package/intelligence/orchestrator/core/state-manager.js +88 -0
  38. package/intelligence/orchestrator/core/telemetry.js +24 -0
  39. package/intelligence/orchestrator/index.js +17 -0
  40. package/mcp/contracts/mcp-contract.v1.json +1 -1
  41. package/package.json +16 -3
  42. package/src/cli/agent.ts +703 -0
  43. package/src/cli/analyze.ts +640 -0
  44. package/src/cli/audit.ts +707 -0
  45. package/src/cli/auth.ts +930 -0
  46. package/src/cli/billing.ts +364 -0
  47. package/src/cli/build.ts +1089 -0
  48. package/src/cli/business.ts +508 -0
  49. package/src/cli/checkpoint-utils.ts +236 -0
  50. package/src/cli/checkpoint.ts +757 -0
  51. package/src/cli/cloud-sync.ts +534 -0
  52. package/src/cli/content.ts +273 -0
  53. package/src/cli/context.ts +667 -0
  54. package/src/cli/dashboard.ts +133 -0
  55. package/src/cli/deploy.ts +704 -0
  56. package/src/cli/doctor.ts +480 -0
  57. package/src/cli/fundraise.ts +494 -0
  58. package/src/cli/generate.ts +346 -0
  59. package/src/cli/github-cmd.ts +566 -0
  60. package/src/cli/health.ts +599 -0
  61. package/src/cli/index.ts +113 -0
  62. package/src/cli/init.ts +838 -0
  63. package/src/cli/legal.ts +495 -0
  64. package/src/cli/log.ts +316 -0
  65. package/src/cli/loop.ts +1660 -0
  66. package/src/cli/manager.ts +878 -0
  67. package/src/cli/mcp.ts +275 -0
  68. package/src/cli/memory.ts +346 -0
  69. package/src/cli/metrics.ts +590 -0
  70. package/src/cli/monitor.ts +960 -0
  71. package/src/cli/mvp.ts +662 -0
  72. package/src/cli/onboard.ts +663 -0
  73. package/src/cli/orchestrator.ts +622 -0
  74. package/src/cli/plugin.ts +483 -0
  75. package/src/cli/prd.ts +671 -0
  76. package/src/cli/preseed-start.ts +1633 -0
  77. package/src/cli/preseed.ts +2434 -0
  78. package/src/cli/project.ts +526 -0
  79. package/src/cli/quality.ts +885 -0
  80. package/src/cli/security.ts +1079 -0
  81. package/src/cli/seed.ts +1224 -0
  82. package/src/cli/skill.ts +537 -0
  83. package/src/cli/suggest.ts +1225 -0
  84. package/src/cli/switch.ts +518 -0
  85. package/src/cli/task.ts +780 -0
  86. package/src/cli/telemetry.ts +172 -0
  87. package/src/cli/todo.ts +627 -0
  88. package/src/cli/types.ts +15 -0
  89. package/src/cli/update.ts +334 -0
  90. package/src/cli/visualize.ts +609 -0
  91. package/src/cli/watch.ts +895 -0
  92. package/src/cli/workspace.ts +709 -0
  93. package/src/core/action-recorder.ts +673 -0
  94. package/src/core/analyze-workflow.ts +1453 -0
  95. package/src/core/api-client.ts +1120 -0
  96. package/src/core/audit-workflow.ts +1681 -0
  97. package/src/core/auth.ts +471 -0
  98. package/src/core/build-orchestrator.ts +509 -0
  99. package/src/core/build-state.ts +621 -0
  100. package/src/core/checkpoint-engine.ts +482 -0
  101. package/src/core/config.ts +1285 -0
  102. package/src/core/context-loader.ts +694 -0
  103. package/src/core/context.ts +410 -0
  104. package/src/core/deploy-workflow.ts +1085 -0
  105. package/src/core/entitlements.ts +322 -0
  106. package/src/core/github-sync.ts +720 -0
  107. package/src/core/index.ts +981 -0
  108. package/src/core/ingest.ts +1186 -0
  109. package/src/core/metrics-engine.ts +886 -0
  110. package/src/core/mvp.ts +847 -0
  111. package/src/core/onboard-workflow.ts +1293 -0
  112. package/src/core/policies.ts +81 -0
  113. package/src/core/preseed-workflow.ts +1163 -0
  114. package/src/core/preseed.ts +1826 -0
  115. package/src/core/project-context.ts +380 -0
  116. package/src/core/project-state.ts +699 -0
  117. package/src/core/r2-sync.ts +691 -0
  118. package/src/core/scaffold.ts +1715 -0
  119. package/src/core/session.ts +286 -0
  120. package/src/core/task-extractor.ts +799 -0
  121. package/src/core/telemetry.ts +371 -0
  122. package/src/core/tier-enforcement.ts +737 -0
  123. package/src/core/utils.ts +437 -0
  124. package/src/index.ts +29 -0
  125. package/src/intelligence/agent-collab.ts +2376 -0
  126. package/src/intelligence/auto-suggest.ts +713 -0
  127. package/src/intelligence/content-gen.ts +1351 -0
  128. package/src/intelligence/cross-project.ts +1692 -0
  129. package/src/intelligence/git-memory.ts +529 -0
  130. package/src/intelligence/index.ts +318 -0
  131. package/src/intelligence/orchestrator.ts +534 -0
  132. package/src/intelligence/prd.ts +466 -0
  133. package/src/intelligence/recommendations.ts +982 -0
  134. package/src/intelligence/workflow-composer.ts +1472 -0
  135. package/src/mcp/capabilities.ts +233 -0
  136. package/src/mcp/index.ts +37 -0
  137. package/src/mcp/registry.ts +1268 -0
  138. package/src/mcp/response-formatter.ts +797 -0
  139. package/src/mcp/server.ts +240 -0
  140. package/src/types/agent.ts +69 -0
  141. package/src/types/config.ts +86 -0
  142. package/src/types/context.ts +77 -0
  143. package/src/types/index.ts +53 -0
  144. package/src/types/mcp.ts +91 -0
  145. package/src/types/skills.ts +47 -0
  146. package/src/types/workflow.ts +155 -0
  147. package/generators/index.js +0 -18
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../node_modules/tsup/assets/cjs_shims.js","../../package.json","../../src/core/auth.ts","../../src/core/session.ts","../../intelligence/git-memory.js","../../generators/templates/agents.template.js","../../src/cli/index.ts","../../src/cli/telemetry.ts","../../src/core/utils.ts","../../src/core/telemetry.ts","../../src/cli/dashboard.ts","../../src/cli/generate.ts","../../src/core/config.ts","../../src/core/context.ts","../../src/cli/todo.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 \"name\": \"@girardmedia/bootspring\",\n \"version\": \"2.0.21\",\n \"description\": \"Development scaffolding with intelligence - AI-powered context, agents, and workflows for any MCP-compatible assistant\",\n \"keywords\": [\n \"ai\",\n \"development\",\n \"scaffolding\",\n \"mcp\",\n \"claude\",\n \"agents\",\n \"context\",\n \"workflow\",\n \"devtools\"\n ],\n \"author\": \"Bootspring\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bootspring/bootspring.git\"\n },\n \"homepage\": \"https://bootspring.com\",\n \"bugs\": {\n \"url\": \"https://github.com/bootspring/bootspring/issues\"\n },\n \"bin\": {\n \"bootspring\": \"./bin/bootspring.js\"\n },\n \"main\": \"./core/index.js\",\n \"types\": \"./core/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./core/index.d.ts\",\n \"default\": \"./core/index.js\"\n },\n \"./mcp\": {\n \"types\": \"./mcp/server.d.ts\",\n \"default\": \"./mcp/server.js\"\n },\n \"./auth\": {\n \"types\": \"./core/auth.d.ts\",\n \"default\": \"./core/auth.js\"\n },\n \"./api\": {\n \"types\": \"./core/api-client.d.ts\",\n \"default\": \"./core/api-client.js\"\n },\n \"./marketplace\": {\n \"types\": \"./marketplace/index.d.ts\",\n \"default\": \"./marketplace/index.js\"\n }\n },\n \"files\": [\n \"bin/\",\n \"core/\",\n \"cli/\",\n \"mcp/\",\n \"intelligence/\",\n \"quality/\",\n \"generators/\",\n \"hooks/\",\n \"plugins/\",\n \"marketplace/\",\n \"src/\",\n \"dist/\"\n ],\n \"scripts\": {\n \"start\": \"node bin/bootspring.js\",\n \"dashboard\": \"node bin/bootspring.js dashboard\",\n \"mcp\": \"node mcp/server.js\",\n \"test\": \"jest\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"typecheck\": \"tsc --noEmit\",\n \"build\": \"tsup\",\n \"build:watch\": \"tsup --watch\",\n \"dev\": \"tsx watch src/index.ts\",\n \"verify:lint-budget\": \"node scripts/check-lint-budgets.js\",\n \"build:mcp-contract\": \"node scripts/export-mcp-contract.js\",\n \"verify:mcp-contract\": \"node scripts/export-mcp-contract.js --check\",\n \"verify:package\": \"node scripts/check-package-boundaries.js\",\n \"db:sync\": \"node shared/db/sync.js\",\n \"db:sync:check\": \"node shared/db/sync.js --check\",\n \"prepublishOnly\": \"npm test && npm run lint --if-present && npm run verify:package && npm run verify:mcp-contract\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.2\",\n \"@types/node\": \"^25.3.0\",\n \"eslint\": \"^9.39.2\",\n \"globals\": \"^17.3.0\",\n \"jest\": \"^29.7.0\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.21.0\",\n \"typescript\": \"^5.9.3\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"ws\": \"^8.18.0\",\n \"yaml\": \"^2.8.0\",\n \"zod\": \"^3.25.0\"\n },\n \"engines\": {\n \"node\": \">=18.0.0\"\n },\n \"overrides\": {\n \"table\": {\n \"ajv\": \"^8.12.0\"\n },\n \"minimatch\": \"^10.2.1\"\n }\n}\n","/**\n * Bootspring Auth Module\n *\n * Manages authentication tokens stored in ~/.bootspring/\n *\n * @package bootspring\n * @module core/auth\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\n\nexport const BOOTSPRING_DIR = path.join(os.homedir(), '.bootspring');\nexport const CREDENTIALS_FILE = path.join(BOOTSPRING_DIR, 'credentials.json');\nexport const CONFIG_FILE = path.join(BOOTSPRING_DIR, 'config.json');\nexport const DEVICE_FILE = path.join(BOOTSPRING_DIR, 'device.json');\n\n/**\n * User info structure\n */\nexport interface UserInfo {\n id?: string;\n email?: string;\n name?: string;\n tier?: string;\n [key: string]: unknown;\n}\n\n/**\n * Stored credentials structure\n */\nexport interface Credentials {\n token?: string | undefined;\n refreshToken?: string | undefined;\n expiresAt?: string | undefined;\n apiKey?: string | undefined;\n user?: UserInfo | undefined;\n [key: string]: unknown;\n}\n\n/**\n * Encrypted data structure\n */\ninterface EncryptedData {\n iv: string;\n data: string;\n}\n\n/**\n * Login response structure\n */\nexport interface LoginResponse {\n token: string;\n refreshToken?: string;\n expiresIn?: string;\n user?: UserInfo;\n}\n\n/**\n * Device info structure\n */\nexport interface DeviceInfo {\n deviceId: string;\n fingerprint: string;\n createdAt: string;\n platform: string;\n arch: string;\n hostname: string;\n}\n\n/**\n * Device context for auth requests\n */\nexport interface DeviceContext {\n deviceId: string;\n platform: string;\n arch: string;\n hostname: string;\n cliVersion: string;\n nodeVersion: string;\n timezone: string;\n}\n\n/**\n * Global config structure\n */\nexport interface GlobalConfig {\n [key: string]: unknown;\n}\n\n// Simple encryption key derived from machine ID\nfunction getEncryptionKey(): Buffer {\n const machineId = os.hostname() + os.userInfo().username;\n return crypto.createHash('sha256').update(machineId).digest();\n}\n\n/**\n * Ensure ~/.bootspring directory exists\n */\nexport function ensureDir(): void {\n if (!fs.existsSync(BOOTSPRING_DIR)) {\n fs.mkdirSync(BOOTSPRING_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Encrypt data\n */\nfunction encrypt(data: Credentials): EncryptedData | Credentials {\n try {\n const key = getEncryptionKey();\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);\n let encrypted = cipher.update(JSON.stringify(data), 'utf8', 'hex');\n encrypted += cipher.final('hex');\n return { iv: iv.toString('hex'), data: encrypted };\n } catch {\n // Fallback to plain JSON if encryption fails\n return data;\n }\n}\n\n/**\n * Decrypt data\n */\nfunction decrypt(encrypted: EncryptedData | Credentials): Credentials {\n try {\n if ('iv' in encrypted && 'data' in encrypted && typeof encrypted.iv === 'string') {\n const key = getEncryptionKey();\n const iv = Buffer.from(encrypted.iv, 'hex');\n const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);\n let decrypted = decipher.update(encrypted.data as string, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return JSON.parse(decrypted) as Credentials;\n }\n return encrypted as Credentials;\n } catch {\n // Fallback to treating as plain data\n return encrypted as Credentials;\n }\n}\n\n/**\n * Get stored credentials\n */\nexport function getCredentials(): Credentials | null {\n try {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n const raw = JSON.parse(fs.readFileSync(CREDENTIALS_FILE, 'utf-8'));\n return decrypt(raw);\n }\n } catch {\n // Ignore read errors\n }\n return null;\n}\n\n/**\n * Save credentials (encrypted)\n */\nexport function saveCredentials(credentials: Credentials): void {\n ensureDir();\n const encrypted = encrypt(credentials);\n fs.writeFileSync(\n CREDENTIALS_FILE,\n JSON.stringify(encrypted, null, 2),\n { mode: 0o600 }\n );\n}\n\n/**\n * Clear credentials (logout)\n */\nexport function clearCredentials(): void {\n try {\n if (fs.existsSync(CREDENTIALS_FILE)) {\n fs.unlinkSync(CREDENTIALS_FILE);\n }\n } catch {\n // Ignore delete errors\n }\n}\n\n/**\n * Get auth token (JWT)\n */\nexport function getToken(): string | null {\n const creds = getCredentials();\n if (!creds) return null;\n\n // API key auth doesn't use JWT tokens\n if (creds.apiKey) return null;\n\n // Check if token is expired\n if (creds.expiresAt && new Date(creds.expiresAt) < new Date()) {\n return null; // Token expired\n }\n\n return creds.token || null;\n}\n\n/**\n * Get API key (if using API key auth)\n */\nexport function getApiKey(): string | null {\n const creds = getCredentials();\n return creds?.apiKey || null;\n}\n\n/**\n * Check if using API key authentication\n */\nexport function isApiKeyAuth(): boolean {\n const creds = getCredentials();\n return !!creds?.apiKey;\n}\n\n/**\n * Get refresh token\n */\nexport function getRefreshToken(): string | null {\n const creds = getCredentials();\n return creds?.refreshToken || null;\n}\n\n/**\n * Check if user is authenticated\n */\nexport function isAuthenticated(): boolean {\n return !!getToken() || !!getApiKey();\n}\n\n/**\n * Get user info from stored credentials\n */\nexport function getUser(): UserInfo | null {\n const creds = getCredentials();\n return creds?.user || null;\n}\n\n/**\n * Get user's current tier\n */\nexport function getTier(): string {\n const user = getUser();\n return user?.tier || 'free';\n}\n\n/**\n * Parse expiry string (e.g., '15m', '1h', '7d')\n */\nfunction parseExpiry(expiry: string): number {\n const match = expiry.match(/^(\\d+)([mhd])$/);\n if (!match || !match[1] || !match[2]) return 15 * 60 * 1000; // Default 15 minutes\n\n const value = parseInt(match[1]);\n const unit = match[2];\n\n switch (unit) {\n case 'm': return value * 60 * 1000;\n case 'h': return value * 60 * 60 * 1000;\n case 'd': return value * 24 * 60 * 60 * 1000;\n default: return 15 * 60 * 1000;\n }\n}\n\n/**\n * Save login response (JWT auth)\n */\nexport function login(response: LoginResponse): void {\n // Calculate expiration time\n const expiresIn = response.expiresIn ?? '15m';\n const expiresMs = parseExpiry(expiresIn);\n const expiresAt = new Date(Date.now() + expiresMs).toISOString();\n\n const credentials: Credentials = {\n token: response.token,\n expiresAt\n };\n\n if (response.refreshToken !== undefined) {\n credentials.refreshToken = response.refreshToken;\n }\n if (response.user !== undefined) {\n credentials.user = response.user;\n }\n\n saveCredentials(credentials);\n}\n\n/**\n * Save API key credentials\n */\nexport function loginWithApiKey(apiKey: string, user?: UserInfo): void {\n const credentials: Credentials = { apiKey };\n if (user !== undefined) {\n credentials.user = user;\n }\n saveCredentials(credentials);\n}\n\n/**\n * Update tokens (after refresh)\n */\nexport function updateTokens(response: LoginResponse): void {\n const creds = getCredentials() || {};\n const expiresIn = response.expiresIn ?? '15m';\n const expiresMs = parseExpiry(expiresIn);\n const expiresAt = new Date(Date.now() + expiresMs).toISOString();\n\n const credentials: Credentials = {\n ...creds,\n token: response.token,\n expiresAt\n };\n\n if (response.refreshToken !== undefined) {\n credentials.refreshToken = response.refreshToken;\n }\n\n saveCredentials(credentials);\n}\n\n/**\n * Logout\n */\nexport function logout(): void {\n clearCredentials();\n}\n\n/**\n * Get global config\n */\nexport function getConfig(): GlobalConfig {\n try {\n if (fs.existsSync(CONFIG_FILE)) {\n return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8')) as GlobalConfig;\n }\n } catch {\n // Ignore\n }\n return {};\n}\n\n/**\n * Save global config\n */\nexport function saveConfig(config: GlobalConfig): void {\n ensureDir();\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));\n}\n\n/**\n * Get credentials file path (for display)\n */\nexport function getCredentialsPath(): string {\n return CREDENTIALS_FILE;\n}\n\n/**\n * Generate a stable device fingerprint based on machine characteristics\n */\nexport function generateDeviceFingerprint(): string {\n const networkInterfaces = os.networkInterfaces();\n const macAddresses = Object.values(networkInterfaces)\n .flat()\n .filter((iface): iface is os.NetworkInterfaceInfo =>\n iface !== undefined && !iface.internal && iface.mac !== '00:00:00:00:00:00'\n )\n .map(iface => iface.mac)\n .sort()\n .join(',');\n\n const components = [\n os.hostname(),\n os.userInfo().username,\n os.platform(),\n os.arch(),\n os.cpus()[0]?.model || 'unknown-cpu',\n os.homedir(),\n macAddresses\n ];\n\n return crypto\n .createHash('sha256')\n .update(components.join('|'))\n .digest('hex');\n}\n\n/**\n * Get or create persistent device ID\n */\nexport function getDeviceInfo(): DeviceInfo {\n ensureDir();\n\n try {\n if (fs.existsSync(DEVICE_FILE)) {\n const stored = JSON.parse(fs.readFileSync(DEVICE_FILE, 'utf-8')) as DeviceInfo;\n // Verify fingerprint still matches (detect if copied to another machine)\n const currentFingerprint = generateDeviceFingerprint();\n if (stored.fingerprint === currentFingerprint) {\n return stored;\n }\n // Fingerprint mismatch - device file was copied, regenerate\n }\n } catch {\n // Ignore read errors, regenerate\n }\n\n // Generate new device info\n const deviceInfo: DeviceInfo = {\n deviceId: crypto.randomUUID(),\n fingerprint: generateDeviceFingerprint(),\n createdAt: new Date().toISOString(),\n platform: os.platform(),\n arch: os.arch(),\n hostname: os.hostname()\n };\n\n fs.writeFileSync(DEVICE_FILE, JSON.stringify(deviceInfo, null, 2), { mode: 0o600 });\n return deviceInfo;\n}\n\n/**\n * Get device ID for authentication requests\n */\nexport function getDeviceId(): string {\n return getDeviceInfo().deviceId;\n}\n\n/**\n * Get full device context for authentication\n */\nexport function getDeviceContext(): DeviceContext {\n const info = getDeviceInfo();\n\n // Get version from package.json\n let cliVersion = 'unknown';\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkg = require('../../package.json');\n cliVersion = pkg.version;\n } catch {\n // Ignore\n }\n\n return {\n deviceId: info.deviceId,\n platform: info.platform,\n arch: info.arch,\n hostname: info.hostname,\n cliVersion,\n nodeVersion: process.version,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone\n };\n}\n\n/**\n * Clear device info (for testing or reset)\n */\nexport function clearDeviceInfo(): void {\n try {\n if (fs.existsSync(DEVICE_FILE)) {\n fs.unlinkSync(DEVICE_FILE);\n }\n } catch {\n // Ignore delete errors\n }\n}\n","/**\n * Bootspring Session Manager\n *\n * Manages the current project session context linked to bootspring.com API.\n * This tracks which project the CLI is currently working with.\n *\n * @package bootspring\n * @module core/session\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport const BOOTSPRING_DIR = path.join(os.homedir(), '.bootspring');\nexport const SESSION_FILE = path.join(BOOTSPRING_DIR, 'session.json');\nexport const LOCAL_CONFIG_NAME = '.bootspring.json';\n\n/**\n * Project info structure\n */\nexport interface ProjectInfo {\n id: string;\n name: string;\n slug?: string | undefined;\n lastUsed?: string | undefined;\n [key: string]: unknown;\n}\n\n/**\n * Session data structure\n */\nexport interface SessionData {\n project?: ProjectInfo;\n recentProjects?: ProjectInfo[];\n updatedAt?: string;\n [key: string]: unknown;\n}\n\n/**\n * Local config structure\n */\nexport interface LocalConfig {\n projectId?: string | undefined;\n projectName?: string | undefined;\n projectSlug?: string | undefined;\n createdAt?: string | undefined;\n _path?: string | undefined;\n _dir?: string | undefined;\n _fromJsConfig?: boolean | undefined;\n [key: string]: unknown;\n}\n\n/**\n * Effective project with source info\n */\nexport interface EffectiveProject extends ProjectInfo {\n source: 'local' | 'session';\n _localConfig?: LocalConfig;\n}\n\n/**\n * Session state for display\n */\nexport interface SessionState {\n hasSession: boolean;\n project: EffectiveProject | null;\n source: 'local' | 'session' | null;\n hasLocalConfig: boolean;\n localConfigPath?: string | undefined;\n recentProjects: ProjectInfo[];\n lastUpdated: string | null;\n}\n\n/**\n * Ensure ~/.bootspring directory exists\n */\nexport function ensureDir(): void {\n if (!fs.existsSync(BOOTSPRING_DIR)) {\n fs.mkdirSync(BOOTSPRING_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\n/**\n * Get current session data\n */\nexport function getSession(): SessionData | null {\n try {\n if (fs.existsSync(SESSION_FILE)) {\n return JSON.parse(fs.readFileSync(SESSION_FILE, 'utf-8')) as SessionData;\n }\n } catch {\n // Ignore read errors\n }\n return null;\n}\n\n/**\n * Save session data\n */\nexport function saveSession(session: SessionData): void {\n ensureDir();\n const data = {\n ...session,\n updatedAt: new Date().toISOString()\n };\n fs.writeFileSync(SESSION_FILE, JSON.stringify(data, null, 2));\n}\n\n/**\n * Clear session\n */\nexport function clearSession(): void {\n try {\n if (fs.existsSync(SESSION_FILE)) {\n fs.unlinkSync(SESSION_FILE);\n }\n } catch {\n // Ignore delete errors\n }\n}\n\n/**\n * Get current project context\n */\nexport function getCurrentProject(): ProjectInfo | null {\n const session = getSession();\n return session?.project || null;\n}\n\n/**\n * Set current project context\n */\nexport function setCurrentProject(project: ProjectInfo): void {\n const session = getSession() || {};\n session.project = project;\n saveSession(session);\n}\n\n/**\n * Get recent projects\n */\nexport function getRecentProjects(): ProjectInfo[] {\n const session = getSession();\n return session?.recentProjects || [];\n}\n\n/**\n * Add to recent projects\n */\nexport function addRecentProject(project: ProjectInfo): void {\n const session = getSession() || {};\n const recent = session.recentProjects || [];\n\n // Remove if already exists\n const filtered = recent.filter(p => p.id !== project.id);\n\n // Add to front\n filtered.unshift({\n id: project.id,\n name: project.name,\n slug: project.slug,\n lastUsed: new Date().toISOString()\n });\n\n // Keep only last 10\n session.recentProjects = filtered.slice(0, 10);\n saveSession(session);\n}\n\n/**\n * Check if a local .bootspring.json or bootspring.config.js exists in cwd or ancestors\n */\nexport function findLocalConfig(startDir?: string): LocalConfig | null {\n let dir = startDir || process.cwd();\n\n // Walk up to 10 directories\n for (let i = 0; i < 10; i++) {\n // First check for .bootspring.json\n const jsonConfigPath = path.join(dir, LOCAL_CONFIG_NAME);\n if (fs.existsSync(jsonConfigPath)) {\n try {\n const config = JSON.parse(fs.readFileSync(jsonConfigPath, 'utf-8')) as LocalConfig;\n return {\n ...config,\n _path: jsonConfigPath,\n _dir: dir\n };\n } catch {\n // Continue to check other config files\n }\n }\n\n // Also check for bootspring.config.js with projectId\n const jsConfigPath = path.join(dir, 'bootspring.config.js');\n if (fs.existsSync(jsConfigPath)) {\n try {\n // Clear require cache to get fresh config\n delete require.cache[require.resolve(jsConfigPath)];\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const config = require(jsConfigPath) as Record<string, unknown>;\n if (config.projectId) {\n const project = config.project as Record<string, unknown> | undefined;\n return {\n projectId: config.projectId as string,\n projectName: (project?.name || config.name || 'Unknown') as string,\n projectSlug: project?.slug as string | undefined,\n _path: jsConfigPath,\n _dir: dir,\n _fromJsConfig: true\n };\n }\n } catch {\n // Continue searching\n }\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return null;\n}\n\n/**\n * Get effective project context (local config > session)\n */\nexport function getEffectiveProject(): EffectiveProject | null {\n // First check for local .bootspring.json\n const local = findLocalConfig();\n if (local?.projectId) {\n return {\n id: local.projectId,\n name: local.projectName || 'Unknown',\n slug: local.projectSlug,\n source: 'local',\n _localConfig: local\n };\n }\n\n // Fall back to session\n const sessionProject = getCurrentProject();\n if (sessionProject) {\n return {\n ...sessionProject,\n source: 'session'\n };\n }\n\n return null;\n}\n\n/**\n * Create a local .bootspring.json file\n */\nexport function createLocalConfig(dir: string, project: ProjectInfo): string {\n const configPath = path.join(dir, LOCAL_CONFIG_NAME);\n const config: LocalConfig = {\n projectId: project.id,\n projectName: project.name,\n projectSlug: project.slug,\n createdAt: new Date().toISOString()\n };\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2));\n return configPath;\n}\n\n/**\n * Get full session state for display\n */\nexport function getSessionState(): SessionState {\n const session = getSession();\n const effective = getEffectiveProject();\n const local = findLocalConfig();\n\n return {\n hasSession: !!session,\n project: effective,\n source: effective?.source || null,\n hasLocalConfig: !!local,\n localConfigPath: local?._path,\n recentProjects: session?.recentProjects || [],\n lastUpdated: session?.updatedAt || null\n };\n}\n","#!/usr/bin/env node\n\n/**\n * Bootspring Git Memory\n *\n * Extracts learnings, patterns, and decisions from git history.\n * Replaces Ralph's progress.txt with structured git-based memory.\n *\n * @package bootspring\n * @module intelligence/git-memory\n */\n\nconst { execSync } = require('child_process');\n\n/**\n * Memory categories extracted from commits\n */\nconst MEMORY_CATEGORIES = {\n DECISION: {\n patterns: [\n /decided to/i, /chose to/i, /switched to/i, /migrated to/i,\n /now using/i, /replaced .+ with/i, /prefer/i\n ],\n icon: '🎯',\n label: 'Decisions'\n },\n BUGFIX: {\n patterns: [\n /fix(ed|es)?:/i, /bug(fix)?:/i, /resolved/i, /patched/i,\n /was causing/i, /issue with/i, /broke/i, /fixed by/i\n ],\n icon: '🐛',\n label: 'Bug Fixes & Gotchas'\n },\n PATTERN: {\n patterns: [\n /pattern/i, /refactor/i, /abstracted/i, /extracted/i,\n /standardized/i, /convention/i, /approach/i\n ],\n icon: '🔧',\n label: 'Patterns & Conventions'\n },\n ARCHITECTURE: {\n patterns: [\n /architect/i, /structure/i, /reorganiz/i, /module/i,\n /split/i, /merged/i, /moved .+ to/i, /renamed/i\n ],\n icon: '🏗️',\n label: 'Architecture'\n },\n DEPENDENCY: {\n patterns: [\n /added .+ dependency/i, /upgraded/i, /downgraded/i,\n /pinned/i, /removed .+ package/i, /npm/i, /yarn/i\n ],\n icon: '📦',\n label: 'Dependencies'\n },\n PERFORMANCE: {\n patterns: [\n /performance/i, /optimiz/i, /faster/i, /slower/i,\n /memory/i, /cache/i, /lazy/i, /async/i\n ],\n icon: '⚡',\n label: 'Performance'\n },\n SECURITY: {\n patterns: [\n /security/i, /vulnerab/i, /auth/i, /permission/i,\n /sanitiz/i, /validat/i, /escape/i, /inject/i\n ],\n icon: '🔒',\n label: 'Security'\n },\n CONFIG: {\n patterns: [\n /config/i, /environment/i, /\\.env/i, /settings/i,\n /setup/i, /initialize/i\n ],\n icon: '⚙️',\n label: 'Configuration'\n }\n};\n\n/**\n * Execute git command and return output\n */\nfunction git(command, options = {}) {\n try {\n const cwd = options.cwd || process.cwd();\n return execSync(`git ${command}`, {\n cwd,\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n }).trim();\n } catch (e) {\n if (options.throwOnError) throw e;\n return '';\n }\n}\n\n/**\n * Check if current directory is a git repo\n */\nfunction isGitRepo(cwd = process.cwd()) {\n try {\n git('rev-parse --git-dir', { cwd, throwOnError: true });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get recent commits with full messages\n */\nfunction getCommits(options = {}) {\n const {\n limit = 100,\n since = null,\n until = null,\n author = null,\n path: filePath = null,\n cwd = process.cwd()\n } = options;\n\n // Use %x00 (null char) as record separator and ||| as field separator\n // This handles multi-line commit bodies correctly\n let command = `log --pretty=format:\"%H|||%ai|||%an|||%s%x00\" -n ${limit}`;\n\n if (since) command += ` --since=\"${since}\"`;\n if (until) command += ` --until=\"${until}\"`;\n if (author) command += ` --author=\"${author}\"`;\n if (filePath) command += ` -- \"${filePath}\"`;\n\n const output = git(command, { cwd });\n if (!output) return [];\n\n // Split by null character to get individual commits\n return output.split('\\x00')\n .filter(record => record.trim())\n .map(record => {\n const [hash, date, author, subject] = record.trim().split('|||');\n return {\n hash: hash?.slice(0, 8),\n date,\n author,\n subject,\n body: '', // Body extraction removed for simplicity - subject is enough for categorization\n fullMessage: subject || ''\n };\n })\n .filter(c => c.hash && c.hash.length === 8);\n}\n\n/**\n * Categorize a commit based on its message\n */\nfunction categorizeCommit(commit) {\n const categories = [];\n\n for (const [category, config] of Object.entries(MEMORY_CATEGORIES)) {\n for (const pattern of config.patterns) {\n if (pattern.test(commit.fullMessage)) {\n categories.push(category);\n break;\n }\n }\n }\n\n // Default to general if no category matched\n if (categories.length === 0) {\n categories.push('GENERAL');\n }\n\n return categories;\n}\n\n/**\n * Extract files changed in a commit\n */\nfunction getCommitFiles(hash, cwd = process.cwd()) {\n const output = git(`show --name-only --pretty=format:\"\" ${hash}`, { cwd });\n return output.split('\\n').filter(f => f.trim());\n}\n\n/**\n * Extract learnings from commit history\n */\nfunction extractLearnings(options = {}) {\n const {\n limit = 50,\n since = '3 months ago',\n cwd = process.cwd(),\n includeFiles = false\n } = options;\n\n if (!isGitRepo(cwd)) {\n return { error: 'Not a git repository', learnings: [] };\n }\n\n const commits = getCommits({ limit, since, cwd });\n const learnings = [];\n\n for (const commit of commits) {\n const categories = categorizeCommit(commit);\n\n // Skip mundane commits\n if (isMundaneCommit(commit)) continue;\n\n const learning = {\n hash: commit.hash,\n date: commit.date,\n categories,\n summary: commit.subject,\n details: commit.body || null,\n importance: calculateImportance(commit, categories)\n };\n\n if (includeFiles) {\n learning.files = getCommitFiles(commit.hash, cwd);\n }\n\n learnings.push(learning);\n }\n\n // Sort by importance\n learnings.sort((a, b) => b.importance - a.importance);\n\n return { learnings, total: commits.length };\n}\n\n/**\n * Check if commit is mundane (low-value for memory)\n */\nfunction isMundaneCommit(commit) {\n const mundanePatterns = [\n /^merge/i,\n /^wip/i,\n /^temp/i,\n /^bump version/i,\n /^update changelog/i,\n /^lint/i,\n /^format/i,\n /^typo/i,\n /^minor/i,\n /^small/i\n ];\n\n return mundanePatterns.some(p => p.test(commit.subject));\n}\n\n/**\n * Calculate importance score for a learning\n */\nfunction calculateImportance(commit, categories) {\n let score = 0;\n\n // Category weights\n const weights = {\n DECISION: 10,\n ARCHITECTURE: 9,\n SECURITY: 8,\n BUGFIX: 7,\n PATTERN: 6,\n PERFORMANCE: 5,\n DEPENDENCY: 4,\n CONFIG: 3,\n GENERAL: 1\n };\n\n for (const cat of categories) {\n score += weights[cat] || 1;\n }\n\n // Boost for longer messages (more context)\n if (commit.body && commit.body.length > 50) {\n score += 2;\n }\n\n // Boost for conventional commit prefixes\n if (/^(feat|fix|refactor|perf|security):/i.test(commit.subject)) {\n score += 2;\n }\n\n return score;\n}\n\n/**\n * Group learnings by category\n */\nfunction groupByCategory(learnings) {\n const grouped = {};\n\n for (const learning of learnings) {\n for (const category of learning.categories) {\n if (!grouped[category]) {\n grouped[category] = [];\n }\n grouped[category].push(learning);\n }\n }\n\n return grouped;\n}\n\n/**\n * Generate markdown summary of learnings\n */\nfunction toMarkdown(learnings, options = {}) {\n const { title = 'Project Learnings', maxPerCategory = 5 } = options;\n const grouped = groupByCategory(learnings);\n\n let md = `## ${title}\\n\\n`;\n md += `> Extracted from ${learnings.length} significant commits\\n\\n`;\n\n for (const [category, items] of Object.entries(grouped)) {\n const config = MEMORY_CATEGORIES[category] || { icon: '📝', label: category };\n const topItems = items.slice(0, maxPerCategory);\n\n md += `### ${config.icon} ${config.label}\\n\\n`;\n\n for (const item of topItems) {\n md += `- **${item.summary}**`;\n if (item.details) {\n // First line of details only\n const firstLine = item.details.split('\\n')[0].trim();\n if (firstLine && firstLine.length < 100) {\n md += ` - ${firstLine}`;\n }\n }\n md += ` _(${item.hash})_\\n`;\n }\n\n md += '\\n';\n }\n\n return md;\n}\n\n/**\n * Generate compact summary for CLAUDE.md injection\n */\nfunction toCompactSummary(learnings, options = {}) {\n const { maxItems = 15 } = options;\n const topLearnings = learnings.slice(0, maxItems);\n\n let summary = '## Recent Learnings\\n\\n';\n summary += 'Key decisions and patterns from recent development:\\n\\n';\n\n for (const learning of topLearnings) {\n const categoryIcons = learning.categories\n .map(c => MEMORY_CATEGORIES[c]?.icon || '📝')\n .join('');\n\n summary += `- ${categoryIcons} ${learning.summary}\\n`;\n }\n\n return summary;\n}\n\n/**\n * Search learnings by keyword\n */\nfunction searchLearnings(learnings, query) {\n const queryLower = query.toLowerCase();\n\n return learnings.filter(l => {\n return l.summary.toLowerCase().includes(queryLower) ||\n (l.details && l.details.toLowerCase().includes(queryLower)) ||\n l.categories.some(c => c.toLowerCase().includes(queryLower));\n });\n}\n\n/**\n * Get learnings relevant to specific files\n */\nfunction getLearningsForFiles(files, options = {}) {\n const { cwd = process.cwd(), limit = 20 } = options;\n const learnings = [];\n\n for (const file of files) {\n const commits = getCommits({ limit: 10, path: file, cwd });\n\n for (const commit of commits) {\n if (!isMundaneCommit(commit)) {\n const categories = categorizeCommit(commit);\n learnings.push({\n hash: commit.hash,\n date: commit.date,\n categories,\n summary: commit.subject,\n details: commit.body,\n file,\n importance: calculateImportance(commit, categories)\n });\n }\n }\n }\n\n // Dedupe by hash and sort\n const seen = new Set();\n return learnings\n .filter(l => {\n if (seen.has(l.hash)) return false;\n seen.add(l.hash);\n return true;\n })\n .sort((a, b) => b.importance - a.importance)\n .slice(0, limit);\n}\n\n/**\n * Get summary stats about the repo\n */\nfunction getRepoStats(cwd = process.cwd()) {\n if (!isGitRepo(cwd)) {\n return null;\n }\n\n const totalCommits = parseInt(git('rev-list --count HEAD', { cwd }) || '0');\n const firstCommit = git('log --reverse --pretty=format:\"%ai\" | head -1', { cwd });\n const contributors = git('shortlog -sn --no-merges', { cwd })\n .split('\\n')\n .filter(l => l.trim())\n .length;\n\n const recentActivity = git('log --since=\"1 week ago\" --oneline', { cwd })\n .split('\\n')\n .filter(l => l.trim())\n .length;\n\n return {\n totalCommits,\n firstCommit,\n contributors,\n recentActivity,\n weeklyPace: recentActivity\n };\n}\n\n// CLI\nif (require.main === module) {\n const args = process.argv.slice(2);\n const command = args[0] || 'summary';\n\n switch (command) {\n case 'extract': {\n const result = extractLearnings({\n limit: parseInt(args[1]) || 50,\n includeFiles: args.includes('--files')\n });\n\n if (result.error) {\n console.error(result.error);\n process.exit(1);\n }\n\n console.log(JSON.stringify(result.learnings, null, 2));\n break;\n }\n\n case 'summary': {\n const result = extractLearnings({ limit: 50 });\n\n if (result.error) {\n console.error(result.error);\n process.exit(1);\n }\n\n console.log(toMarkdown(result.learnings));\n break;\n }\n\n case 'compact': {\n const result = extractLearnings({ limit: 30 });\n\n if (result.error) {\n console.error(result.error);\n process.exit(1);\n }\n\n console.log(toCompactSummary(result.learnings));\n break;\n }\n\n case 'search': {\n const query = args.slice(1).join(' ');\n if (!query) {\n console.error('Usage: git-memory.js search <query>');\n process.exit(1);\n }\n\n const result = extractLearnings({ limit: 100 });\n const matches = searchLearnings(result.learnings, query);\n\n console.log(`Found ${matches.length} matches for \"${query}\":\\n`);\n for (const match of matches.slice(0, 10)) {\n console.log(` [${match.hash}] ${match.summary}`);\n }\n break;\n }\n\n case 'stats': {\n const stats = getRepoStats();\n if (!stats) {\n console.error('Not a git repository');\n process.exit(1);\n }\n console.log(JSON.stringify(stats, null, 2));\n break;\n }\n\n case 'categories': {\n console.log('\\nAvailable categories:\\n');\n for (const [key, config] of Object.entries(MEMORY_CATEGORIES)) {\n console.log(` ${config.icon} ${key.padEnd(15)} ${config.label}`);\n }\n console.log();\n break;\n }\n\n default:\n console.log(`\nBootspring Git Memory\n\nUsage:\n git-memory.js extract [limit] [--files] Extract learnings as JSON\n git-memory.js summary Generate markdown summary\n git-memory.js compact Compact summary for CLAUDE.md\n git-memory.js search <query> Search learnings\n git-memory.js stats Repository statistics\n git-memory.js categories List memory categories\n`);\n }\n}\n\nmodule.exports = {\n isGitRepo,\n getCommits,\n extractLearnings,\n groupByCategory,\n toMarkdown,\n toCompactSummary,\n searchLearnings,\n getLearningsForFiles,\n getRepoStats,\n MEMORY_CATEGORIES\n};\n","/**\n * AGENTS.md Template Generator\n *\n * Generates AGENTS.md following the open standard for AI coding agents.\n * Supported by: OpenAI Codex, Cursor, Amp, Jules (Google), Factory, Kilo Code\n *\n * Best practices from https://github.blog/ai-and-ml/github-copilot/how-to-write-a-great-agents-md-lessons-from-over-2500-repositories/\n *\n * @package bootspring\n * @module generators/templates/agents\n */\n\n/**\n * Generate root AGENTS.md content from config\n */\nfunction generate(config) {\n const sections = [];\n\n // Persona - Be specific, not vague\n sections.push(`# ${config.project.name}`);\n sections.push('');\n sections.push(`You are a senior full-stack developer working on ${config.project.name}, a ${formatFramework(config.stack.framework)} application with ${config.stack.language}.`);\n sections.push('');\n\n // Commands - Put early\n sections.push('## Commands');\n sections.push('');\n sections.push('```bash');\n sections.push('# Development');\n sections.push('npm run dev');\n sections.push('');\n sections.push('# Quality checks (run before committing)');\n sections.push('npm run lint');\n sections.push('npm run test');\n sections.push('npm run typecheck');\n sections.push('');\n sections.push('# Build tasks');\n sections.push('bootspring build next # Get next task');\n sections.push('bootspring build done # Mark task complete');\n sections.push('bootspring build status # Check progress');\n sections.push('```');\n sections.push('');\n\n // Task System\n sections.push('## Build Loop');\n sections.push('');\n sections.push('**Start building:**');\n sections.push('```');\n sections.push('bootspring build next');\n sections.push('```');\n sections.push('');\n sections.push('This loops through all tasks:');\n sections.push('1. Find in_progress task in `planning/TASK_QUEUE.md`');\n sections.push('2. Implement following acceptance criteria');\n sections.push('3. Run `bootspring build done`');\n sections.push('4. Continue to next task (auto-queued)');\n sections.push('');\n sections.push('**Keep looping until MVP complete.**');\n sections.push('');\n\n // Stack - Be specific about versions\n sections.push('## Stack');\n sections.push('');\n sections.push(`- **Framework**: ${formatFramework(config.stack.framework)}`);\n sections.push(`- **Language**: ${config.stack.language}`);\n if (config.stack.database !== 'none') {\n sections.push(`- **Database**: ${config.stack.database}`);\n if (config.stack.orm) {\n sections.push(`- **ORM**: ${config.stack.orm}`);\n }\n }\n sections.push('');\n\n // Code Style\n sections.push('## Code Style');\n sections.push('');\n if (config.stack.framework === 'nextjs') {\n sections.push('- Use Server Components by default');\n sections.push('- Use Server Actions for mutations (not API routes)');\n }\n sections.push('- Use Zod for input validation');\n sections.push('- Keep files under 300 lines');\n sections.push('- Use meaningful variable and function names');\n sections.push('- Follow existing patterns in the codebase');\n sections.push('');\n\n // Git Workflow\n sections.push('## Git Workflow');\n sections.push('');\n sections.push('- Conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`');\n sections.push('- Atomic commits - one logical change per commit');\n sections.push('- Run quality checks before committing');\n sections.push('- Never force push to main');\n sections.push('- **Never add Co-Authored-By or AI attribution to commits**');\n sections.push('');\n\n // Boundaries - Critical\n sections.push('## Boundaries');\n sections.push('');\n sections.push('**Never:**');\n sections.push('- Commit secrets, API keys, or credentials');\n sections.push('- Modify `.env` files with real values');\n sections.push('- Delete or overwrite migration files');\n sections.push('- Skip tests to make code compile');\n sections.push('- Introduce breaking changes without discussion');\n sections.push('');\n sections.push('**Always:**');\n sections.push('- Read existing code before modifying');\n sections.push('- Run tests after changes');\n sections.push('- Check for TypeScript errors');\n sections.push('- Follow the acceptance criteria exactly');\n sections.push('');\n\n // Testing\n sections.push('## Testing');\n sections.push('');\n sections.push('- Write tests for new features');\n sections.push('- Ensure existing tests still pass');\n sections.push('- Test edge cases and error conditions');\n sections.push('');\n\n return sections.join('\\n');\n}\n\n/**\n * Generate planning-specific AGENTS.md for the planning directory\n */\nfunction generatePlanningAgents(_config) {\n const sections = [];\n\n sections.push('# Planning Directory');\n sections.push('');\n sections.push('You are working on build tasks for the MVP. This directory contains build planning files.');\n sections.push('');\n\n sections.push('## Current Task');\n sections.push('');\n sections.push('Find the task with `status: in_progress` in `TASK_QUEUE.md`.');\n sections.push('');\n\n sections.push('## Commands');\n sections.push('');\n sections.push('```bash');\n sections.push('bootspring build done # Mark task complete, get next');\n sections.push('bootspring build skip # Skip task, get next');\n sections.push('bootspring build status # View progress');\n sections.push('```');\n sections.push('');\n\n sections.push('## Files');\n sections.push('');\n sections.push('| File | Purpose |');\n sections.push('|------|---------|');\n sections.push('| `TASK_QUEUE.md` | All tasks - find in_progress task |');\n sections.push('| `TODO.md` | Full task checklist |');\n sections.push('| `BUILD_STATE.json` | Build state (do not edit) |');\n sections.push('| `TASK_QUEUE.md` | Ordered task queue |');\n sections.push('| `CONTEXT.md` | Build context summary |');\n sections.push('');\n\n sections.push('## Workflow');\n sections.push('');\n sections.push('1. Find in_progress task in `TASK_QUEUE.md`');\n sections.push('2. Implement in the main codebase (not here)');\n sections.push('3. Ensure acceptance criteria met');\n sections.push('4. Run `npm run lint && npm run test`');\n sections.push('5. Commit changes');\n sections.push('6. Run `bootspring build done`');\n sections.push('');\n\n sections.push('## Boundaries');\n sections.push('');\n sections.push('- Do NOT edit `BUILD_STATE.json` directly');\n sections.push('- Do NOT skip quality checks');\n sections.push('- Do NOT work on multiple tasks at once');\n sections.push('');\n\n return sections.join('\\n');\n}\n\n// Helper functions\nfunction formatFramework(framework) {\n const names = {\n 'nextjs': 'Next.js 14+ (App Router)',\n 'remix': 'Remix',\n 'nuxt': 'Nuxt 3',\n 'sveltekit': 'SvelteKit',\n 'express': 'Express.js',\n 'fastify': 'Fastify',\n 'hono': 'Hono'\n };\n return names[framework] || framework;\n}\n\nmodule.exports = {\n generate,\n generatePlanningAgents\n};\n","/**\n * Bootspring CLI Module\n * Command-line interface commands\n *\n * @package bootspring\n * @module cli\n */\n\n// Export CLI commands\nexport * as telemetry from './telemetry';\nexport * as dashboard from './dashboard';\nexport * as generate from './generate';\nexport * as todo from './todo';\n\n// Re-export run functions for convenience\nexport { run as runTelemetry } from './telemetry';\nexport { run as runDashboard } from './dashboard';\nexport { run as runGenerate, generateClaudeMd } from './generate';\nexport { run as runTodo } from './todo';\n\n// Re-export todo types\nexport type { SimpleTodoItem, TodoItem } from './todo';\n","/**\n * Bootspring Telemetry Command\n * Inspect and upload telemetry events.\n *\n * @package bootspring\n * @module cli/telemetry\n */\n\nimport * as utils from '../core/utils';\nimport * as telemetry from '../core/telemetry';\nimport type { ListEventsOptions, UploadOptions } from '../core/telemetry';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * List command options\n */\ninterface ListOptions {\n event?: string | undefined;\n limit?: number | undefined;\n}\n\n/**\n * Upload command options\n */\ninterface UploadCommandOptions {\n endpoint?: string | undefined;\n token?: string | undefined;\n event?: string | undefined;\n limit?: number | undefined;\n clear?: boolean | undefined;\n}\n\n// =============================================================================\n// Command Functions\n// =============================================================================\n\n/**\n * Show telemetry status\n */\nfunction showStatus(): void {\n const status = telemetry.getStatus();\n console.log(`\n${utils.COLORS.cyan}${utils.COLORS.bold}Telemetry Status${utils.COLORS.reset}\n${utils.COLORS.dim}File: ${status.file}${utils.COLORS.reset}\n${utils.COLORS.dim}Events: ${status.count}${utils.COLORS.reset}\n${utils.COLORS.dim}Last event: ${status.lastEventAt ?? 'none'}${utils.COLORS.reset}\n`);\n}\n\n/**\n * List telemetry events\n */\nfunction listEvents(options: ListOptions = {}): void {\n const listOptions: ListEventsOptions = {\n event: options.event,\n limit: options.limit\n };\n\n const records = telemetry.listEvents(listOptions);\n if (records.length === 0) {\n utils.print.warning('No telemetry events found');\n return;\n }\n\n records.forEach(record => {\n console.log(`${utils.COLORS.cyan}${record.timestamp}${utils.COLORS.reset} ${record.event}`);\n });\n console.log(`\\n${utils.COLORS.dim}${records.length} event(s)${utils.COLORS.reset}`);\n}\n\n/**\n * Upload telemetry events\n */\nasync function upload(options: UploadCommandOptions = {}): Promise<void> {\n const spinner = utils.createSpinner('Uploading telemetry events').start();\n try {\n const uploadOptions: UploadOptions = {\n endpoint: options.endpoint,\n token: options.token,\n event: options.event,\n limit: options.limit,\n clearOnSuccess: options.clear\n };\n\n const result = await telemetry.uploadEvents(uploadOptions);\n spinner.succeed(`Uploaded ${result.uploaded} event(s)`);\n utils.print.dim(`Endpoint: ${result.endpoint}`);\n utils.print.dim(`Remaining local events: ${result.remaining}`);\n } catch (error) {\n spinner.fail(`Upload failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * Clear telemetry events\n */\nfunction clear(): void {\n const result = telemetry.clearEvents();\n utils.print.success(`Cleared ${result.cleared} event(s)`);\n}\n\n/**\n * Show help\n */\nfunction help(): void {\n console.log(`\n${utils.COLORS.cyan}${utils.COLORS.bold}Bootspring Telemetry${utils.COLORS.reset}\n\n${utils.COLORS.cyan}Usage:${utils.COLORS.reset}\n bootspring telemetry <command> [options]\n\n${utils.COLORS.cyan}Commands:${utils.COLORS.reset}\n ${utils.COLORS.cyan}status${utils.COLORS.reset} Show telemetry status\n ${utils.COLORS.cyan}list${utils.COLORS.reset} List telemetry events\n ${utils.COLORS.cyan}upload${utils.COLORS.reset} Upload events to endpoint\n ${utils.COLORS.cyan}clear${utils.COLORS.reset} Clear local event log\n\n${utils.COLORS.cyan}Options:${utils.COLORS.reset}\n ${utils.COLORS.cyan}--event <name>${utils.COLORS.reset} Filter by event name\n ${utils.COLORS.cyan}--limit <n>${utils.COLORS.reset} Limit listed/uploaded events\n ${utils.COLORS.cyan}--endpoint <url>${utils.COLORS.reset} Upload endpoint override\n ${utils.COLORS.cyan}--token <value>${utils.COLORS.reset} Upload bearer token\n ${utils.COLORS.cyan}--clear${utils.COLORS.reset} Clear local events on successful upload\n`);\n}\n\n// =============================================================================\n// Main Entry Point\n// =============================================================================\n\n/**\n * Run telemetry command\n */\nexport async function run(args: string[]): Promise<void> {\n const parsed = utils.parseArgs(args);\n const command = parsed._[0] ?? 'status';\n\n switch (command) {\n case 'status':\n showStatus();\n break;\n case 'list':\n listEvents({\n event: parsed.event as string | undefined,\n limit: parsed.limit ? Number(parsed.limit) : undefined\n });\n break;\n case 'upload':\n await upload({\n endpoint: parsed.endpoint as string | undefined,\n token: parsed.token as string | undefined,\n event: parsed.event as string | undefined,\n limit: parsed.limit ? Number(parsed.limit) : undefined,\n clear: Boolean(parsed.clear)\n });\n break;\n case 'clear':\n clear();\n break;\n case 'help':\n case '--help':\n case '-h':\n help();\n break;\n default:\n utils.print.error(`Unknown telemetry command: ${command}`);\n help();\n }\n}\n","/**\n * Bootspring Utilities\n * Shared utility functions\n *\n * @package bootspring\n * @module core/utils\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n// ANSI color codes\nexport const COLORS = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n italic: '\\x1b[3m',\n underline: '\\x1b[4m',\n\n // Foreground\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m',\n\n // Background\n bgBlack: '\\x1b[40m',\n bgRed: '\\x1b[41m',\n bgGreen: '\\x1b[42m',\n bgYellow: '\\x1b[43m',\n bgBlue: '\\x1b[44m',\n bgMagenta: '\\x1b[45m',\n bgCyan: '\\x1b[46m',\n bgWhite: '\\x1b[47m'\n} as const;\n\nexport type ColorName = keyof typeof COLORS;\n\n/**\n * Spinner controller interface\n */\nexport interface Spinner {\n start(): Spinner;\n succeed(text?: string): Spinner;\n fail(text?: string): Spinner;\n warn(text?: string): Spinner;\n info(text?: string): Spinner;\n stop(): Spinner;\n}\n\n/**\n * Parsed command line arguments\n */\nexport interface ParsedArgs {\n _: string[];\n [key: string]: string | boolean | string[];\n}\n\n/**\n * Styled console output\n */\nexport const print = {\n info: (msg: string): void => console.log(`${COLORS.cyan}ℹ${COLORS.reset} ${msg}`),\n success: (msg: string): void => console.log(`${COLORS.green}✓${COLORS.reset} ${msg}`),\n warning: (msg: string): void => console.log(`${COLORS.yellow}⚠${COLORS.reset} ${msg}`),\n error: (msg: string): void => console.log(`${COLORS.red}✗${COLORS.reset} ${msg}`),\n debug: (msg: string): void => {\n if (process.env.DEBUG) {\n console.log(`${COLORS.dim}⋯ ${msg}${COLORS.reset}`);\n }\n },\n header: (msg: string): void => console.log(`\\n${COLORS.bold}${COLORS.cyan}${msg}${COLORS.reset}\\n`),\n dim: (msg: string): void => console.log(`${COLORS.dim}${msg}${COLORS.reset}`),\n brand: (msg: string): void => console.log(`${COLORS.cyan}⚡${COLORS.reset} ${msg}`)\n};\n\n/**\n * Create a spinner for async operations\n */\nexport function createSpinner(message: string): Spinner {\n const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n let frameIndex = 0;\n let interval: ReturnType<typeof setInterval> | null = null;\n const isTTY = process.stdout.isTTY;\n\n const clearLine = (): void => {\n if (isTTY && process.stdout.clearLine) {\n process.stdout.clearLine(0);\n process.stdout.cursorTo(0);\n }\n };\n\n return {\n start(): Spinner {\n if (isTTY) {\n process.stdout.write(`${COLORS.cyan}${frames[0]}${COLORS.reset} ${message}`);\n interval = setInterval(() => {\n frameIndex = (frameIndex + 1) % frames.length;\n clearLine();\n process.stdout.write(`${COLORS.cyan}${frames[frameIndex]}${COLORS.reset} ${message}`);\n }, 80);\n }\n return this;\n },\n\n succeed(text: string = message): Spinner {\n if (interval) clearInterval(interval);\n clearLine();\n console.log(`${COLORS.green}✓${COLORS.reset} ${text}`);\n return this;\n },\n\n fail(text: string = message): Spinner {\n if (interval) clearInterval(interval);\n clearLine();\n console.log(`${COLORS.red}✗${COLORS.reset} ${text}`);\n return this;\n },\n\n warn(text: string = message): Spinner {\n if (interval) clearInterval(interval);\n clearLine();\n console.log(`${COLORS.yellow}⚠${COLORS.reset} ${text}`);\n return this;\n },\n\n info(text: string = message): Spinner {\n if (interval) clearInterval(interval);\n clearLine();\n console.log(`${COLORS.cyan}ℹ${COLORS.reset} ${text}`);\n return this;\n },\n\n stop(): Spinner {\n if (interval) clearInterval(interval);\n clearLine();\n return this;\n }\n };\n}\n\n/**\n * Ensure directory exists\n */\nexport function ensureDir(dirPath: string): boolean {\n try {\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Read file safely\n */\nexport function readFile(filepath: string, defaultValue: string | null = null): string | null {\n try {\n return fs.readFileSync(filepath, 'utf-8');\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Write file safely\n */\nexport function writeFile(filepath: string, content: string): boolean {\n try {\n const dir = path.dirname(filepath);\n ensureDir(dir);\n fs.writeFileSync(filepath, content, 'utf-8');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if file exists\n */\nexport function fileExists(filepath: string): boolean {\n try {\n return fs.existsSync(filepath);\n } catch {\n return false;\n }\n}\n\n/**\n * Get file modification time\n */\nexport function getFileTime(filepath: string): Date | null {\n try {\n const stats = fs.statSync(filepath);\n return stats.mtime;\n } catch {\n return null;\n }\n}\n\n/**\n * Format date as ISO string without time\n */\nexport function formatDate(date: Date = new Date()): string {\n const parts = date.toISOString().split('T');\n return parts[0] ?? date.toISOString().substring(0, 10);\n}\n\n/**\n * Format date as relative time\n */\nexport function formatRelativeTime(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n return 'just now';\n}\n\n/**\n * Slugify a string\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/[\\s_-]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Truncate string with ellipsis\n */\nexport function truncate(str: string, length: number = 50): string {\n if (str.length <= length) return str;\n return str.slice(0, length - 3) + '...';\n}\n\n/**\n * Parse command line arguments\n */\nexport function parseArgs(args: string[]): ParsedArgs {\n const result: ParsedArgs = { _: [] };\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) continue;\n\n if (arg.startsWith('--')) {\n const key = arg.slice(2);\n const nextArg = args[i + 1];\n\n if (key.includes('=')) {\n const parts = key.split('=');\n const k = parts[0];\n const v = parts.slice(1).join('=');\n if (k) result[k] = v;\n } else if (nextArg && !nextArg.startsWith('-')) {\n result[key] = nextArg;\n i++;\n } else {\n result[key] = true;\n }\n } else if (arg.startsWith('-') && arg.length === 2) {\n const key = arg.slice(1);\n const nextArg = args[i + 1];\n\n if (nextArg && !nextArg.startsWith('-')) {\n result[key] = nextArg;\n i++;\n } else {\n result[key] = true;\n }\n } else if (arg.startsWith('-')) {\n const keys = arg.slice(1).split('');\n for (const key of keys) {\n if (key) result[key] = true;\n }\n } else {\n result._.push(arg);\n }\n }\n\n return result;\n}\n\n/**\n * Create a simple table for console output\n */\nexport function createTable(headers: string[], rows: (string | number)[][]): string {\n const widths = headers.map((h, i) => {\n const colValues = [h, ...rows.map(r => String(r[i] ?? ''))];\n return Math.max(...colValues.map(v => v.length));\n });\n\n const separator = widths.map(w => '─'.repeat(w + 2)).join('┼');\n const formatRow = (row: (string | number)[]): string =>\n row.map((cell, i) => ` ${String(cell).padEnd(widths[i] ?? 0)} `).join('│');\n\n const lines = [\n formatRow(headers),\n separator,\n ...rows.map(formatRow)\n ];\n\n return lines.join('\\n');\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Check if running in CI environment\n */\nexport function isCI(): boolean {\n return !!(\n process.env.CI ||\n process.env.CONTINUOUS_INTEGRATION ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.CIRCLECI ||\n process.env.TRAVIS\n );\n}\n\n/**\n * Package.json structure\n */\nexport interface PackageJson {\n name?: string;\n version?: string;\n description?: string;\n main?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\n/**\n * Get package.json from project\n */\nexport function getPackageJson(projectRoot: string): PackageJson | null {\n const pkgPath = path.join(projectRoot, 'package.json');\n try {\n return JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\n/**\n * Check if running in MCP context (AI assistant integration only)\n */\nexport function isMCPContext(): boolean {\n return !!(\n process.env.BOOTSPRING_MCP ||\n process.env.MCP_SERVER ||\n process.env.CLAUDE_CODE_MCP\n );\n}\n\nexport interface RequireMCPOptions {\n silent?: boolean;\n brief?: boolean;\n}\n\n/**\n * Print MCP recommendation message and return false if not in MCP context.\n * This is a soft gate - callers should provide degraded functionality.\n */\nexport function requireMCP(feature: string, options: RequireMCPOptions = {}): boolean {\n if (isMCPContext()) {\n return true;\n }\n\n if (options.silent) {\n return false;\n }\n\n if (options.brief) {\n console.log(`${COLORS.dim}Note: ${feature} has enhanced features when used with MCP integration.${COLORS.reset}`);\n console.log(`${COLORS.dim}Run \"bootspring mcp\" for setup instructions.${COLORS.reset}\\n`);\n return false;\n }\n\n console.log(`\n${COLORS.yellow}${COLORS.bold}Limited Mode - MCP Integration Recommended${COLORS.reset}\n\n${feature} works in CLI mode but has enhanced features through MCP integration.\nMCP enables real-time AI-assisted workflows and deeper integration.\n\n${COLORS.bold}Current Mode:${COLORS.reset} CLI (limited functionality)\n${COLORS.bold}Enhanced Mode:${COLORS.reset} MCP (full AI integration)\n\n${COLORS.bold}To enable full features:${COLORS.reset}\n 1. Start the MCP server:\n ${COLORS.cyan}bootspring mcp start${COLORS.reset}\n\n 2. Add Bootspring to your AI client's MCP configuration\n\n${COLORS.bold}Documentation:${COLORS.reset}\n https://bootspring.com/docs/mcp-setup\n\n${COLORS.dim}Run \"bootspring mcp\" for server options${COLORS.reset}\n`);\n\n return false;\n}\n\n/**\n * Print a warning about MCP-only features (non-blocking)\n */\nexport function warnMCPLimited(feature: string): void {\n if (isMCPContext()) return;\n\n console.log(`${COLORS.dim}Note: ${feature} - some features require MCP integration.${COLORS.reset}`);\n console.log(`${COLORS.dim}Run \"bootspring mcp\" for setup instructions.${COLORS.reset}\\n`);\n}\n","/**\n * Bootspring Telemetry\n * Lightweight JSONL event emitter for product instrumentation.\n *\n * @package bootspring\n * @module core/telemetry\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as crypto from 'crypto';\n\nexport const MAX_EVENTS_LIMIT = 10000;\n\n/**\n * Telemetry event record\n */\nexport interface TelemetryRecord {\n timestamp: string;\n event: string;\n payload: Record<string, unknown>;\n}\n\n/**\n * Telemetry status\n */\nexport interface TelemetryStatus {\n file: string;\n exists: boolean;\n count: number;\n lastEventAt: string | null;\n}\n\n/**\n * Upload result\n */\nexport interface UploadResult {\n uploaded: number;\n remaining: number;\n endpoint: string;\n attempted?: number;\n batches?: number;\n attempts?: number;\n failedBatches?: FailedBatch[];\n}\n\n/**\n * Failed batch info\n */\nexport interface FailedBatch {\n index: number;\n count: number;\n error: string;\n}\n\n/**\n * List events options\n */\nexport interface ListEventsOptions {\n projectRoot?: string | undefined;\n event?: string | undefined;\n from?: string | Date | undefined;\n to?: string | Date | undefined;\n limit?: number | undefined;\n}\n\n/**\n * Upload options\n */\nexport interface UploadOptions {\n projectRoot?: string | undefined;\n endpoint?: string | undefined;\n token?: string | undefined;\n event?: string | undefined;\n limit?: number | undefined;\n batchSize?: number | undefined;\n clearOnSuccess?: boolean | undefined;\n maxRetries?: number | undefined;\n retryDelayMs?: number | undefined;\n}\n\n/**\n * Emit event options\n */\nexport interface EmitOptions {\n projectRoot?: string;\n}\n\nexport function getTelemetryDir(projectRoot: string = process.cwd()): string {\n return path.join(projectRoot, '.bootspring', 'telemetry');\n}\n\nexport function getTelemetryFile(projectRoot: string = process.cwd()): string {\n return path.join(getTelemetryDir(projectRoot), 'events.jsonl');\n}\n\nexport function ensureTelemetryDir(projectRoot: string = process.cwd()): string {\n const dir = getTelemetryDir(projectRoot);\n fs.mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nexport function emitEvent(\n event: string,\n payload: Record<string, unknown> = {},\n options: EmitOptions = {}\n): TelemetryRecord {\n const projectRoot = options.projectRoot || process.cwd();\n ensureTelemetryDir(projectRoot);\n const file = getTelemetryFile(projectRoot);\n const record: TelemetryRecord = {\n timestamp: new Date().toISOString(),\n event: String(event || '').trim(),\n payload: payload || {}\n };\n fs.appendFileSync(file, `${JSON.stringify(record)}\\n`, 'utf-8');\n return record;\n}\n\nfunction parseEventLine(line: string): TelemetryRecord | null {\n try {\n return JSON.parse(line) as TelemetryRecord;\n } catch {\n return null;\n }\n}\n\nexport function listEvents(options: ListEventsOptions = {}): TelemetryRecord[] {\n const projectRoot = options.projectRoot || process.cwd();\n const file = getTelemetryFile(projectRoot);\n if (!fs.existsSync(file)) return [];\n\n const eventFilter = String(options.event || '').trim();\n const from = options.from ? new Date(options.from).getTime() : null;\n const to = options.to ? new Date(options.to).getTime() : null;\n const limit = Number(options.limit);\n\n const lines = fs.readFileSync(file, 'utf-8').split('\\n').filter(Boolean);\n let records = lines\n .map(parseEventLine)\n .filter((record): record is TelemetryRecord => record !== null)\n .filter(record => {\n if (eventFilter && record.event !== eventFilter) return false;\n const ts = new Date(record.timestamp).getTime();\n if (Number.isFinite(from) && from !== null && ts < from) return false;\n if (Number.isFinite(to) && to !== null && ts > to) return false;\n return true;\n });\n\n const effectiveLimit = Number.isFinite(limit) && limit > 0\n ? Math.min(limit, MAX_EVENTS_LIMIT)\n : MAX_EVENTS_LIMIT;\n records = records.slice(-effectiveLimit);\n return records;\n}\n\nexport interface ClearResult {\n cleared: number;\n file: string;\n}\n\nexport function clearEvents(options: { projectRoot?: string } = {}): ClearResult {\n const projectRoot = options.projectRoot || process.cwd();\n const file = getTelemetryFile(projectRoot);\n const records = listEvents({ projectRoot });\n if (fs.existsSync(file)) {\n fs.writeFileSync(file, '', 'utf-8');\n }\n return {\n cleared: records.length,\n file\n };\n}\n\nexport function getStatus(options: { projectRoot?: string } = {}): TelemetryStatus {\n const projectRoot = options.projectRoot || process.cwd();\n const file = getTelemetryFile(projectRoot);\n const records = listEvents({ projectRoot });\n const lastRecord = records.length > 0 ? records[records.length - 1] : null;\n return {\n file,\n exists: fs.existsSync(file),\n count: records.length,\n lastEventAt: lastRecord?.timestamp ?? null\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction chunkArray<T>(items: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < items.length; i += size) {\n chunks.push(items.slice(i, i + size));\n }\n return chunks;\n}\n\ninterface BatchPostResult {\n success: boolean;\n attempts: number;\n error?: string;\n}\n\nasync function postBatchWithRetry(\n endpoint: string,\n body: unknown,\n headers: Record<string, string>,\n options: { maxRetries?: number | undefined; retryDelayMs?: number | undefined } = {}\n): Promise<BatchPostResult> {\n const maxRetries = Number(options.maxRetries);\n const retryDelayMs = Number(options.retryDelayMs);\n const retries = Number.isFinite(maxRetries) && maxRetries >= 0 ? maxRetries : 2;\n const delayBase = Number.isFinite(retryDelayMs) && retryDelayMs > 0 ? retryDelayMs : 300;\n\n let attempt = 0;\n while (true) {\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return { success: true, attempts: attempt + 1 };\n } catch (error) {\n if (attempt >= retries) {\n return {\n success: false,\n attempts: attempt + 1,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n attempt += 1;\n const delay = delayBase * (2 ** (attempt - 1));\n await sleep(delay);\n }\n }\n}\n\nexport async function uploadEvents(options: UploadOptions = {}): Promise<UploadResult> {\n const projectRoot = options.projectRoot || process.cwd();\n const API_BASE = process.env.BOOTSPRING_API_URL || 'https://www.bootspring.com';\n const defaultEndpoint = `${API_BASE}/api/v1/events/batch`;\n const endpoint = options.endpoint || process.env.BOOTSPRING_TELEMETRY_ENDPOINT || defaultEndpoint;\n\n const token = options.token || process.env.BOOTSPRING_TELEMETRY_TOKEN;\n const event = options.event;\n const limit = Number(options.limit) || undefined;\n const batchSizeOption = Number(options.batchSize || process.env.BOOTSPRING_TELEMETRY_BATCH_SIZE);\n const batchSize = Number.isFinite(batchSizeOption) && batchSizeOption > 0 ? batchSizeOption : 100;\n const clearOnSuccess = options.clearOnSuccess === true;\n const records = listEvents({ projectRoot, event, limit });\n\n if (records.length === 0) {\n return {\n uploaded: 0,\n remaining: 0,\n endpoint\n };\n }\n\n // Try to get API key and project context from auth/session modules\n let apiKey: string | null = null;\n let projectId: string | null = null;\n try {\n // Dynamic imports to avoid circular dependencies\n const auth = await import('./auth.js');\n const session = await import('./session.js');\n apiKey = auth.getApiKey();\n const project = session.getEffectiveProject();\n projectId = project?.id ?? null;\n } catch {\n // Modules not available, continue without\n }\n\n // Get version from package.json\n let version = 'unknown';\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkg = require('../../package.json') as { version: string };\n version = pkg.version;\n } catch {\n // Ignore\n }\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n accept: 'application/json',\n 'user-agent': `bootspring-cli/${version}`\n };\n\n // Use API key if available, otherwise fall back to token\n if (apiKey) {\n headers['x-api-key'] = apiKey;\n } else if (token) {\n headers.authorization = `Bearer ${token}`;\n }\n\n // Add project context if available\n if (projectId) {\n headers['x-project-id'] = projectId;\n }\n\n const batches = chunkArray(records, batchSize);\n let uploaded = 0;\n let totalAttempts = 0;\n const failedBatches: FailedBatch[] = [];\n\n for (let i = 0; i < batches.length; i++) {\n const events = batches[i];\n if (!events) continue;\n\n const batchId = crypto.createHash('sha1')\n .update(JSON.stringify(events))\n .digest('hex');\n const result = await postBatchWithRetry(\n endpoint,\n {\n source: 'bootspring',\n batch: {\n index: i,\n total: batches.length,\n id: batchId\n },\n events\n },\n {\n ...headers,\n 'x-bootspring-batch-id': batchId\n },\n options\n );\n\n totalAttempts += result.attempts ?? 1;\n if (!result.success) {\n failedBatches.push({\n index: i,\n count: events.length,\n error: result.error ?? 'upload_failed'\n });\n continue;\n }\n uploaded += events.length;\n }\n\n if (failedBatches.length > 0) {\n throw new Error(`Telemetry upload failed for ${failedBatches.length}/${batches.length} batches`);\n }\n\n if (clearOnSuccess) {\n clearEvents({ projectRoot });\n }\n\n const remaining = clearOnSuccess ? 0 : listEvents({ projectRoot }).length;\n return {\n uploaded,\n attempted: records.length,\n batches: batches.length,\n attempts: totalAttempts,\n remaining,\n endpoint,\n failedBatches\n };\n}\n\n// Alias for compatibility\nexport const track = emitEvent;\n","/**\n * Bootspring Dashboard Command\n *\n * Opens the cloud dashboard at bootspring.com/dashboard.\n * The local dashboard has been removed in favor of the cloud version.\n *\n * @package bootspring\n * @module cli/dashboard\n */\n\nimport { exec } from 'child_process';\nimport * as auth from '../core/auth';\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst DASHBOARD_URL = 'https://bootspring.com/dashboard';\n\n// ANSI colors\nconst colors = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m'\n} as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Open URL in default browser\n */\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n\n let command: string;\n if (platform === 'darwin') {\n command = `open \"${url}\"`;\n } else if (platform === 'win32') {\n command = `start \"\" \"${url}\"`;\n } else {\n command = `xdg-open \"${url}\"`;\n }\n\n exec(command, (error) => {\n if (error) {\n console.log(`${colors.dim}Could not open browser automatically.${colors.reset}`);\n console.log(`${colors.dim}Please visit: ${url}${colors.reset}`);\n }\n });\n}\n\n/**\n * Open cloud dashboard\n */\nfunction openDashboard(): void {\n console.log(`\\n${colors.cyan}${colors.bold}\\u26a1 Bootspring Dashboard${colors.reset}`);\n\n // Check authentication\n if (!auth.isAuthenticated()) {\n console.log(`\\n${colors.yellow}You are not logged in.${colors.reset}`);\n console.log(`${colors.dim}Run 'bootspring auth login' first to access the dashboard.${colors.reset}\\n`);\n console.log(`${colors.dim}Opening login page...${colors.reset}`);\n openBrowser('https://bootspring.com/login');\n return;\n }\n\n const user = auth.getUser();\n console.log(`\\n${colors.dim}Opening dashboard for ${user?.email ?? 'unknown'}...${colors.reset}`);\n\n // Get token for SSO\n const token = auth.getToken();\n let url = DASHBOARD_URL;\n\n if (token) {\n // Add token as query parameter for seamless SSO\n url = `${DASHBOARD_URL}?token=${encodeURIComponent(token)}`;\n }\n\n openBrowser(url);\n\n console.log(`\\n${colors.green}\\u2713 Dashboard opened in browser${colors.reset}`);\n console.log(`${colors.dim}URL: ${DASHBOARD_URL}${colors.reset}\\n`);\n}\n\n/**\n * Show help\n */\nfunction showHelp(): void {\n console.log(`\n${colors.cyan}${colors.bold}\\u26a1 Bootspring Dashboard${colors.reset}\n${colors.dim}Cloud-based project dashboard${colors.reset}\n\n${colors.bold}Usage:${colors.reset}\n bootspring dashboard\n\n${colors.bold}Description:${colors.reset}\n Opens the Bootspring cloud dashboard in your browser.\n\n The dashboard provides:\n - Real-time project context sync\n - Usage analytics and billing\n - Team management (Team tier)\n - API key management\n\n${colors.bold}Notes:${colors.reset}\n - You must be logged in (bootspring auth login)\n - Dashboard is available at https://bootspring.com/dashboard\n - Pro tier required for full dashboard features\n`);\n}\n\n// =============================================================================\n// Main Entry Point\n// =============================================================================\n\n/**\n * Run dashboard command\n */\nexport async function run(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (subcommand === 'help' || subcommand === '-h' || subcommand === '--help') {\n showHelp();\n return;\n }\n\n openDashboard();\n}\n","/**\n * Bootspring Generate Command\n * Generate and regenerate AI context files\n *\n * @package bootspring\n * @module cli/generate\n */\n\nimport * as path from 'path';\nimport * as config from '../core/config';\nimport * as context from '../core/context';\nimport * as utils from '../core/utils';\nimport type { LoadedConfig, ConfigInput } from '../core/config';\nimport type { ProjectContext, ValidationCheck } from '../core/context';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Git memory module interface\n */\ninterface GitMemoryModule {\n extractLearnings: (options: { limit: number; since: string; cwd: string }) => { learnings: unknown[] };\n toCompactSummary: (learnings: unknown[], options: { maxItems: number }) => string;\n}\n\n/**\n * Agents template module interface\n */\ninterface AgentsTemplateModule {\n generate: (cfg: LoadedConfig | ConfigInput) => string;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Generate CLAUDE.md content from config and project state\n */\nexport function generateClaudeMd(cfg: LoadedConfig | ConfigInput, ctx: ProjectContext): string {\n const date = utils.formatDate();\n\n const sections: string[] = [];\n\n // Header\n sections.push(`# ${cfg.project?.name ?? 'Project'} - AI Context\n\n**Generated by**: Bootspring v1.0.0\n**Last Updated**: ${date}\n**Status**: ${ctx.state.phase}\n**Health**: ${ctx.state.health}\n\n---`);\n\n // Project Overview\n sections.push(`## Project Overview\n\n${cfg.project?.description ?? 'A modern web application built with Bootspring.'}\n\n---`);\n\n // Tech Stack\n sections.push(`## Tech Stack\n\n| Component | Technology |\n|-----------|------------|\n| Framework | ${cfg.stack?.framework ?? 'unknown'} |\n| Language | ${cfg.stack?.language ?? 'unknown'} |\n| Database | ${cfg.stack?.database ?? 'unknown'} |\n| Hosting | ${cfg.stack?.hosting ?? 'unknown'} |\n\n---`);\n\n // Enabled Plugins\n const plugins = cfg.plugins ?? {};\n const enabledPlugins = Object.entries(plugins)\n .filter(([_name, p]) => p && p.enabled !== false);\n\n if (enabledPlugins.length > 0) {\n const pluginSections = enabledPlugins.map(([name, plugin]) => {\n const pluginData = plugin as { provider?: string; features?: string[] };\n return `### ${name.charAt(0).toUpperCase() + name.slice(1)}\n- **Provider**: ${pluginData.provider ?? 'default'}\n- **Features**: ${(pluginData.features ?? []).join(', ') || 'default'}`;\n });\n\n sections.push(`## Enabled Plugins\n\n${pluginSections.join('\\n\\n')}\n\n---`);\n }\n\n // Bootspring Commands\n sections.push(`## Bootspring Commands\n\nQuick commands for your AI assistant:\n\n### Todo Management\n\\`\\`\\`bash\nbootspring todo add \"task\" # Add a new todo\nbootspring todo list # List all todos\nbootspring todo done <id> # Mark as complete\nbootspring todo clear # Clear completed\n\\`\\`\\`\n\n### Agents & Skills\n\\`\\`\\`bash\nbootspring agent list # List available agents\nbootspring agent invoke <n> # Get specialized help\nbootspring skill search <q> # Find code patterns\nbootspring skill show <name> # View a skill\n\\`\\`\\`\n\n### Project Tools\n\\`\\`\\`bash\nbootspring dashboard # Start real-time dashboard\nbootspring generate # Regenerate this context\nbootspring quality pre-commit # Run quality checks\nbootspring context validate # Validate project setup\n\\`\\`\\`\n\n---`);\n\n // Project State\n const issuesText = ctx.state.issues && ctx.state.issues.length > 0\n ? `\\n- **Issues**: ${ctx.state.issues.join(', ')}`\n : '';\n\n sections.push(`## Current State\n\n- **Phase**: ${ctx.state.phase}\n- **Health**: ${ctx.state.health}\n- **Open Todos**: ${ctx.state.todos}${issuesText}\n\n---`);\n\n // Git Info\n if (ctx.git.initialized) {\n sections.push(`## Git Repository\n\n- **Branch**: ${ctx.git.branch ?? 'unknown'}\n- **Remote**: ${ctx.git.hasRemote ? 'configured' : 'not configured'}\n\n---`);\n\n // Extract git learnings\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const gitMemory = require('../../intelligence/git-memory') as GitMemoryModule;\n const loadedCfg = cfg as LoadedConfig;\n const { learnings } = gitMemory.extractLearnings({\n limit: 30,\n since: '2 months ago',\n cwd: loadedCfg._projectRoot ?? process.cwd()\n });\n\n if (learnings && learnings.length > 0) {\n const learningsSection = gitMemory.toCompactSummary(learnings, { maxItems: 12 });\n sections.push(learningsSection + '\\n---');\n }\n } catch {\n // Git memory extraction failed silently\n }\n }\n\n // Project Structure\n sections.push(`## Project Structure\n\n- **Structure Type**: ${ctx.files.structure}\n- **Has TypeScript**: ${ctx.files.hasTsConfig ? 'yes' : 'no'}\n- **Has Package.json**: ${ctx.files.hasPackageJson ? 'yes' : 'no'}\n\n---`);\n\n // Development Guidelines\n const language = cfg.stack?.language === 'typescript' ? 'TypeScript' : 'JavaScript';\n sections.push(`## Development Guidelines\n\n### Code Style\n- Use ${language} for all new code\n- Follow existing naming conventions in the codebase\n- Keep files focused and under 300 lines when possible\n\n### Best Practices\n- Use Server Components by default (if Next.js)\n- Prefer Server Actions over API routes for mutations\n- Use Zod for all input validation\n- Never expose API keys to client-side code\n- Write tests for new features\n\n### Git Commits\n- Use conventional commit format: \\`feat:\\`, \\`fix:\\`, \\`docs:\\`, \\`refactor:\\`\n- Keep commits focused and atomic\n- **Never add Co-Authored-By or AI attribution to commits**\n- Never commit sensitive data or API keys\n\n---`);\n\n // Custom Instructions\n if (cfg.customInstructions) {\n sections.push(`## Custom Instructions\n\n${cfg.customInstructions}\n\n---`);\n }\n\n // Footer\n sections.push(`---\n\n*Generated by [Bootspring](https://bootspring.com) - Development scaffolding with intelligence*\n`);\n\n return sections.join('\\n\\n');\n}\n\n// =============================================================================\n// Main Entry Point\n// =============================================================================\n\n/**\n * Run generate command\n */\nexport async function run(args: string[]): Promise<void> {\n const parsedArgs = utils.parseArgs(args);\n const full = parsedArgs.full || parsedArgs.f;\n\n console.log(`\n${utils.COLORS.cyan}${utils.COLORS.bold}\\u26a1 Bootspring Generate${utils.COLORS.reset}\n${utils.COLORS.dim}Regenerating AI context...${utils.COLORS.reset}\n`);\n\n // Load config\n const cfg = config.load();\n\n if (!cfg._configPath) {\n utils.print.error('No bootspring.config.js found');\n utils.print.dim('Run \"bootspring init\" first to initialize your project');\n return;\n }\n\n // Get context\n const ctx = context.get({ config: cfg });\n\n // Generate CLAUDE.md\n const claudePath = path.join(cfg._projectRoot ?? process.cwd(), cfg.paths?.context ?? 'CLAUDE.md');\n const spinner = utils.createSpinner('Generating CLAUDE.md').start();\n\n try {\n const content = generateClaudeMd(cfg, ctx);\n utils.writeFile(claudePath, content);\n spinner.succeed('Generated CLAUDE.md');\n } catch (error) {\n spinner.fail(`Failed to generate CLAUDE.md: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n\n // Generate todo.md if missing (required for 100% score)\n const todoPath = path.join(cfg._projectRoot ?? process.cwd(), cfg.paths?.todo ?? 'todo.md');\n if (!utils.fileExists(todoPath)) {\n const todoSpinner = utils.createSpinner('Generating todo.md').start();\n const todoContent = `# ${cfg.project?.name ?? 'Project'} - Todo List\n\n> Last updated: ${utils.formatDate()}\n\n## In Progress\n\n## Pending\n\n- [ ] Review generated context\n- [ ] Configure environment variables\n\n## Completed\n\n`;\n utils.writeFile(todoPath, todoContent);\n todoSpinner.succeed('Generated todo.md');\n }\n\n // Validate context\n const validation = context.validate({ config: cfg });\n\n console.log(`\n${utils.COLORS.bold}Context Validation${utils.COLORS.reset}\n`);\n\n for (const check of validation.checks) {\n const icon = check.status === 'pass' ? utils.COLORS.green + '\\u2713' :\n check.status === 'fail' ? utils.COLORS.red + '\\u2717' :\n check.status === 'warn' ? utils.COLORS.yellow + '\\u26a0' :\n utils.COLORS.dim + '\\u2139';\n console.log(` ${icon}${utils.COLORS.reset} ${check.name}: ${utils.COLORS.dim}${check.message}${utils.COLORS.reset}`);\n }\n\n console.log(`\n${utils.COLORS.bold}Score:${utils.COLORS.reset} ${validation.score}/${validation.maxScore} (${validation.percentage}%)\n`);\n\n if (validation.valid) {\n utils.print.success('Context is valid and ready for AI assistants');\n } else {\n utils.print.warning('Context has some issues - review the checks above');\n }\n\n // Full generation includes additional files\n if (full) {\n console.log(`\\n${utils.COLORS.bold}Full Generation${utils.COLORS.reset}\\n`);\n\n // Generate .mcp.json if missing\n const mcpPath = path.join(cfg._projectRoot ?? process.cwd(), '.mcp.json');\n if (!utils.fileExists(mcpPath)) {\n const mcpSpinner = utils.createSpinner('Generating .mcp.json').start();\n const mcpConfig = {\n mcpServers: {\n bootspring: {\n command: 'npx',\n args: ['bootspring', 'mcp'],\n env: {}\n }\n }\n };\n utils.writeFile(mcpPath, JSON.stringify(mcpConfig, null, 2));\n mcpSpinner.succeed('Generated .mcp.json');\n }\n\n // Generate AGENTS.md for multi-tool compatibility\n const agentsPath = path.join(cfg._projectRoot ?? process.cwd(), 'AGENTS.md');\n const agentsSpinner = utils.createSpinner('Generating AGENTS.md').start();\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const agentsTemplate = require('../../generators/templates/agents.template') as AgentsTemplateModule;\n const agentsContent = agentsTemplate.generate(cfg);\n utils.writeFile(agentsPath, agentsContent);\n agentsSpinner.succeed('Generated AGENTS.md (Codex, Cursor, Amp, Kilo)');\n } catch (error) {\n agentsSpinner.fail(`Failed to generate AGENTS.md: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n console.log(`\n${utils.COLORS.dim}Tip: Run 'bootspring generate --full' to regenerate all files${utils.COLORS.reset}\n`);\n}\n","/**\n * Bootspring Configuration\n * Handles loading and validating bootspring.config.js\n *\n * @package bootspring\n * @module core/config\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { z } from 'zod';\n\n// =============================================================================\n// Zod Schemas for Configuration Validation\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Plugin Schemas\n// -----------------------------------------------------------------------------\n\n/**\n * Base plugin schema - all plugins share these common fields\n */\nexport const BasePluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.string().optional(),\n features: z.array(z.string()).optional().default([])\n}).passthrough();\n\n/**\n * Auth plugin schema with specific provider options\n */\nexport const AuthPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['clerk', 'nextauth', 'auth0', 'supabase', 'jwt', 'custom']).optional(),\n features: z.array(z.enum([\n 'social_login', 'email_password', 'magic_link', 'sso', 'mfa', 'rbac', 'passwordless'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Payments plugin schema\n */\nexport const PaymentsPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['stripe', 'paddle', 'lemonsqueezy', 'paypal', 'custom']).optional(),\n features: z.array(z.enum([\n 'checkout', 'subscriptions', 'invoices', 'usage_billing', 'trials', 'coupons'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Database plugin schema\n */\nexport const DatabasePluginSchema = z.object({\n enabled: z.boolean().optional().default(true),\n provider: z.enum(['prisma', 'drizzle', 'typeorm', 'kysely', 'custom']).optional(),\n features: z.array(z.enum([\n 'migrations', 'transactions', 'seeding', 'multi_tenant', 'full_text_search', 'soft_delete'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Testing plugin schema\n */\nexport const TestingPluginSchema = z.object({\n enabled: z.boolean().optional().default(true),\n provider: z.enum(['vitest', 'jest', 'playwright', 'cypress', 'custom']).optional(),\n features: z.array(z.enum([\n 'unit', 'integration', 'e2e', 'coverage', 'snapshot', 'mocking'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Security plugin schema\n */\nexport const SecurityPluginSchema = z.object({\n enabled: z.boolean().optional().default(true),\n provider: z.string().optional(),\n features: z.array(z.enum([\n 'input_validation', 'rate_limiting', 'csrf', 'xss', 'sql_injection',\n 'audit', 'rbac', 'encryption', 'secrets_management'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * AI plugin schema\n */\nexport const AIPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['anthropic', 'openai', 'google', 'cohere', 'custom']).optional(),\n features: z.array(z.enum([\n 'streaming', 'tool_use', 'embeddings', 'rag', 'agents', 'vision'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Email plugin schema\n */\nexport const EmailPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['resend', 'sendgrid', 'postmark', 'ses', 'mailgun', 'custom']).optional(),\n features: z.array(z.enum([\n 'transactional', 'marketing', 'templates', 'tracking'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Analytics plugin schema\n */\nexport const AnalyticsPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['posthog', 'amplitude', 'mixpanel', 'google_analytics', 'custom']).optional(),\n features: z.array(z.enum([\n 'page_views', 'events', 'user_tracking', 'funnels', 'experiments'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Monitoring plugin schema\n */\nexport const MonitoringPluginSchema = z.object({\n enabled: z.boolean().optional().default(false),\n provider: z.enum(['sentry', 'datadog', 'newrelic', 'logrocket', 'custom']).optional(),\n features: z.array(z.enum([\n 'error_tracking', 'performance', 'logs', 'alerts', 'apm'\n ])).optional().default([])\n}).passthrough();\n\n/**\n * Combined plugins schema with specific plugin types\n */\nexport const PluginsSchema = z.object({\n auth: AuthPluginSchema.optional(),\n payments: PaymentsPluginSchema.optional(),\n database: DatabasePluginSchema.optional(),\n testing: TestingPluginSchema.optional(),\n security: SecurityPluginSchema.optional(),\n ai: AIPluginSchema.optional(),\n email: EmailPluginSchema.optional(),\n analytics: AnalyticsPluginSchema.optional(),\n monitoring: MonitoringPluginSchema.optional()\n}).catchall(BasePluginSchema);\n\n// Backward compatible alias\nexport const PluginSchema = BasePluginSchema;\n\n// -----------------------------------------------------------------------------\n// Agent Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Individual agent configuration\n */\nexport const AgentConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n expertise: z.array(z.string()).optional(),\n customInstructions: z.string().optional(),\n priority: z.enum(['high', 'medium', 'low']).optional().default('medium')\n}).passthrough();\n\n/**\n * Agents section configuration\n */\nexport const AgentsConfigSchema = z.object({\n enabled: z.record(z.string(), z.boolean()).optional(),\n custom: z.record(z.string(), AgentConfigSchema).optional(),\n defaults: z.array(z.string()).optional(),\n settings: z.object({\n maxConcurrent: z.number().int().min(1).max(10).optional().default(3),\n timeout: z.number().int().min(1000).max(300000).optional().default(60000),\n verbose: z.boolean().optional().default(false)\n }).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Skills Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Individual skill configuration\n */\nexport const SkillConfigSchema = z.object({\n enabled: z.boolean().optional().default(true),\n tier: z.enum(['free', 'pro', 'premium']).optional().default('free'),\n category: z.string().optional(),\n maxChars: z.number().int().min(100).optional()\n}).passthrough();\n\n/**\n * Skills section configuration\n */\nexport const SkillsConfigSchema = z.object({\n categories: z.record(z.string(), z.boolean()).optional(),\n custom: z.record(z.string(), SkillConfigSchema).optional(),\n external: z.object({\n enabled: z.boolean().optional().default(false),\n manifestUrl: z.string().url().optional(),\n cacheDir: z.string().optional(),\n requireSignature: z.boolean().optional().default(false)\n }).optional(),\n settings: z.object({\n defaultMaxChars: z.number().int().min(100).optional().default(50000),\n summaryByDefault: z.boolean().optional().default(false),\n includeExternal: z.boolean().optional().default(false)\n }).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Workflows Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Workflow phase schema\n */\nexport const WorkflowPhaseSchema = z.object({\n name: z.string().min(1, 'Phase name is required'),\n agents: z.array(z.string()).min(1, 'At least one agent is required'),\n duration: z.string().optional(),\n parallel: z.boolean().optional().default(false),\n description: z.string().optional()\n}).passthrough();\n\n/**\n * Individual workflow configuration\n */\nexport const WorkflowConfigSchema = z.object({\n name: z.string().min(1, 'Workflow name is required'),\n description: z.string().optional(),\n tier: z.enum(['free', 'pro']).optional().default('free'),\n pack: z.string().optional(),\n outcomes: z.array(z.string()).optional(),\n completionSignals: z.array(z.string()).optional(),\n phases: z.array(WorkflowPhaseSchema).min(1, 'At least one phase is required')\n}).passthrough();\n\n/**\n * Workflows section configuration\n */\nexport const WorkflowsConfigSchema = z.object({\n enabled: z.record(z.string(), z.boolean()).optional(),\n custom: z.record(z.string(), WorkflowConfigSchema).optional(),\n default: z.string().optional(),\n settings: z.object({\n autoAdvance: z.boolean().optional().default(true),\n pauseBetweenPhases: z.boolean().optional().default(false),\n trackSignals: z.boolean().optional().default(true),\n emitTelemetry: z.boolean().optional().default(true)\n }).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Quality Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Quality check configuration\n */\nexport const QualityCheckSchema = z.union([\n z.boolean(),\n z.object({\n enabled: z.boolean().optional().default(true),\n checks: z.array(z.enum([\n 'lint', 'typecheck', 'test', 'build', 'security', 'coverage', 'format'\n ])).optional()\n })\n]);\n\n/**\n * Quality section configuration\n */\nexport const QualityConfigSchema = z.object({\n preCommit: QualityCheckSchema.optional().default(true),\n prePush: QualityCheckSchema.optional().default(false),\n preDeploy: QualityCheckSchema.optional(),\n strictMode: z.boolean().optional().default(false),\n coverage: z.object({\n statements: z.number().min(0).max(100).optional(),\n branches: z.number().min(0).max(100).optional(),\n functions: z.number().min(0).max(100).optional(),\n lines: z.number().min(0).max(100).optional()\n }).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Context Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Context generation configuration\n */\nexport const ContextConfigSchema = z.object({\n includeEnvVars: z.boolean().optional().default(true),\n includeTechStack: z.boolean().optional().default(true),\n includePlugins: z.boolean().optional().default(true),\n includeGitInfo: z.boolean().optional().default(true),\n includeTodos: z.boolean().optional().default(true),\n includeLearnings: z.boolean().optional().default(true),\n customSections: z.array(z.object({\n title: z.string(),\n content: z.string()\n })).optional().default([]),\n maxSize: z.number().int().min(1000).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Paths Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Paths configuration\n */\nexport const PathsConfigSchema = z.object({\n context: z.string().optional().default('CLAUDE.md'),\n config: z.string().optional().default('bootspring.config.js'),\n todo: z.string().optional().default('todo.md'),\n roadmap: z.string().optional().default('ROADMAP.md'),\n changelog: z.string().optional().default('CHANGELOG.md'),\n state: z.string().optional().default('.bootspring')\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Dashboard Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Dashboard configuration\n */\nexport const DashboardConfigSchema = z.object({\n port: z.number().int().min(1024).max(65535).optional().default(3456),\n autoOpen: z.boolean().optional().default(false),\n host: z.string().optional().default('localhost'),\n theme: z.enum(['light', 'dark', 'system']).optional().default('system')\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Project Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Project information schema\n */\nexport const ProjectConfigSchema = z.object({\n name: z.string().min(1, 'Project name is required'),\n description: z.string().optional().default(''),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+/, 'Version must be semver format').optional().default('1.0.0'),\n author: z.string().optional(),\n license: z.string().optional(),\n repository: z.string().url().optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Stack Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Technology stack configuration\n */\nexport const StackConfigSchema = z.object({\n framework: z.enum([\n 'nextjs', 'remix', 'nuxt', 'sveltekit', 'astro', 'express', 'fastify', 'hono', 'custom'\n ]).optional(),\n language: z.enum(['typescript', 'javascript']).optional(),\n database: z.enum(['postgresql', 'mysql', 'mongodb', 'sqlite', 'supabase', 'planetscale', 'none']).optional(),\n hosting: z.enum([\n 'vercel', 'railway', 'render', 'fly', 'aws', 'gcp', 'azure', 'cloudflare', 'self-hosted', 'custom'\n ]).optional()\n}).passthrough();\n\n// -----------------------------------------------------------------------------\n// Main Configuration Schema\n// -----------------------------------------------------------------------------\n\n/**\n * Complete Bootspring configuration schema\n */\nexport const ConfigSchema = z.object({\n project: ProjectConfigSchema.optional(),\n stack: StackConfigSchema.optional(),\n plugins: PluginsSchema.optional(),\n agents: AgentsConfigSchema.optional(),\n skills: SkillsConfigSchema.optional(),\n workflows: WorkflowsConfigSchema.optional(),\n dashboard: DashboardConfigSchema.optional(),\n quality: QualityConfigSchema.optional(),\n context: ContextConfigSchema.optional(),\n paths: PathsConfigSchema.optional(),\n mcp: z.object({\n enabled: z.boolean().optional().default(false),\n servers: z.record(z.string(), z.object({\n command: z.string(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional()\n })).optional()\n }).optional()\n}).passthrough();\n\n// =============================================================================\n// TypeScript Types (using z.input for input types, z.infer for output types)\n// =============================================================================\n\n// Input types (what users provide - allows partial/missing defaults)\nexport type BasePluginInput = z.input<typeof BasePluginSchema>;\nexport type AuthPluginInput = z.input<typeof AuthPluginSchema>;\nexport type PaymentsPluginInput = z.input<typeof PaymentsPluginSchema>;\nexport type DatabasePluginInput = z.input<typeof DatabasePluginSchema>;\nexport type TestingPluginInput = z.input<typeof TestingPluginSchema>;\nexport type SecurityPluginInput = z.input<typeof SecurityPluginSchema>;\nexport type AIPluginInput = z.input<typeof AIPluginSchema>;\nexport type EmailPluginInput = z.input<typeof EmailPluginSchema>;\nexport type AnalyticsPluginInput = z.input<typeof AnalyticsPluginSchema>;\nexport type MonitoringPluginInput = z.input<typeof MonitoringPluginSchema>;\nexport type PluginsInput = z.input<typeof PluginsSchema>;\nexport type ConfigInput = z.input<typeof ConfigSchema>;\n\n// Output types (after parsing with defaults applied)\nexport type BasePlugin = z.infer<typeof BasePluginSchema>;\nexport type AuthPlugin = z.infer<typeof AuthPluginSchema>;\nexport type PaymentsPlugin = z.infer<typeof PaymentsPluginSchema>;\nexport type DatabasePlugin = z.infer<typeof DatabasePluginSchema>;\nexport type TestingPlugin = z.infer<typeof TestingPluginSchema>;\nexport type SecurityPlugin = z.infer<typeof SecurityPluginSchema>;\nexport type AIPlugin = z.infer<typeof AIPluginSchema>;\nexport type EmailPlugin = z.infer<typeof EmailPluginSchema>;\nexport type AnalyticsPlugin = z.infer<typeof AnalyticsPluginSchema>;\nexport type MonitoringPlugin = z.infer<typeof MonitoringPluginSchema>;\nexport type Plugins = z.infer<typeof PluginsSchema>;\n\nexport type AgentConfig = z.infer<typeof AgentConfigSchema>;\nexport type AgentsConfig = z.infer<typeof AgentsConfigSchema>;\n\nexport type SkillConfig = z.infer<typeof SkillConfigSchema>;\nexport type SkillsConfig = z.infer<typeof SkillsConfigSchema>;\n\nexport type ConfigWorkflowPhase = z.infer<typeof WorkflowPhaseSchema>;\nexport type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>;\nexport type WorkflowsConfig = z.infer<typeof WorkflowsConfigSchema>;\n\nexport type QualityCheck = z.infer<typeof QualityCheckSchema>;\nexport type QualityConfig = z.infer<typeof QualityConfigSchema>;\n\nexport type ContextConfig = z.infer<typeof ContextConfigSchema>;\nexport type PathsConfig = z.infer<typeof PathsConfigSchema>;\nexport type DashboardConfig = z.infer<typeof DashboardConfigSchema>;\nexport type ConfigProjectConfig = z.infer<typeof ProjectConfigSchema>;\nexport type ConfigStackConfig = z.infer<typeof StackConfigSchema>;\n\nexport type Config = z.infer<typeof ConfigSchema>;\n\n/**\n * Loaded configuration with internal metadata\n */\nexport interface LoadedConfig extends ConfigInput {\n _projectRoot?: string | undefined;\n _configPath?: string | null | undefined;\n _bootspringDir?: string | undefined;\n _validation?: ValidationResult | { skipped: boolean } | undefined;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings?: string[] | undefined;\n data?: Config | null | undefined;\n validatedAt?: string | undefined;\n}\n\n/**\n * Section validation result\n */\nexport interface SectionValidationResult {\n valid: boolean;\n errors: string[];\n data: unknown;\n}\n\n/**\n * Preset definition\n */\nexport interface PresetDefinition {\n name: string;\n description: string;\n tags: string[];\n extends: string | null;\n config: Partial<ConfigInput>;\n}\n\n/**\n * Preset info for listing\n */\nexport interface PresetInfo {\n key: string;\n name: string;\n description: string;\n tags?: string[] | undefined;\n extends?: string | null | undefined;\n}\n\n/**\n * List presets options\n */\nexport interface ListPresetsOptions {\n tag?: string | undefined;\n verbose?: boolean | undefined;\n}\n\n/**\n * Validate options\n */\nexport interface ValidateOptions {\n strict?: boolean | undefined;\n sections?: string[] | undefined;\n}\n\n/**\n * Load with validation options\n */\nexport interface LoadWithValidationOptions {\n validate?: boolean | undefined;\n strict?: boolean | undefined;\n silent?: boolean | undefined;\n}\n\n// =============================================================================\n// Validation Helpers\n// =============================================================================\n\n/**\n * Format Zod validation errors into user-friendly messages\n */\nexport function formatValidationErrors(zodError: z.ZodError): string[] {\n return zodError.issues.map(issue => {\n const path = issue.path.join('.');\n const prefix = path ? `${path}: ` : '';\n\n switch (issue.code) {\n case 'invalid_type':\n return `${prefix}Expected ${issue.expected}, received ${issue.received}`;\n case 'invalid_enum_value':\n return `${prefix}Invalid value \"${issue.received}\". Expected one of: ${issue.options.join(', ')}`;\n case 'too_small':\n if (issue.type === 'string') {\n return `${prefix}String must contain at least ${issue.minimum} character(s)`;\n }\n if (issue.type === 'array') {\n return `${prefix}Array must contain at least ${issue.minimum} element(s)`;\n }\n return `${prefix}Value must be greater than or equal to ${issue.minimum}`;\n case 'too_big':\n return `${prefix}Value must be less than or equal to ${issue.maximum}`;\n case 'invalid_string':\n if (issue.validation === 'url') {\n return `${prefix}Invalid URL format`;\n }\n if (issue.validation === 'regex') {\n return `${prefix}Invalid format`;\n }\n return `${prefix}${issue.message}`;\n default:\n return `${prefix}${issue.message}`;\n }\n });\n}\n\n/**\n * Section schema mapping\n */\nconst sectionSchemas: Record<string, z.ZodTypeAny> = {\n project: ProjectConfigSchema,\n stack: StackConfigSchema,\n plugins: PluginsSchema,\n agents: AgentsConfigSchema,\n skills: SkillsConfigSchema,\n workflows: WorkflowsConfigSchema,\n dashboard: DashboardConfigSchema,\n quality: QualityConfigSchema,\n context: ContextConfigSchema,\n paths: PathsConfigSchema\n};\n\n/**\n * Validate a specific config section\n */\nexport function validateSection(section: string, data: unknown): SectionValidationResult {\n const schema = sectionSchemas[section];\n if (!schema) {\n return {\n valid: false,\n errors: [`Unknown configuration section: ${section}`],\n data: null\n };\n }\n\n const result = schema.safeParse(data);\n\n if (result.success) {\n return {\n valid: true,\n errors: [],\n data: result.data\n };\n }\n\n return {\n valid: false,\n errors: formatValidationErrors(result.error),\n data: null\n };\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nexport const DEFAULT_CONFIG: ConfigInput = {\n project: {\n name: 'My Project',\n description: '',\n version: '1.0.0'\n },\n stack: {\n framework: 'nextjs',\n language: 'typescript',\n database: 'postgresql',\n hosting: 'vercel'\n },\n plugins: {\n auth: { enabled: false, provider: 'clerk' },\n payments: { enabled: false, provider: 'stripe' },\n database: { enabled: true, provider: 'prisma' },\n testing: { enabled: true, provider: 'vitest' },\n security: { enabled: true },\n ai: { enabled: false }\n },\n dashboard: {\n port: 3456,\n autoOpen: false\n },\n quality: {\n preCommit: true,\n prePush: false,\n strictMode: false\n },\n paths: {\n context: 'CLAUDE.md',\n config: 'bootspring.config.js',\n todo: 'todo.md'\n }\n};\n\n// Config file names to search for\nexport const CONFIG_FILES = [\n 'bootspring.config.js',\n 'bootspring.config.mjs',\n 'bootspring.config.json',\n '.bootspringrc',\n '.bootspringrc.js',\n '.bootspringrc.json'\n];\n\n// =============================================================================\n// Configuration Presets\n// =============================================================================\n\nexport const CONFIG_PRESETS: Record<string, PresetDefinition> = {\n 'saas-starter': {\n name: 'SaaS Starter',\n description: 'Full SaaS setup with auth, payments, and database',\n tags: ['fullstack', 'production', 'monetization'],\n extends: null,\n config: {\n stack: {\n framework: 'nextjs',\n language: 'typescript',\n database: 'postgresql',\n hosting: 'vercel'\n },\n plugins: {\n auth: { enabled: true, provider: 'clerk', features: ['email_password', 'social_login'] },\n payments: { enabled: true, provider: 'stripe', features: ['checkout', 'subscriptions'] },\n database: { enabled: true, provider: 'prisma', features: ['migrations', 'seeding'] },\n testing: { enabled: true, provider: 'vitest', features: ['unit', 'integration'] },\n security: { enabled: true, features: ['input_validation', 'rate_limiting'] },\n email: { enabled: true, provider: 'resend', features: ['transactional'] },\n analytics: { enabled: true, provider: 'posthog', features: ['events', 'user_tracking'] },\n ai: { enabled: false }\n },\n quality: {\n preCommit: true,\n prePush: false,\n strictMode: false\n }\n }\n },\n\n 'api-only': {\n name: 'API Only',\n description: 'Headless API configuration without frontend',\n tags: ['backend', 'headless', 'microservice'],\n extends: null,\n config: {\n stack: {\n framework: 'express',\n language: 'typescript',\n database: 'postgresql',\n hosting: 'railway'\n },\n plugins: {\n auth: { enabled: true, provider: 'jwt', features: ['email_password'] },\n payments: { enabled: false },\n database: { enabled: true, provider: 'prisma', features: ['migrations', 'transactions'] },\n testing: { enabled: true, provider: 'vitest', features: ['unit', 'integration'] },\n security: { enabled: true, features: ['input_validation', 'rate_limiting', 'csrf'] },\n monitoring: { enabled: true, provider: 'sentry', features: ['error_tracking', 'performance'] },\n ai: { enabled: false }\n },\n quality: {\n preCommit: true,\n prePush: true,\n strictMode: true\n }\n }\n },\n\n 'static-site': {\n name: 'Static Site',\n description: 'Simple static site setup with optional CMS',\n tags: ['static', 'content', 'marketing'],\n extends: null,\n config: {\n stack: {\n framework: 'astro',\n language: 'typescript',\n database: 'none',\n hosting: 'vercel'\n },\n plugins: {\n auth: { enabled: false },\n payments: { enabled: false },\n database: { enabled: false },\n testing: { enabled: true, provider: 'vitest', features: ['unit'] },\n security: { enabled: true, features: ['xss'] },\n analytics: { enabled: true, provider: 'google_analytics', features: ['page_views'] },\n ai: { enabled: false }\n },\n quality: {\n preCommit: true,\n prePush: false,\n strictMode: false\n }\n }\n },\n\n 'enterprise': {\n name: 'Enterprise',\n description: 'Enterprise-grade configuration with all security and quality features',\n tags: ['enterprise', 'security', 'compliance'],\n extends: 'saas-starter',\n config: {\n stack: {\n framework: 'nextjs',\n language: 'typescript',\n database: 'postgresql',\n hosting: 'aws'\n },\n plugins: {\n auth: { enabled: true, provider: 'clerk', features: ['sso', 'mfa', 'rbac'] },\n payments: { enabled: true, provider: 'stripe', features: ['checkout', 'subscriptions', 'invoices'] },\n database: { enabled: true, provider: 'prisma', features: ['migrations', 'transactions', 'multi_tenant', 'soft_delete'] },\n testing: { enabled: true, provider: 'vitest', features: ['unit', 'integration', 'e2e', 'coverage'] },\n security: { enabled: true, features: ['input_validation', 'rate_limiting', 'csrf', 'audit', 'rbac', 'encryption'] },\n monitoring: { enabled: true, provider: 'datadog', features: ['error_tracking', 'performance', 'logs', 'apm'] },\n email: { enabled: true, provider: 'ses', features: ['transactional', 'tracking'] },\n ai: { enabled: false }\n },\n quality: {\n preCommit: true,\n prePush: true,\n preDeploy: { enabled: true, checks: ['lint', 'typecheck', 'test', 'build', 'security'] },\n strictMode: true,\n coverage: {\n statements: 80,\n branches: 75,\n functions: 80,\n lines: 80\n }\n }\n }\n },\n\n 'minimal': {\n name: 'Minimal',\n description: 'Bare minimum setup for quick prototyping',\n tags: ['prototype', 'minimal', 'quick'],\n extends: null,\n config: {\n stack: {\n framework: 'nextjs',\n language: 'typescript',\n database: 'none',\n hosting: 'vercel'\n },\n plugins: {\n auth: { enabled: false },\n payments: { enabled: false },\n database: { enabled: false },\n testing: { enabled: false },\n security: { enabled: true },\n ai: { enabled: false }\n },\n quality: {\n preCommit: false,\n prePush: false,\n strictMode: false\n }\n }\n },\n\n 'ai-app': {\n name: 'AI Application',\n description: 'AI-powered application with Claude integration',\n tags: ['ai', 'llm', 'anthropic'],\n extends: null,\n config: {\n stack: {\n framework: 'nextjs',\n language: 'typescript',\n database: 'postgresql',\n hosting: 'vercel'\n },\n plugins: {\n auth: { enabled: true, provider: 'clerk', features: ['email_password'] },\n payments: { enabled: false },\n database: { enabled: true, provider: 'prisma', features: ['migrations'] },\n testing: { enabled: true, provider: 'vitest', features: ['unit', 'mocking'] },\n security: { enabled: true, features: ['input_validation', 'rate_limiting'] },\n ai: { enabled: true, provider: 'anthropic', features: ['streaming', 'tool_use'] }\n },\n quality: {\n preCommit: true,\n prePush: false,\n strictMode: false\n }\n }\n }\n};\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {\n const result = { ...target } as T;\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (Array.isArray(sourceValue)) {\n (result as Record<string, unknown>)[key as string] = [...sourceValue];\n } else if (\n sourceValue !== null &&\n typeof sourceValue === 'object' &&\n !Array.isArray(sourceValue) &&\n targetValue !== null &&\n typeof targetValue === 'object' &&\n !Array.isArray(targetValue)\n ) {\n (result as Record<string, unknown>)[key as string] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n );\n } else if (sourceValue !== undefined) {\n (result as Record<string, unknown>)[key as string] = sourceValue;\n }\n }\n\n return result;\n}\n\n/**\n * Find the project root directory\n */\nexport function findProjectRoot(): string {\n let dir = process.cwd();\n const root = path.parse(dir).root;\n\n while (dir !== root) {\n if (\n fs.existsSync(path.join(dir, 'package.json')) ||\n fs.existsSync(path.join(dir, 'bootspring.config.js')) ||\n fs.existsSync(path.join(dir, '.git'))\n ) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n\n return process.cwd();\n}\n\n/**\n * Find config file in project\n */\nexport function findConfigFile(projectRoot: string): string | null {\n for (const filename of CONFIG_FILES) {\n const filepath = path.join(projectRoot, filename);\n if (fs.existsSync(filepath)) {\n return filepath;\n }\n }\n return null;\n}\n\n// =============================================================================\n// Preset Functions\n// =============================================================================\n\n/**\n * Get a preset configuration\n */\nexport function getPreset(presetName: string): PresetDefinition | null {\n return CONFIG_PRESETS[presetName] ?? null;\n}\n\n/**\n * Resolve preset inheritance chain\n */\nexport function resolvePresetChain(presetName: string, seen: Set<string> = new Set()): ConfigInput {\n const preset = CONFIG_PRESETS[presetName];\n if (!preset) {\n throw new Error(`Unknown preset: ${presetName}. Available: ${Object.keys(CONFIG_PRESETS).join(', ')}`);\n }\n\n if (seen.has(presetName)) {\n throw new Error(`Circular preset inheritance detected: ${presetName}`);\n }\n seen.add(presetName);\n\n let config: ConfigInput = { ...DEFAULT_CONFIG };\n\n if (preset.extends) {\n const parentConfig = resolvePresetChain(preset.extends, seen);\n config = deepMerge(config, parentConfig);\n }\n\n config = deepMerge(config, preset.config as ConfigInput);\n\n return config;\n}\n\n/**\n * Apply a preset to configuration\n */\nexport function applyPreset(presetNames: string | string[], overrides: Partial<ConfigInput> = {}): ConfigInput {\n const presets = Array.isArray(presetNames) ? presetNames : [presetNames];\n\n if (presets.length === 0) {\n throw new Error('At least one preset name is required');\n }\n\n let config: ConfigInput = { ...DEFAULT_CONFIG };\n\n for (const presetName of presets) {\n const trimmedName = presetName.trim();\n const presetConfig = resolvePresetChain(trimmedName);\n config = deepMerge(config, presetConfig);\n }\n\n config = deepMerge(config, overrides as ConfigInput);\n\n return config;\n}\n\n/**\n * Combine multiple presets\n */\nexport function combinePresets(presetNames: string[], overrides: Partial<ConfigInput> = {}): ConfigInput {\n if (!Array.isArray(presetNames) || presetNames.length === 0) {\n throw new Error('combinePresets requires a non-empty array of preset names');\n }\n return applyPreset(presetNames, overrides);\n}\n\n/**\n * Parse preset string\n */\nexport function parsePresetString(presetString: string): string[] {\n if (!presetString || typeof presetString !== 'string') {\n return [];\n }\n return presetString.split(',').map(s => s.trim()).filter(Boolean);\n}\n\n/**\n * Validate preset names\n */\nexport function validatePresets(presetNames: string | string[]): { valid: boolean; errors: string[]; validPresets: string[] } {\n const presets = Array.isArray(presetNames) ? presetNames : [presetNames];\n const errors: string[] = [];\n const validPresets: string[] = [];\n const availablePresets = Object.keys(CONFIG_PRESETS);\n\n for (const preset of presets) {\n if (CONFIG_PRESETS[preset]) {\n validPresets.push(preset);\n } else {\n errors.push(`Unknown preset: \"${preset}\". Available: ${availablePresets.join(', ')}`);\n }\n }\n\n return { valid: errors.length === 0, errors, validPresets };\n}\n\n/**\n * Get presets by tag\n */\nexport function getPresetsByTag(tag: string): string[] {\n return Object.entries(CONFIG_PRESETS)\n .filter(([, preset]) => preset.tags && preset.tags.includes(tag))\n .map(([key]) => key);\n}\n\n/**\n * Create custom preset\n */\nexport function createCustomPreset(baseName: string, newName: string, customConfig: Partial<ConfigInput> = {}): PresetDefinition {\n const basePreset = CONFIG_PRESETS[baseName];\n if (!basePreset) {\n throw new Error(`Unknown base preset: ${baseName}`);\n }\n\n return {\n name: newName,\n description: `Custom preset based on ${basePreset.name}`,\n tags: [...(basePreset.tags || []), 'custom'],\n extends: baseName,\n config: customConfig\n };\n}\n\n/**\n * List available presets\n */\nexport function listPresets(options: ListPresetsOptions = {}): PresetInfo[] {\n let entries = Object.entries(CONFIG_PRESETS);\n\n if (options.tag) {\n entries = entries.filter(([, preset]) =>\n preset.tags && preset.tags.includes(options.tag!)\n );\n }\n\n return entries.map(([key, preset]) => {\n const info: PresetInfo = {\n key,\n name: preset.name,\n description: preset.description\n };\n\n if (options.verbose) {\n info.tags = preset.tags || [];\n info.extends = preset.extends;\n }\n\n return info;\n });\n}\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n/**\n * Load configuration from file\n */\nexport function load(projectRoot: string | null = null): LoadedConfig {\n const root = projectRoot ?? findProjectRoot();\n const configPath = findConfigFile(root);\n\n let userConfig: Partial<Config> = {};\n\n if (configPath) {\n try {\n if (configPath.endsWith('.json') || configPath.endsWith('.bootspringrc')) {\n const content = fs.readFileSync(configPath, 'utf-8');\n userConfig = JSON.parse(content) as Partial<Config>;\n } else {\n delete require.cache[require.resolve(configPath)];\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n userConfig = require(configPath) as Partial<Config>;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Warning: Could not load config from ${configPath}: ${message}`);\n }\n }\n\n const config: LoadedConfig = deepMerge(DEFAULT_CONFIG, userConfig);\n\n config._projectRoot = root;\n config._configPath = configPath;\n config._bootspringDir = path.join(root, '.bootspring');\n\n return config;\n}\n\n/**\n * Save configuration to file\n */\nexport function save(config: LoadedConfig, filepath: string | null = null): boolean {\n const root = config._projectRoot ?? findProjectRoot();\n const targetPath = filepath ?? path.join(root, 'bootspring.config.js');\n\n const cleanConfig = { ...config };\n delete cleanConfig._projectRoot;\n delete cleanConfig._configPath;\n delete cleanConfig._bootspringDir;\n delete cleanConfig._validation;\n\n const content = `/**\n * Bootspring Configuration\n * https://bootspring.com/docs/configuration\n */\n\nmodule.exports = ${JSON.stringify(cleanConfig, null, 2)};\n`;\n\n try {\n fs.writeFileSync(targetPath, content, 'utf-8');\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`Error saving config: ${message}`);\n return false;\n }\n}\n\n/**\n * Validate configuration\n */\nexport function validate(config: LoadedConfig, options: ValidateOptions = {}): ValidationResult {\n const configToValidate = { ...config };\n delete configToValidate._projectRoot;\n delete configToValidate._configPath;\n delete configToValidate._bootspringDir;\n delete configToValidate._validation;\n\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (options.sections && options.sections.length > 0) {\n let allValid = true;\n const validatedData: Record<string, unknown> = {};\n\n for (const section of options.sections) {\n const sectionValue = (configToValidate as Record<string, unknown>)[section];\n if (sectionValue !== undefined) {\n const result = validateSection(section, sectionValue);\n if (!result.valid) {\n allValid = false;\n errors.push(...result.errors);\n } else {\n validatedData[section] = result.data;\n }\n }\n }\n\n return {\n valid: allValid,\n errors,\n warnings,\n data: allValid ? validatedData as unknown as Config : null\n };\n }\n\n const result = ConfigSchema.safeParse(configToValidate);\n\n if (result.success) {\n return {\n valid: true,\n errors: [],\n warnings,\n data: result.data\n };\n }\n\n return {\n valid: false,\n errors: formatValidationErrors(result.error),\n warnings,\n data: null\n };\n}\n\n/**\n * Load and optionally validate configuration\n */\nexport function loadWithValidation(projectRoot: string | null = null, options: LoadWithValidationOptions = {}): LoadedConfig {\n const { validate: shouldValidate = true, strict = false, silent = false } = options;\n\n const config = load(projectRoot);\n\n if (!shouldValidate) {\n config._validation = { skipped: true };\n return config;\n }\n\n const validation = validate(config);\n\n config._validation = {\n valid: validation.valid,\n errors: validation.errors,\n warnings: validation.warnings ?? [],\n validatedAt: new Date().toISOString()\n };\n\n if (!validation.valid) {\n if (strict) {\n const errorMessage = `Configuration validation failed:\\n${validation.errors.map(e => ` - ${e}`).join('\\n')}`;\n throw new Error(errorMessage);\n }\n\n if (!silent) {\n console.warn('\\x1b[33mWarning: Configuration has validation issues:\\x1b[0m');\n validation.errors.forEach(error => {\n console.warn(` \\x1b[33m- ${error}\\x1b[0m`);\n });\n console.warn('\\x1b[33mThe configuration will still be used, but some features may not work correctly.\\x1b[0m');\n }\n }\n\n return config;\n}\n\n/**\n * Get validation hint for error path\n */\nexport function getValidationHint(errorPath: string): string | null {\n const hints: Record<string, string> = {\n 'stack.framework': 'Valid frameworks: nextjs, remix, nuxt, sveltekit, astro, express, fastify, hono, custom',\n 'stack.language': 'Valid languages: typescript, javascript',\n 'stack.database': 'Valid databases: postgresql, mysql, mongodb, sqlite, supabase, planetscale, none',\n 'stack.hosting': 'Valid hosting options: vercel, railway, render, fly, aws, gcp, azure, cloudflare, self-hosted, custom',\n 'plugins.auth.provider': 'Valid auth providers: clerk, nextauth, auth0, supabase, jwt, custom',\n 'plugins.payments.provider': 'Valid payment providers: stripe, paddle, lemonsqueezy, paypal, custom',\n 'plugins.database.provider': 'Valid database ORMs: prisma, drizzle, typeorm, kysely, custom',\n 'plugins.testing.provider': 'Valid test frameworks: vitest, jest, playwright, cypress, custom',\n 'plugins.ai.providers': 'Valid AI providers: anthropic, openai, google, cohere, huggingface, custom',\n 'dashboard.port': 'Port must be between 1024 and 65535',\n 'project.version': 'Version must follow semver format (e.g., 1.0.0)'\n };\n\n return hints[errorPath] ?? null;\n}\n\n/**\n * Parse and validate configuration with defaults\n */\nexport function parseConfig(config: LoadedConfig): Config {\n const configToParse = { ...config };\n delete configToParse._projectRoot;\n delete configToParse._configPath;\n delete configToParse._bootspringDir;\n delete configToParse._validation;\n\n const result = ConfigSchema.safeParse(configToParse);\n if (result.success) {\n return result.data;\n }\n return configToParse as Config;\n}\n\n/**\n * Get default configuration\n */\nexport function getDefaults(): ConfigInput {\n return { ...DEFAULT_CONFIG };\n}\n","/**\n * Bootspring Context Manager\n * Handles project context for AI assistants\n *\n * @package bootspring\n * @module core/context\n */\n\nimport * as path from 'path';\nimport * as configModule from './config';\nimport * as utils from './utils';\nimport type { LoadedConfig, ConfigInput } from './config';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Enabled plugin info\n */\nexport interface EnabledPlugin {\n provider: string;\n features: string[];\n}\n\n/**\n * Enabled plugins map\n */\nexport interface EnabledPlugins {\n [name: string]: EnabledPlugin;\n}\n\n/**\n * Project file structure info\n */\nexport interface ProjectFiles {\n hasPackageJson: boolean;\n hasTsConfig: boolean;\n hasClaudeMd: boolean;\n hasBootspringConfig: boolean;\n hasTodoMd: boolean;\n hasGit: boolean;\n hasSrcDir: boolean;\n hasAppDir: boolean;\n hasPagesDir: boolean;\n structure: 'app-router' | 'pages-router' | 'src-based' | 'flat';\n}\n\n/**\n * Git repository info\n */\nexport interface GitInfo {\n initialized: boolean;\n branch?: string | undefined;\n hasRemote?: boolean | undefined;\n}\n\n/**\n * Project state info\n */\nexport interface ProjectState {\n phase: 'unknown' | 'uninitialized' | 'initialized' | 'active';\n health: 'unknown' | 'good' | 'fair' | 'needs-attention';\n todos: number;\n lastGenerated: Date | null;\n issues?: string[] | undefined;\n}\n\n/**\n * Full project context\n */\nexport interface ProjectContext {\n project: ConfigInput['project'];\n stack: ConfigInput['stack'];\n plugins: EnabledPlugins;\n files: ProjectFiles;\n git: GitInfo;\n state: ProjectState;\n timestamp: string;\n}\n\n/**\n * Validation check result\n */\nexport interface ValidationCheck {\n name: string;\n status: 'pass' | 'fail' | 'warn';\n message: string;\n}\n\n/**\n * Context validation result\n */\nexport interface ContextValidationResult {\n valid: boolean;\n score: number;\n maxScore: number;\n percentage: number;\n checks: ValidationCheck[];\n}\n\n/**\n * Options for get/validate functions\n */\nexport interface ContextOptions {\n config?: LoadedConfig | undefined;\n}\n\n// =============================================================================\n// Functions\n// =============================================================================\n\n/**\n * Get current project context\n */\nexport function get(options: ContextOptions = {}): ProjectContext {\n const cfg = options.config ?? configModule.load();\n const projectRoot = cfg._projectRoot ?? process.cwd();\n\n const context: ProjectContext = {\n project: cfg.project,\n stack: cfg.stack,\n plugins: getEnabledPlugins(cfg),\n files: getProjectFiles(projectRoot),\n git: getGitInfo(projectRoot),\n state: getProjectState(projectRoot, cfg),\n timestamp: new Date().toISOString()\n };\n\n return context;\n}\n\n/**\n * Get enabled plugins from config\n */\nexport function getEnabledPlugins(cfg: LoadedConfig | ConfigInput): EnabledPlugins {\n const enabled: EnabledPlugins = {};\n\n const plugins = cfg.plugins ?? {};\n for (const [name, plugin] of Object.entries(plugins)) {\n if (plugin && plugin.enabled !== false) {\n enabled[name] = {\n provider: (plugin as { provider?: string }).provider ?? 'default',\n features: (plugin as { features?: string[] }).features ?? []\n };\n }\n }\n\n return enabled;\n}\n\n/**\n * Get project file structure summary\n */\nexport function getProjectFiles(projectRoot: string): ProjectFiles {\n const files: ProjectFiles = {\n hasPackageJson: utils.fileExists(path.join(projectRoot, 'package.json')),\n hasTsConfig: utils.fileExists(path.join(projectRoot, 'tsconfig.json')),\n hasClaudeMd: utils.fileExists(path.join(projectRoot, 'CLAUDE.md')),\n hasBootspringConfig: utils.fileExists(path.join(projectRoot, 'bootspring.config.js')),\n hasTodoMd: utils.fileExists(path.join(projectRoot, 'todo.md')),\n hasGit: utils.fileExists(path.join(projectRoot, '.git')),\n hasSrcDir: utils.fileExists(path.join(projectRoot, 'src')),\n hasAppDir: utils.fileExists(path.join(projectRoot, 'app')),\n hasPagesDir: utils.fileExists(path.join(projectRoot, 'pages')),\n structure: 'flat'\n };\n\n // Detect framework structure\n if (files.hasAppDir) {\n files.structure = 'app-router';\n } else if (files.hasPagesDir) {\n files.structure = 'pages-router';\n } else if (files.hasSrcDir) {\n files.structure = 'src-based';\n }\n\n return files;\n}\n\n/**\n * Get git information\n */\nexport function getGitInfo(projectRoot: string): GitInfo {\n const gitDir = path.join(projectRoot, '.git');\n\n if (!utils.fileExists(gitDir)) {\n return { initialized: false };\n }\n\n const info: GitInfo = { initialized: true };\n\n // Get current branch\n const headPath = path.join(gitDir, 'HEAD');\n if (utils.fileExists(headPath)) {\n const head = utils.readFile(headPath);\n if (head) {\n const trimmedHead = head.trim();\n if (trimmedHead.startsWith('ref: refs/heads/')) {\n info.branch = trimmedHead.replace('ref: refs/heads/', '');\n }\n }\n }\n\n // Check for remote\n const configPath = path.join(gitDir, 'config');\n if (utils.fileExists(configPath)) {\n const gitConfig = utils.readFile(configPath);\n if (gitConfig) {\n info.hasRemote = gitConfig.includes('[remote \"origin\"]');\n }\n }\n\n return info;\n}\n\n/**\n * Get project state\n */\nexport function getProjectState(projectRoot: string, cfg: LoadedConfig | ConfigInput): ProjectState {\n const state: ProjectState = {\n phase: 'unknown',\n health: 'unknown',\n todos: 0,\n lastGenerated: null\n };\n\n // Count todos\n const todoPath = path.join(projectRoot, cfg.paths?.todo ?? 'todo.md');\n if (utils.fileExists(todoPath)) {\n const content = utils.readFile(todoPath);\n if (content) {\n const todoMatches = content.match(/- \\[ \\]/g);\n state.todos = todoMatches ? todoMatches.length : 0;\n }\n }\n\n // Check CLAUDE.md generation time\n const claudePath = path.join(projectRoot, cfg.paths?.context ?? 'CLAUDE.md');\n if (utils.fileExists(claudePath)) {\n state.lastGenerated = utils.getFileTime(claudePath);\n }\n\n // Determine phase\n const loadedCfg = cfg as LoadedConfig;\n if (!loadedCfg._configPath) {\n state.phase = 'uninitialized';\n } else if (!state.lastGenerated) {\n state.phase = 'initialized';\n } else {\n state.phase = 'active';\n }\n\n // Determine health\n const issues: string[] = [];\n if (!utils.fileExists(path.join(projectRoot, 'package.json'))) {\n issues.push('missing-package-json');\n }\n if (!loadedCfg._configPath) {\n issues.push('missing-config');\n }\n if (!state.lastGenerated) {\n issues.push('missing-context');\n }\n\n if (issues.length === 0) {\n state.health = 'good';\n } else if (issues.length <= 2) {\n state.health = 'fair';\n } else {\n state.health = 'needs-attention';\n }\n\n state.issues = issues;\n\n return state;\n}\n\n/**\n * Validate project context\n */\nexport function validate(options: ContextOptions = {}): ContextValidationResult {\n const cfg = options.config ?? configModule.load();\n const projectRoot = cfg._projectRoot ?? process.cwd();\n\n const checks: ValidationCheck[] = [];\n let score = 0;\n const maxScore = 10;\n\n // Check 1: Config exists\n if (cfg._configPath) {\n checks.push({ name: 'Configuration', status: 'pass', message: 'bootspring.config.js found' });\n score += 2;\n } else {\n checks.push({ name: 'Configuration', status: 'fail', message: 'bootspring.config.js missing' });\n }\n\n // Check 2: CLAUDE.md exists\n const claudePath = path.join(projectRoot, cfg.paths?.context ?? 'CLAUDE.md');\n if (utils.fileExists(claudePath)) {\n checks.push({ name: 'AI Context', status: 'pass', message: 'CLAUDE.md exists' });\n score += 2;\n } else {\n checks.push({ name: 'AI Context', status: 'fail', message: 'CLAUDE.md missing - run bootspring generate' });\n }\n\n // Check 3: package.json exists\n if (utils.fileExists(path.join(projectRoot, 'package.json'))) {\n checks.push({ name: 'Package', status: 'pass', message: 'package.json found' });\n score += 1;\n } else {\n checks.push({ name: 'Package', status: 'warn', message: 'package.json missing' });\n }\n\n // Check 4: Git initialized\n if (utils.fileExists(path.join(projectRoot, '.git'))) {\n checks.push({ name: 'Git', status: 'pass', message: 'Git repository initialized' });\n score += 1;\n } else {\n checks.push({ name: 'Git', status: 'warn', message: 'Git not initialized' });\n }\n\n // Check 5: TypeScript config (if using TS)\n if (cfg.stack?.language === 'typescript') {\n if (utils.fileExists(path.join(projectRoot, 'tsconfig.json'))) {\n checks.push({ name: 'TypeScript', status: 'pass', message: 'tsconfig.json found' });\n score += 1;\n } else {\n checks.push({ name: 'TypeScript', status: 'fail', message: 'tsconfig.json missing for TypeScript project' });\n }\n } else {\n score += 1;\n }\n\n // Check 6: Config validation\n const configValidation = configModule.validate(cfg);\n if (configValidation.valid) {\n checks.push({ name: 'Config Validation', status: 'pass', message: 'Configuration is valid' });\n score += 2;\n } else {\n checks.push({ name: 'Config Validation', status: 'fail', message: configValidation.errors.join(', ') });\n }\n\n // Check 7: Todo file\n if (utils.fileExists(path.join(projectRoot, cfg.paths?.todo ?? 'todo.md'))) {\n checks.push({ name: 'Todo Tracking', status: 'pass', message: 'todo.md exists' });\n score += 1;\n } else {\n checks.push({ name: 'Todo Tracking', status: 'fail', message: 'todo.md not found' });\n }\n\n return {\n valid: score >= maxScore * 0.6,\n score,\n maxScore,\n percentage: Math.round((score / maxScore) * 100),\n checks\n };\n}\n\n/**\n * Generate context summary for AI\n */\nexport function generateSummary(options: ContextOptions = {}): string {\n const ctx = get(options);\n\n const lines: string[] = [\n '# Project Context',\n '',\n `**Project**: ${ctx.project?.name ?? 'Unknown'}`,\n `**Generated**: ${ctx.timestamp}`,\n '',\n '## Stack',\n `- Framework: ${ctx.stack?.framework ?? 'unknown'}`,\n `- Language: ${ctx.stack?.language ?? 'unknown'}`,\n `- Database: ${ctx.stack?.database ?? 'unknown'}`,\n `- Hosting: ${ctx.stack?.hosting ?? 'unknown'}`,\n ''\n ];\n\n // Plugins\n const enabledPlugins = Object.keys(ctx.plugins);\n if (enabledPlugins.length > 0) {\n lines.push('## Enabled Plugins');\n for (const [name, plugin] of Object.entries(ctx.plugins)) {\n lines.push(`- **${name}**: ${plugin.provider}`);\n }\n lines.push('');\n }\n\n // State\n lines.push('## Project State');\n lines.push(`- Phase: ${ctx.state.phase}`);\n lines.push(`- Health: ${ctx.state.health}`);\n lines.push(`- Open Todos: ${ctx.state.todos}`);\n if (ctx.state.lastGenerated) {\n lines.push(`- Context Last Generated: ${utils.formatRelativeTime(ctx.state.lastGenerated)}`);\n }\n lines.push('');\n\n // Git\n if (ctx.git.initialized) {\n lines.push('## Git');\n lines.push(`- Branch: ${ctx.git.branch ?? 'unknown'}`);\n lines.push(`- Remote: ${ctx.git.hasRemote ? 'configured' : 'not configured'}`);\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","/**\n * Bootspring Todo Command\n * Simple and powerful todo management\n *\n * @package bootspring\n * @module cli/todo\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as config from '../core/config';\nimport * as utils from '../core/utils';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Simple todo item (for utility functions)\n */\nexport interface SimpleTodoItem {\n done: boolean;\n text: string;\n}\n\n/**\n * Full todo item with metadata (for CLI display)\n */\nexport interface TodoItem {\n index: number;\n indent: number;\n completed: boolean;\n text: string;\n line: number;\n}\n\n/**\n * Display options\n */\ninterface DisplayOptions {\n showCompleted?: boolean | undefined;\n showIndex?: boolean | undefined;\n}\n\n// =============================================================================\n// Utility Functions (for programmatic/test use)\n// =============================================================================\n\n/**\n * Parse todo file and return todos\n */\nexport function parseTodoFile(filePath: string): SimpleTodoItem[] {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const todos: SimpleTodoItem[] = [];\n const lines = content.split('\\n');\n\n for (const line of lines) {\n const match = line.match(/^(\\s*)-\\s*\\[([ xX])\\]\\s*(.+)$/);\n if (match && match[2] && match[3]) {\n todos.push({\n done: match[2].toLowerCase() === 'x',\n text: match[3].trim()\n });\n }\n }\n\n return todos;\n } catch {\n return [];\n }\n}\n\n/**\n * Write todos to file\n */\nexport function writeTodoFile(filePath: string, items: SimpleTodoItem[]): void {\n const lines = ['# Todo', ''];\n\n for (const item of items) {\n const checkbox = item.done ? '[x]' : '[ ]';\n lines.push(`- ${checkbox} ${item.text}`);\n }\n\n lines.push(''); // trailing newline\n fs.writeFileSync(filePath, lines.join('\\n'), 'utf-8');\n}\n\n/**\n * Add a todo to file (utility function)\n */\nfunction addTodoUtil(filePath: string, text: string): void {\n const todos = parseTodoFile(filePath);\n todos.push({ done: false, text });\n writeTodoFile(filePath, todos);\n}\n\n/**\n * Mark a todo as done (utility function)\n */\nexport function markDone(filePath: string, index: number): void {\n const todos = parseTodoFile(filePath);\n if (index >= 0 && index < todos.length) {\n const todo = todos[index];\n if (todo) {\n todo.done = true;\n writeTodoFile(filePath, todos);\n }\n }\n}\n\n/**\n * Mark a todo as not done (utility function)\n */\nexport function markUndone(filePath: string, index: number): void {\n const todos = parseTodoFile(filePath);\n if (index >= 0 && index < todos.length) {\n const todo = todos[index];\n if (todo) {\n todo.done = false;\n writeTodoFile(filePath, todos);\n }\n }\n}\n\n/**\n * Remove a todo by index (utility function)\n */\nfunction removeTodoUtil(filePath: string, index: number): void {\n const todos = parseTodoFile(filePath);\n if (index >= 0 && index < todos.length) {\n todos.splice(index, 1);\n writeTodoFile(filePath, todos);\n }\n}\n\n/**\n * Clear todos (utility function)\n */\nexport function clearTodos(filePath: string, type: 'completed' | 'all' = 'completed'): void {\n const todos = parseTodoFile(filePath);\n\n if (type === 'all') {\n writeTodoFile(filePath, []);\n } else if (type === 'completed') {\n const remaining = todos.filter(t => !t.done);\n writeTodoFile(filePath, remaining);\n }\n}\n\n/**\n * List all todos from file (utility function)\n */\nfunction listTodosUtil(filePath: string): SimpleTodoItem[] {\n return parseTodoFile(filePath);\n}\n\n// =============================================================================\n// Internal Parsing (for CLI use)\n// =============================================================================\n\n/**\n * Parse todo.md file content\n */\nexport function parseTodos(content: string): TodoItem[] {\n const todos: TodoItem[] = [];\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n\n // Match todo items: - [ ] or - [x]\n const match = line.match(/^(\\s*)-\\s*\\[([ xX])\\]\\s*(.+)$/);\n if (match && match[1] !== undefined && match[2] && match[3]) {\n todos.push({\n index: todos.length + 1,\n indent: match[1].length,\n completed: match[2].toLowerCase() === 'x',\n text: match[3].trim(),\n line: i\n });\n }\n }\n\n return todos;\n}\n\n/**\n * Format todos for display\n */\nfunction displayTodos(todos: TodoItem[], options: DisplayOptions = {}): void {\n const { showCompleted = true, showIndex = true } = options;\n\n const pending = todos.filter(t => !t.completed);\n const completed = todos.filter(t => t.completed);\n\n if (pending.length === 0 && completed.length === 0) {\n utils.print.dim('No todos found. Add one with: bootspring todo add \"Your task\"');\n return;\n }\n\n // Display pending\n if (pending.length > 0) {\n console.log(`\\n${utils.COLORS.bold}Pending (${pending.length})${utils.COLORS.reset}\\n`);\n for (const todo of pending) {\n const index = showIndex ? `${utils.COLORS.dim}${String(todo.index).padStart(2)}${utils.COLORS.reset} ` : '';\n const indent = ' '.repeat(todo.indent);\n console.log(`${index}${indent}${utils.COLORS.yellow}\\u25cb${utils.COLORS.reset} ${todo.text}`);\n }\n }\n\n // Display completed\n if (showCompleted && completed.length > 0) {\n console.log(`\\n${utils.COLORS.bold}Completed (${completed.length})${utils.COLORS.reset}\\n`);\n for (const todo of completed) {\n const index = showIndex ? `${utils.COLORS.dim}${String(todo.index).padStart(2)}${utils.COLORS.reset} ` : '';\n const indent = ' '.repeat(todo.indent);\n console.log(`${index}${indent}${utils.COLORS.green}\\u25cf${utils.COLORS.reset} ${utils.COLORS.dim}${todo.text}${utils.COLORS.reset}`);\n }\n }\n\n console.log();\n}\n\n/**\n * Get todo file path\n */\nfunction getTodoPath(): string {\n const cfg = config.load();\n return path.join(cfg._projectRoot ?? process.cwd(), cfg.paths?.todo ?? 'todo.md');\n}\n\n/**\n * Read todo file\n */\nfunction readTodoFile(): string {\n const todoPath = getTodoPath();\n if (!utils.fileExists(todoPath)) {\n // Create default todo file\n const defaultContent = '# Todo List\\n\\n## Pending\\n\\n## Completed\\n';\n utils.writeFile(todoPath, defaultContent);\n return defaultContent;\n }\n return utils.readFile(todoPath) ?? '';\n}\n\n/**\n * Save todo file content (internal CLI use)\n */\nfunction saveTodoContent(content: string): void {\n const todoPath = getTodoPath();\n utils.writeFile(todoPath, content);\n}\n\n/**\n * List all todos (CLI)\n */\nfunction listTodosCli(args: string[]): void {\n const parsedArgs = utils.parseArgs(args);\n const content = readTodoFile();\n const todos = parseTodos(content);\n\n console.log(`${utils.COLORS.cyan}${utils.COLORS.bold}\\u26a1 Bootspring Todo${utils.COLORS.reset}`);\n\n displayTodos(todos, {\n showCompleted: !parsedArgs.pending,\n showIndex: true\n });\n\n // Summary\n const pending = todos.filter(t => !t.completed).length;\n const completed = todos.filter(t => t.completed).length;\n utils.print.dim(`${pending} pending, ${completed} completed`);\n}\n\n/**\n * Add a new todo (CLI)\n */\nfunction addTodoCli(args: string[]): void {\n const text = args.join(' ').trim();\n\n if (!text) {\n utils.print.error('Please provide a todo text');\n utils.print.dim('Usage: bootspring todo add \"Your task\"');\n return;\n }\n\n const content = readTodoFile();\n const lines = content.split('\\n');\n\n // Find the \"Pending\" section or add after first heading\n let insertIndex = -1;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line && line.match(/^##?\\s*(Pending|In Progress|Todo)/i)) {\n insertIndex = i + 1;\n // Skip empty lines after heading\n while (insertIndex < lines.length && lines[insertIndex]?.trim() === '') {\n insertIndex++;\n }\n break;\n }\n }\n\n // If no section found, add after first heading\n if (insertIndex === -1) {\n for (let i = 0; i < lines.length; i++) {\n if (lines[i]?.startsWith('#')) {\n insertIndex = i + 1;\n break;\n }\n }\n }\n\n // If still no good place, add at the end\n if (insertIndex === -1) {\n insertIndex = lines.length;\n }\n\n // Insert the new todo\n const newTodo = `- [ ] ${text}`;\n lines.splice(insertIndex, 0, newTodo);\n\n saveTodoContent(lines.join('\\n'));\n\n utils.print.success(`Added: ${text}`);\n\n // Show count\n const todos = parseTodos(lines.join('\\n'));\n const pending = todos.filter(t => !t.completed).length;\n utils.print.dim(`${pending} pending todos`);\n}\n\n/**\n * Mark todo as done (CLI)\n */\nexport function doneTodo(args: string[]): void {\n const indexStr = args[0];\n\n if (!indexStr) {\n utils.print.error('Please provide a todo number');\n utils.print.dim('Usage: bootspring todo done <number>');\n return;\n }\n\n const index = parseInt(indexStr, 10);\n if (isNaN(index) || index < 1) {\n utils.print.error('Invalid todo number');\n return;\n }\n\n const content = readTodoFile();\n const todos = parseTodos(content);\n\n const todo = todos.find(t => t.index === index);\n if (!todo) {\n utils.print.error(`Todo #${index} not found`);\n return;\n }\n\n if (todo.completed) {\n utils.print.warning(`Todo #${index} is already completed`);\n return;\n }\n\n // Update the line\n const lines = content.split('\\n');\n const originalLine = lines[todo.line];\n if (originalLine) {\n lines[todo.line] = originalLine.replace('[ ]', '[x]');\n }\n\n saveTodoContent(lines.join('\\n'));\n\n utils.print.success(`Completed: ${todo.text}`);\n\n // Show remaining\n const remaining = todos.filter(t => !t.completed && t.index !== index).length;\n utils.print.dim(`${remaining} pending todos remaining`);\n}\n\n/**\n * Undo a completed todo (CLI)\n */\nexport function undoTodo(args: string[]): void {\n const indexStr = args[0];\n\n if (!indexStr) {\n utils.print.error('Please provide a todo number');\n utils.print.dim('Usage: bootspring todo undo <number>');\n return;\n }\n\n const index = parseInt(indexStr, 10);\n if (isNaN(index) || index < 1) {\n utils.print.error('Invalid todo number');\n return;\n }\n\n const content = readTodoFile();\n const todos = parseTodos(content);\n\n const todo = todos.find(t => t.index === index);\n if (!todo) {\n utils.print.error(`Todo #${index} not found`);\n return;\n }\n\n if (!todo.completed) {\n utils.print.warning(`Todo #${index} is not completed`);\n return;\n }\n\n // Update the line\n const lines = content.split('\\n');\n const originalLine = lines[todo.line];\n if (originalLine) {\n lines[todo.line] = originalLine.replace(/\\[[xX]\\]/, '[ ]');\n }\n\n saveTodoContent(lines.join('\\n'));\n\n utils.print.success(`Reopened: ${todo.text}`);\n}\n\n/**\n * Remove a todo (CLI)\n */\nfunction removeTodoCli(args: string[]): void {\n const indexStr = args[0];\n\n if (!indexStr) {\n utils.print.error('Please provide a todo number');\n utils.print.dim('Usage: bootspring todo remove <number>');\n return;\n }\n\n const index = parseInt(indexStr, 10);\n if (isNaN(index) || index < 1) {\n utils.print.error('Invalid todo number');\n return;\n }\n\n const content = readTodoFile();\n const todos = parseTodos(content);\n\n const todo = todos.find(t => t.index === index);\n if (!todo) {\n utils.print.error(`Todo #${index} not found`);\n return;\n }\n\n // Remove the line\n const lines = content.split('\\n');\n lines.splice(todo.line, 1);\n\n saveTodoContent(lines.join('\\n'));\n\n utils.print.success(`Removed: ${todo.text}`);\n}\n\n/**\n * Clear completed todos (CLI)\n */\nexport function clearCompleted(): void {\n const content = readTodoFile();\n const todos = parseTodos(content);\n const completedTodos = todos.filter(t => t.completed);\n\n if (completedTodos.length === 0) {\n utils.print.info('No completed todos to clear');\n return;\n }\n\n // Remove completed lines (in reverse order to maintain indices)\n const lines = content.split('\\n');\n const linesToRemove = completedTodos.map(t => t.line).sort((a, b) => b - a);\n\n for (const lineIndex of linesToRemove) {\n lines.splice(lineIndex, 1);\n }\n\n saveTodoContent(lines.join('\\n'));\n\n utils.print.success(`Cleared ${completedTodos.length} completed todos`);\n}\n\n/**\n * Show todo help\n */\nfunction showHelp(): void {\n console.log(`\n${utils.COLORS.cyan}${utils.COLORS.bold}\\u26a1 Bootspring Todo${utils.COLORS.reset}\n${utils.COLORS.dim}Simple and powerful todo management${utils.COLORS.reset}\n\n${utils.COLORS.bold}Usage:${utils.COLORS.reset}\n bootspring todo <command> [args]\n\n${utils.COLORS.bold}Commands:${utils.COLORS.reset}\n ${utils.COLORS.cyan}list${utils.COLORS.reset} List all todos\n ${utils.COLORS.cyan}add${utils.COLORS.reset} <text> Add a new todo\n ${utils.COLORS.cyan}done${utils.COLORS.reset} <number> Mark todo as completed\n ${utils.COLORS.cyan}undo${utils.COLORS.reset} <number> Reopen a completed todo\n ${utils.COLORS.cyan}remove${utils.COLORS.reset} <number> Remove a todo\n ${utils.COLORS.cyan}clear${utils.COLORS.reset} Clear all completed todos\n\n${utils.COLORS.bold}Examples:${utils.COLORS.reset}\n bootspring todo add \"Implement user auth\"\n bootspring todo done 1\n bootspring todo list --pending\n bootspring todo clear\n`);\n}\n\n// =============================================================================\n// Main Entry Point\n// =============================================================================\n\n/**\n * Run todo command\n */\nexport async function run(args: string[]): Promise<void> {\n const subcommand = args[0] ?? 'list';\n const subargs = args.slice(1);\n\n switch (subcommand) {\n case 'list':\n case 'ls':\n listTodosCli(subargs);\n break;\n\n case 'add':\n case 'a':\n case 'new':\n addTodoCli(subargs);\n break;\n\n case 'done':\n case 'd':\n case 'complete':\n case 'check':\n doneTodo(subargs);\n break;\n\n case 'undo':\n case 'u':\n case 'reopen':\n undoTodo(subargs);\n break;\n\n case 'remove':\n case 'rm':\n case 'delete':\n removeTodoCli(subargs);\n break;\n\n case 'clear':\n clearCompleted();\n break;\n\n case 'help':\n case '-h':\n case '--help':\n showHelp();\n break;\n\n default:\n // If it looks like a todo text, treat as add\n if (subcommand && !subcommand.startsWith('-')) {\n addTodoCli([subcommand, ...subargs]);\n } else {\n utils.print.error(`Unknown subcommand: ${subcommand}`);\n showHelp();\n }\n }\n}\n\n// =============================================================================\n// Smart Wrappers (for compatibility)\n// =============================================================================\n\n/**\n * Smart wrapper that detects if called with file path or CLI args\n */\nexport function addTodo(firstArg: string | string[], secondArg?: string): void {\n if (typeof firstArg === 'string' && typeof secondArg === 'string') {\n // Utility mode: addTodo(filePath, text)\n addTodoUtil(firstArg, secondArg);\n } else if (Array.isArray(firstArg)) {\n // CLI mode: addTodo(args)\n addTodoCli(firstArg);\n } else {\n // Default CLI mode with single arg treated as array\n addTodoCli([firstArg, secondArg].filter((x): x is string => Boolean(x)));\n }\n}\n\n/**\n * Smart wrapper for removeTodo\n */\nexport function removeTodo(firstArg: string | string[], secondArg?: number): void {\n if (typeof firstArg === 'string' && typeof secondArg === 'number') {\n // Utility mode: removeTodo(filePath, index)\n removeTodoUtil(firstArg, secondArg);\n } else if (Array.isArray(firstArg)) {\n // CLI mode: removeTodo(args)\n removeTodoCli(firstArg);\n } else {\n removeTodoCli([firstArg]);\n }\n}\n\n/**\n * Smart wrapper for listTodos\n */\nexport function listTodos(firstArg?: string | string[]): SimpleTodoItem[] | void {\n if (typeof firstArg === 'string' && (firstArg.includes('/') || firstArg.includes('\\\\'))) {\n // Utility mode: listTodos(filePath)\n return listTodosUtil(firstArg);\n } else if (Array.isArray(firstArg)) {\n // CLI mode: listTodos(args)\n listTodosCli(firstArg);\n } else {\n listTodosCli(firstArg ? [firstArg] : []);\n }\n}\n"],"mappings":"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","names":["exports","module","ensureDir","networkInterfaces","fs","path","BOOTSPRING_DIR","ensureDir","fs","path","os","exports","module","author","exports","module","run","fs","path","crypto","listEvents","run","platform","run","path","fs","path","path","result","path","validate","run","validate","run","fs","path","showHelp","run"]}