@girardmedia/bootspring 3.3.3 → 3.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/assets/agents/accessibility-auditor.md +39 -0
  2. package/assets/agents/api-designer.md +40 -0
  3. package/assets/agents/auth-implementer.md +64 -0
  4. package/assets/agents/bug-hunter.md +42 -0
  5. package/assets/agents/bundle-analyzer.md +40 -0
  6. package/assets/agents/cache-optimizer.md +55 -0
  7. package/assets/agents/changelog-writer.md +55 -0
  8. package/assets/agents/ci-cd-builder.md +40 -0
  9. package/assets/agents/code-explainer.md +39 -0
  10. package/assets/agents/code-reviewer.md +39 -0
  11. package/assets/agents/cost-optimizer.md +57 -0
  12. package/assets/agents/cron-scheduler.md +51 -0
  13. package/assets/agents/data-seeder.md +56 -0
  14. package/assets/agents/database-architect.md +40 -0
  15. package/assets/agents/dependency-updater.md +40 -0
  16. package/assets/agents/deploy-checker.md +40 -0
  17. package/assets/agents/docker-optimizer.md +40 -0
  18. package/assets/agents/documentation-writer.md +40 -0
  19. package/assets/agents/email-builder.md +55 -0
  20. package/assets/agents/env-setup.md +40 -0
  21. package/assets/agents/error-handler.md +40 -0
  22. package/assets/agents/eslint-fixer.md +46 -0
  23. package/assets/agents/feature-flagger.md +69 -0
  24. package/assets/agents/git-detective.md +39 -0
  25. package/assets/agents/graphql-builder.md +60 -0
  26. package/assets/agents/incident-responder.md +59 -0
  27. package/assets/agents/log-analyzer.md +39 -0
  28. package/assets/agents/migration-planner.md +41 -0
  29. package/assets/agents/monorepo-navigator.md +39 -0
  30. package/assets/agents/nextjs-expert.md +57 -0
  31. package/assets/agents/notification-builder.md +56 -0
  32. package/assets/agents/onboarding-guide.md +39 -0
  33. package/assets/agents/performance-profiler.md +40 -0
  34. package/assets/agents/prisma-expert.md +57 -0
  35. package/assets/agents/rate-limiter.md +58 -0
  36. package/assets/agents/react-expert.md +58 -0
  37. package/assets/agents/refactorer.md +42 -0
  38. package/assets/agents/regex-builder.md +46 -0
  39. package/assets/agents/release-manager.md +40 -0
  40. package/assets/agents/s3-manager.md +58 -0
  41. package/assets/agents/schema-validator.md +40 -0
  42. package/assets/agents/search-builder.md +62 -0
  43. package/assets/agents/security-auditor.md +39 -0
  44. package/assets/agents/sitemap-generator.md +53 -0
  45. package/assets/agents/stripe-integrator.md +59 -0
  46. package/assets/agents/tailwind-expert.md +55 -0
  47. package/assets/agents/tech-debt-tracker.md +39 -0
  48. package/assets/agents/test-writer.md +42 -0
  49. package/assets/agents/type-fixer.md +45 -0
  50. package/assets/agents/webhook-builder.md +54 -0
  51. package/assets/rules/cpp.md +53 -0
  52. package/assets/rules/css.md +52 -0
  53. package/assets/rules/go.md +50 -0
  54. package/assets/rules/html.md +52 -0
  55. package/assets/rules/java.md +51 -0
  56. package/assets/rules/kotlin.md +50 -0
  57. package/assets/rules/php.md +51 -0
  58. package/assets/rules/python.md +51 -0
  59. package/assets/rules/ruby.md +51 -0
  60. package/assets/rules/rust.md +49 -0
  61. package/assets/rules/shell.md +52 -0
  62. package/assets/rules/sql.md +49 -0
  63. package/assets/rules/swift.md +50 -0
  64. package/assets/rules/typescript.md +52 -0
  65. package/assets/rules/yaml-json.md +51 -0
  66. package/assets/skills/accessibility.md +210 -0
  67. package/assets/skills/agent-patterns.md +387 -0
  68. package/assets/skills/ai-integration.md +263 -0
  69. package/assets/skills/animation-patterns.md +224 -0
  70. package/assets/skills/api-design.md +218 -0
  71. package/assets/skills/api-gateway.md +341 -0
  72. package/assets/skills/api-versioning.md +226 -0
  73. package/assets/skills/astro-patterns.md +233 -0
  74. package/assets/skills/auth-patterns.md +248 -0
  75. package/assets/skills/aws-patterns.md +171 -0
  76. package/assets/skills/background-jobs.md +162 -0
  77. package/assets/skills/browser-extensions.md +309 -0
  78. package/assets/skills/caching-patterns.md +253 -0
  79. package/assets/skills/ci-cd.md +251 -0
  80. package/assets/skills/cli-development.md +296 -0
  81. package/assets/skills/code-review.md +185 -0
  82. package/assets/skills/cron-patterns.md +327 -0
  83. package/assets/skills/data-fetching.md +231 -0
  84. package/assets/skills/database-migrations.md +346 -0
  85. package/assets/skills/database-patterns.md +219 -0
  86. package/assets/skills/debugging.md +281 -0
  87. package/assets/skills/design-system.md +289 -0
  88. package/assets/skills/django-patterns.md +182 -0
  89. package/assets/skills/docker-patterns.md +235 -0
  90. package/assets/skills/e2e-testing.md +287 -0
  91. package/assets/skills/edge-computing.md +268 -0
  92. package/assets/skills/electron-patterns.md +266 -0
  93. package/assets/skills/email-templates.md +206 -0
  94. package/assets/skills/error-handling.md +265 -0
  95. package/assets/skills/event-driven.md +232 -0
  96. package/assets/skills/express-patterns.md +239 -0
  97. package/assets/skills/fastapi-patterns.md +198 -0
  98. package/assets/skills/feature-flags.md +212 -0
  99. package/assets/skills/figma-to-code.md +298 -0
  100. package/assets/skills/file-upload.md +228 -0
  101. package/assets/skills/forms-patterns.md +264 -0
  102. package/assets/skills/gcp-patterns.md +189 -0
  103. package/assets/skills/git-workflow.md +187 -0
  104. package/assets/skills/golang-patterns.md +185 -0
  105. package/assets/skills/graphql-patterns.md +244 -0
  106. package/assets/skills/i18n-patterns.md +172 -0
  107. package/assets/skills/image-processing.md +350 -0
  108. package/assets/skills/java-springboot.md +226 -0
  109. package/assets/skills/kotlin-patterns.md +207 -0
  110. package/assets/skills/kubernetes-patterns.md +326 -0
  111. package/assets/skills/laravel-patterns.md +261 -0
  112. package/assets/skills/llm-fine-tuning.md +335 -0
  113. package/assets/skills/load-testing.md +303 -0
  114. package/assets/skills/logging-observability.md +228 -0
  115. package/assets/skills/markdown-processing.md +318 -0
  116. package/assets/skills/mcp-server-patterns.md +292 -0
  117. package/assets/skills/microservices.md +272 -0
  118. package/assets/skills/migration-patterns.md +239 -0
  119. package/assets/skills/mongodb-patterns.md +189 -0
  120. package/assets/skills/monorepo-patterns.md +287 -0
  121. package/assets/skills/nextjs-app-router.md +237 -0
  122. package/assets/skills/notification-patterns.md +348 -0
  123. package/assets/skills/oauth-patterns.md +246 -0
  124. package/assets/skills/payment-integration.md +222 -0
  125. package/assets/skills/pdf-generation.md +307 -0
  126. package/assets/skills/performance-optimization.md +277 -0
  127. package/assets/skills/php-patterns.md +210 -0
  128. package/assets/skills/prisma-patterns.md +241 -0
  129. package/assets/skills/prompt-engineering.md +193 -0
  130. package/assets/skills/pwa-patterns.md +247 -0
  131. package/assets/skills/python-patterns.md +158 -0
  132. package/assets/skills/python-testing.md +172 -0
  133. package/assets/skills/queue-patterns.md +295 -0
  134. package/assets/skills/rag-patterns.md +159 -0
  135. package/assets/skills/rate-limiting.md +319 -0
  136. package/assets/skills/react-components.md +201 -0
  137. package/assets/skills/react-native-patterns.md +299 -0
  138. package/assets/skills/real-time-patterns.md +181 -0
  139. package/assets/skills/redis-patterns.md +188 -0
  140. package/assets/skills/refactoring.md +218 -0
  141. package/assets/skills/regex-patterns.md +191 -0
  142. package/assets/skills/remix-patterns.md +262 -0
  143. package/assets/skills/responsive-design.md +199 -0
  144. package/assets/skills/ruby-rails-patterns.md +178 -0
  145. package/assets/skills/rust-patterns.md +211 -0
  146. package/assets/skills/search-patterns.md +227 -0
  147. package/assets/skills/security-hardening.md +237 -0
  148. package/assets/skills/seo-patterns.md +179 -0
  149. package/assets/skills/serverless-patterns.md +223 -0
  150. package/assets/skills/sql-optimization.md +154 -0
  151. package/assets/skills/state-management.md +254 -0
  152. package/assets/skills/storybook-patterns.md +330 -0
  153. package/assets/skills/svelte-patterns.md +258 -0
  154. package/assets/skills/swift-patterns.md +227 -0
  155. package/assets/skills/tailwind-patterns.md +272 -0
  156. package/assets/skills/tdd-workflow.md +199 -0
  157. package/assets/skills/terraform-patterns.md +270 -0
  158. package/assets/skills/testing-react.md +240 -0
  159. package/assets/skills/testing-vitest.md +232 -0
  160. package/assets/skills/typescript-strict.md +159 -0
  161. package/assets/skills/video-processing.md +340 -0
  162. package/assets/skills/vue-patterns.md +247 -0
  163. package/assets/skills/web-workers.md +327 -0
  164. package/assets/skills/webhooks-patterns.md +283 -0
  165. package/assets/skills/websocket-patterns.md +306 -0
  166. package/dist/cli/index.js +557 -549
  167. package/dist/core/index.d.ts +2754 -0
  168. package/dist/core/index.js +2 -0
  169. package/dist/core.js +33 -31
  170. package/dist/mcp/index.d.ts +610 -0
  171. package/dist/mcp/index.js +2 -0
  172. package/dist/mcp-server.js +73 -71
  173. package/package.json +4 -1
package/dist/core.js CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var to=Object.create;var ut=Object.defineProperty;var ro=Object.getOwnPropertyDescriptor;var no=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,io=Object.prototype.hasOwnProperty;var ae=(e,t)=>()=>(e&&(t=e(e=0)),t);var tr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),oo=(e,t)=>{for(var r in t)ut(e,r,{get:t[r],enumerable:!0})},dn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of no(t))!io.call(e,s)&&s!==r&&ut(e,s,{get:()=>t[s],enumerable:!(n=ro(t,s))||n.enumerable});return e};var pt=(e,t,r)=>(r=e!=null?to(so(e)):{},dn(t||!e||!e.__esModule?ut(r,"default",{value:e,enumerable:!0}):r,e)),Le=e=>dn(ut({},"__esModule",{value:!0}),e);var P=ae(()=>{"use strict"});function lo(e){let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=null,s=process.stdout.isTTY,i=()=>{s&&process.stdout.clearLine&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))};return{start(){return s&&(process.stdout.write(`${p.cyan}${t[0]}${p.reset} ${e}`),n=setInterval(()=>{r=(r+1)%t.length,i(),process.stdout.write(`${p.cyan}${t[r]}${p.reset} ${e}`)},80)),this},succeed(c=e){return n&&clearInterval(n),i(),console.log(`${p.green}\u2713${p.reset} ${c}`),this},fail(c=e){return n&&clearInterval(n),i(),console.log(`${p.red}\u2717${p.reset} ${c}`),this},warn(c=e){return n&&clearInterval(n),i(),console.log(`${p.yellow}\u26A0${p.reset} ${c}`),this},info(c=e){return n&&clearInterval(n),i(),console.log(`${p.cyan}\u2139${p.reset} ${c}`),this},stop(){return n&&clearInterval(n),i(),this}}}var p,ao,I,co,rr=ae(()=>{"use strict";P();p={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"},ao=e=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e==null?String(e):JSON.stringify(e),I=(e=>console.log(e));I.info=e=>console.log(`${p.cyan}\u2139${p.reset} ${e}`);I.success=e=>console.log(`${p.green}\u2713${p.reset} ${e}`);I.warning=e=>console.log(`${p.yellow}\u26A0${p.reset} ${e}`);I.error=e=>console.log(`${p.red}\u2717${p.reset} ${e}`);I.debug=e=>{process.env.DEBUG&&console.log(`${p.dim}\u22EF ${e}${p.reset}`)};I.header=e=>console.log(`
1
+ "use strict";var to=Object.create;var ut=Object.defineProperty;var ro=Object.getOwnPropertyDescriptor;var no=Object.getOwnPropertyNames;var so=Object.getPrototypeOf,io=Object.prototype.hasOwnProperty;var ce=(e,t)=>()=>(e&&(t=e(e=0)),t);var tr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),oo=(e,t)=>{for(var r in t)ut(e,r,{get:t[r],enumerable:!0})},dn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of no(t))!io.call(e,s)&&s!==r&&ut(e,s,{get:()=>t[s],enumerable:!(n=ro(t,s))||n.enumerable});return e};var pt=(e,t,r)=>(r=e!=null?to(so(e)):{},dn(t||!e||!e.__esModule?ut(r,"default",{value:e,enumerable:!0}):r,e)),qe=e=>dn(ut({},"__esModule",{value:!0}),e);var P=ce(()=>{"use strict"});function lo(e){let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=null,s=process.stdout.isTTY,i=()=>{s&&process.stdout.clearLine&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))};return{start(){return s&&(process.stdout.write(`${p.cyan}${t[0]}${p.reset} ${e}`),n=setInterval(()=>{r=(r+1)%t.length,i(),process.stdout.write(`${p.cyan}${t[r]}${p.reset} ${e}`)},80)),this},succeed(c=e){return n&&clearInterval(n),i(),console.log(`${p.green}\u2713${p.reset} ${c}`),this},fail(c=e){return n&&clearInterval(n),i(),console.log(`${p.red}\u2717${p.reset} ${c}`),this},warn(c=e){return n&&clearInterval(n),i(),console.log(`${p.yellow}\u26A0${p.reset} ${c}`),this},info(c=e){return n&&clearInterval(n),i(),console.log(`${p.cyan}\u2139${p.reset} ${c}`),this},stop(){return n&&clearInterval(n),i(),this}}}var p,ao,I,co,rr=ce(()=>{"use strict";P();p={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"},ao=e=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e==null?String(e):JSON.stringify(e),I=(e=>console.log(e));I.info=e=>console.log(`${p.cyan}\u2139${p.reset} ${e}`);I.success=e=>console.log(`${p.green}\u2713${p.reset} ${e}`);I.warning=e=>console.log(`${p.yellow}\u26A0${p.reset} ${e}`);I.error=e=>console.log(`${p.red}\u2717${p.reset} ${e}`);I.debug=e=>{process.env.DEBUG&&console.log(`${p.dim}\u22EF ${e}${p.reset}`)};I.header=e=>console.log(`
2
2
  ${p.bold}${p.cyan}${e}${p.reset}
3
3
  `);I.subheader=e=>console.log(`
4
- ${p.bold}${e}${p.reset}`);I.dim=e=>console.log(`${p.dim}${e}${p.reset}`);I.brand=e=>console.log(`${p.cyan}\u26A1${p.reset} ${e}`);I.keyValue=(e,t)=>console.log(` ${p.bold}${e}:${p.reset} ${t}`);I.list=(e,t=" ")=>{for(let r of e)console.log(`${t}- ${ao(r)}`)};I.apiError=(e,t)=>{if(t&&typeof t=="object"&&t.authHandled)return;let r=t instanceof Error?t.message:String(t);console.log(`${p.red}\u2717${p.reset} ${e}: ${r}`)};co=I});function gn(e){try{return ce.default.existsSync(e)||ce.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function uo(e,t=null){try{return ce.default.readFileSync(e,"utf-8")}catch{return t}}function po(e,t){try{let r=fn.default.dirname(e);return gn(r),ce.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function fo(e){try{return ce.default.existsSync(e)}catch{return!1}}function go(e){try{return ce.default.statSync(e).mtime}catch{return null}}function mo(e=new Date){return e.toISOString().split("T")[0]}function ho(e){let r=new Date().getTime()-e.getTime(),n=Math.floor(r/1e3),s=Math.floor(n/60),i=Math.floor(s/60),a=Math.floor(i/24);return a>0?`${a} day${a>1?"s":""} ago`:i>0?`${i} hour${i>1?"s":""} ago`:s>0?`${s} minute${s>1?"s":""} ago`:"just now"}function _o(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function vo(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function yo(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function dt(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function So(e){return JSON.parse(JSON.stringify(e))}var ce,fn,nr=ae(()=>{"use strict";P();ce=pt(require("fs")),fn=pt(require("path"))});function bo(e){let t={_:[]};for(let r=0;r<e.length;r++){let n=e[r];if(n){if(n.startsWith("--")){let s=n.slice(2),i=e[r+1];if(s.includes("=")){let a=s.split("="),c=a[0],l=a.slice(1).join("=");c&&(t[c]=l)}else i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")&&n.length===2){let s=n.slice(1),i=e[r+1];i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")){let s=n.slice(1).split("");for(let i of s)i&&(t[i]=!0);continue}t._.push(n)}}return t}function To(e,t){let r=e.map((i,a)=>{let c=[i,...t.map(l=>String(l[a]??""))];return Math.max(...c.map(l=>l.length))}),n=r.map(i=>"\u2500".repeat(i+2)).join("\u253C"),s=i=>i.map((a,c)=>` ${String(a).padEnd(r[c]??0)} `).join("\u2502");return[s(e),n,...t.map(s)].join(`
4
+ ${p.bold}${e}${p.reset}`);I.dim=e=>console.log(`${p.dim}${e}${p.reset}`);I.brand=e=>console.log(`${p.cyan}\u26A1${p.reset} ${e}`);I.keyValue=(e,t)=>console.log(` ${p.bold}${e}:${p.reset} ${t}`);I.list=(e,t=" ")=>{for(let r of e)console.log(`${t}- ${ao(r)}`)};I.apiError=(e,t)=>{if(t&&typeof t=="object"&&t.authHandled)return;let r=t instanceof Error?t.message:String(t);console.log(`${p.red}\u2717${p.reset} ${e}: ${r}`)};co=I});function gn(e){try{return le.default.existsSync(e)||le.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function uo(e,t=null){try{return le.default.readFileSync(e,"utf-8")}catch{return t}}function po(e,t){try{let r=fn.default.dirname(e);return gn(r),le.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function fo(e){try{return le.default.existsSync(e)}catch{return!1}}function go(e){try{return le.default.statSync(e).mtime}catch{return null}}function mo(e=new Date){return e.toISOString().split("T")[0]}function ho(e){let r=new Date().getTime()-e.getTime(),n=Math.floor(r/1e3),s=Math.floor(n/60),i=Math.floor(s/60),a=Math.floor(i/24);return a>0?`${a} day${a>1?"s":""} ago`:i>0?`${i} hour${i>1?"s":""} ago`:s>0?`${s} minute${s>1?"s":""} ago`:"just now"}function _o(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function vo(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function yo(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function dt(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function So(e){return JSON.parse(JSON.stringify(e))}var le,fn,nr=ce(()=>{"use strict";P();le=pt(require("fs")),fn=pt(require("path"))});function bo(e){let t={_:[]};for(let r=0;r<e.length;r++){let n=e[r];if(n){if(n.startsWith("--")){let s=n.slice(2),i=e[r+1];if(s.includes("=")){let a=s.split("="),c=a[0],l=a.slice(1).join("=");c&&(t[c]=l)}else i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")&&n.length===2){let s=n.slice(1),i=e[r+1];i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")){let s=n.slice(1).split("");for(let i of s)i&&(t[i]=!0);continue}t._.push(n)}}return t}function To(e,t){let r=e.map((i,a)=>{let c=[i,...t.map(l=>String(l[a]??""))];return Math.max(...c.map(l=>l.length))}),n=r.map(i=>"\u2500".repeat(i+2)).join("\u253C"),s=i=>i.map((a,c)=>` ${String(a).padEnd(r[c]??0)} `).join("\u2502");return[s(e),n,...t.map(s)].join(`
5
5
  `)}function Eo(e){let t=hn.join(e,"package.json");try{return JSON.parse(mn.readFileSync(t,"utf-8"))}catch{return null}}function wo(e,t={}){return dt()?!0:t.silent?!1:t.brief?(console.log(`${p.dim}Note: ${e} has enhanced features when used with MCP integration.${p.reset}`),console.log(`${p.dim}Run "bootspring mcp" for setup instructions.${p.reset}
6
6
  `),!1):(console.log(`
7
7
  ${p.yellow}${p.bold}Limited Mode - MCP Integration Recommended${p.reset}
@@ -23,52 +23,54 @@ ${p.bold}Documentation:${p.reset}
23
23
 
24
24
  ${p.dim}Run "bootspring mcp" for server options${p.reset}
25
25
  `),!1)}function ko(e){dt()||(console.log(`${p.dim}Note: ${e} - some features require MCP integration.${p.reset}`),console.log(`${p.dim}Run "bootspring mcp" for setup instructions.${p.reset}
26
- `))}var mn,hn,_n=ae(()=>{"use strict";P();mn=pt(require("fs")),hn=pt(require("path"));rr();nr()});var Po,Ao,vn=ae(()=>{"use strict";P();Po="3.3.2",Ao="@girardmedia/bootspring"});function Sn(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,le).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,le).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${le}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${le}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${le}`)}function ft(e){return Sn(String(e||""))}function sr(e,t=0){if(t>10)return e;if(typeof e=="string")return ft(e);if(Array.isArray(e))return e.map(n=>sr(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(yn.test(n)){r[n]=le;continue}r[n]=sr(s,t+1)}return r}function xo(e){return e?e instanceof Error?ft(e.message||String(e)):ft(String(e)):""}var le,yn,bn=ae(()=>{"use strict";P();le="[REDACTED]",yn=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i});var Te={};oo(Te,{BOOTSPRING_PACKAGE_NAME:()=>Ao,BOOTSPRING_VERSION:()=>Po,COLORS:()=>p,REDACTED:()=>le,SENSITIVE_KEY_PATTERN:()=>yn,createSpinner:()=>lo,createTable:()=>To,deepClone:()=>So,ensureDir:()=>gn,fileExists:()=>fo,formatDate:()=>mo,formatRelativeTime:()=>ho,getFileTime:()=>go,getPackageJson:()=>Eo,isCI:()=>yo,isMCPContext:()=>dt,parseArgs:()=>bo,print:()=>co,readFile:()=>uo,redactErrorMessage:()=>xo,redactPatternMatches:()=>Sn,redactSensitiveData:()=>sr,redactSensitiveString:()=>ft,requireMCP:()=>wo,slugify:()=>_o,truncate:()=>vo,warnMCPLimited:()=>ko,writeFile:()=>po});var Ee=ae(()=>{"use strict";P();_n();vn();bn();rr();nr()});var Ui=tr((pl,nn)=>{"use strict";P();var Co=Object.create,At=Object.defineProperty,Oo=Object.getOwnPropertyDescriptor,$n=Object.getOwnPropertyNames,Io=Object.getPrototypeOf,jo=Object.prototype.hasOwnProperty,xt=(e,t)=>function(){return e&&(t=(0,e[$n(e)[0]])(e=0)),t},O=(e,t)=>{for(var r in t)At(e,r,{get:t[r],enumerable:!0})},yt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of $n(t))!jo.call(e,s)&&s!==r&&At(e,s,{get:()=>t[s],enumerable:!(n=Oo(t,s))||n.enumerable});return e},$o=(e,t,r)=>(yt(e,t,"default"),r&&yt(r,t,"default")),v=(e,t,r)=>(r=e!=null?Co(Io(e)):{},yt(t||!e||!e.__esModule?At(r,"default",{value:e,enumerable:!0}):r,e)),Ro=e=>yt(At({},"__esModule",{value:!0}),e),A=xt({"../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.14_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"(){"use strict"}}),Ct={};O(Ct,{BOOTSPRING_DIR:()=>G,CONFIG_FILE:()=>ke,CREDENTIALS_FILE:()=>N,DEVICE_FILE:()=>Z,clearCredentials:()=>Xe,clearDeviceInfo:()=>Bn,clearProjectApiKey:()=>$t,clearProjectScopedSession:()=>yr,decrypt:()=>Ot,encrypt:()=>gr,ensureBootspringDir:()=>_e,findNearestProjectConfigPath:()=>Ze,generateDeviceFingerprint:()=>Ge,getApiKey:()=>Qe,getConfig:()=>zn,getCredentials:()=>J,getCredentialsPath:()=>Fn,getDeviceContext:()=>je,getDeviceId:()=>Nt,getDeviceInfo:()=>Rt,getLegacyProjectApiKey:()=>fe,getProjectScopedSessionState:()=>mr,getProjectScopedToken:()=>It,getRefreshToken:()=>Ie,getStoredApiKey:()=>jt,getTier:()=>Dn,getToken:()=>ve,getTokenExpiryStatus:()=>Rn,getUser:()=>hr,isApiKeyAuth:()=>Nn,isAuthenticated:()=>ye,login:()=>et,loginWithApiKey:()=>qn,logout:()=>Sr,readNearestProjectConfig:()=>re,saveApiKeyToProject:()=>Ln,saveConfig:()=>Gn,saveCredentials:()=>K,saveProjectScopedSession:()=>vr,updateTokens:()=>Mn,writeNearestProjectConfig:()=>Oe});function No(){try{if(b.default.existsSync(gt))return Buffer.from(b.default.readFileSync(gt,"utf-8").trim(),"hex")}catch(t){$e("salt file read failed, regenerating",t)}_e();let e=H.default.randomBytes(32);return b.default.writeFileSync(gt,e.toString("hex"),{mode:384}),e}function ur(){let e=No(),t=Ge();return H.default.scryptSync(t,e,32)}function Do(){let e=C.default.hostname()+C.default.userInfo().username;return H.default.createHash("sha256").update(e).digest()}function _e(){b.default.existsSync(G)||b.default.mkdirSync(G,{recursive:!0,mode:448})}function gr(e){let t=ur(),r=H.default.randomBytes(16),n=H.default.createCipheriv("aes-256-cbc",t,r),s=n.update(JSON.stringify(e),"utf8","hex");return s+=n.final("hex"),{iv:r.toString("hex"),data:s,v:2}}function ir(e,t){let r=Buffer.from(e.iv,"hex"),n=H.default.createDecipheriv("aes-256-cbc",t,r),s=n.update(e.data,"hex","utf8");return s+=n.final("utf8"),JSON.parse(s)}function Ot(e){if(!e||typeof e!="object")throw new Error("Invalid credential format");let t=e;if(!t.iv||!t.data){if(t.token||t.apiKey)return console.error("[bootspring] Migrating legacy unencrypted credentials to encrypted storage"),e;throw new Error("Invalid credential format")}let r=e;if(r.v===2)return ir(r,ur());try{return ir(r,ur())}catch{return ir(r,Do())}}function J(){if(pe)return pe.value;try{if(b.default.existsSync(N)){let e=JSON.parse(b.default.readFileSync(N,"utf-8")),t=Ot(e);return(e&&typeof e=="object"&&!e.iv&&!e.data||e&&typeof e=="object"&&e.iv&&e.v!==2)&&K(t),pe={resolved:!0,value:t},t}}catch{br=!0;try{b.default.unlinkSync(N)}catch(e){$e("failed to delete corrupt credentials file",e)}}return pe={resolved:!0,value:null},null}function K(e){_e();let t=gr({...e});b.default.writeFileSync(N,JSON.stringify(t,null,2),{mode:384}),pe=null}function Xe(){try{b.default.existsSync(N)&&b.default.unlinkSync(N)}catch{}pe=null,br=!1}function ve(){let e=J();return!e||e.expiresAt&&new Date(e.expiresAt)<new Date?null:e.token??null}function Rn(e=300*1e3){let t=J();if(!t||!t.expiresAt)return{expiringSoon:!1,expired:!1,expiresAt:null,msUntilExpiry:0};let r=new Date(t.expiresAt).getTime(),n=Date.now(),s=r-n;return{expiringSoon:s>0&&s<=e,expired:s<=0,expiresAt:t.expiresAt,msUntilExpiry:Math.max(0,s)}}function Ze(){let e=process.cwd();for(let t=0;t<10;t++){let r=V.default.join(e,".bootspring.json");if(b.default.existsSync(r))return r;let n=V.default.dirname(e);if(n===e)break;e=n}return null}function re(){try{let e=Ze();if(!e)return null;let t=JSON.parse(b.default.readFileSync(e,"utf-8"));return{path:e,config:t}}catch{return null}}function Oe(e,t){try{return b.default.writeFileSync(e,JSON.stringify(t,null,2)),!0}catch{return!1}}function mr(){let e=re();if(!e||!e.config.projectAuth)return null;let t=e.config.projectAuth;return typeof t.token!="string"||t.token.length===0||typeof t.expiresAt!="string"||t.expiresAt.length===0?null:{token:t.token,expiresAt:t.expiresAt,issuedAt:typeof t.issuedAt=="string"?t.issuedAt:new Date().toISOString(),source:typeof t.source=="string"?t.source:"unknown",migratedFromLegacyApiKey:!!t.migratedFromLegacyApiKey}}function fe(){let e=re();if(!e)return null;let t=e.config.apiKey;return typeof t=="string"&&t.length>0?t:null}function It(){let e=mr();if(!e)return null;let t=new Date(e.expiresAt).getTime();return!Number.isFinite(t)||Date.now()>=t-6e4?null:e.token}function jt(){let e=J();return typeof e?.apiKey=="string"&&e.apiKey.length>0?e.apiKey:null}function Qe(){let e=process.env.BOOTSPRING_API_KEY;if(e)return e;if(ve())return null;let t=It();if(t)return t;let r=jt();if(r)return r;let n=fe();return n||null}function Nn(){return process.env.BOOTSPRING_API_KEY?!0:ve()?!1:!!(It()||jt()||fe())}function Ie(){return J()?.refreshToken||null}function ye(){return!!(ve()||Qe()||Ie())}function hr(){return J()?.user||null}function Dn(){let e=process.env.BOOTSPRING_USER_TIER;return e?e.toLowerCase():hr()?.tier||"free"}function _r(e){let t=e.match(/^(\d+)([mhd])$/);if(!t)return 900*1e3;let r=parseInt(t[1]);switch(t[2]){case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return 900*1e3}}function et(e){let t=e.expiresIn||"15m",r=_r(t),n=new Date(Date.now()+r).toISOString();K({token:e.token,refreshToken:e.refreshToken,expiresAt:n,user:e.user}),e.token&&vr(e.token,{expiresAt:n,source:"device-flow"})}function Ln(e){try{let t=re();if(!t)return!1;let r={...t.config};return r.apiKey=e,Oe(t.path,r)}catch{return!1}}function $t(){try{let e=re();if(!e)return!1;let t={...e.config};return Object.prototype.hasOwnProperty.call(t,"apiKey")?(delete t.apiKey,Oe(e.path,t)):!1}catch{return!1}}function qn(e,t){K({apiKey:e,user:t}),$t()}function Mn(e){let t=J()||{},r=e.expiresIn||"15m",n=_r(r),s=new Date(Date.now()+n).toISOString();K({...t,token:e.token,refreshToken:e.refreshToken,expiresAt:s})}function vr(e,t={}){try{let r=re();if(!r||!e)return!1;let n=t.expiresAt?t.expiresAt:typeof t.expiresIn=="number"&&Number.isFinite(t.expiresIn)?new Date(Date.now()+t.expiresIn*1e3).toISOString():typeof t.expiresIn=="string"?new Date(Date.now()+_r(t.expiresIn)).toISOString():new Date(Date.now()+900*1e3).toISOString(),s={...r.config,projectAuth:{token:e,expiresAt:n,issuedAt:new Date().toISOString(),source:t.source||"api-key-exchange",migratedFromLegacyApiKey:!!t.migratedFromLegacyApiKey}};return t.migratedFromLegacyApiKey&&Object.prototype.hasOwnProperty.call(s,"apiKey")&&delete s.apiKey,Oe(r.path,s)}catch{return!1}}function yr(){try{let e=re();if(!e||!e.config.projectAuth)return!1;let t={...e.config};return delete t.projectAuth,Oe(e.path,t)}catch{return!1}}function Sr(){Xe(),yr(),$t()}function zn(){try{if(b.default.existsSync(ke))return JSON.parse(b.default.readFileSync(ke,"utf-8"))}catch(e){$e("failed to read config file",e)}return{}}function Gn(e){_e(),b.default.writeFileSync(ke,JSON.stringify(e,null,2))}function Fn(){return N}function Ge(){let e=[C.default.hostname(),C.default.userInfo().username,C.default.platform(),C.default.arch(),C.default.cpus()[0]?.model||"unknown-cpu",C.default.homedir(),Object.values(C.default.networkInterfaces()).flat().filter(t=>!!t&&!t.internal&&t.mac!=="00:00:00:00:00:00").map(t=>t.mac).sort().join(",")];return H.default.createHash("sha256").update(e.join("|")).digest("hex")}function Rt(){_e();try{if(b.default.existsSync(Z)){let t=JSON.parse(b.default.readFileSync(Z,"utf-8"));if(t.fingerprint===Ge())return t}}catch(t){$e("failed to read device file, regenerating",t)}let e={deviceId:H.default.randomUUID(),fingerprint:Ge(),createdAt:new Date().toISOString(),platform:C.default.platform(),arch:C.default.arch(),hostname:C.default.hostname()};return b.default.writeFileSync(Z,JSON.stringify(e,null,2),{mode:384}),e}function Nt(){return Rt().deviceId}function je(e="0.0.0"){let t=Rt(),r=process.cwd();return{deviceId:t.deviceId,platform:t.platform,arch:t.arch,hostname:t.hostname,cliVersion:e,nodeVersion:process.version,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,cwd:V.default.basename(r),cwdFull:r}}function Bn(){try{b.default.existsSync(Z)&&b.default.unlinkSync(Z)}catch(e){$e("failed to delete device file",e)}}var b,V,C,H,$e,G,N,ke,Z,gt,pe,br,ne=xt({"src/auth.ts"(){"use strict";A(),b=v(require("fs")),V=v(require("path")),C=v(require("os")),H=v(require("crypto")),$e=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:auth]",...e):()=>{},G=V.default.join(C.default.homedir(),".bootspring"),N=V.default.join(G,"credentials.json"),ke=V.default.join(G,"config.json"),Z=V.default.join(G,"device.json"),gt=V.default.join(G,".encryption-salt"),pe=null,br=!1}}),Tr={};O(Tr,{LOCAL_CONFIG_NAME:()=>Pe,SESSION_FILE:()=>Q,addRecentProject:()=>Wn,clearSession:()=>Un,createLocalConfig:()=>Jn,findLocalConfig:()=>Lt,getCurrentProject:()=>Vn,getEffectiveProject:()=>Re,getRecentProjects:()=>Hn,getSession:()=>se,getSessionState:()=>Yn,saveSession:()=>Dt,setCurrentProject:()=>Kn});function se(){try{if(D.default.existsSync(Q))return JSON.parse(D.default.readFileSync(Q,"utf-8"))}catch(e){qt("failed to read session file",e)}return null}function Dt(e){_e();let t={...e,updatedAt:new Date().toISOString()};D.default.writeFileSync(Q,JSON.stringify(t,null,2))}function Un(){try{D.default.existsSync(Q)&&D.default.unlinkSync(Q)}catch(e){qt("failed to delete session file",e)}}function Vn(){return se()?.project||null}function Lo(e){return Xn.some(t=>D.default.existsSync(B.default.join(e,t)))}function St(e){let t=B.default.resolve(e);try{return D.default.realpathSync.native(t)}catch{try{return D.default.realpathSync(t)}catch{return t}}}function qo(e){let t=St(e);for(let r=0;r<10;r++){if(Lo(t))return t;let n=B.default.dirname(t);if(n===t)break;t=n}return null}function Mo(e){let t=St(e),r=qo(t);return r?{dir:r,mode:"tree"}:{dir:t,mode:"exact"}}function Kn(e,t){let r=se()||{};if(e){let n=Mo(t||process.cwd());r.project=e,r.projectScopeDir=n.dir,r.projectScopeMode=n.mode}else delete r.project,delete r.projectScopeDir,delete r.projectScopeMode;Dt(r)}function Hn(){return se()?.recentProjects||[]}function Wn(e){let t=se()||{},n=(t.recentProjects||[]).filter(s=>s.id!==e.id);n.unshift({id:e.id,name:e.name,slug:e.slug,lastUsed:new Date().toISOString()}),t.recentProjects=n.slice(0,10),Dt(t)}function Lt(e){let t=e||process.cwd();for(let r=0;r<10;r++){let n=B.default.join(t,Pe);if(D.default.existsSync(n))try{return{...JSON.parse(D.default.readFileSync(n,"utf-8")),_path:n,_dir:t}}catch(i){qt("failed to parse local config at",n,i)}let s=B.default.dirname(t);if(s===t)break;t=s}return null}function Re(e){let t=Lt(e);if(t?.projectId)return{id:t.projectId,name:t.projectName||"Unknown",slug:t.projectSlug,source:"local"};let r=se(),n=r?.project;if(!n||!r?.projectScopeDir)return null;let s=St(r.projectScopeDir),i=St(e||process.cwd());return(()=>{if(r.projectScopeMode==="exact")return i===s;let c=B.default.relative(s,i);return c===""||!c.startsWith("..")&&!B.default.isAbsolute(c)})()?{...n,source:"session"}:null}function Jn(e,t){let r=B.default.join(e,Pe),n={projectId:t.id,projectName:t.name,projectSlug:t.slug,createdAt:new Date().toISOString()};return D.default.writeFileSync(r,JSON.stringify(n,null,2)),r}function Yn(){let e=se(),t=Re(),r=Lt();return{hasSession:!!e,project:t,source:t?.source||null,hasLocalConfig:!!r,localConfigPath:r?._path,recentProjects:e?.recentProjects||[],lastUpdated:e?.updatedAt||null}}var D,B,qt,Q,Pe,Xn,Mt=xt({"src/session.ts"(){"use strict";A(),D=v(require("fs")),B=v(require("path")),ne(),qt=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:session]",...e):()=>{},Q=B.default.join(G,"session.json"),Pe=".bootspring.json",Xn=[Pe,"bootspring.config.js",".git"]}}),Er={};O(Er,{ASSISTANTS:()=>rs,ASSISTANT_FIRST_SUCCESS_EVENT:()=>Ue,ASSISTANT_RETURN_EVENT:()=>Ve,ASSISTANT_SETUP_EVENT:()=>zt,BILLING_UPGRADE_STARTED_EVENT:()=>Tt,MAX_EVENTS_LIMIT:()=>bt,UPGRADE_COMPLETED_EVENT:()=>Pr,UPGRADE_PROMPT_EVENT:()=>Et,clearEvents:()=>es,emitEvent:()=>Fe,ensureTelemetryDir:()=>Qn,getAssistantActivationFunnel:()=>Jo,getStatus:()=>Wo,getTelemetryDir:()=>wr,getTelemetryFile:()=>tt,getUpgradeConversionFunnel:()=>Xo,inferAssistantFromEnvironment:()=>zo,listEvents:()=>ee,track:()=>is,trackAssistantSetup:()=>Vo,trackAssistantUsageSuccess:()=>Ko,uploadEvents:()=>ta});function Ne(e){let t=String(e||"").trim().toLowerCase();if(!t)return null;let r=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return r==="claude"||r==="claude-code"?"claude":r==="codex"||r==="openai-codex"?"codex":r==="gemini"||r==="gemini-cli"?"gemini":null}function zo(e=process.env){let t=Ne(e.BOOTSPRING_ASSISTANT);return t||(e.CLAUDE_CODE||e.CLAUDECODE?"claude":e.CODEX_SANDBOX||e.CODEX_ENV||e.OPENAI_CODEX?"codex":e.GEMINI_CLI||e.GOOGLE_GEMINI_CLI?"gemini":null)}function Zn(e,t="unknown"){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Go(e){let t=Zn(e,"updated");return ns.has(t)?t:"other"}function Tn(e){let t=Zn(e,"unknown");return ss.has(t)?t:"other"}function wr(e=process.cwd()){return kr.join(e,".bootspring","telemetry")}function tt(e=process.cwd()){return kr.join(wr(e),"events.jsonl")}function Qn(e=process.cwd()){let t=wr(e);return te.mkdirSync(t,{recursive:!0}),t}function Fe(e,t={},r={}){let n=r.projectRoot||process.cwd();Qn(n);let s=tt(n),a={timestamp:(r.now?new Date(r.now):new Date).toISOString(),event:String(e||"").trim(),payload:(0,Be.redactSensitiveData)(t||{})};return te.appendFileSync(s,`${JSON.stringify(a)}
27
- `,"utf-8"),a}function Fo(e,t={}){return ee({projectRoot:t.projectRoot}).filter(r=>Ne(r?.payload?.assistant)===e)}function Bo(e){return e>=7?"d7_plus":e>=2?"d2_6":e>=1?"d1":"d0"}function Uo(e){let r=String(e?.payload?.occurredAt||"").trim()||String(e?.timestamp||"").trim(),n=new Date(r).getTime();return Number.isFinite(n)?n:null}function ue(e){let t=String(e?.payload?.occurredAt||"").trim();return t||String(e?.timestamp||"").trim()||null}function Vo(e,t={},r={}){let n=Ne(e);return n?Fe(zt,{assistant:n,status:Go(t.status)},r):null}function Ko(e,t={},r={}){let n=Ne(e);if(!n)return{assistant:null,firstSuccessTracked:!1,returnTracked:!1,daysSinceFirst:null};let s=r.projectRoot||process.cwd(),i=r.now?new Date(r.now):new Date,a=Fo(n,{projectRoot:s}),c=a.find(f=>f.event===Ue);if(!c)return Fe(Ue,{assistant:n,source:Tn(t.source||"mcp")},{projectRoot:s,now:i}),{assistant:n,firstSuccessTracked:!0,returnTracked:!1,daysSinceFirst:0};let l=Uo(c),u=l!==null?Math.floor((i.getTime()-l)/(1440*60*1e3)):0;if(u>=1){let f=Bo(u);if(!a.some(_=>_.event!==Ve?!1:String(_?.payload?.window||"")===f))return Fe(Ve,{assistant:n,source:Tn(t.source||"mcp"),window:f},{projectRoot:s,now:i}),{assistant:n,firstSuccessTracked:!1,returnTracked:!0,daysSinceFirst:u}}return{assistant:n,firstSuccessTracked:!1,returnTracked:!1,daysSinceFirst:u}}function Ho(e){try{return JSON.parse(e)}catch{return null}}function ee(e={}){let t=e.projectRoot||process.cwd(),r=tt(t);if(!te.existsSync(r))return[];let n=String(e.event||"").trim(),s=e.from?new Date(e.from).getTime():null,i=e.to?new Date(e.to).getTime():null,a=Number(e.limit),l=te.readFileSync(r,"utf-8").split(`
28
- `).filter(Boolean).map(Ho).filter(f=>f!==null).filter(f=>{if(n&&f.event!==n)return!1;let g=new Date(f.timestamp).getTime();return!(Number.isFinite(s)&&s!==null&&g<s||Number.isFinite(i)&&i!==null&&g>i)}),u=Number.isFinite(a)&&a>0?Math.min(a,bt):bt;return l=l.slice(-u),l}function es(e={}){let t=e.projectRoot||process.cwd(),r=tt(t),n=ee({projectRoot:t});return te.existsSync(r)&&te.writeFileSync(r,"","utf-8"),{cleared:n.length,file:r}}function Wo(e={}){let t=e.projectRoot||process.cwd(),r=tt(t),n=ee({projectRoot:t}),s=n.length>0?n[n.length-1]:null;return{file:r,exists:te.existsSync(r),count:n.length,lastEventAt:s?.timestamp??null}}function En(e,t){let r=new Date(String(e||"")).getTime(),n=new Date(String(t||"")).getTime();return!Number.isFinite(r)||!Number.isFinite(n)?null:Math.floor((n-r)/(1440*60*1e3))}function or(e,t){let r=e.filter(u=>Ne(u?.payload?.assistant)===t),n=r.find(u=>u.event===zt)||null,s=r.find(u=>u.event===Ue)||null,i=r.filter(u=>u.event===Ve),a=s?i.some(u=>{let f=En(ue(s),ue(u));return f!==null&&f>=1}):!1,c=s?i.some(u=>{let f=En(ue(s),ue(u));return f!==null&&f>=7}):!1,l=i.length>0?i[i.length-1]:null;return{setup:!!n,firstSuccess:!!s,returned:i.length>0,d1:a,d7:c,setupAt:ue(n),firstSuccessAt:ue(s),lastReturnAt:ue(l)}}function Jo(e={}){let t=e.projectRoot||process.cwd(),r=Ne(e.assistant),n=ee({projectRoot:t,from:e.from,to:e.to}),s={claude:or(n,"claude"),codex:or(n,"codex"),gemini:or(n,"gemini")},i=r?{[r]:s[r]}:s,c=Object.values(i).reduce((l,u)=>(u.setup&&(l.setup+=1),u.firstSuccess&&(l.firstSuccess+=1),u.returned&&(l.return+=1),u.d1&&(l.d1+=1),u.d7&&(l.d7+=1),l),{setup:0,firstSuccess:0,return:0,d1:0,d7:0});return{generatedAt:new Date().toISOString(),query:{assistant:r,from:e.from||null,to:e.to||null},totals:c,assistants:i}}function ar(e,t){return t?Number((e/t).toFixed(4)):0}function qe(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Yo(e={}){let t=e.feature||e.skillId||e.workflow||e.agent||"unknown";return{capability:qe(e.capability,"unknown"),featureType:qe(e.featureType,"general"),feature:qe(t,"unknown"),placement:qe(e.placement,"inline"),variant:qe(e.variant,"control")}}function Xo(e={}){let t=e.projectRoot||process.cwd(),r=ee({projectRoot:t}),n={};for(let i of r){if(i.event!==Et&&i.event!==Tt&&i.event!==Pr)continue;let a=Yo(i.payload),c=`${a.capability}:${a.featureType}:${a.feature}`;n[c]||(n[c]={capability:a.capability,featureType:a.featureType,feature:a.feature,prompted:0,started:0,completed:0,converted:0,conversionRate:0,placements:{},variants:{}});let l=n[c];if(l){if(i.event===Et){l.prompted+=1,l.placements[a.placement]=(l.placements[a.placement]||0)+1,l.variants[a.variant]=(l.variants[a.variant]||0)+1;continue}if(i.event===Tt){l.started+=1;continue}l.completed+=1}}let s=Object.values(n).reduce((i,a)=>(a.converted=Math.min(a.prompted,a.completed),a.conversionRate=ar(a.converted,a.prompted),i.prompted+=a.prompted,i.started+=a.started,i.completed+=a.completed,i.converted+=a.converted,i),{prompted:0,started:0,completed:0,converted:0});return{generatedAt:new Date().toISOString(),totals:{...s,startRate:ar(s.started,s.prompted),conversionRate:ar(s.converted,s.prompted)},capabilities:n}}function Zo(e){return new Promise(t=>setTimeout(t,e))}function Qo(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}async function ea(e,t,r,n={}){let s=Number(n.maxRetries),i=Number(n.retryDelayMs),a=Number.isFinite(s)&&s>=0?s:2,c=Number.isFinite(i)&&i>0?i:300,l=0;for(;;)try{let u=await fetch(e,{method:"POST",headers:r,body:JSON.stringify(t)});if(!u.ok)throw new Error(`HTTP ${u.status}`);return{success:!0,attempts:l+1}}catch(u){if(l>=a)return{success:!1,attempts:l+1,error:(0,Be.redactErrorMessage)(u)};l+=1;let f=c*2**(l-1);await Zo(f)}}async function ta(e={}){let t=e.projectRoot||process.cwd(),n=`${process.env.BOOTSPRING_API_URL||"https://api.bootspring.com"}/api/v1/events/batch`,s=e.endpoint||process.env.BOOTSPRING_TELEMETRY_ENDPOINT||n,i=e.token||process.env.BOOTSPRING_TELEMETRY_TOKEN,a=e.event,c=Number(e.limit)||void 0,l=Number(e.batchSize||process.env.BOOTSPRING_TELEMETRY_BATCH_SIZE),u=Number.isFinite(l)&&l>0?l:100,f=e.clearOnSuccess===!0,g=ee({projectRoot:t,event:a,limit:c});if(g.length===0)return{uploaded:0,remaining:0,endpoint:s};let _=e.apiKey??null,w=e.projectId??null;if(!_)try{let ie=await Promise.resolve().then(()=>(ne(),Ct)),oe=await Promise.resolve().then(()=>(Mt(),Tr));_=ie.getApiKey();let lt=oe.getEffectiveProject();w=w??lt?.id??null}catch{}let T={"content-type":"application/json",accept:"application/json","user-agent":`bootspring-cli/${Be.BOOTSPRING_VERSION||"unknown"}`};_?T["x-api-key"]=_:i&&(T.authorization=`Bearer ${i}`),w&&(T["x-project-id"]=w);let M=Qo(g,u),un=0,pn=0,ct=[];for(let ie=0;ie<M.length;ie++){let oe=M[ie];if(!oe)continue;let lt=ts.createHash("sha1").update(JSON.stringify(oe)).digest("hex"),er=await ea(s,{source:"bootspring",batch:{index:ie,total:M.length,id:lt},events:oe},{...T,"x-bootspring-batch-id":lt},e);if(pn+=er.attempts??1,!er.success){ct.push({index:ie,count:oe.length,error:(0,Be.redactErrorMessage)(er.error??"upload_failed")});continue}un+=oe.length}if(ct.length>0)throw new Error(`Telemetry upload failed for ${ct.length}/${M.length} batches`);f&&es({projectRoot:t});let eo=f?0:ee({projectRoot:t}).length;return{uploaded:un,attempted:g.length,batches:M.length,attempts:pn,remaining:eo,endpoint:s,failedBatches:ct}}var te,kr,ts,Be,bt,rs,zt,Ue,Ve,Tt,Et,Pr,ns,ss,is,os=xt({"src/telemetry.ts"(){"use strict";A(),te=v(require("fs")),kr=v(require("path")),ts=v(require("crypto")),Be=(Ee(),Le(Te)),bt=1e4,rs=["claude","codex","gemini"],zt="assistant_setup",Ue="assistant_first_success",Ve="assistant_return",Tt="billing_upgrade_started",Et="premium_prompted",Pr="premium_unlocked",ns=new Set(["installed","updated","skipped","failed","created","unchanged"]),ss=new Set(["mcp","cli","setup","dashboard","api","unknown"]),is=Fe}}),Ar={};O(Ar,{API_BASE:()=>rt,API_VERSION:()=>Gt,BOOTSPRING_DIR:()=>G,BootspringClient:()=>vs,COMMANDS_SOURCE:()=>Se,CONFIG_FILE:()=>ke,CREDENTIALS_FILE:()=>N,CURRENT_VERSION:()=>z,DEFAULT_INTERVAL_MS:()=>Lr,DEFAULT_POLICY_PROFILE:()=>Ke,DEVICE_FILE:()=>Z,LIMITS:()=>Ae,LOCAL_CONFIG_NAME:()=>Pe,PACKAGE_NAME:()=>We,PATTERNS:()=>wt,POLICY_PROFILES:()=>He,SESSION_FILE:()=>Q,SHELL_DANGEROUS_CHARS:()=>la,STATE_PATH:()=>Je,TARGET_DIRS:()=>nt,addRecentProject:()=>Wn,api:()=>xr,apiLogin:()=>ls,applyUpdate:()=>qr,auth:()=>Ct,callMcpTool:()=>ms,checkForUpdates:()=>Ds,checkInstallation:()=>zs,classifyError:()=>j,clearCredentials:()=>Xe,clearDeviceInfo:()=>Bn,clearProjectApiKey:()=>$t,clearProjectScopedSession:()=>yr,clearSession:()=>Un,compareVersions:()=>Vt,config:()=>Si,context:()=>qi,createClient:()=>aa,createLocalConfig:()=>Jn,decrypt:()=>Ot,encrypt:()=>gr,ensureBootspringDir:()=>_e,ensureLatestVersion:()=>Ls,entitlements:()=>li,findLocalConfig:()=>Lt,findNearestProjectConfigPath:()=>Ze,generateDeviceFingerprint:()=>Ge,getApiKey:()=>Qe,getCommandFiles:()=>st,getConfig:()=>zn,getCredentials:()=>J,getCredentialsPath:()=>Fn,getCurrentProject:()=>Vn,getDeviceContext:()=>je,getDeviceId:()=>Nt,getDeviceInfo:()=>Rt,getEffectiveProject:()=>Re,getInstallContext:()=>Kt,getLatestVersion:()=>Ht,getLegacyProjectApiKey:()=>fe,getMcpResource:()=>_s,getPolicyProfile:()=>Ut,getProjectScopedSessionState:()=>mr,getProjectScopedToken:()=>It,getRecentProjects:()=>Hn,getRefreshToken:()=>Ie,getSession:()=>se,getSessionState:()=>Yn,getStoredApiKey:()=>jt,getTier:()=>Dn,getToken:()=>ve,getTokenExpiryStatus:()=>Rn,getUser:()=>hr,healthCheck:()=>cs,installAll:()=>Ms,installToTarget:()=>Mr,isApiKeyAuth:()=>Nn,isAuthenticated:()=>ye,isWorkflowBlocked:()=>Ir,listMcpResources:()=>hs,listMcpTools:()=>gs,login:()=>et,loginWithApiKey:()=>qn,logout:()=>Sr,maybeAutoUploadTelemetry:()=>js,normalizeProfile:()=>Ft,policies:()=>ys,pollDeviceToken:()=>ps,presence:()=>xs,readNearestProjectConfig:()=>re,refreshSession:()=>ds,registerMcpForAssistant:()=>As,remoteLogout:()=>fs,request:()=>q,resolvePolicyProfile:()=>Bt,runDiagnostics:()=>Es,saveApiKeyToProject:()=>Ln,saveConfig:()=>Gn,saveCredentials:()=>K,saveProjectScopedSession:()=>vr,saveSession:()=>Dt,selfHeal:()=>bs,selfUpdate:()=>$s,sendHealthReport:()=>Os,sendHeartbeat:()=>Cs,session:()=>Tr,setAuthFailureHandler:()=>as,setCurrentProject:()=>Kn,setupCommands:()=>qs,startDeviceFlow:()=>us,stripUnsafeControlChars:()=>Ss,telemetry:()=>Er,tierEnforcement:()=>Fs,trackToolUsage:()=>Is,tryHeal:()=>Ts,uninstallAll:()=>Gs,updateTokens:()=>Mn,validateNumericId:()=>ua,validateSlug:()=>da,validateStringLength:()=>jr,validateTodoText:()=>pa,writeNearestProjectConfig:()=>Oe});nn.exports=Ro(Ar);A();$o(Ar,(Ee(),Le(Te)),nn.exports);ne();var xr={};O(xr,{API_BASE:()=>rt,API_VERSION:()=>Gt,apiLogin:()=>ls,callMcpTool:()=>ms,getMcpResource:()=>_s,healthCheck:()=>cs,listMcpResources:()=>hs,listMcpTools:()=>gs,pollDeviceToken:()=>ps,refreshSession:()=>ds,remoteLogout:()=>fs,request:()=>q,setAuthFailureHandler:()=>as,startDeviceFlow:()=>us});A();var Cr=v(require("https")),Or=v(require("http"));ne();var mt=(Ee(),Le(Te)),rt=process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",Gt="v1",pr=null;function as(e){pr=e}var wn=new Map,ra=6e4;function na(e,t){let r=String(e||"").trim();if(!r)return`API Error (${t||"unknown"})`;if(/^\s*<!doctype html/i.test(r)||/^\s*<html/i.test(r)){let n=r.match(/<title[^>]*>([^<]+)<\/title>/i),s=n&&n[1]?`: ${n[1].trim()}`:"";return`Bootspring API returned an HTML error page (HTTP ${t||"unknown"}${s})`}return(0,mt.redactSensitiveString)(r)}var Me=null;async function sa(){let e=Ie();return e?Me||(Me=(async()=>{try{let t=new URL(`/api/${Gt}/auth/refresh`,rt),n=t.protocol==="https:"?Cr.default:Or.default,s=JSON.stringify({refreshToken:e,device:je()}),i=await new Promise((a,c)=>{let l=n.request(t,{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(s)},timeout:1e4},u=>{let f="";u.on("data",g=>f+=g),u.on("end",()=>{try{let g=JSON.parse(f);if((u.statusCode||500)>=400){c(new Error(g.error||"refresh failed"));return}a(g)}catch(g){c(g)}})});l.on("error",c),l.on("timeout",()=>l.destroy(new Error("refresh timeout"))),l.write(s),l.end()});return et(i),i.token||null}catch{return null}finally{Me=null}})(),Me):null}async function ia(){let e=ve();if(!e){let r=J();r?.refreshToken&&r?.expiresAt&&(e=await sa())}if(e)return{Authorization:`Bearer ${e}`};let t=Qe();return t?t.startsWith("eyJ")?{Authorization:`Bearer ${t}`}:{"X-API-Key":t}:{}}function oa(e,t){if(!t||typeof t!="object")return e;for(let[r,n]of Object.entries(t))if(n!=null){if(Array.isArray(n)){n.forEach(s=>e.searchParams.append(r,String(s)));continue}e.searchParams.set(r,String(n))}return e}async function kn(e,t,r,n){let s=await ia(),i=oa(new URL(`/api/${Gt}${t}`,rt),e==="GET"?r:null),c=i.protocol==="https:"?Cr.default:Or.default,l={"Content-Type":"application/json","User-Agent":"bootspring-core","X-Device-Id":Nt(),...s,...n.headers};if(e==="GET"&&!n.noCache){let u=`${e}:${i.pathname}${i.search}`,f=wn.get(u);if(f&&Date.now()-f.time<ra)return f.data}return new Promise((u,f)=>{let g=c.request(i,{method:e,headers:l,timeout:n.timeout||3e4},_=>{let w="";_.on("data",h=>w+=h),_.on("end",()=>{try{let h=JSON.parse(w);if(_.statusCode>=400){let T=new Error((0,mt.redactSensitiveString)(String(h.message||h.error||"API Error")));T.status=_.statusCode,T.code=h.error||h.code,T.details=(0,mt.redactSensitiveData)(h.details),f(T)}else e==="GET"&&!n.noCache&&wn.set(`${e}:${i.pathname}${i.search}`,{data:h,time:Date.now()}),u(h)}catch{if(_.statusCode>=400){let h=new Error(na(w,_.statusCode));h.status=_.statusCode,f(h)}else u(w)}})});g.on("error",_=>{let w=new Error(_.code==="ECONNREFUSED"?"Cannot connect to Bootspring API.":_.code==="ENOTFOUND"?"Cannot resolve api.bootspring.com \u2014 check your internet connection.":_.code==="ETIMEDOUT"?"API request timed out.":_.code==="EHOSTUNREACH"?"API host unreachable \u2014 check your network.":(0,mt.redactSensitiveString)(_.message||String(_)));w.code=_.code,f(w)}),r&&e!=="GET"&&g.write(JSON.stringify(r)),g.end()})}async function q(e,t,r=null,n={}){try{return await kn(e,t,r,n)}catch(s){if(s.status===401&&pr&&!n._authRetried){if(await pr())return kn(e,t,r,{...n,_authRetried:!0,noCache:!0});s.authHandled=!0}throw s}}async function cs(){try{let e=new URL("/health",rt);return new Promise(t=>{(e.protocol==="https:"?Cr.default:Or.default).get(e,n=>{let s="";n.on("data",i=>s+=i),n.on("end",()=>{try{t({connected:!0,...JSON.parse(s)})}catch{t({connected:!1})}})}).on("error",()=>t({connected:!1}))})}catch{return{connected:!1}}}async function ls(e,t){let r=await q("POST","/auth/login",{email:e,password:t,device:je()});return et(r),r}async function us(){return q("POST","/auth/device",{device:je()},{noCache:!0})}async function ps(e){return q("POST","/auth/device/token",{device_code:e},{noCache:!0})}async function ds(){let e=Ie();if(!e)throw Object.assign(new Error("No refresh token available"),{code:"NO_REFRESH_TOKEN"});let t=await q("POST","/auth/refresh",{refreshToken:e,device:je()},{noCache:!0});return et(t),t}async function fs(){let e=Ie();try{return await q("POST","/auth/logout",{refreshToken:e},{noCache:!0})}finally{Sr()}}async function gs(){return q("GET","/mcp/tools")}async function ms(e,t){return q("POST","/mcp/tool",{tool:e,arguments:t})}async function hs(){return q("GET","/mcp/resources")}async function _s(e){return q("GET",`/mcp/resources/${encodeURIComponent(e)}`)}A();var vs=class{config;constructor(e){this.config=e}async request(e){let t=new URL(e.path,this.config.baseUrl);if(e.query)for(let[s,i]of Object.entries(e.query))t.searchParams.set(s,i);let r={"Content-Type":"application/json"};this.config.token&&(r.Authorization=`Bearer ${this.config.token}`),this.config.apiKey&&(r["X-API-Key"]=this.config.apiKey);let n=await fetch(t.toString(),{method:e.method,headers:r,body:e.body?JSON.stringify(e.body):void 0,signal:AbortSignal.timeout(this.config.timeout??3e4)});if(!n.ok){let s=await n.json().catch(()=>({message:n.statusText}));throw new Error(s.message||`HTTP ${n.status}`)}return n.json()}async post__api_v1_auth_register(e){return this.request({method:"POST",path:"/api/v1/auth/register",body:e})}async post__api_v1_auth_login(e){return this.request({method:"POST",path:"/api/v1/auth/login",body:e})}async post__api_v1_auth_refresh(e){return this.request({method:"POST",path:"/api/v1/auth/refresh",body:e})}async get__api_v1_auth_me(){return this.request({method:"GET",path:"/api/v1/auth/me"})}async patch__api_v1_auth_me(e){return this.request({method:"PATCH",path:"/api/v1/auth/me",body:e})}async delete__api_v1_auth_me(){return this.request({method:"DELETE",path:"/api/v1/auth/me"})}async post__api_v1_auth_logout(e){return this.request({method:"POST",path:"/api/v1/auth/logout",body:e})}async post__api_v1_auth_logoutall(e){return this.request({method:"POST",path:"/api/v1/auth/logout-all",body:e})}async get__api_v1_auth_devices(){return this.request({method:"GET",path:"/api/v1/auth/devices"})}async delete__api_v1_auth_devices_deviceId(e){return this.request({method:"DELETE",path:`/api/v1/auth/devices/${e}`})}async post__api_v1_auth_device(e){return this.request({method:"POST",path:"/api/v1/auth/device",body:e})}async post__api_v1_auth_device_authorize(e){return this.request({method:"POST",path:"/api/v1/auth/device/authorize",body:e})}async post__api_v1_auth_device_token(e){return this.request({method:"POST",path:"/api/v1/auth/device/token",body:e})}async get__api_v1_auth_device_status_userCode(e){return this.request({method:"GET",path:`/api/v1/auth/device/status/${e}`})}async post__api_v1_auth_password_resetrequest(e){return this.request({method:"POST",path:"/api/v1/auth/password/reset-request",body:e})}async post__api_v1_auth_password_reset(e){return this.request({method:"POST",path:"/api/v1/auth/password/reset",body:e})}async post__api_v1_auth_email_verify(e){return this.request({method:"POST",path:"/api/v1/auth/email/verify",body:e})}async post__api_v1_auth_email_resend(e){return this.request({method:"POST",path:"/api/v1/auth/email/resend",body:e})}async get__api_v1_auth_oauth_provider(e){return this.request({method:"GET",path:`/api/v1/auth/oauth/${e}`})}async get__api_v1_auth_sso_orgId(e){return this.request({method:"GET",path:`/api/v1/auth/sso/${e}`})}async put__api_v1_auth_sso_orgId_config(e,t){return this.request({method:"PUT",path:`/api/v1/auth/sso/${e}/config`,body:t})}async get__api_v1_auth_oidc_orgId(e){return this.request({method:"GET",path:`/api/v1/auth/oidc/${e}`})}async put__api_v1_auth_oidc_orgId_config(e,t){return this.request({method:"PUT",path:`/api/v1/auth/oidc/${e}/config`,body:t})}async get__api_v1_agents(){return this.request({method:"GET",path:"/api/v1/agents"})}async get__api_v1_agents_search(){return this.request({method:"GET",path:"/api/v1/agents/search"})}async get__api_v1_agents_id(e){return this.request({method:"GET",path:`/api/v1/agents/${e}`})}async post__api_v1_agents_id_invoke(e,t){return this.request({method:"POST",path:`/api/v1/agents/${e}/invoke`,body:t})}async post__api_v1_agents_run(e){return this.request({method:"POST",path:"/api/v1/agents/run",body:e})}async get__api_v1_skills(){return this.request({method:"GET",path:"/api/v1/skills"})}async post__api_v1_skills_run(e){return this.request({method:"POST",path:"/api/v1/skills/run",body:e})}async post__api_v1_build(e){return this.request({method:"POST",path:"/api/v1/build",body:e})}async get__api_v1_build_slots(){return this.request({method:"GET",path:"/api/v1/build/slots"})}async get__api_v1_build_tasks(){return this.request({method:"GET",path:"/api/v1/build/tasks"})}async get__api_v1_build_tasks_taskId(e){return this.request({method:"GET",path:`/api/v1/build/tasks/${e}`})}async get__api_v1_build_progress(){return this.request({method:"GET",path:"/api/v1/build/progress"})}async get__api_v1_quality_gates(){return this.request({method:"GET",path:"/api/v1/quality/gates"})}async get__api_v1_quality_gates_id(e){return this.request({method:"GET",path:`/api/v1/quality/gates/${e}`})}async post__api_v1_quality_run(e){return this.request({method:"POST",path:"/api/v1/quality/run",body:e})}async post__api_v1_quality_check(e){return this.request({method:"POST",path:"/api/v1/quality/check",body:e})}async post__api_v1_quality_analyze(e){return this.request({method:"POST",path:"/api/v1/quality/analyze",body:e})}async get__api_v1_quality_history(){return this.request({method:"GET",path:"/api/v1/quality/history"})}async get__api_v1_quality_budgets(){return this.request({method:"GET",path:"/api/v1/quality/budgets"})}async get__api_v1_projects(){return this.request({method:"GET",path:"/api/v1/projects"})}async post__api_v1_projects(e){return this.request({method:"POST",path:"/api/v1/projects",body:e})}async get__api_v1_projects_activity(){return this.request({method:"GET",path:"/api/v1/projects/activity"})}async get__api_v1_projects_id_members(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/members`})}async patch__api_v1_projects_id_members(e,t){return this.request({method:"PATCH",path:`/api/v1/projects/${e}/members`,body:t})}async delete__api_v1_projects_id_members(e){return this.request({method:"DELETE",path:`/api/v1/projects/${e}/members`})}async post__api_v1_projects_id_invite(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/invite`,body:t})}async get__api_v1_projects_id_invitations(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/invitations`})}async post__api_v1_projects_id_invitations(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/invitations`,body:t})}async post__api_v1_projects_id_transfer(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/transfer`,body:t})}async get__api_v1_projects_id_activity(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/activity`})}async get__api_v1_invitations(){return this.request({method:"GET",path:"/api/v1/invitations"})}async post__api_v1_invitations_invitationId_accept(e,t){return this.request({method:"POST",path:`/api/v1/invitations/${e}/accept`,body:t})}async post__api_v1_invitations_invitationId_decline(e,t){return this.request({method:"POST",path:`/api/v1/invitations/${e}/decline`,body:t})}async get__api_v1_organizations(){return this.request({method:"GET",path:"/api/v1/organizations"})}async post__api_v1_organizations(e){return this.request({method:"POST",path:"/api/v1/organizations",body:e})}async get__api_v1_billing_status(){return this.request({method:"GET",path:"/api/v1/billing/status"})}async get__api_v1_billing_subscription(){return this.request({method:"GET",path:"/api/v1/billing/subscription"})}async post__api_v1_billing_checkout(e){return this.request({method:"POST",path:"/api/v1/billing/checkout",body:e})}async post__api_v1_billing_portal(e){return this.request({method:"POST",path:"/api/v1/billing/portal",body:e})}async get__api_v1_billing_usage(){return this.request({method:"GET",path:"/api/v1/billing/usage"})}async get__api_v1_billing_invoices(){return this.request({method:"GET",path:"/api/v1/billing/invoices"})}async get__api_v1_workflows(){return this.request({method:"GET",path:"/api/v1/workflows"})}async post__api_v1_workflows_run(e){return this.request({method:"POST",path:"/api/v1/workflows/run",body:e})}async get__api_v1_workflows_runs(){return this.request({method:"GET",path:"/api/v1/workflows/runs"})}async get__api_v1_workflows_runs_id(e){return this.request({method:"GET",path:`/api/v1/workflows/runs/${e}`})}async post__api_v1_workflows_runs_id_replay(e,t){return this.request({method:"POST",path:`/api/v1/workflows/runs/${e}/replay`,body:t})}async post__api_v1_pipeline_run(e){return this.request({method:"POST",path:"/api/v1/pipeline/run",body:e})}async get__api_v1_swarm_status(){return this.request({method:"GET",path:"/api/v1/swarm/status"})}async get__api_v1_swarm_agents(){return this.request({method:"GET",path:"/api/v1/swarm/agents"})}async post__api_v1_swarm_agents(e){return this.request({method:"POST",path:"/api/v1/swarm/agents",body:e})}async delete__api_v1_swarm_agents_agentId(e){return this.request({method:"DELETE",path:`/api/v1/swarm/agents/${e}`})}async post__api_v1_swarm_tasks(e){return this.request({method:"POST",path:"/api/v1/swarm/tasks",body:e})}async post__api_v1_swarm_tasks_batch(e){return this.request({method:"POST",path:"/api/v1/swarm/tasks/batch",body:e})}async post__api_v1_swarm_consensus(e){return this.request({method:"POST",path:"/api/v1/swarm/consensus",body:e})}async post__api_v1_swarm_topology(e){return this.request({method:"POST",path:"/api/v1/swarm/topology",body:e})}async post__api_v1_swarm_configure(e){return this.request({method:"POST",path:"/api/v1/swarm/configure",body:e})}async get__api_v1_swarm_memory(){return this.request({method:"GET",path:"/api/v1/swarm/memory"})}async post__api_v1_swarm_memory(e){return this.request({method:"POST",path:"/api/v1/swarm/memory",body:e})}async post__api_v1_swarm_memory_search(e){return this.request({method:"POST",path:"/api/v1/swarm/memory/search",body:e})}async post__api_v1_swarm_plan(e){return this.request({method:"POST",path:"/api/v1/swarm/plan",body:e})}async get__api_v1_knowledgegraph_stats(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/stats"})}async get__api_v1_knowledgegraph_search(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/search"})}async post__api_v1_knowledgegraph_entity(e){return this.request({method:"POST",path:"/api/v1/knowledge-graph/entity",body:e})}async get__api_v1_knowledgegraph_path(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/path"})}async get__api_v1_knowledgegraph_export(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/export"})}async get__api_v1_session(){return this.request({method:"GET",path:"/api/v1/session"})}async get__api_v1_session_stats(){return this.request({method:"GET",path:"/api/v1/session/stats"})}async get__api_v1_session_stats_session(){return this.request({method:"GET",path:"/api/v1/session/stats/session"})}async get__api_v1_session_stats_sessions(){return this.request({method:"GET",path:"/api/v1/session/stats/sessions"})}async get__api_v1_session_stats_costs(){return this.request({method:"GET",path:"/api/v1/session/stats/costs"})}async get__api_v1_session_stats_summary(){return this.request({method:"GET",path:"/api/v1/session/stats/summary"})}async post__api_v1_session_stats_sync(e){return this.request({method:"POST",path:"/api/v1/session/stats/sync",body:e})}async get__api_v1_session_stats_intelligence_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/intelligence/${e}`})}async get__api_v1_session_stats_efficiency_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/efficiency/${e}`})}async get__api_v1_session_stats_patterns_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/patterns/${e}`})}async get__api_v1_session_stats_trends(){return this.request({method:"GET",path:"/api/v1/session/stats/trends"})}async get__api_v1_session_stats_optimize(){return this.request({method:"GET",path:"/api/v1/session/stats/optimize"})}async get__api_v1_session_stats_export(){return this.request({method:"GET",path:"/api/v1/session/stats/export"})}async get__api_v1_session_suggest(){return this.request({method:"GET",path:"/api/v1/session/suggest"})}async get__api_v1_session_suggest_status(){return this.request({method:"GET",path:"/api/v1/session/suggest/status"})}async get__api_v1_session_suggest_config(){return this.request({method:"GET",path:"/api/v1/session/suggest/config"})}async post__api_v1_session_suggest_config(e){return this.request({method:"POST",path:"/api/v1/session/suggest/config",body:e})}async get__api_v1_metrics_kpis(){return this.request({method:"GET",path:"/api/v1/metrics/kpis"})}async get__api_v1_metrics_events(){return this.request({method:"GET",path:"/api/v1/metrics/events"})}async post__api_v1_metrics_events(e){return this.request({method:"POST",path:"/api/v1/metrics/events",body:e})}async post__api_v1_seed(e){return this.request({method:"POST",path:"/api/v1/seed",body:e})}async get__api_v1_system_health(){return this.request({method:"GET",path:"/api/v1/system/health"})}async get__api_v1_system_version(){return this.request({method:"GET",path:"/api/v1/system/version"})}async get__api_v1_system_endpoints(){return this.request({method:"GET",path:"/api/v1/system/endpoints"})}async get__api_v1_system_openapijson(){return this.request({method:"GET",path:"/api/v1/system/openapi.json"})}async get__api_v1_system_docs(){return this.request({method:"GET",path:"/api/v1/system/docs"})}async get__api_v1_system_uptime(){return this.request({method:"GET",path:"/api/v1/system/uptime"})}async get__api_v1_system_sla(){return this.request({method:"GET",path:"/api/v1/system/sla"})}async get__api_v1_system_ws_stats(){return this.request({method:"GET",path:"/api/v1/system/ws/stats"})}async get__api_v1_system_ws_health(){return this.request({method:"GET",path:"/api/v1/system/ws/health"})}async post__api_v1_integrations_linear_fullsync(e){return this.request({method:"POST",path:"/api/v1/integrations/linear/full-sync",body:e})}async post__api_v1_integrations_jira_fullsync(e){return this.request({method:"POST",path:"/api/v1/integrations/jira/full-sync",body:e})}async get__api_v1_gdpr_export(){return this.request({method:"GET",path:"/api/v1/gdpr/export"})}async delete__api_v1_gdpr_delete(){return this.request({method:"DELETE",path:"/api/v1/gdpr/delete"})}async get__api_v1_geo_skills(){return this.request({method:"GET",path:"/api/v1/geo/skills"})}async post__api_v1_geo_run(e){return this.request({method:"POST",path:"/api/v1/geo/run",body:e})}async post__api_v1_geo_audit(e){return this.request({method:"POST",path:"/api/v1/geo/audit",body:e})}async get__api_v1_marketing_skills(){return this.request({method:"GET",path:"/api/v1/marketing/skills"})}async post__api_v1_marketing_run(e){return this.request({method:"POST",path:"/api/v1/marketing/run",body:e})}async get__api_v1_harness_status(){return this.request({method:"GET",path:"/api/v1/harness/status"})}async get__api_v1_harness_health(){return this.request({method:"GET",path:"/api/v1/harness/health"})}async get__api_v1_harness_audit(){return this.request({method:"GET",path:"/api/v1/harness/audit"})}async get__api_v1_harness_modes(){return this.request({method:"GET",path:"/api/v1/harness/modes"})}async get__api_v1_harness_rules(){return this.request({method:"GET",path:"/api/v1/harness/rules"})}async post__api_v1_brain_query(e){return this.request({method:"POST",path:"/api/v1/brain/query",body:e})}async post__api_v1_brain_classify(e){return this.request({method:"POST",path:"/api/v1/brain/classify",body:e})}async get__api_v1_search(){return this.request({method:"GET",path:"/api/v1/search"})}async get__api_v1_memory(){return this.request({method:"GET",path:"/api/v1/memory"})}async post__api_v1_memory(e){return this.request({method:"POST",path:"/api/v1/memory",body:e})}async post__api_v1_memory_search(e){return this.request({method:"POST",path:"/api/v1/memory/search",body:e})}async get__api_v1_notifications(){return this.request({method:"GET",path:"/api/v1/notifications"})}async patch__api_v1_notifications_id_read(e,t){return this.request({method:"PATCH",path:`/api/v1/notifications/${e}/read`,body:t})}async post__api_v1_notifications_readall(e){return this.request({method:"POST",path:"/api/v1/notifications/read-all",body:e})}async get__api_v1_audit(){return this.request({method:"GET",path:"/api/v1/audit"})}async get__api_v1_sprint(){return this.request({method:"GET",path:"/api/v1/sprint"})}async post__api_v1_sprint(e){return this.request({method:"POST",path:"/api/v1/sprint",body:e})}async get__api_v1_learning(){return this.request({method:"GET",path:"/api/v1/learning"})}async get__api_v1_learning_recommendations(){return this.request({method:"GET",path:"/api/v1/learning/recommendations"})}async get__api_v1_tools(){return this.request({method:"GET",path:"/api/v1/tools"})}async post__api_v1_tools_codereview(e){return this.request({method:"POST",path:"/api/v1/tools/code-review",body:e})}async post__api_v1_codegen_generate(e){return this.request({method:"POST",path:"/api/v1/codegen/generate",body:e})}async get__api_v1_recall(){return this.request({method:"GET",path:"/api/v1/recall"})}async post__api_v1_docsintelligence_query(e){return this.request({method:"POST",path:"/api/v1/docs-intelligence/query",body:e})}async get__api_v1_rbac_roles(){return this.request({method:"GET",path:"/api/v1/rbac/roles"})}async get__api_v1_rbac_permissions(){return this.request({method:"GET",path:"/api/v1/rbac/permissions"})}async post__api_v1_sync_export(e){return this.request({method:"POST",path:"/api/v1/sync/export",body:e})}async post__api_v1_sync_import(e){return this.request({method:"POST",path:"/api/v1/sync/import",body:e})}};function aa(e){return new vs(e)}var ys={};O(ys,{DEFAULT_POLICY_PROFILE:()=>Ke,POLICY_PROFILES:()=>He,getPolicyProfile:()=>Ut,isWorkflowBlocked:()=>Ir,normalizeProfile:()=>Ft,resolvePolicyProfile:()=>Bt});A();var Ke="startup",He={startup:{id:"startup",name:"Startup",allowExternalSkills:!0,blockedWorkflows:[]},regulated:{id:"regulated",name:"Regulated",allowExternalSkills:!1,blockedWorkflows:["growth-pack"]},enterprise:{id:"enterprise",name:"Enterprise",allowExternalSkills:!0,blockedWorkflows:[]}};function Ft(e){let t=String(e||Ke).trim().toLowerCase();return He[t]?t:Ke}function ca(e){return e?String(e).split(",").map(t=>t.trim()).filter(Boolean):[]}function Bt(e={}){return Ft(e.policyProfile||process.env.BOOTSPRING_POLICY_PROFILE)}function Ut(e,t={}){let r=Ft(e),n=He[r]||He[Ke],s=ca(t.blockedWorkflows||process.env.BOOTSPRING_POLICY_BLOCKED_WORKFLOWS);return{...n,blockedWorkflows:Array.from(new Set([...n.blockedWorkflows||[],...s]))}}function Ir(e,t){let r=String(e?.key||"").trim();return r?(t.blockedWorkflows||[]).includes(r):!1}Mt();A();var Ae={MAX_STRING_LENGTH:1e3,MAX_PATH_LENGTH:4096,MAX_FILENAME_LENGTH:255,MAX_TODO_LENGTH:500,MAX_PROJECT_NAME_LENGTH:100,MAX_DESCRIPTION_LENGTH:2e3,MIN_ID:1,MAX_ID:Number.MAX_SAFE_INTEGER,MAX_ARRAY_LENGTH:1e3},wt={PROJECT_NAME:/^[a-zA-Z][a-zA-Z0-9_-]*$/,SAFE_FILENAME:/^[^:*?"<>|]+$/,SLUG:/^[a-z][a-z0-9-]*$/,NUMERIC_ID:/^\d+$/,EMAIL:/^[^\s@]+@[^\s@]+\.[^\s@]+$/,URL:/^https?:\/\/[^\s]+$/},la=/[;&|`$(){}[\]<>\\!#*?"'\n\r\t]/;function Ss(e,t={}){let{allowTabs:r=!1,allowNewlines:n=!1}=t,s="";for(let i of e){let a=i.charCodeAt(0),c=a===10||a===13,l=a===9;if(!(a>=0&&a<=31||a===127)){s+=i;continue}if(c&&n){s+=i;continue}l&&r&&(s+=i)}return s}function jr(e,t=Ae.MAX_STRING_LENGTH,r=0){return typeof e!="string"?{valid:!1,error:"Value must be a string"}:e.length<r?{valid:!1,error:`String must be at least ${r} characters`}:e.length>t?{valid:!1,error:`String exceeds maximum length of ${t} characters`,sanitized:e.slice(0,t)}:{valid:!0,sanitized:e}}function ua(e,t={}){let{min:r=Ae.MIN_ID,max:n=Ae.MAX_ID}=t,s;if(typeof e=="string"){let i=e.trim();if(!wt.NUMERIC_ID.test(i))return{valid:!1,error:"Invalid numeric ID format"};s=parseInt(i,10)}else if(typeof e=="number")s=e;else return{valid:!1,error:"Value must be a string or number"};return!Number.isFinite(s)||!Number.isInteger(s)?{valid:!1,error:"Value must be an integer"}:s<r?{valid:!1,error:`Value must be at least ${r}`}:s>n?{valid:!1,error:`Value must be at most ${n}`}:{valid:!0,value:s}}function pa(e){let t=jr(e,Ae.MAX_TODO_LENGTH,1);return t.valid?{valid:!0,sanitized:Ss(e,{allowNewlines:!0})}:t}function da(e){if(typeof e!="string")return{valid:!1,error:"Slug must be a string"};let t=jr(e,Ae.MAX_FILENAME_LENGTH,1);if(!t.valid)return t;if(!wt.SLUG.test(e)){let r=e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/^[^a-z]+/,"").replace(/-+/g,"-").replace(/-$/,"");return r.length===0||!wt.SLUG.test(r)?{valid:!1,error:"Invalid slug format"}:{valid:!1,error:"Slug contains invalid characters",sanitized:r}}return{valid:!0,sanitized:e}}var bs={};O(bs,{classifyError:()=>j,registerMcpForAssistant:()=>As,runDiagnostics:()=>Es,tryHeal:()=>Ts});A();var m=v(require("fs")),S=v(require("path")),ze=v(require("os")),dr=require("child_process");ne();var fa=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:self-heal]",...e):()=>{};function j(e){let t=String(e?.message||e||"").toLowerCase(),r=e?.status,n=String(e?.code||"").toLowerCase();return r===401||t.includes("authentication required")?{id:"auth-expired",category:"auth",message:"Session expired or invalid credentials.",fix:"bootspring auth login",autoHealable:!0}:r===403?{id:"auth-tier",category:"auth",message:"This feature requires a paid plan.",fix:"Upgrade at https://bootspring.com/pricing",autoHealable:!1}:t.includes("bad decrypt")||t.includes("provider routines")?{id:"auth-corrupt-credentials",category:"auth",message:"Encrypted credentials cannot be read.",fix:"bootspring auth login",autoHealable:!0}:n==="econnrefused"||t.includes("econnrefused")?{id:"net-refused",category:"network",message:"Bootspring API is not reachable.",fix:"Check https://status.bootspring.com or try again later.",autoHealable:!1}:n==="enotfound"||t.includes("enotfound")||t.includes("getaddrinfo")?{id:"net-dns",category:"network",message:"Cannot resolve api.bootspring.com \u2014 check your internet connection.",fix:"Verify your DNS and network connectivity.",autoHealable:!1}:n==="etimedout"||t.includes("etimedout")||t.includes("socket hang up")?{id:"net-timeout",category:"network",message:"API request timed out.",fix:"Check your connection or try again.",autoHealable:!1}:t.includes("html error page")||t.includes("<!doctype")?{id:"net-proxy",category:"network",message:"API returned an HTML page \u2014 possible proxy or captive portal.",fix:"Check if you are behind a VPN, proxy, or captive portal.",autoHealable:!1}:t.includes("no project")||t.includes(".bootspring.json")?{id:"config-missing",category:"config",message:"No Bootspring project configuration found.",fix:"bootspring init",autoHealable:!0}:t.includes("invalid json")||t.includes("unexpected token")?{id:"config-corrupt",category:"config",message:"A configuration file contains invalid JSON.",fix:"bootspring doctor --fix",autoHealable:!0}:t.includes("cannot find module")||t.includes("module not found")?{id:"deps-missing",category:"deps",message:"Missing dependencies.",fix:"npm install",autoHealable:!0}:t.includes("no build state")||t.includes("build_state.json")?{id:"state-no-build",category:"state",message:"No build state found.",fix:"bootspring build start",autoHealable:!1}:null}var ga={"auth-corrupt-credentials":()=>{try{Xe();let e=fe();if(e)return K({apiKey:e}),{issue:j({message:"bad decrypt"}),healed:!0,detail:"Re-encrypted credentials from project API key."}}catch(e){fa("credential recovery failed",e)}return{issue:j({message:"bad decrypt"}),healed:!1,detail:"No fallback API key available."}},"auth-expired":()=>{let e=fe();return e?(K({apiKey:e}),{issue:j({status:401}),healed:!0,detail:"Restored auth from project API key."}):{issue:j({status:401}),healed:!1}},"config-missing":()=>({issue:j({message:"no project"}),healed:!1}),"config-corrupt":()=>{let e=Ze();if(e)try{return JSON.parse(m.default.readFileSync(e,"utf-8")),{issue:j({message:"invalid json"}),healed:!0,detail:"Config is actually valid."}}catch{let t=e+".bak";return m.default.copyFileSync(e,t),m.default.writeFileSync(e,JSON.stringify({projectId:"unknown"},null,2)),{issue:j({message:"invalid json"}),healed:!0,detail:`Backed up to ${S.default.basename(t)} and reset config.`}}return{issue:j({message:"invalid json"}),healed:!1}},"deps-missing":()=>{let e=process.cwd();if(m.default.existsSync(S.default.join(e,"package.json")))try{return(0,dr.execSync)("npm install",{cwd:e,timeout:12e4,stdio:"pipe"}),{issue:j({message:"cannot find module"}),healed:!0,detail:"Ran npm install successfully."}}catch{return{issue:j({message:"cannot find module"}),healed:!1,detail:"npm install failed."}}return{issue:j({message:"cannot find module"}),healed:!1}}};function Ts(e){let t=ga[e.id];if(!t)return{issue:e,healed:!1};try{return t()}catch{return{issue:e,healed:!1}}}function Es(e=!1){let t=[],r=process.cwd(),n=ze.default.homedir();if(ye())t.push({id:"auth",status:"ok",message:"Authenticated"});else if(e){let h=fe();h?(K({apiKey:h}),t.push({id:"auth",status:"healed",message:"Restored auth from project API key."})):t.push({id:"auth",status:"action-needed",message:"Not authenticated.",fix:"bootspring auth login"})}else t.push({id:"auth",status:"action-needed",message:"Not authenticated.",fix:"bootspring auth login"});if(m.default.existsSync(N))try{let h=JSON.parse(m.default.readFileSync(N,"utf-8"));Ot(h),t.push({id:"credentials",status:"ok",message:"Credentials file readable."})}catch{e?(Xe(),t.push({id:"credentials",status:"healed",message:"Removed unreadable credentials file."})):t.push({id:"credentials",status:"action-needed",message:"Credentials file corrupted.",fix:"bootspring doctor --fix"})}else t.push({id:"credentials",status:"ok",message:"No credentials file (using API key or not logged in)."});let s=Ze();if(s)try{JSON.parse(m.default.readFileSync(s,"utf-8")),t.push({id:"config",status:"ok",message:".bootspring.json valid."})}catch{if(e){let h=s+".bak";try{m.default.copyFileSync(s,h),m.default.writeFileSync(s,JSON.stringify({projectId:"unknown"},null,2)),t.push({id:"config",status:"healed",message:`Backed up corrupt config and reset. Backup: ${S.default.basename(h)}`})}catch{t.push({id:"config",status:"action-needed",message:".bootspring.json corrupted.",fix:"Delete and re-run bootspring init"})}}else t.push({id:"config",status:"action-needed",message:".bootspring.json corrupted.",fix:"bootspring doctor --fix"})}if(m.default.existsSync(S.default.join(r,"package.json"))&&!m.default.existsSync(S.default.join(r,"node_modules")))if(e)try{(0,dr.execSync)("npm install",{cwd:r,timeout:12e4,stdio:"pipe"}),t.push({id:"deps",status:"healed",message:"Installed missing dependencies."})}catch{t.push({id:"deps",status:"action-needed",message:"Dependencies missing.",fix:"npm install"})}else t.push({id:"deps",status:"action-needed",message:"Dependencies missing.",fix:"npm install"});else t.push({id:"deps",status:"ok",message:"Dependencies installed."});let i=S.default.join(r,"package-lock.json"),a=S.default.join(r,"pnpm-lock.yaml"),c=S.default.join(r,"node_modules"),l=m.default.existsSync(a)?a:m.default.existsSync(i)?i:null;if(l&&m.default.existsSync(c))try{let h=m.default.statSync(l).mtimeMs,T=m.default.statSync(c).mtimeMs;if(h>T){let M=l.endsWith(".yaml")?"pnpm install":"npm install";if(e)try{(0,dr.execSync)(M,{cwd:r,timeout:12e4,stdio:"pipe"}),t.push({id:"deps-stale",status:"healed",message:`Lockfile newer than node_modules \u2014 ran ${M}.`})}catch{t.push({id:"deps-stale",status:"action-needed",message:"Lockfile newer than node_modules.",fix:M})}else t.push({id:"deps-stale",status:"action-needed",message:"Lockfile newer than node_modules \u2014 dependencies may be stale.",fix:`${M}`})}}catch{}let u={claude:S.default.join(n,".claude.json"),codex:S.default.join(n,".codex","config.toml"),gemini:S.default.join(n,".gemini","settings.json")},f=S.default.join(r,".mcp.json"),g={claude:cr(u.claude),codex:ma(u.codex),gemini:cr(u.gemini),project:cr(f)};if(g.claude||g.codex||g.gemini||g.project){let h=Object.entries(g).filter(([,T])=>T).map(([T])=>T);t.push({id:"mcp",status:"ok",message:`MCP configured for: ${h.join(", ")}.`})}else if(e){let h=[],T=[];ws(u.claude)?h.push("Claude Code"):T.push("Claude Code"),m.default.existsSync(S.default.dirname(u.codex))&&(ks(u.codex)?h.push("Codex"):T.push("Codex")),m.default.existsSync(S.default.dirname(u.gemini))&&(Ps(u.gemini)?h.push("Gemini CLI"):T.push("Gemini CLI")),h.length>0?t.push({id:"mcp",status:"healed",message:`Registered bootspring MCP for: ${h.join(", ")}.`}):t.push({id:"mcp",status:"action-needed",message:"Bootspring MCP not configured.",fix:"bootspring setup assistants"})}else t.push({id:"mcp",status:"action-needed",message:"Bootspring MCP not configured.",fix:"bootspring doctor --fix"});m.default.existsSync(S.default.join(r,"CLAUDE.md"))?t.push({id:"claude-md",status:"ok",message:"CLAUDE.md present."}):m.default.existsSync(S.default.join(r,"package.json"))&&t.push({id:"claude-md",status:"action-needed",message:"No CLAUDE.md found.",fix:"bootspring generate"});let w=S.default.join(r,"planning","BUILD_STATE.json");if(m.default.existsSync(w))try{let h=JSON.parse(m.default.readFileSync(w,"utf-8"));if(!h.implementationQueue||!Array.isArray(h.implementationQueue))if(e){let T=w+".bak";m.default.copyFileSync(w,T),h.implementationQueue=h.implementationQueue||[],m.default.writeFileSync(w,JSON.stringify(h,null,2)),t.push({id:"build-state",status:"healed",message:`BUILD_STATE.json repaired (backed up to ${S.default.basename(T)}).`})}else t.push({id:"build-state",status:"action-needed",message:"BUILD_STATE.json has invalid structure.",fix:"bootspring doctor --fix"});else t.push({id:"build-state",status:"ok",message:"Build state valid."})}catch{t.push({id:"build-state",status:"action-needed",message:"BUILD_STATE.json is corrupted.",fix:"Delete and re-run bootspring build start"})}return t}function cr(e){try{if(!m.default.existsSync(e))return!1;let t=m.default.readFileSync(e,"utf-8");return t.trim()?!!JSON.parse(t)?.mcpServers?.bootspring:!1}catch{return!1}}function ma(e){try{return m.default.existsSync(e)?m.default.readFileSync(e,"utf-8").includes("[mcp_servers.bootspring]"):!1}catch{return!1}}function ws(e){try{let t={};if(m.default.existsSync(e)){let r=m.default.readFileSync(e,"utf-8");t=r.trim()?JSON.parse(r):{}}return(!t.mcpServers||typeof t.mcpServers!="object")&&(t.mcpServers={}),t.mcpServers.bootspring={type:"stdio",command:"bootspring",args:["mcp"],env:{BOOTSPRING_ASSISTANT:"claude"}},m.default.writeFileSync(e,`${JSON.stringify(t,null,2)}
29
- `,"utf-8"),!0}catch{return!1}}function ks(e){try{let t=S.default.dirname(e);m.default.existsSync(t)||m.default.mkdirSync(t,{recursive:!0});let r=m.default.existsSync(e)?m.default.readFileSync(e,"utf-8"):"";if(r.includes("[mcp_servers.bootspring]"))return!0;let n=`[mcp_servers.bootspring]
26
+ `))}var mn,hn,_n=ce(()=>{"use strict";P();mn=pt(require("fs")),hn=pt(require("path"));rr();nr()});var Po,Ao,vn=ce(()=>{"use strict";P();Po="3.3.2",Ao="@girardmedia/bootspring"});function Sn(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,ue).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,ue).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${ue}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${ue}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${ue}`)}function ft(e){return Sn(String(e||""))}function sr(e,t=0){if(t>10)return e;if(typeof e=="string")return ft(e);if(Array.isArray(e))return e.map(n=>sr(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(yn.test(n)){r[n]=ue;continue}r[n]=sr(s,t+1)}return r}function xo(e){return e?e instanceof Error?ft(e.message||String(e)):ft(String(e)):""}var ue,yn,bn=ce(()=>{"use strict";P();ue="[REDACTED]",yn=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i});var Ee={};oo(Ee,{BOOTSPRING_PACKAGE_NAME:()=>Ao,BOOTSPRING_VERSION:()=>Po,COLORS:()=>p,REDACTED:()=>ue,SENSITIVE_KEY_PATTERN:()=>yn,createSpinner:()=>lo,createTable:()=>To,deepClone:()=>So,ensureDir:()=>gn,fileExists:()=>fo,formatDate:()=>mo,formatRelativeTime:()=>ho,getFileTime:()=>go,getPackageJson:()=>Eo,isCI:()=>yo,isMCPContext:()=>dt,parseArgs:()=>bo,print:()=>co,readFile:()=>uo,redactErrorMessage:()=>xo,redactPatternMatches:()=>Sn,redactSensitiveData:()=>sr,redactSensitiveString:()=>ft,requireMCP:()=>wo,slugify:()=>_o,truncate:()=>vo,warnMCPLimited:()=>ko,writeFile:()=>po});var we=ce(()=>{"use strict";P();_n();vn();bn();rr();nr()});var Ui=tr((fl,nn)=>{"use strict";P();var Oo=Object.create,At=Object.defineProperty,Co=Object.getOwnPropertyDescriptor,$n=Object.getOwnPropertyNames,Io=Object.getPrototypeOf,jo=Object.prototype.hasOwnProperty,xt=(e,t)=>function(){return e&&(t=(0,e[$n(e)[0]])(e=0)),t},C=(e,t)=>{for(var r in t)At(e,r,{get:t[r],enumerable:!0})},yt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of $n(t))!jo.call(e,s)&&s!==r&&At(e,s,{get:()=>t[s],enumerable:!(n=Co(t,s))||n.enumerable});return e},$o=(e,t,r)=>(yt(e,t,"default"),r&&yt(r,t,"default")),y=(e,t,r)=>(r=e!=null?Oo(Io(e)):{},yt(t||!e||!e.__esModule?At(r,"default",{value:e,enumerable:!0}):r,e)),Ro=e=>yt(At({},"__esModule",{value:!0}),e),A=xt({"../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.14_tsx@4.21.0_typescript@5.9.3_yaml@2.8.3/node_modules/tsup/assets/cjs_shims.js"(){"use strict"}}),Ot={};C(Ot,{BOOTSPRING_DIR:()=>G,CONFIG_FILE:()=>Pe,CREDENTIALS_FILE:()=>D,DEVICE_FILE:()=>Q,clearCredentials:()=>Xe,clearDeviceInfo:()=>Bn,clearProjectApiKey:()=>$t,clearProjectScopedSession:()=>yr,decrypt:()=>Ct,encrypt:()=>gr,ensureBootspringDir:()=>ve,findNearestProjectConfigPath:()=>Ze,generateDeviceFingerprint:()=>Ge,getApiKey:()=>Qe,getConfig:()=>zn,getCredentials:()=>J,getCredentialsPath:()=>Fn,getDeviceContext:()=>$e,getDeviceId:()=>Nt,getDeviceInfo:()=>Rt,getLegacyProjectApiKey:()=>ge,getProjectScopedSessionState:()=>mr,getProjectScopedToken:()=>It,getRefreshToken:()=>je,getStoredApiKey:()=>jt,getTier:()=>Dn,getToken:()=>ye,getTokenExpiryStatus:()=>Rn,getUser:()=>hr,isApiKeyAuth:()=>Nn,isAuthenticated:()=>Se,login:()=>et,loginWithApiKey:()=>qn,logout:()=>Sr,readNearestProjectConfig:()=>ne,saveApiKeyToProject:()=>Ln,saveConfig:()=>Gn,saveCredentials:()=>K,saveProjectScopedSession:()=>vr,updateTokens:()=>Mn,writeNearestProjectConfig:()=>Ie});function No(){try{if(T.default.existsSync(gt))return Buffer.from(T.default.readFileSync(gt,"utf-8").trim(),"hex")}catch(t){Re("salt file read failed, regenerating",t)}ve();let e=H.default.randomBytes(32);return T.default.writeFileSync(gt,e.toString("hex"),{mode:384}),e}function ur(){let e=No(),t=Ge();return H.default.scryptSync(t,e,32)}function Do(){let e=O.default.hostname()+O.default.userInfo().username;return H.default.createHash("sha256").update(e).digest()}function ve(){T.default.existsSync(G)||T.default.mkdirSync(G,{recursive:!0,mode:448})}function gr(e){let t=ur(),r=H.default.randomBytes(16),n=H.default.createCipheriv("aes-256-cbc",t,r),s=n.update(JSON.stringify(e),"utf8","hex");return s+=n.final("hex"),{iv:r.toString("hex"),data:s,v:2}}function ir(e,t){let r=Buffer.from(e.iv,"hex"),n=H.default.createDecipheriv("aes-256-cbc",t,r),s=n.update(e.data,"hex","utf8");return s+=n.final("utf8"),JSON.parse(s)}function Ct(e){if(!e||typeof e!="object")throw new Error("Invalid credential format");let t=e;if(!t.iv||!t.data){if(t.token||t.apiKey)return console.error("[bootspring] Migrating legacy unencrypted credentials to encrypted storage"),e;throw new Error("Invalid credential format")}let r=e;if(r.v===2)return ir(r,ur());try{return ir(r,ur())}catch{return ir(r,Do())}}function J(){if(de)return de.value;try{if(T.default.existsSync(D)){let e=JSON.parse(T.default.readFileSync(D,"utf-8")),t=Ct(e);return(e&&typeof e=="object"&&!e.iv&&!e.data||e&&typeof e=="object"&&e.iv&&e.v!==2)&&K(t),de={resolved:!0,value:t},t}}catch{br=!0;try{T.default.unlinkSync(D)}catch(e){Re("failed to delete corrupt credentials file",e)}}return de={resolved:!0,value:null},null}function K(e){ve();let t=gr({...e});T.default.writeFileSync(D,JSON.stringify(t,null,2),{mode:384}),de=null}function Xe(){try{T.default.existsSync(D)&&T.default.unlinkSync(D)}catch{}de=null,br=!1}function ye(){let e=J();return!e||e.expiresAt&&new Date(e.expiresAt)<new Date?null:e.token??null}function Rn(e=300*1e3){let t=J();if(!t||!t.expiresAt)return{expiringSoon:!1,expired:!1,expiresAt:null,msUntilExpiry:0};let r=new Date(t.expiresAt).getTime(),n=Date.now(),s=r-n;return{expiringSoon:s>0&&s<=e,expired:s<=0,expiresAt:t.expiresAt,msUntilExpiry:Math.max(0,s)}}function Ze(){let e=process.cwd();for(let t=0;t<10;t++){let r=V.default.join(e,".bootspring.json");if(T.default.existsSync(r))return r;let n=V.default.dirname(e);if(n===e)break;e=n}return null}function ne(){try{let e=Ze();if(!e)return null;let t=JSON.parse(T.default.readFileSync(e,"utf-8"));return{path:e,config:t}}catch{return null}}function Ie(e,t){try{return T.default.writeFileSync(e,JSON.stringify(t,null,2)),!0}catch{return!1}}function mr(){let e=ne();if(!e||!e.config.projectAuth)return null;let t=e.config.projectAuth;return typeof t.token!="string"||t.token.length===0||typeof t.expiresAt!="string"||t.expiresAt.length===0?null:{token:t.token,expiresAt:t.expiresAt,issuedAt:typeof t.issuedAt=="string"?t.issuedAt:new Date().toISOString(),source:typeof t.source=="string"?t.source:"unknown",migratedFromLegacyApiKey:!!t.migratedFromLegacyApiKey}}function ge(){let e=ne();if(!e)return null;let t=e.config.apiKey;return typeof t=="string"&&t.length>0?t:null}function It(){let e=mr();if(!e)return null;let t=new Date(e.expiresAt).getTime();return!Number.isFinite(t)||Date.now()>=t-6e4?null:e.token}function jt(){let e=J();return typeof e?.apiKey=="string"&&e.apiKey.length>0?e.apiKey:null}function Qe(){let e=process.env.BOOTSPRING_API_KEY;if(e)return e;if(ye())return null;let t=It();if(t)return t;let r=jt();if(r)return r;let n=ge();return n||null}function Nn(){return process.env.BOOTSPRING_API_KEY?!0:ye()?!1:!!(It()||jt()||ge())}function je(){return J()?.refreshToken||null}function Se(){return!!(ye()||Qe()||je())}function hr(){return J()?.user||null}function Dn(){let e=process.env.BOOTSPRING_USER_TIER;return e?e.toLowerCase():hr()?.tier||"free"}function _r(e){let t=e.match(/^(\d+)([mhd])$/);if(!t)return 900*1e3;let r=parseInt(t[1]);switch(t[2]){case"m":return r*60*1e3;case"h":return r*60*60*1e3;case"d":return r*24*60*60*1e3;default:return 900*1e3}}function et(e){let t=e.expiresIn||"15m",r=_r(t),n=new Date(Date.now()+r).toISOString();K({token:e.token,refreshToken:e.refreshToken,expiresAt:n,user:e.user}),e.token&&vr(e.token,{expiresAt:n,source:"device-flow"})}function Ln(e){try{let t=ne();if(!t)return!1;let r={...t.config};return r.apiKey=e,Ie(t.path,r)}catch{return!1}}function $t(){try{let e=ne();if(!e)return!1;let t={...e.config};return Object.prototype.hasOwnProperty.call(t,"apiKey")?(delete t.apiKey,Ie(e.path,t)):!1}catch{return!1}}function qn(e,t){K({apiKey:e,user:t}),$t()}function Mn(e){let t=J()||{},r=e.expiresIn||"15m",n=_r(r),s=new Date(Date.now()+n).toISOString();K({...t,token:e.token,refreshToken:e.refreshToken,expiresAt:s})}function vr(e,t={}){try{let r=ne();if(!r||!e)return!1;let n=t.expiresAt?t.expiresAt:typeof t.expiresIn=="number"&&Number.isFinite(t.expiresIn)?new Date(Date.now()+t.expiresIn*1e3).toISOString():typeof t.expiresIn=="string"?new Date(Date.now()+_r(t.expiresIn)).toISOString():new Date(Date.now()+900*1e3).toISOString(),s={...r.config,projectAuth:{token:e,expiresAt:n,issuedAt:new Date().toISOString(),source:t.source||"api-key-exchange",migratedFromLegacyApiKey:!!t.migratedFromLegacyApiKey}};return t.migratedFromLegacyApiKey&&Object.prototype.hasOwnProperty.call(s,"apiKey")&&delete s.apiKey,Ie(r.path,s)}catch{return!1}}function yr(){try{let e=ne();if(!e||!e.config.projectAuth)return!1;let t={...e.config};return delete t.projectAuth,Ie(e.path,t)}catch{return!1}}function Sr(){Xe(),yr(),$t()}function zn(){try{if(T.default.existsSync(Pe))return JSON.parse(T.default.readFileSync(Pe,"utf-8"))}catch(e){Re("failed to read config file",e)}return{}}function Gn(e){ve(),T.default.writeFileSync(Pe,JSON.stringify(e,null,2))}function Fn(){return D}function Ge(){let e=[O.default.hostname(),O.default.userInfo().username,O.default.platform(),O.default.arch(),O.default.cpus()[0]?.model||"unknown-cpu",O.default.homedir(),Object.values(O.default.networkInterfaces()).flat().filter(t=>!!t&&!t.internal&&t.mac!=="00:00:00:00:00:00").map(t=>t.mac).sort().join(",")];return H.default.createHash("sha256").update(e.join("|")).digest("hex")}function Rt(){ve();try{if(T.default.existsSync(Q)){let t=JSON.parse(T.default.readFileSync(Q,"utf-8"));if(t.fingerprint===Ge())return t}}catch(t){Re("failed to read device file, regenerating",t)}let e={deviceId:H.default.randomUUID(),fingerprint:Ge(),createdAt:new Date().toISOString(),platform:O.default.platform(),arch:O.default.arch(),hostname:O.default.hostname()};return T.default.writeFileSync(Q,JSON.stringify(e,null,2),{mode:384}),e}function Nt(){return Rt().deviceId}function $e(e="0.0.0"){let t=Rt(),r=process.cwd();return{deviceId:t.deviceId,platform:t.platform,arch:t.arch,hostname:t.hostname,cliVersion:e,nodeVersion:process.version,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,cwd:V.default.basename(r),cwdFull:r}}function Bn(){try{T.default.existsSync(Q)&&T.default.unlinkSync(Q)}catch(e){Re("failed to delete device file",e)}}var T,V,O,H,Re,G,D,Pe,Q,gt,de,br,se=xt({"src/auth.ts"(){"use strict";A(),T=y(require("fs")),V=y(require("path")),O=y(require("os")),H=y(require("crypto")),Re=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:auth]",...e):()=>{},G=V.default.join(O.default.homedir(),".bootspring"),D=V.default.join(G,"credentials.json"),Pe=V.default.join(G,"config.json"),Q=V.default.join(G,"device.json"),gt=V.default.join(G,".encryption-salt"),de=null,br=!1}}),Tr={};C(Tr,{LOCAL_CONFIG_NAME:()=>Ae,SESSION_FILE:()=>ee,addRecentProject:()=>Wn,clearSession:()=>Un,createLocalConfig:()=>Jn,findLocalConfig:()=>Lt,getCurrentProject:()=>Vn,getEffectiveProject:()=>Ne,getRecentProjects:()=>Hn,getSession:()=>ie,getSessionState:()=>Yn,saveSession:()=>Dt,setCurrentProject:()=>Kn});function ie(){try{if(L.default.existsSync(ee))return JSON.parse(L.default.readFileSync(ee,"utf-8"))}catch(e){qt("failed to read session file",e)}return null}function Dt(e){ve();let t={...e,updatedAt:new Date().toISOString()};L.default.writeFileSync(ee,JSON.stringify(t,null,2))}function Un(){try{L.default.existsSync(ee)&&L.default.unlinkSync(ee)}catch(e){qt("failed to delete session file",e)}}function Vn(){return ie()?.project||null}function Lo(e){return Xn.some(t=>L.default.existsSync(B.default.join(e,t)))}function St(e){let t=B.default.resolve(e);try{return L.default.realpathSync.native(t)}catch{try{return L.default.realpathSync(t)}catch{return t}}}function qo(e){let t=St(e);for(let r=0;r<10;r++){if(Lo(t))return t;let n=B.default.dirname(t);if(n===t)break;t=n}return null}function Mo(e){let t=St(e),r=qo(t);return r?{dir:r,mode:"tree"}:{dir:t,mode:"exact"}}function Kn(e,t){let r=ie()||{};if(e){let n=Mo(t||process.cwd());r.project=e,r.projectScopeDir=n.dir,r.projectScopeMode=n.mode}else delete r.project,delete r.projectScopeDir,delete r.projectScopeMode;Dt(r)}function Hn(){return ie()?.recentProjects||[]}function Wn(e){let t=ie()||{},n=(t.recentProjects||[]).filter(s=>s.id!==e.id);n.unshift({id:e.id,name:e.name,slug:e.slug,lastUsed:new Date().toISOString()}),t.recentProjects=n.slice(0,10),Dt(t)}function Lt(e){let t=e||process.cwd();for(let r=0;r<10;r++){let n=B.default.join(t,Ae);if(L.default.existsSync(n))try{return{...JSON.parse(L.default.readFileSync(n,"utf-8")),_path:n,_dir:t}}catch(i){qt("failed to parse local config at",n,i)}let s=B.default.dirname(t);if(s===t)break;t=s}return null}function Ne(e){let t=Lt(e);if(t?.projectId)return{id:String(t.projectId),name:String(t.projectName||"Unknown"),slug:t.projectSlug!=null?String(t.projectSlug):void 0,source:"local"};let r=ie(),n=r?.project;if(!n||!r?.projectScopeDir)return null;let s=St(r.projectScopeDir),i=St(e||process.cwd());return(()=>{if(r.projectScopeMode==="exact")return i===s;let c=B.default.relative(s,i);return c===""||!c.startsWith("..")&&!B.default.isAbsolute(c)})()?{...n,source:"session"}:null}function Jn(e,t){let r=B.default.join(e,Ae),n={projectId:t.id,projectName:t.name,projectSlug:t.slug,createdAt:new Date().toISOString()};return L.default.writeFileSync(r,JSON.stringify(n,null,2)),r}function Yn(){let e=ie(),t=Ne(),r=Lt();return{hasSession:!!e,project:t,source:t?.source||null,hasLocalConfig:!!r,localConfigPath:r?._path,recentProjects:e?.recentProjects||[],lastUpdated:e?.updatedAt||null}}var L,B,qt,ee,Ae,Xn,Mt=xt({"src/session.ts"(){"use strict";A(),L=y(require("fs")),B=y(require("path")),se(),qt=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:session]",...e):()=>{},ee=B.default.join(G,"session.json"),Ae=".bootspring.json",Xn=[Ae,"bootspring.config.js",".git"]}}),Er={};C(Er,{ASSISTANTS:()=>rs,ASSISTANT_FIRST_SUCCESS_EVENT:()=>Ue,ASSISTANT_RETURN_EVENT:()=>Ve,ASSISTANT_SETUP_EVENT:()=>zt,BILLING_UPGRADE_STARTED_EVENT:()=>Tt,MAX_EVENTS_LIMIT:()=>bt,UPGRADE_COMPLETED_EVENT:()=>Pr,UPGRADE_PROMPT_EVENT:()=>Et,clearEvents:()=>es,emitEvent:()=>Fe,ensureTelemetryDir:()=>Qn,getAssistantActivationFunnel:()=>Jo,getStatus:()=>Wo,getTelemetryDir:()=>wr,getTelemetryFile:()=>tt,getUpgradeConversionFunnel:()=>Xo,inferAssistantFromEnvironment:()=>zo,listEvents:()=>te,track:()=>is,trackAssistantSetup:()=>Vo,trackAssistantUsageSuccess:()=>Ko,uploadEvents:()=>ta});function De(e){let t=String(e||"").trim().toLowerCase();if(!t)return null;let r=t.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return r==="claude"||r==="claude-code"?"claude":r==="codex"||r==="openai-codex"?"codex":r==="gemini"||r==="gemini-cli"?"gemini":null}function zo(e=process.env){let t=De(e.BOOTSPRING_ASSISTANT);return t||(e.CLAUDE_CODE||e.CLAUDECODE?"claude":e.CODEX_SANDBOX||e.CODEX_ENV||e.OPENAI_CODEX?"codex":e.GEMINI_CLI||e.GOOGLE_GEMINI_CLI?"gemini":null)}function Zn(e,t="unknown"){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Go(e){let t=Zn(e,"updated");return ns.has(t)?t:"other"}function Tn(e){let t=Zn(e,"unknown");return ss.has(t)?t:"other"}function wr(e=process.cwd()){return kr.join(e,".bootspring","telemetry")}function tt(e=process.cwd()){return kr.join(wr(e),"events.jsonl")}function Qn(e=process.cwd()){let t=wr(e);return re.mkdirSync(t,{recursive:!0}),t}function Fe(e,t={},r={}){let n=r.projectRoot||process.cwd();Qn(n);let s=tt(n),a={timestamp:(r.now?new Date(r.now):new Date).toISOString(),event:String(e||"").trim(),payload:(0,Be.redactSensitiveData)(t||{})};return re.appendFileSync(s,`${JSON.stringify(a)}
27
+ `,"utf-8"),a}function Fo(e,t={}){return te({projectRoot:t.projectRoot}).filter(r=>De(r?.payload?.assistant)===e)}function Bo(e){return e>=7?"d7_plus":e>=2?"d2_6":e>=1?"d1":"d0"}function Uo(e){let r=String(e?.payload?.occurredAt||"").trim()||String(e?.timestamp||"").trim(),n=new Date(r).getTime();return Number.isFinite(n)?n:null}function pe(e){let t=String(e?.payload?.occurredAt||"").trim();return t||String(e?.timestamp||"").trim()||null}function Vo(e,t={},r={}){let n=De(e);return n?Fe(zt,{assistant:n,status:Go(t.status)},r):null}function Ko(e,t={},r={}){let n=De(e);if(!n)return{assistant:null,firstSuccessTracked:!1,returnTracked:!1,daysSinceFirst:null};let s=r.projectRoot||process.cwd(),i=r.now?new Date(r.now):new Date,a=Fo(n,{projectRoot:s}),c=a.find(g=>g.event===Ue);if(!c)return Fe(Ue,{assistant:n,source:Tn(t.source||"mcp")},{projectRoot:s,now:i}),{assistant:n,firstSuccessTracked:!0,returnTracked:!1,daysSinceFirst:0};let l=Uo(c),u=l!==null?Math.floor((i.getTime()-l)/(1440*60*1e3)):0;if(u>=1){let g=Bo(u);if(!a.some(v=>v.event!==Ve?!1:String(v?.payload?.window||"")===g))return Fe(Ve,{assistant:n,source:Tn(t.source||"mcp"),window:g},{projectRoot:s,now:i}),{assistant:n,firstSuccessTracked:!1,returnTracked:!0,daysSinceFirst:u}}return{assistant:n,firstSuccessTracked:!1,returnTracked:!1,daysSinceFirst:u}}function Ho(e){try{return JSON.parse(e)}catch{return null}}function te(e={}){let t=e.projectRoot||process.cwd(),r=tt(t);if(!re.existsSync(r))return[];let n=String(e.event||"").trim(),s=e.from?new Date(e.from).getTime():null,i=e.to?new Date(e.to).getTime():null,a=Number(e.limit),l=re.readFileSync(r,"utf-8").split(`
28
+ `).filter(Boolean).map(Ho).filter(g=>g!==null).filter(g=>{if(n&&g.event!==n)return!1;let m=new Date(g.timestamp).getTime();return!(Number.isFinite(s)&&s!==null&&m<s||Number.isFinite(i)&&i!==null&&m>i)}),u=Number.isFinite(a)&&a>0?Math.min(a,bt):bt;return l=l.slice(-u),l}function es(e={}){let t=e.projectRoot||process.cwd(),r=tt(t),n=te({projectRoot:t});return re.existsSync(r)&&re.writeFileSync(r,"","utf-8"),{cleared:n.length,file:r}}function Wo(e={}){let t=e.projectRoot||process.cwd(),r=tt(t),n=te({projectRoot:t}),s=n.length>0?n[n.length-1]:null;return{file:r,exists:re.existsSync(r),count:n.length,lastEventAt:s?.timestamp??null}}function En(e,t){let r=new Date(String(e||"")).getTime(),n=new Date(String(t||"")).getTime();return!Number.isFinite(r)||!Number.isFinite(n)?null:Math.floor((n-r)/(1440*60*1e3))}function or(e,t){let r=e.filter(u=>De(u?.payload?.assistant)===t),n=r.find(u=>u.event===zt)||null,s=r.find(u=>u.event===Ue)||null,i=r.filter(u=>u.event===Ve),a=s?i.some(u=>{let g=En(pe(s),pe(u));return g!==null&&g>=1}):!1,c=s?i.some(u=>{let g=En(pe(s),pe(u));return g!==null&&g>=7}):!1,l=i.length>0?i[i.length-1]:null;return{setup:!!n,firstSuccess:!!s,returned:i.length>0,d1:a,d7:c,setupAt:pe(n),firstSuccessAt:pe(s),lastReturnAt:pe(l)}}function Jo(e={}){let t=e.projectRoot||process.cwd(),r=De(e.assistant),n=te({projectRoot:t,from:e.from,to:e.to}),s={claude:or(n,"claude"),codex:or(n,"codex"),gemini:or(n,"gemini")},i=r?{[r]:s[r]}:s,c=Object.values(i).reduce((l,u)=>(u.setup&&(l.setup+=1),u.firstSuccess&&(l.firstSuccess+=1),u.returned&&(l.return+=1),u.d1&&(l.d1+=1),u.d7&&(l.d7+=1),l),{setup:0,firstSuccess:0,return:0,d1:0,d7:0});return{generatedAt:new Date().toISOString(),query:{assistant:r,from:e.from||null,to:e.to||null},totals:c,assistants:i}}function ar(e,t){return t?Number((e/t).toFixed(4)):0}function Me(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Yo(e={}){let t=e.feature||e.skillId||e.workflow||e.agent||"unknown";return{capability:Me(e.capability,"unknown"),featureType:Me(e.featureType,"general"),feature:Me(t,"unknown"),placement:Me(e.placement,"inline"),variant:Me(e.variant,"control")}}function Xo(e={}){let t=e.projectRoot||process.cwd(),r=te({projectRoot:t}),n={};for(let i of r){if(i.event!==Et&&i.event!==Tt&&i.event!==Pr)continue;let a=Yo(i.payload),c=`${a.capability}:${a.featureType}:${a.feature}`;n[c]||(n[c]={capability:a.capability,featureType:a.featureType,feature:a.feature,prompted:0,started:0,completed:0,converted:0,conversionRate:0,placements:{},variants:{}});let l=n[c];if(l){if(i.event===Et){l.prompted+=1,l.placements[a.placement]=(l.placements[a.placement]||0)+1,l.variants[a.variant]=(l.variants[a.variant]||0)+1;continue}if(i.event===Tt){l.started+=1;continue}l.completed+=1}}let s=Object.values(n).reduce((i,a)=>(a.converted=Math.min(a.prompted,a.completed),a.conversionRate=ar(a.converted,a.prompted),i.prompted+=a.prompted,i.started+=a.started,i.completed+=a.completed,i.converted+=a.converted,i),{prompted:0,started:0,completed:0,converted:0});return{generatedAt:new Date().toISOString(),totals:{...s,startRate:ar(s.started,s.prompted),conversionRate:ar(s.converted,s.prompted)},capabilities:n}}function Zo(e){return new Promise(t=>setTimeout(t,e))}function Qo(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}async function ea(e,t,r,n={}){let s=Number(n.maxRetries),i=Number(n.retryDelayMs),a=Number.isFinite(s)&&s>=0?s:2,c=Number.isFinite(i)&&i>0?i:300,l=0;for(;;)try{let u=await fetch(e,{method:"POST",headers:r,body:JSON.stringify(t)});if(!u.ok)throw new Error(`HTTP ${u.status}`);return{success:!0,attempts:l+1}}catch(u){if(l>=a)return{success:!1,attempts:l+1,error:(0,Be.redactErrorMessage)(u)};l+=1;let g=c*2**(l-1);await Zo(g)}}async function ta(e={}){let t=e.projectRoot||process.cwd(),n=`${process.env.BOOTSPRING_API_URL||"https://api.bootspring.com"}/api/v1/events/batch`,s=e.endpoint||process.env.BOOTSPRING_TELEMETRY_ENDPOINT||n,i=e.token||process.env.BOOTSPRING_TELEMETRY_TOKEN,a=e.event,c=Number(e.limit)||void 0,l=Number(e.batchSize||process.env.BOOTSPRING_TELEMETRY_BATCH_SIZE),u=Number.isFinite(l)&&l>0?l:100,g=e.clearOnSuccess===!0,m=te({projectRoot:t,event:a,limit:c});if(m.length===0)return{uploaded:0,remaining:0,endpoint:s};let v=e.apiKey??null,k=e.projectId??null;if(!v)try{let oe=await Promise.resolve().then(()=>(se(),Ot)),ae=await Promise.resolve().then(()=>(Mt(),Tr));v=oe.getApiKey();let lt=ae.getEffectiveProject();k=k??lt?.id??null}catch{}let b={"content-type":"application/json",accept:"application/json","user-agent":`bootspring-cli/${Be.BOOTSPRING_VERSION||"unknown"}`};v?b["x-api-key"]=v:i&&(b.authorization=`Bearer ${i}`),k&&(b["x-project-id"]=k);let N=Qo(m,u),un=0,pn=0,ct=[];for(let oe=0;oe<N.length;oe++){let ae=N[oe];if(!ae)continue;let lt=ts.createHash("sha1").update(JSON.stringify(ae)).digest("hex"),er=await ea(s,{source:"bootspring",batch:{index:oe,total:N.length,id:lt},events:ae},{...b,"x-bootspring-batch-id":lt},e);if(pn+=er.attempts??1,!er.success){ct.push({index:oe,count:ae.length,error:(0,Be.redactErrorMessage)(er.error??"upload_failed")});continue}un+=ae.length}if(ct.length>0)throw new Error(`Telemetry upload failed for ${ct.length}/${N.length} batches`);g&&es({projectRoot:t});let eo=g?0:te({projectRoot:t}).length;return{uploaded:un,attempted:m.length,batches:N.length,attempts:pn,remaining:eo,endpoint:s,failedBatches:ct}}var re,kr,ts,Be,bt,rs,zt,Ue,Ve,Tt,Et,Pr,ns,ss,is,os=xt({"src/telemetry.ts"(){"use strict";A(),re=y(require("fs")),kr=y(require("path")),ts=y(require("crypto")),Be=(we(),qe(Ee)),bt=1e4,rs=["claude","codex","gemini"],zt="assistant_setup",Ue="assistant_first_success",Ve="assistant_return",Tt="billing_upgrade_started",Et="premium_prompted",Pr="premium_unlocked",ns=new Set(["installed","updated","skipped","failed","created","unchanged"]),ss=new Set(["mcp","cli","setup","dashboard","api","unknown"]),is=Fe}}),Ar={};C(Ar,{API_BASE:()=>rt,API_VERSION:()=>Gt,BOOTSPRING_DIR:()=>G,BootspringClient:()=>vs,COMMANDS_SOURCE:()=>be,CONFIG_FILE:()=>Pe,CREDENTIALS_FILE:()=>D,CURRENT_VERSION:()=>z,DEFAULT_INTERVAL_MS:()=>Lr,DEFAULT_POLICY_PROFILE:()=>Ke,DEVICE_FILE:()=>Q,LIMITS:()=>xe,LOCAL_CONFIG_NAME:()=>Ae,PACKAGE_NAME:()=>We,PATTERNS:()=>wt,POLICY_PROFILES:()=>He,SESSION_FILE:()=>ee,SHELL_DANGEROUS_CHARS:()=>la,STATE_PATH:()=>Je,TARGET_DIRS:()=>nt,addRecentProject:()=>Wn,api:()=>xr,apiLogin:()=>ls,applyUpdate:()=>qr,auth:()=>Ot,callMcpTool:()=>ms,checkForUpdates:()=>Ds,checkInstallation:()=>zs,classifyError:()=>j,clearCredentials:()=>Xe,clearDeviceInfo:()=>Bn,clearProjectApiKey:()=>$t,clearProjectScopedSession:()=>yr,clearSession:()=>Un,compareVersions:()=>Vt,config:()=>Si,context:()=>qi,createClient:()=>aa,createLocalConfig:()=>Jn,decrypt:()=>Ct,encrypt:()=>gr,ensureBootspringDir:()=>ve,ensureLatestVersion:()=>Ls,entitlements:()=>li,findLocalConfig:()=>Lt,findNearestProjectConfigPath:()=>Ze,generateDeviceFingerprint:()=>Ge,getApiKey:()=>Qe,getCommandFiles:()=>st,getConfig:()=>zn,getCredentials:()=>J,getCredentialsPath:()=>Fn,getCurrentProject:()=>Vn,getDeviceContext:()=>$e,getDeviceId:()=>Nt,getDeviceInfo:()=>Rt,getEffectiveProject:()=>Ne,getInstallContext:()=>Kt,getLatestVersion:()=>Ht,getLegacyProjectApiKey:()=>ge,getMcpResource:()=>_s,getPolicyProfile:()=>Ut,getProjectScopedSessionState:()=>mr,getProjectScopedToken:()=>It,getRecentProjects:()=>Hn,getRefreshToken:()=>je,getSession:()=>ie,getSessionState:()=>Yn,getStoredApiKey:()=>jt,getTier:()=>Dn,getToken:()=>ye,getTokenExpiryStatus:()=>Rn,getUser:()=>hr,healthCheck:()=>cs,installAll:()=>Ms,installToTarget:()=>Mr,isApiKeyAuth:()=>Nn,isAuthenticated:()=>Se,isWorkflowBlocked:()=>Ir,listMcpResources:()=>hs,listMcpTools:()=>gs,login:()=>et,loginWithApiKey:()=>qn,logout:()=>Sr,maybeAutoUploadTelemetry:()=>js,normalizeProfile:()=>Ft,policies:()=>ys,pollDeviceToken:()=>ps,presence:()=>xs,readNearestProjectConfig:()=>ne,refreshSession:()=>ds,registerMcpForAssistant:()=>As,remoteLogout:()=>fs,request:()=>M,resolvePolicyProfile:()=>Bt,runDiagnostics:()=>Es,saveApiKeyToProject:()=>Ln,saveConfig:()=>Gn,saveCredentials:()=>K,saveProjectScopedSession:()=>vr,saveSession:()=>Dt,selfHeal:()=>bs,selfUpdate:()=>$s,sendHealthReport:()=>Cs,sendHeartbeat:()=>Os,session:()=>Tr,setAuthFailureHandler:()=>as,setCurrentProject:()=>Kn,setupCommands:()=>qs,startDeviceFlow:()=>us,stripUnsafeControlChars:()=>Ss,telemetry:()=>Er,tierEnforcement:()=>Fs,trackToolUsage:()=>Is,tryHeal:()=>Ts,uninstallAll:()=>Gs,updateTokens:()=>Mn,validateNumericId:()=>ua,validateSlug:()=>da,validateStringLength:()=>jr,validateTodoText:()=>pa,writeNearestProjectConfig:()=>Ie});nn.exports=Ro(Ar);A();$o(Ar,(we(),qe(Ee)),nn.exports);se();var xr={};C(xr,{API_BASE:()=>rt,API_VERSION:()=>Gt,apiLogin:()=>ls,callMcpTool:()=>ms,getMcpResource:()=>_s,healthCheck:()=>cs,listMcpResources:()=>hs,listMcpTools:()=>gs,pollDeviceToken:()=>ps,refreshSession:()=>ds,remoteLogout:()=>fs,request:()=>M,setAuthFailureHandler:()=>as,startDeviceFlow:()=>us});A();var Or=y(require("https")),Cr=y(require("http"));se();var mt=(we(),qe(Ee)),rt=process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",Gt="v1",pr=null;function as(e){pr=e}var wn=new Map,ra=6e4;function na(e,t){let r=String(e||"").trim();if(!r)return`API Error (${t||"unknown"})`;if(/^\s*<!doctype html/i.test(r)||/^\s*<html/i.test(r)){let n=r.match(/<title[^>]*>([^<]+)<\/title>/i),s=n&&n[1]?`: ${n[1].trim()}`:"";return`Bootspring API returned an HTML error page (HTTP ${t||"unknown"}${s})`}return(0,mt.redactSensitiveString)(r)}var ze=null;async function sa(){let e=je();return e?ze||(ze=(async()=>{try{let t=new URL(`/api/${Gt}/auth/refresh`,rt),n=t.protocol==="https:"?Or.default:Cr.default,s=JSON.stringify({refreshToken:e,device:$e()}),i=await new Promise((a,c)=>{let l=n.request(t,{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(s)},timeout:1e4},u=>{let g="";u.on("data",m=>g+=m),u.on("end",()=>{try{let m=JSON.parse(g);if((u.statusCode||500)>=400){c(new Error(m.error||"refresh failed"));return}a(m)}catch(m){c(m)}})});l.on("error",c),l.on("timeout",()=>l.destroy(new Error("refresh timeout"))),l.write(s),l.end()});return et(i),i.token||null}catch{return null}finally{ze=null}})(),ze):null}async function ia(){let e=ye();if(!e){let r=J();r?.refreshToken&&r?.expiresAt&&(e=await sa())}if(e)return{Authorization:`Bearer ${e}`};let t=Qe();return t?t.startsWith("eyJ")?{Authorization:`Bearer ${t}`}:{"X-API-Key":t}:{}}function oa(e,t){if(!t||typeof t!="object")return e;for(let[r,n]of Object.entries(t))if(n!=null){if(Array.isArray(n)){n.forEach(s=>e.searchParams.append(r,String(s)));continue}e.searchParams.set(r,String(n))}return e}async function kn(e,t,r,n){let s=await ia(),i=oa(new URL(`/api/${Gt}${t}`,rt),e==="GET"?r:null),c=i.protocol==="https:"?Or.default:Cr.default,l={"Content-Type":"application/json","User-Agent":"bootspring-core","X-Device-Id":Nt(),...s,...n.headers};if(e==="GET"&&!n.noCache){let u=`${e}:${i.pathname}${i.search}`,g=wn.get(u);if(g&&Date.now()-g.time<ra)return g.data}return new Promise((u,g)=>{let m=c.request(i,{method:e,headers:l,timeout:n.timeout||3e4},v=>{let k="";v.on("data",h=>k+=h),v.on("end",()=>{try{let h=JSON.parse(k);if(v.statusCode>=400){let b=h,N=Object.assign(new Error((0,mt.redactSensitiveString)(String(b.message||b.error||"API Error"))),{status:v.statusCode,code:String(b.error||b.code||""),details:(0,mt.redactSensitiveData)(b.details)});g(N)}else e==="GET"&&!n.noCache&&wn.set(`${e}:${i.pathname}${i.search}`,{data:h,time:Date.now()}),u(h)}catch{if(v.statusCode>=400){let h=Object.assign(new Error(na(k,v.statusCode)),{status:v.statusCode});g(h)}else u(k)}})});m.on("error",v=>{let k=Object.assign(new Error(v.code==="ECONNREFUSED"?"Cannot connect to Bootspring API.":v.code==="ENOTFOUND"?"Cannot resolve api.bootspring.com \u2014 check your internet connection.":v.code==="ETIMEDOUT"?"API request timed out.":v.code==="EHOSTUNREACH"?"API host unreachable \u2014 check your network.":(0,mt.redactSensitiveString)(v.message||String(v))),{code:v.code});g(k)}),r&&e!=="GET"&&m.write(JSON.stringify(r)),m.end()})}async function M(e,t,r=null,n={}){try{return await kn(e,t,r,n)}catch(s){let i=s;if(i.status===401&&pr&&!n._authRetried){if(await pr())return kn(e,t,r,{...n,_authRetried:!0,noCache:!0});i.authHandled=!0}throw s}}async function cs(){try{let e=new URL("/health",rt);return new Promise(t=>{(e.protocol==="https:"?Or.default:Cr.default).get(e,n=>{let s="";n.on("data",i=>s+=i),n.on("end",()=>{try{t({connected:!0,...JSON.parse(s)})}catch{t({connected:!1})}})}).on("error",()=>t({connected:!1}))})}catch{return{connected:!1}}}async function ls(e,t){let r=await M("POST","/auth/login",{email:e,password:t,device:$e()});return et(r),r}async function us(){return M("POST","/auth/device",{device:$e()},{noCache:!0})}async function ps(e){return M("POST","/auth/device/token",{device_code:e},{noCache:!0})}async function ds(){let e=je();if(!e)throw Object.assign(new Error("No refresh token available"),{code:"NO_REFRESH_TOKEN"});let t=await M("POST","/auth/refresh",{refreshToken:e,device:$e()},{noCache:!0});return et(t),t}async function fs(){let e=je();try{return await M("POST","/auth/logout",{refreshToken:e},{noCache:!0})}finally{Sr()}}async function gs(){return M("GET","/mcp/tools")}async function ms(e,t){return M("POST","/mcp/tool",{tool:e,arguments:t})}async function hs(){return M("GET","/mcp/resources")}async function _s(e){return M("GET",`/mcp/resources/${encodeURIComponent(e)}`)}A();var vs=class{config;constructor(e){this.config=e}async request(e){let t=new URL(e.path,this.config.baseUrl);if(e.query)for(let[s,i]of Object.entries(e.query))t.searchParams.set(s,i);let r={"Content-Type":"application/json"};this.config.token&&(r.Authorization=`Bearer ${this.config.token}`),this.config.apiKey&&(r["X-API-Key"]=this.config.apiKey);let n=await fetch(t.toString(),{method:e.method,headers:r,body:e.body?JSON.stringify(e.body):void 0,signal:AbortSignal.timeout(this.config.timeout??3e4)});if(!n.ok){let s=await n.json().catch(()=>({message:n.statusText}));throw new Error(s.message||`HTTP ${n.status}`)}return n.json()}async post__api_v1_auth_register(e){return this.request({method:"POST",path:"/api/v1/auth/register",body:e})}async post__api_v1_auth_login(e){return this.request({method:"POST",path:"/api/v1/auth/login",body:e})}async post__api_v1_auth_refresh(e){return this.request({method:"POST",path:"/api/v1/auth/refresh",body:e})}async get__api_v1_auth_me(){return this.request({method:"GET",path:"/api/v1/auth/me"})}async patch__api_v1_auth_me(e){return this.request({method:"PATCH",path:"/api/v1/auth/me",body:e})}async delete__api_v1_auth_me(){return this.request({method:"DELETE",path:"/api/v1/auth/me"})}async post__api_v1_auth_logout(e){return this.request({method:"POST",path:"/api/v1/auth/logout",body:e})}async post__api_v1_auth_logoutall(e){return this.request({method:"POST",path:"/api/v1/auth/logout-all",body:e})}async get__api_v1_auth_devices(){return this.request({method:"GET",path:"/api/v1/auth/devices"})}async delete__api_v1_auth_devices_deviceId(e){return this.request({method:"DELETE",path:`/api/v1/auth/devices/${e}`})}async post__api_v1_auth_device(e){return this.request({method:"POST",path:"/api/v1/auth/device",body:e})}async post__api_v1_auth_device_authorize(e){return this.request({method:"POST",path:"/api/v1/auth/device/authorize",body:e})}async post__api_v1_auth_device_token(e){return this.request({method:"POST",path:"/api/v1/auth/device/token",body:e})}async get__api_v1_auth_device_status_userCode(e){return this.request({method:"GET",path:`/api/v1/auth/device/status/${e}`})}async post__api_v1_auth_password_resetrequest(e){return this.request({method:"POST",path:"/api/v1/auth/password/reset-request",body:e})}async post__api_v1_auth_password_reset(e){return this.request({method:"POST",path:"/api/v1/auth/password/reset",body:e})}async post__api_v1_auth_email_verify(e){return this.request({method:"POST",path:"/api/v1/auth/email/verify",body:e})}async post__api_v1_auth_email_resend(e){return this.request({method:"POST",path:"/api/v1/auth/email/resend",body:e})}async get__api_v1_auth_oauth_provider(e){return this.request({method:"GET",path:`/api/v1/auth/oauth/${e}`})}async get__api_v1_auth_sso_orgId(e){return this.request({method:"GET",path:`/api/v1/auth/sso/${e}`})}async put__api_v1_auth_sso_orgId_config(e,t){return this.request({method:"PUT",path:`/api/v1/auth/sso/${e}/config`,body:t})}async get__api_v1_auth_oidc_orgId(e){return this.request({method:"GET",path:`/api/v1/auth/oidc/${e}`})}async put__api_v1_auth_oidc_orgId_config(e,t){return this.request({method:"PUT",path:`/api/v1/auth/oidc/${e}/config`,body:t})}async get__api_v1_agents(){return this.request({method:"GET",path:"/api/v1/agents"})}async get__api_v1_agents_search(){return this.request({method:"GET",path:"/api/v1/agents/search"})}async get__api_v1_agents_id(e){return this.request({method:"GET",path:`/api/v1/agents/${e}`})}async post__api_v1_agents_id_invoke(e,t){return this.request({method:"POST",path:`/api/v1/agents/${e}/invoke`,body:t})}async post__api_v1_agents_run(e){return this.request({method:"POST",path:"/api/v1/agents/run",body:e})}async get__api_v1_skills(){return this.request({method:"GET",path:"/api/v1/skills"})}async post__api_v1_skills_run(e){return this.request({method:"POST",path:"/api/v1/skills/run",body:e})}async post__api_v1_build(e){return this.request({method:"POST",path:"/api/v1/build",body:e})}async get__api_v1_build_slots(){return this.request({method:"GET",path:"/api/v1/build/slots"})}async get__api_v1_build_tasks(){return this.request({method:"GET",path:"/api/v1/build/tasks"})}async get__api_v1_build_tasks_taskId(e){return this.request({method:"GET",path:`/api/v1/build/tasks/${e}`})}async get__api_v1_build_progress(){return this.request({method:"GET",path:"/api/v1/build/progress"})}async get__api_v1_quality_gates(){return this.request({method:"GET",path:"/api/v1/quality/gates"})}async get__api_v1_quality_gates_id(e){return this.request({method:"GET",path:`/api/v1/quality/gates/${e}`})}async post__api_v1_quality_run(e){return this.request({method:"POST",path:"/api/v1/quality/run",body:e})}async post__api_v1_quality_check(e){return this.request({method:"POST",path:"/api/v1/quality/check",body:e})}async post__api_v1_quality_analyze(e){return this.request({method:"POST",path:"/api/v1/quality/analyze",body:e})}async get__api_v1_quality_history(){return this.request({method:"GET",path:"/api/v1/quality/history"})}async get__api_v1_quality_budgets(){return this.request({method:"GET",path:"/api/v1/quality/budgets"})}async get__api_v1_projects(){return this.request({method:"GET",path:"/api/v1/projects"})}async post__api_v1_projects(e){return this.request({method:"POST",path:"/api/v1/projects",body:e})}async get__api_v1_projects_activity(){return this.request({method:"GET",path:"/api/v1/projects/activity"})}async get__api_v1_projects_id_members(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/members`})}async patch__api_v1_projects_id_members(e,t){return this.request({method:"PATCH",path:`/api/v1/projects/${e}/members`,body:t})}async delete__api_v1_projects_id_members(e){return this.request({method:"DELETE",path:`/api/v1/projects/${e}/members`})}async post__api_v1_projects_id_invite(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/invite`,body:t})}async get__api_v1_projects_id_invitations(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/invitations`})}async post__api_v1_projects_id_invitations(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/invitations`,body:t})}async post__api_v1_projects_id_transfer(e,t){return this.request({method:"POST",path:`/api/v1/projects/${e}/transfer`,body:t})}async get__api_v1_projects_id_activity(e){return this.request({method:"GET",path:`/api/v1/projects/${e}/activity`})}async get__api_v1_invitations(){return this.request({method:"GET",path:"/api/v1/invitations"})}async post__api_v1_invitations_invitationId_accept(e,t){return this.request({method:"POST",path:`/api/v1/invitations/${e}/accept`,body:t})}async post__api_v1_invitations_invitationId_decline(e,t){return this.request({method:"POST",path:`/api/v1/invitations/${e}/decline`,body:t})}async get__api_v1_organizations(){return this.request({method:"GET",path:"/api/v1/organizations"})}async post__api_v1_organizations(e){return this.request({method:"POST",path:"/api/v1/organizations",body:e})}async get__api_v1_billing_status(){return this.request({method:"GET",path:"/api/v1/billing/status"})}async get__api_v1_billing_subscription(){return this.request({method:"GET",path:"/api/v1/billing/subscription"})}async post__api_v1_billing_checkout(e){return this.request({method:"POST",path:"/api/v1/billing/checkout",body:e})}async post__api_v1_billing_portal(e){return this.request({method:"POST",path:"/api/v1/billing/portal",body:e})}async get__api_v1_billing_usage(){return this.request({method:"GET",path:"/api/v1/billing/usage"})}async get__api_v1_billing_invoices(){return this.request({method:"GET",path:"/api/v1/billing/invoices"})}async get__api_v1_workflows(){return this.request({method:"GET",path:"/api/v1/workflows"})}async post__api_v1_workflows_run(e){return this.request({method:"POST",path:"/api/v1/workflows/run",body:e})}async get__api_v1_workflows_runs(){return this.request({method:"GET",path:"/api/v1/workflows/runs"})}async get__api_v1_workflows_runs_id(e){return this.request({method:"GET",path:`/api/v1/workflows/runs/${e}`})}async post__api_v1_workflows_runs_id_replay(e,t){return this.request({method:"POST",path:`/api/v1/workflows/runs/${e}/replay`,body:t})}async post__api_v1_pipeline_run(e){return this.request({method:"POST",path:"/api/v1/pipeline/run",body:e})}async get__api_v1_swarm_status(){return this.request({method:"GET",path:"/api/v1/swarm/status"})}async get__api_v1_swarm_agents(){return this.request({method:"GET",path:"/api/v1/swarm/agents"})}async post__api_v1_swarm_agents(e){return this.request({method:"POST",path:"/api/v1/swarm/agents",body:e})}async delete__api_v1_swarm_agents_agentId(e){return this.request({method:"DELETE",path:`/api/v1/swarm/agents/${e}`})}async post__api_v1_swarm_tasks(e){return this.request({method:"POST",path:"/api/v1/swarm/tasks",body:e})}async post__api_v1_swarm_tasks_batch(e){return this.request({method:"POST",path:"/api/v1/swarm/tasks/batch",body:e})}async post__api_v1_swarm_consensus(e){return this.request({method:"POST",path:"/api/v1/swarm/consensus",body:e})}async post__api_v1_swarm_topology(e){return this.request({method:"POST",path:"/api/v1/swarm/topology",body:e})}async post__api_v1_swarm_configure(e){return this.request({method:"POST",path:"/api/v1/swarm/configure",body:e})}async get__api_v1_swarm_memory(){return this.request({method:"GET",path:"/api/v1/swarm/memory"})}async post__api_v1_swarm_memory(e){return this.request({method:"POST",path:"/api/v1/swarm/memory",body:e})}async post__api_v1_swarm_memory_search(e){return this.request({method:"POST",path:"/api/v1/swarm/memory/search",body:e})}async post__api_v1_swarm_plan(e){return this.request({method:"POST",path:"/api/v1/swarm/plan",body:e})}async get__api_v1_knowledgegraph_stats(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/stats"})}async get__api_v1_knowledgegraph_search(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/search"})}async post__api_v1_knowledgegraph_entity(e){return this.request({method:"POST",path:"/api/v1/knowledge-graph/entity",body:e})}async get__api_v1_knowledgegraph_path(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/path"})}async get__api_v1_knowledgegraph_export(){return this.request({method:"GET",path:"/api/v1/knowledge-graph/export"})}async get__api_v1_session(){return this.request({method:"GET",path:"/api/v1/session"})}async get__api_v1_session_stats(){return this.request({method:"GET",path:"/api/v1/session/stats"})}async get__api_v1_session_stats_session(){return this.request({method:"GET",path:"/api/v1/session/stats/session"})}async get__api_v1_session_stats_sessions(){return this.request({method:"GET",path:"/api/v1/session/stats/sessions"})}async get__api_v1_session_stats_costs(){return this.request({method:"GET",path:"/api/v1/session/stats/costs"})}async get__api_v1_session_stats_summary(){return this.request({method:"GET",path:"/api/v1/session/stats/summary"})}async post__api_v1_session_stats_sync(e){return this.request({method:"POST",path:"/api/v1/session/stats/sync",body:e})}async get__api_v1_session_stats_intelligence_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/intelligence/${e}`})}async get__api_v1_session_stats_efficiency_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/efficiency/${e}`})}async get__api_v1_session_stats_patterns_id(e){return this.request({method:"GET",path:`/api/v1/session/stats/patterns/${e}`})}async get__api_v1_session_stats_trends(){return this.request({method:"GET",path:"/api/v1/session/stats/trends"})}async get__api_v1_session_stats_optimize(){return this.request({method:"GET",path:"/api/v1/session/stats/optimize"})}async get__api_v1_session_stats_export(){return this.request({method:"GET",path:"/api/v1/session/stats/export"})}async get__api_v1_session_suggest(){return this.request({method:"GET",path:"/api/v1/session/suggest"})}async get__api_v1_session_suggest_status(){return this.request({method:"GET",path:"/api/v1/session/suggest/status"})}async get__api_v1_session_suggest_config(){return this.request({method:"GET",path:"/api/v1/session/suggest/config"})}async post__api_v1_session_suggest_config(e){return this.request({method:"POST",path:"/api/v1/session/suggest/config",body:e})}async get__api_v1_metrics_kpis(){return this.request({method:"GET",path:"/api/v1/metrics/kpis"})}async get__api_v1_metrics_events(){return this.request({method:"GET",path:"/api/v1/metrics/events"})}async post__api_v1_metrics_events(e){return this.request({method:"POST",path:"/api/v1/metrics/events",body:e})}async post__api_v1_seed(e){return this.request({method:"POST",path:"/api/v1/seed",body:e})}async get__api_v1_system_health(){return this.request({method:"GET",path:"/api/v1/system/health"})}async get__api_v1_system_version(){return this.request({method:"GET",path:"/api/v1/system/version"})}async get__api_v1_system_endpoints(){return this.request({method:"GET",path:"/api/v1/system/endpoints"})}async get__api_v1_system_openapijson(){return this.request({method:"GET",path:"/api/v1/system/openapi.json"})}async get__api_v1_system_docs(){return this.request({method:"GET",path:"/api/v1/system/docs"})}async get__api_v1_system_uptime(){return this.request({method:"GET",path:"/api/v1/system/uptime"})}async get__api_v1_system_sla(){return this.request({method:"GET",path:"/api/v1/system/sla"})}async get__api_v1_system_ws_stats(){return this.request({method:"GET",path:"/api/v1/system/ws/stats"})}async get__api_v1_system_ws_health(){return this.request({method:"GET",path:"/api/v1/system/ws/health"})}async post__api_v1_integrations_linear_fullsync(e){return this.request({method:"POST",path:"/api/v1/integrations/linear/full-sync",body:e})}async post__api_v1_integrations_jira_fullsync(e){return this.request({method:"POST",path:"/api/v1/integrations/jira/full-sync",body:e})}async get__api_v1_gdpr_export(){return this.request({method:"GET",path:"/api/v1/gdpr/export"})}async delete__api_v1_gdpr_delete(){return this.request({method:"DELETE",path:"/api/v1/gdpr/delete"})}async get__api_v1_geo_skills(){return this.request({method:"GET",path:"/api/v1/geo/skills"})}async post__api_v1_geo_run(e){return this.request({method:"POST",path:"/api/v1/geo/run",body:e})}async post__api_v1_geo_audit(e){return this.request({method:"POST",path:"/api/v1/geo/audit",body:e})}async get__api_v1_marketing_skills(){return this.request({method:"GET",path:"/api/v1/marketing/skills"})}async post__api_v1_marketing_run(e){return this.request({method:"POST",path:"/api/v1/marketing/run",body:e})}async get__api_v1_harness_status(){return this.request({method:"GET",path:"/api/v1/harness/status"})}async get__api_v1_harness_health(){return this.request({method:"GET",path:"/api/v1/harness/health"})}async get__api_v1_harness_audit(){return this.request({method:"GET",path:"/api/v1/harness/audit"})}async get__api_v1_harness_modes(){return this.request({method:"GET",path:"/api/v1/harness/modes"})}async get__api_v1_harness_rules(){return this.request({method:"GET",path:"/api/v1/harness/rules"})}async post__api_v1_brain_query(e){return this.request({method:"POST",path:"/api/v1/brain/query",body:e})}async post__api_v1_brain_classify(e){return this.request({method:"POST",path:"/api/v1/brain/classify",body:e})}async get__api_v1_search(){return this.request({method:"GET",path:"/api/v1/search"})}async get__api_v1_memory(){return this.request({method:"GET",path:"/api/v1/memory"})}async post__api_v1_memory(e){return this.request({method:"POST",path:"/api/v1/memory",body:e})}async post__api_v1_memory_search(e){return this.request({method:"POST",path:"/api/v1/memory/search",body:e})}async get__api_v1_notifications(){return this.request({method:"GET",path:"/api/v1/notifications"})}async patch__api_v1_notifications_id_read(e,t){return this.request({method:"PATCH",path:`/api/v1/notifications/${e}/read`,body:t})}async post__api_v1_notifications_readall(e){return this.request({method:"POST",path:"/api/v1/notifications/read-all",body:e})}async get__api_v1_audit(){return this.request({method:"GET",path:"/api/v1/audit"})}async get__api_v1_sprint(){return this.request({method:"GET",path:"/api/v1/sprint"})}async post__api_v1_sprint(e){return this.request({method:"POST",path:"/api/v1/sprint",body:e})}async get__api_v1_learning(){return this.request({method:"GET",path:"/api/v1/learning"})}async get__api_v1_learning_recommendations(){return this.request({method:"GET",path:"/api/v1/learning/recommendations"})}async get__api_v1_tools(){return this.request({method:"GET",path:"/api/v1/tools"})}async post__api_v1_tools_codereview(e){return this.request({method:"POST",path:"/api/v1/tools/code-review",body:e})}async post__api_v1_codegen_generate(e){return this.request({method:"POST",path:"/api/v1/codegen/generate",body:e})}async get__api_v1_recall(){return this.request({method:"GET",path:"/api/v1/recall"})}async post__api_v1_docsintelligence_query(e){return this.request({method:"POST",path:"/api/v1/docs-intelligence/query",body:e})}async get__api_v1_rbac_roles(){return this.request({method:"GET",path:"/api/v1/rbac/roles"})}async get__api_v1_rbac_permissions(){return this.request({method:"GET",path:"/api/v1/rbac/permissions"})}async post__api_v1_sync_export(e){return this.request({method:"POST",path:"/api/v1/sync/export",body:e})}async post__api_v1_sync_import(e){return this.request({method:"POST",path:"/api/v1/sync/import",body:e})}};function aa(e){return new vs(e)}var ys={};C(ys,{DEFAULT_POLICY_PROFILE:()=>Ke,POLICY_PROFILES:()=>He,getPolicyProfile:()=>Ut,isWorkflowBlocked:()=>Ir,normalizeProfile:()=>Ft,resolvePolicyProfile:()=>Bt});A();var Ke="startup",He={startup:{id:"startup",name:"Startup",allowExternalSkills:!0,blockedWorkflows:[]},regulated:{id:"regulated",name:"Regulated",allowExternalSkills:!1,blockedWorkflows:["growth-pack"]},enterprise:{id:"enterprise",name:"Enterprise",allowExternalSkills:!0,blockedWorkflows:[]}};function Ft(e){let t=String(e||Ke).trim().toLowerCase();return He[t]?t:Ke}function ca(e){return e?String(e).split(",").map(t=>t.trim()).filter(Boolean):[]}function Bt(e={}){return Ft(e.policyProfile||process.env.BOOTSPRING_POLICY_PROFILE)}function Ut(e,t={}){let r=Ft(e),n=He[r]||He[Ke],s=ca(t.blockedWorkflows||process.env.BOOTSPRING_POLICY_BLOCKED_WORKFLOWS);return{...n,blockedWorkflows:Array.from(new Set([...n.blockedWorkflows||[],...s]))}}function Ir(e,t){let r=String(e?.key||"").trim();return r?(t.blockedWorkflows||[]).includes(r):!1}Mt();A();var xe={MAX_STRING_LENGTH:1e3,MAX_PATH_LENGTH:4096,MAX_FILENAME_LENGTH:255,MAX_TODO_LENGTH:500,MAX_PROJECT_NAME_LENGTH:100,MAX_DESCRIPTION_LENGTH:2e3,MIN_ID:1,MAX_ID:Number.MAX_SAFE_INTEGER,MAX_ARRAY_LENGTH:1e3},wt={PROJECT_NAME:/^[a-zA-Z][a-zA-Z0-9_-]*$/,SAFE_FILENAME:/^[^:*?"<>|]+$/,SLUG:/^[a-z][a-z0-9-]*$/,NUMERIC_ID:/^\d+$/,EMAIL:/^[^\s@]+@[^\s@]+\.[^\s@]+$/,URL:/^https?:\/\/[^\s]+$/},la=/[;&|`$(){}[\]<>\\!#*?"'\n\r\t]/;function Ss(e,t={}){let{allowTabs:r=!1,allowNewlines:n=!1}=t,s="";for(let i of e){let a=i.charCodeAt(0),c=a===10||a===13,l=a===9;if(!(a>=0&&a<=31||a===127)){s+=i;continue}if(c&&n){s+=i;continue}l&&r&&(s+=i)}return s}function jr(e,t=xe.MAX_STRING_LENGTH,r=0){return typeof e!="string"?{valid:!1,error:"Value must be a string"}:e.length<r?{valid:!1,error:`String must be at least ${r} characters`}:e.length>t?{valid:!1,error:`String exceeds maximum length of ${t} characters`,sanitized:e.slice(0,t)}:{valid:!0,sanitized:e}}function ua(e,t={}){let{min:r=xe.MIN_ID,max:n=xe.MAX_ID}=t,s;if(typeof e=="string"){let i=e.trim();if(!wt.NUMERIC_ID.test(i))return{valid:!1,error:"Invalid numeric ID format"};s=parseInt(i,10)}else if(typeof e=="number")s=e;else return{valid:!1,error:"Value must be a string or number"};return!Number.isFinite(s)||!Number.isInteger(s)?{valid:!1,error:"Value must be an integer"}:s<r?{valid:!1,error:`Value must be at least ${r}`}:s>n?{valid:!1,error:`Value must be at most ${n}`}:{valid:!0,value:s}}function pa(e){let t=jr(e,xe.MAX_TODO_LENGTH,1);return t.valid?{valid:!0,sanitized:Ss(e,{allowNewlines:!0})}:t}function da(e){if(typeof e!="string")return{valid:!1,error:"Slug must be a string"};let t=jr(e,xe.MAX_FILENAME_LENGTH,1);if(!t.valid)return t;if(!wt.SLUG.test(e)){let r=e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/^[^a-z]+/,"").replace(/-+/g,"-").replace(/-$/,"");return r.length===0||!wt.SLUG.test(r)?{valid:!1,error:"Invalid slug format"}:{valid:!1,error:"Slug contains invalid characters",sanitized:r}}return{valid:!0,sanitized:e}}var bs={};C(bs,{classifyError:()=>j,registerMcpForAssistant:()=>As,runDiagnostics:()=>Es,tryHeal:()=>Ts});A();var f=y(require("fs")),_=y(require("path")),X=y(require("os")),dr=require("child_process");se();var fa=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:self-heal]",...e):()=>{};function j(e){let t=e,r=String(t?.message||e||"").toLowerCase(),n=t?.status,s=String(t?.code||"").toLowerCase();return n===401||r.includes("authentication required")?{id:"auth-expired",category:"auth",message:"Session expired or invalid credentials.",fix:"bootspring auth login",autoHealable:!0}:n===403?{id:"auth-tier",category:"auth",message:"This feature requires a paid plan.",fix:"Upgrade at https://bootspring.com/pricing",autoHealable:!1}:r.includes("bad decrypt")||r.includes("provider routines")?{id:"auth-corrupt-credentials",category:"auth",message:"Encrypted credentials cannot be read.",fix:"bootspring auth login",autoHealable:!0}:s==="econnrefused"||r.includes("econnrefused")?{id:"net-refused",category:"network",message:"Bootspring API is not reachable.",fix:"Check https://status.bootspring.com or try again later.",autoHealable:!1}:s==="enotfound"||r.includes("enotfound")||r.includes("getaddrinfo")?{id:"net-dns",category:"network",message:"Cannot resolve api.bootspring.com \u2014 check your internet connection.",fix:"Verify your DNS and network connectivity.",autoHealable:!1}:s==="etimedout"||r.includes("etimedout")||r.includes("socket hang up")?{id:"net-timeout",category:"network",message:"API request timed out.",fix:"Check your connection or try again.",autoHealable:!1}:r.includes("html error page")||r.includes("<!doctype")?{id:"net-proxy",category:"network",message:"API returned an HTML page \u2014 possible proxy or captive portal.",fix:"Check if you are behind a VPN, proxy, or captive portal.",autoHealable:!1}:r.includes("no project")||r.includes(".bootspring.json")?{id:"config-missing",category:"config",message:"No Bootspring project configuration found.",fix:"bootspring init",autoHealable:!0}:r.includes("invalid json")||r.includes("unexpected token")?{id:"config-corrupt",category:"config",message:"A configuration file contains invalid JSON.",fix:"bootspring doctor --fix",autoHealable:!0}:r.includes("cannot find module")||r.includes("module not found")?{id:"deps-missing",category:"deps",message:"Missing dependencies.",fix:"npm install",autoHealable:!0}:r.includes("no build state")||r.includes("build_state.json")?{id:"state-no-build",category:"state",message:"No build state found.",fix:"bootspring build start",autoHealable:!1}:null}var ga={"auth-corrupt-credentials":()=>{try{Xe();let e=ge();if(e)return K({apiKey:e}),{issue:j({message:"bad decrypt"}),healed:!0,detail:"Re-encrypted credentials from project API key."}}catch(e){fa("credential recovery failed",e)}return{issue:j({message:"bad decrypt"}),healed:!1,detail:"No fallback API key available."}},"auth-expired":()=>{let e=ge();return e?(K({apiKey:e}),{issue:j({status:401}),healed:!0,detail:"Restored auth from project API key."}):{issue:j({status:401}),healed:!1}},"config-missing":()=>({issue:j({message:"no project"}),healed:!1}),"config-corrupt":()=>{let e=Ze();if(e)try{return JSON.parse(f.default.readFileSync(e,"utf-8")),{issue:j({message:"invalid json"}),healed:!0,detail:"Config is actually valid."}}catch{let t=e+".bak";return f.default.copyFileSync(e,t),f.default.writeFileSync(e,JSON.stringify({projectId:"unknown"},null,2)),{issue:j({message:"invalid json"}),healed:!0,detail:`Backed up to ${_.default.basename(t)} and reset config.`}}return{issue:j({message:"invalid json"}),healed:!1}},"deps-missing":()=>{let e=process.cwd();if(f.default.existsSync(_.default.join(e,"package.json")))try{return(0,dr.execSync)("npm install",{cwd:e,timeout:12e4,stdio:"pipe"}),{issue:j({message:"cannot find module"}),healed:!0,detail:"Ran npm install successfully."}}catch{return{issue:j({message:"cannot find module"}),healed:!1,detail:"npm install failed."}}return{issue:j({message:"cannot find module"}),healed:!1}}};function Ts(e){let t=ga[e.id];if(!t)return{issue:e,healed:!1};try{return t()}catch{return{issue:e,healed:!1}}}function Es(e=!1){let t=[],r=process.cwd(),n=X.default.homedir();if(Se())t.push({id:"auth",status:"ok",message:"Authenticated"});else if(e){let h=ge();h?(K({apiKey:h}),t.push({id:"auth",status:"healed",message:"Restored auth from project API key."})):t.push({id:"auth",status:"action-needed",message:"Not authenticated.",fix:"bootspring auth login"})}else t.push({id:"auth",status:"action-needed",message:"Not authenticated.",fix:"bootspring auth login"});if(f.default.existsSync(D))try{let h=JSON.parse(f.default.readFileSync(D,"utf-8"));Ct(h),t.push({id:"credentials",status:"ok",message:"Credentials file readable."})}catch{e?(Xe(),t.push({id:"credentials",status:"healed",message:"Removed unreadable credentials file."})):t.push({id:"credentials",status:"action-needed",message:"Credentials file corrupted.",fix:"bootspring doctor --fix"})}else t.push({id:"credentials",status:"ok",message:"No credentials file (using API key or not logged in)."});let s=Ze();if(s)try{JSON.parse(f.default.readFileSync(s,"utf-8")),t.push({id:"config",status:"ok",message:".bootspring.json valid."})}catch{if(e){let h=s+".bak";try{f.default.copyFileSync(s,h),f.default.writeFileSync(s,JSON.stringify({projectId:"unknown"},null,2)),t.push({id:"config",status:"healed",message:`Backed up corrupt config and reset. Backup: ${_.default.basename(h)}`})}catch{t.push({id:"config",status:"action-needed",message:".bootspring.json corrupted.",fix:"Delete and re-run bootspring init"})}}else t.push({id:"config",status:"action-needed",message:".bootspring.json corrupted.",fix:"bootspring doctor --fix"})}if(f.default.existsSync(_.default.join(r,"package.json"))&&!f.default.existsSync(_.default.join(r,"node_modules")))if(e)try{(0,dr.execSync)("npm install",{cwd:r,timeout:12e4,stdio:"pipe"}),t.push({id:"deps",status:"healed",message:"Installed missing dependencies."})}catch{t.push({id:"deps",status:"action-needed",message:"Dependencies missing.",fix:"npm install"})}else t.push({id:"deps",status:"action-needed",message:"Dependencies missing.",fix:"npm install"});else t.push({id:"deps",status:"ok",message:"Dependencies installed."});let i=_.default.join(r,"package-lock.json"),a=_.default.join(r,"pnpm-lock.yaml"),c=_.default.join(r,"node_modules"),l=f.default.existsSync(a)?a:f.default.existsSync(i)?i:null;if(l&&f.default.existsSync(c))try{let h=f.default.statSync(l).mtimeMs,b=f.default.statSync(c).mtimeMs;if(h>b){let N=l.endsWith(".yaml")?"pnpm install":"npm install";if(e)try{(0,dr.execSync)(N,{cwd:r,timeout:12e4,stdio:"pipe"}),t.push({id:"deps-stale",status:"healed",message:`Lockfile newer than node_modules \u2014 ran ${N}.`})}catch{t.push({id:"deps-stale",status:"action-needed",message:"Lockfile newer than node_modules.",fix:N})}else t.push({id:"deps-stale",status:"action-needed",message:"Lockfile newer than node_modules \u2014 dependencies may be stale.",fix:`${N}`})}}catch{}let u={claude:_.default.join(n,".claude.json"),codex:_.default.join(n,".codex","config.toml"),gemini:_.default.join(n,".gemini","settings.json")},g=_.default.join(r,".mcp.json"),m={claude:cr(u.claude),codex:ma(u.codex),gemini:cr(u.gemini),project:cr(g)};if(m.claude||m.codex||m.gemini||m.project){let h=Object.entries(m).filter(([,b])=>b).map(([b])=>b);t.push({id:"mcp",status:"ok",message:`MCP configured for: ${h.join(", ")}.`})}else if(e){let h=[],b=[];ws(u.claude)?h.push("Claude Code"):b.push("Claude Code"),f.default.existsSync(_.default.dirname(u.codex))&&(ks(u.codex)?h.push("Codex"):b.push("Codex")),f.default.existsSync(_.default.dirname(u.gemini))&&(Ps(u.gemini)?h.push("Gemini CLI"):b.push("Gemini CLI")),h.length>0?t.push({id:"mcp",status:"healed",message:`Registered bootspring MCP for: ${h.join(", ")}.`}):t.push({id:"mcp",status:"action-needed",message:"Bootspring MCP not configured.",fix:"bootspring setup assistants"})}else t.push({id:"mcp",status:"action-needed",message:"Bootspring MCP not configured.",fix:"bootspring doctor --fix"});f.default.existsSync(_.default.join(r,"CLAUDE.md"))?t.push({id:"claude-md",status:"ok",message:"CLAUDE.md present."}):f.default.existsSync(_.default.join(r,"package.json"))&&t.push({id:"claude-md",status:"action-needed",message:"No CLAUDE.md found.",fix:"bootspring generate"});let k=_.default.join(r,"planning","BUILD_STATE.json");if(f.default.existsSync(k))try{let h=JSON.parse(f.default.readFileSync(k,"utf-8"));if(!h.implementationQueue||!Array.isArray(h.implementationQueue))if(e){let b=k+".bak";f.default.copyFileSync(k,b),h.implementationQueue=h.implementationQueue||[],f.default.writeFileSync(k,JSON.stringify(h,null,2)),t.push({id:"build-state",status:"healed",message:`BUILD_STATE.json repaired (backed up to ${_.default.basename(b)}).`})}else t.push({id:"build-state",status:"action-needed",message:"BUILD_STATE.json has invalid structure.",fix:"bootspring doctor --fix"});else t.push({id:"build-state",status:"ok",message:"Build state valid."})}catch{t.push({id:"build-state",status:"action-needed",message:"BUILD_STATE.json is corrupted.",fix:"Delete and re-run bootspring build start"})}return t}function cr(e){try{if(!f.default.existsSync(e))return!1;let t=f.default.readFileSync(e,"utf-8");return t.trim()?!!JSON.parse(t)?.mcpServers?.bootspring:!1}catch{return!1}}function ma(e){try{return f.default.existsSync(e)?f.default.readFileSync(e,"utf-8").includes("[mcp_servers.bootspring]"):!1}catch{return!1}}function ws(e){try{let t={};if(f.default.existsSync(e)){let n=f.default.readFileSync(e,"utf-8");t=n.trim()?JSON.parse(n):{}}(!t.mcpServers||typeof t.mcpServers!="object")&&(t.mcpServers={});let r=t.mcpServers;return r.bootspring={type:"stdio",command:"bootspring",args:["mcp"],env:{BOOTSPRING_ASSISTANT:"claude"}},f.default.writeFileSync(e,`${JSON.stringify(t,null,2)}
29
+ `,"utf-8"),!0}catch{return!1}}function ks(e){try{let t=_.default.dirname(e);f.default.existsSync(t)||f.default.mkdirSync(t,{recursive:!0});let r=f.default.existsSync(e)?f.default.readFileSync(e,"utf-8"):"";if(r.includes("[mcp_servers.bootspring]"))return!0;let n=`[mcp_servers.bootspring]
30
30
  command = "bootspring"
31
31
  args = ["mcp"]
32
32
  env = { BOOTSPRING_ASSISTANT = "codex" }
33
33
  `,s=r.length>0?`${r.trimEnd()}
34
34
 
35
- ${n}`:n;return m.default.writeFileSync(e,s,"utf-8"),!0}catch{return!1}}function Ps(e){try{let t=S.default.dirname(e);m.default.existsSync(t)||m.default.mkdirSync(t,{recursive:!0});let r={};if(m.default.existsSync(e)){let n=m.default.readFileSync(e,"utf-8");r=n.trim()?JSON.parse(n):{}}return(!r.mcpServers||typeof r.mcpServers!="object")&&(r.mcpServers={}),r.mcpServers.bootspring={command:"bootspring",args:["mcp"],env:{BOOTSPRING_ASSISTANT:"gemini"}},m.default.writeFileSync(e,`${JSON.stringify(r,null,2)}
36
- `,"utf-8"),!0}catch{return!1}}var ha={claude:()=>S.default.join(ze.default.homedir(),".claude.json"),cursor:()=>S.default.join(ze.default.homedir(),".cursor","mcp.json"),codex:()=>S.default.join(ze.default.homedir(),".codex","config.toml"),gemini:()=>S.default.join(ze.default.homedir(),".gemini","settings.json")};function As(e){let t=ha[e](),r=!1;switch(e){case"claude":case"cursor":r=ws(t);break;case"codex":r=ks(t);break;case"gemini":r=Ps(t);break}return{success:r,path:t}}var xs={};O(xs,{maybeAutoUploadTelemetry:()=>js,sendHealthReport:()=>Os,sendHeartbeat:()=>Cs,trackToolUsage:()=>Is});A();ne();Mt();var $r=process.env.BOOTSPRING_SITE_URL||process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",_a=2e4,Rr=5e3,Pn=0,An=0;function Nr(){let e={"content-type":"application/json"},t=Qe();if(t)e["x-api-key"]=t;else{let r=ve();if(r)e.authorization=`Bearer ${r}`;else return null}return e}function Cs(e){if(!ye())return;let t=Re();if(!t?.id)return;let r=Date.now();if(r-Pn<_a)return;Pn=r;let n=Nr();if(!n)return;n["x-project-id"]=t.id;let s;try{s=Nt()}catch{s="unknown"}let i=JSON.stringify({projectId:t.id,status:e?.status||"online",activity:e?.activity||"cli",deviceId:s}),a=new AbortController,c=setTimeout(()=>a.abort(),Rr);fetch(`${$r}/api/v1/presence/heartbeat`,{method:"POST",headers:n,body:i,signal:a.signal}).catch(()=>{}).finally(()=>clearTimeout(c))}async function Os(e){if(!ye())return;let t=Re();if(!t?.id)return;let r=Nr();if(!r)return;r["x-project-id"]=t.id;let n=new AbortController,s=setTimeout(()=>n.abort(),Rr);try{await fetch(`${$r}/api/v1/health/report`,{method:"POST",headers:r,body:JSON.stringify({projectId:t.id,score:e.score,grade:e.grade,data:e.data}),signal:n.signal})}catch{}finally{clearTimeout(s)}}function Is(e){if(!ye())return;let t=Nr();if(!t)return;let r=Re();r?.id&&(t["x-project-id"]=r.id);let n="mcp_calls";e.includes("agent")?n="agents_invoked":e.includes("skill")?n="skills_accessed":(e.includes("workflow")||e.includes("orchestrator"))&&(n="workflows_started");let s=JSON.stringify({type:n,count:1,metadata:{tool:e,source:"mcp"}}),i=new AbortController,a=setTimeout(()=>i.abort(),Rr);fetch(`${$r}/api/v1/track`,{method:"POST",headers:t,body:s,signal:i.signal}).catch(()=>{}).finally(()=>clearTimeout(a))}function js(){if(!ye())return;let e=Date.now(),t=3600*1e3;e-An<t||(An=e,Promise.resolve().then(()=>(os(),Er)).then(r=>{typeof r.uploadEvents=="function"&&r.uploadEvents().catch(()=>{})}).catch(()=>{}))}var $s={};O($s,{CURRENT_VERSION:()=>z,DEFAULT_INTERVAL_MS:()=>Lr,PACKAGE_NAME:()=>We,STATE_PATH:()=>Je,applyUpdate:()=>qr,checkForUpdates:()=>Ds,compareVersions:()=>Vt,ensureLatestVersion:()=>Ls,getInstallContext:()=>Kt,getLatestVersion:()=>Ht});A();var kt=v(require("fs")),va=v(require("os")),x=v(require("path")),Dr=require("child_process"),Rs=(Ee(),Le(Te)),We=Rs.BOOTSPRING_PACKAGE_NAME,z=Rs.BOOTSPRING_VERSION||"0.0.0",Lr=Number.parseInt(process.env.BOOTSPRING_AUTO_UPDATE_INTERVAL_MS||`${360*60*1e3}`,10),Je=x.join(va.homedir(),".bootspring","update-state.json");function ya(){let e=[x.resolve(__dirname,".."),x.resolve(__dirname,"../.."),process.cwd()];for(let t of e)if(kt.existsSync(x.join(t,"package.json")))return t;return e[0]}function Ns(){return process.env.BOOTSPRING_NPM_COMMAND?process.env.BOOTSPRING_NPM_COMMAND:process.platform==="win32"?"npm.cmd":"npm"}function Vt(e,t){let r=String(e||"0.0.0").split(".").map(s=>Number.parseInt(s,10)||0),n=String(t||"0.0.0").split(".").map(s=>Number.parseInt(s,10)||0);for(let s=0;s<3;s+=1){if((r[s]||0)<(n[s]||0))return-1;if((r[s]||0)>(n[s]||0))return 1}return 0}function xn(){try{return JSON.parse(kt.readFileSync(Je,"utf8"))}catch{return{}}}function Cn(e){try{kt.mkdirSync(x.dirname(Je),{recursive:!0,mode:448}),kt.writeFileSync(Je,JSON.stringify(e,null,2))}catch{}}function Kt(){let e=ya(),t=x.resolve(process.argv[1]||x.join(e,"bin","bootspring.js")),r=`${x.sep}node_modules${x.sep}`,n=process.env.BOOTSPRING_AUTO_UPDATE_INSTALL_MODE;if(n==="global"||n==="local"){let s=n==="local"?process.env.BOOTSPRING_AUTO_UPDATE_PROJECT_ROOT||process.cwd():null;return{mode:n,packageRoot:e,projectRoot:s,scriptPath:t}}if(e.includes(`${x.sep}_npx${x.sep}`)||t.includes(`${x.sep}_npx${x.sep}`))return{mode:"ephemeral",packageRoot:e,projectRoot:null,scriptPath:t};if(!e.includes(r))return{mode:"development",packageRoot:e,projectRoot:null,scriptPath:t};if(t.includes(`${r}.bin${x.sep}`)||t.includes(`${r}@girardmedia${x.sep}bootspring${x.sep}bin${x.sep}`)){let[s]=e.split(r);return{mode:"local",packageRoot:e,projectRoot:s||process.cwd(),scriptPath:t}}return{mode:"global",packageRoot:e,projectRoot:null,scriptPath:t}}function Sa(e=[]){if(process.env.BOOTSPRING_SKIP_AUTO_UPDATE==="true"||process.env.BOOTSPRING_AUTO_UPDATE_APPLIED==="true"||process.env.CI)return!0;let t=Array.isArray(e)?e.filter(Boolean):[];if(t.length===0||t[0]==="help"||t[0]==="update"||t[0]==="--version"||t[0]==="-v"||t.includes("--help")||t.includes("-h"))return!0;let r=Kt();return r.mode==="ephemeral"||r.mode==="development"&&process.env.BOOTSPRING_ALLOW_DEV_AUTO_UPDATE!=="true"}function Ht(){try{let e=(0,Dr.execFileSync)(Ns(),["view",We,"version","--json"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:1e4,env:{...process.env,npm_config_update_notifier:"false"}}).trim();return e?JSON.parse(e):null}catch{return null}}function qr(e){let t=e.mode==="local"?["install",`${We}@latest`]:["install","-g",`${We}@latest`];(0,Dr.execFileSync)(Ns(),t,{cwd:e.projectRoot||process.cwd(),encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:12e4,env:{...process.env,npm_config_update_notifier:"false"}})}function ba(e=[]){let t=(0,Dr.spawnSync)(process.execPath,[process.argv[1],...e],{stdio:"inherit",env:{...process.env,BOOTSPRING_AUTO_UPDATE_APPLIED:"true"}});if(t.error)throw t.error;return typeof t.status=="number"?t.status:1}function Ds(e={}){let t=Ht(),r=e.currentVersion||z;return{current:r,latest:t,updateAvailable:t?Vt(r,t)<0:!1}}function Ls(e=[]){if(Sa(e))return{updated:!1,skipped:!0};let t=Kt(),r=xn(),n=Date.parse(r.lastCheckedAt||""),s=Date.now(),i=Number.isFinite(n)&&s-n<Lr,a=r.latestVersion||null;if((!i||r.currentVersion!==z)&&(a=Ht(),Cn({...r,currentVersion:z,latestVersion:a,lastCheckedAt:new Date(s).toISOString()})),!a||Vt(z,a)>=0)return{updated:!1,skipped:!1,current:z,latest:a};let c=t.mode==="local"?t.projectRoot||process.cwd():"global install";console.error(`[bootspring] Updating ${z} -> ${a} before continuing (${c}).`);try{return qr(t),Cn({...xn(),currentVersion:a,latestVersion:a,lastCheckedAt:new Date(s).toISOString(),lastUpdatedAt:new Date().toISOString()}),{updated:!0,current:z,latest:a,exitCode:ba(e)}}catch(l){return console.error(`[bootspring] Auto-update failed: ${l.message}`),{updated:!1,skipped:!1,current:z,latest:a,error:l}}}var qs={};O(qs,{COMMANDS_SOURCE:()=>Se,TARGET_DIRS:()=>nt,checkInstallation:()=>zs,getCommandFiles:()=>st,installAll:()=>Ms,installToTarget:()=>Mr,uninstallAll:()=>Gs});A();var L=v(require("fs")),lr=v(require("os")),F=v(require("path"));function Ta(){let t=[process.env.BOOTSPRING_COMMANDS_SOURCE,F.resolve(__dirname,"../assets/claude-commands"),F.resolve(__dirname,"../claude-commands"),F.resolve(__dirname,"../../../../claude-commands"),F.resolve(process.cwd(),"claude-commands")].filter(Boolean);for(let r of t)if(L.existsSync(r))return r;return t[0]}var Se=Ta(),nt=[{name:"Claude Code",path:F.join(lr.homedir(),".claude","commands")},{name:"Codex",path:F.join(lr.homedir(),".codex","commands")},{name:"Generic",path:F.join(lr.homedir(),".ai-commands")}];function st(e=Se){try{return L.readdirSync(e).filter(t=>t.endsWith(".md"))}catch{return[]}}function Mr(e,t={}){let{verbose:r=!1,force:n=!1,commandsSource:s=Se}=t,i={installed:[],skipped:[],errors:[]};try{L.existsSync(e)||(L.mkdirSync(e,{recursive:!0}),r&&console.log(` Created ${e}`))}catch(a){return i.errors.push({file:e,error:a.message}),i}for(let a of st(s)){let c=F.join(s,a),l=F.join(e,a);try{if(L.existsSync(l)&&!n){i.skipped.push(a);continue}L.copyFileSync(c,l),i.installed.push(a)}catch(u){i.errors.push({file:a,error:u.message})}}return i}function Ms(e={}){let{verbose:t=!1,force:r=!1,commandsSource:n=Se}=e,s={targets:[],totalInstalled:0,totalSkipped:0,totalErrors:0};for(let i of nt){t&&console.log(`
37
- Installing to ${i.name}...`);let a=Mr(i.path,{verbose:t,force:r,commandsSource:n});s.targets.push({name:i.name,path:i.path,...a}),s.totalInstalled+=a.installed.length,s.totalSkipped+=a.skipped.length,s.totalErrors+=a.errors.length}return s}function zs(e=Se){let t=st(e);return nt.map(r=>{let n=L.existsSync(r.path),s=0;if(n)try{s=L.readdirSync(r.path).filter(a=>t.includes(a)).length}catch{s=0}return{name:r.name,path:r.path,installed:n&&s>0,commandCount:s}})}function Gs(e={}){let{verbose:t=!1,commandsSource:r=Se}=e,n=st(r),s={removed:0,notFound:0};for(let i of nt)if(L.existsSync(i.path))for(let a of n){let c=F.join(i.path,a);try{L.existsSync(c)?(L.unlinkSync(c),s.removed++,t&&console.log(` Removed ${c}`)):s.notFound++}catch{}}return s}ne();Mt();var Fs={};O(Fs,{AGENT_TIERS:()=>Hs,CUSTOM_PROMPTS_TIERS:()=>Zs,DEFAULT_LIMITS:()=>ge,DUAL_LLM_TIERS:()=>Qs,FEATURE_GATES:()=>me,FREE_AGENTS:()=>Ws,GENERATION_LIMITS:()=>Xs,PREMIUM_SKILL_CATEGORIES:()=>Js,PREMIUM_SKILL_PATTERNS:()=>Ys,PRESEED_PAID_COMMANDS:()=>Vs,SEED_PAID_COMMANDS:()=>Ks,TIER_HIERARCHY:()=>Us,cacheEntitlements:()=>ei,checkAgentAccess:()=>Aa,checkCustomPromptsAccess:()=>qa,checkDualLlmAccess:()=>Ma,checkGenerationAccess:()=>La,checkLimit:()=>Ca,checkPreseedAccess:()=>ai,checkSeedAccess:()=>ci,checkSkillAccess:()=>xa,clearCache:()=>Pa,fetchEntitlements:()=>ti,formatTierBadge:()=>ja,getCachedEntitlements:()=>Wt,getEntitlements:()=>ri,getLimits:()=>si,getTier:()=>$,getTierLevel:()=>Pt,getUpgradePrompt:()=>Jt,getUpgradePromptContext:()=>oi,getUpgradePromptExperiment:()=>ii,hasFeature:()=>xe,isSkillPremium:()=>ni,meetsTierRequirement:()=>it,requireFeature:()=>Ra,requirePreseedAccess:()=>Na,requireSeedAccess:()=>Da,requireTier:()=>$a});A();var de=v(require("fs")),Ea=v(require("os")),Bs=v(require("path"));ne();function zr(){return Ct}var fr=Bs.join(Ea.homedir(),".bootspring"),Ye=Bs.join(fr,"entitlements.json"),wa=300*1e3,Us={free:0,founder:1,pro:1,team:2,enterprise:3,custom:3},ge={free:{projects:1,apiCallsPerMonth:100,devices:1,teamSeats:1,storage:"50MB"},founder:{projects:5,apiCallsPerMonth:5e3,devices:1,teamSeats:1,storage:"2GB"},pro:{projects:5,apiCallsPerMonth:5e3,devices:1,teamSeats:1,storage:"2GB"},team:{projects:15,apiCallsPerMonth:25e3,devices:2,teamSeats:3,storage:"25GB"},enterprise:{projects:50,apiCallsPerMonth:1e5,devices:5,teamSeats:10,storage:"250GB"},custom:{projects:999,apiCallsPerMonth:999999,devices:999,teamSeats:999,storage:"1TB"}},me={free:["agents.technical","skills.basic","workflows.basic","telemetry","preseed.setup","preseed.init","preseed.generate","preseed.sync","preseed.status","preseed.update","preseed.export","seed.setup","seed.init","seed.status","seed.export"],founder:["agents.technical","agents.business","skills.basic","skills.advanced","workflows.basic","workflows.advanced","telemetry","priority_support","preseed.*","seed.*"],pro:["agents.technical","agents.business","skills.basic","skills.advanced","workflows.basic","workflows.advanced","telemetry","priority_support","preseed.*","seed.*"],team:["agents.technical","agents.business","agents.enterprise","skills.basic","skills.advanced","skills.enterprise","workflows.basic","workflows.advanced","workflows.enterprise","telemetry","priority_support","team_features","presence","custom_policies","preseed.*","seed.*"],enterprise:["agents.*","skills.*","workflows.*","preseed.*","seed.*","telemetry","priority_support","team_features","presence","audit_logs","sso","custom_policies"],custom:["agents.*","skills.*","workflows.*","preseed.*","seed.*","telemetry","priority_support","team_features","presence","audit_logs","sso","custom_policies"]},Vs=["pull","push","workflow","merge","start"],Ks=["scaffold","synthesize","generate"],Hs={"business-strategy-expert":"pro","competitive-analysis-expert":"pro","financial-expert":"pro","fundraising-expert":"pro","growth-expert":"pro","investor-relations-expert":"pro","legal-expert":"pro","operations-expert":"pro","partnerships-expert":"pro","private-equity-expert":"pro","sales-expert":"pro","ui-ux-expert":"pro","content-expert":"pro","marketing-expert":"pro","product-expert":"pro"},Ws=new Set(["database-expert","frontend-expert"]),Js=["ai","payments","security","performance","deployment","email","notifications","realtime","search","seo","files","analytics"],Ys=["auth/mfa","auth/rbac","database/multi-tenant","database/full-text-search","testing/e2e","testing/coverage","state/react-query","ui/command-palette","ui/data-tables"],Xs={free:0,founder:25,pro:25,team:100,enterprise:500,custom:999999},Zs=new Set(["enterprise","custom"]),Qs=new Set(["enterprise","custom"]),ka=["security/validation","deployment/docker"],On="https://bootspring.com/pricing",In={skill:{headline:"Unlock premium skill patterns",value:"Get verified advanced patterns and external catalog access for implementation speed."},workflow:{headline:"Unlock premium workflow packs",value:"Run launch and growth workflows with full checkpoint orchestration."},agent:{headline:"Unlock specialist agents",value:"Access business and enterprise experts for planning, strategy, and execution."},preseed:{headline:"Unlock cloud preseed commands",value:"Enable remote sync and workflow-aware document collaboration."},seed:{headline:"Unlock advanced seed generation",value:"Use scaffold and synthesis flows to generate production-ready project foundations."},general:{headline:"Unlock premium capabilities",value:"Upgrade to access higher-tier commands, workflows, and limits."}};function Wt(){try{if(de.existsSync(Ye)){let e=JSON.parse(de.readFileSync(Ye,"utf-8"));if(e.cachedAt&&Date.now()-new Date(e.cachedAt).getTime()<wa)return e}}catch{return null}return null}function ei(e){try{de.existsSync(fr)||de.mkdirSync(fr,{recursive:!0,mode:448}),de.writeFileSync(Ye,JSON.stringify({...e,cachedAt:new Date().toISOString()},null,2),{mode:384})}catch{}}function Pa(){try{de.existsSync(Ye)&&de.unlinkSync(Ye)}catch{}}async function ti(){let e=zr();if(!e.isAuthenticated())return null;try{let r=await xr.resolveEntitlements();ei(r);let n=e.getUser();if(n&&r.tier!==n.tier){let s=e.getCredentials();s&&e.saveCredentials({...s,user:{...s.user,tier:r.tier}})}return r}catch{let t=Wt();if(t)return t;let r=e.getTier()||"free";return{tier:r,limits:ge[r]||ge.free,features:me[r]||me.free,agents:{denied:[]}}}}async function ri(e={}){let t=zr();if(!e.forceRefresh){let s=Wt();if(s)return s}let r=await ti();if(r)return r;let n=t.getTier()||"free";return{tier:n,limits:ge[n]||ge.free,features:me[n]||me.free,agents:{denied:[]}}}function $(){return Wt()?.tier||zr().getTier()||"free"}function Pt(e){return Us[e?.toLowerCase()||"free"]??0}function it(e,t=null){let r=t||$();return Pt(r)>=Pt(e)}function Aa(e){let t=$();if(Pt(t)===0)return Ws.has(e)?{allowed:!0,userTier:t}:{allowed:!1,requiredTier:"pro",userTier:t};let r=Hs[e];return r?{allowed:it(r,t),requiredTier:r,userTier:t}:{allowed:!0,userTier:t}}function ni(e){if(e.startsWith("external/"))return!0;if(ka.includes(e))return!1;if(Ys.includes(e))return!0;let t=e.split("/")[0];return!!(t&&Js.includes(t))}function xa(e){let t=$();return ni(e)?it("pro",t)?{allowed:!0,userTier:t}:{allowed:!1,reason:`This skill requires a Pro subscription. Current tier: ${t}`,userTier:t}:{allowed:!0,userTier:t}}function xe(e){let t=$(),r=me[t]??me.free??[];for(let n of r){if(n===e)return!0;if(n.endsWith(".*")){let s=n.slice(0,-2);if(e.startsWith(s))return!0}}return!1}async function si(){let e=await ri();return e.limits||ge[e.tier]||ge.free}async function Ca(e,t){let n=(await si())[e],s=typeof n=="number"?n:0;return{allowed:t<s,limit:s,usage:t,remaining:Math.max(0,s-t)}}function ht(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Oa(e){let t=String(e||"").trim().toLowerCase();return t==="banner"?"banner":t==="footer"?"footer":"inline"}function Ia(e){let t=String(e||"").trim()||"this feature",r=t.toLowerCase();if(r.startsWith("skill:")||r.startsWith("skill ")){let n=t.replace(/^skill[:\s]*/i,"").trim()||"premium skill";return{feature:t,featureType:"skill",featureLabel:`Skill ${n}`,capability:"premium_pattern",action:"skill_show"}}if(r.startsWith("workflow:")||r.startsWith("workflow ")){let n=t.replace(/^workflow[:\s]*/i,"").trim()||"workflow";return{feature:t,featureType:"workflow",featureLabel:`Workflow ${n}`,capability:"workflow_pack",action:"workflow_open"}}if(r.startsWith("preseed ")){let n=t.replace(/^preseed\s+/i,"").trim()||"command";return{feature:t,featureType:"preseed",featureLabel:`Preseed ${n}`,capability:"preseed_command",action:n.toLowerCase().replace(/\s+/g,"_")}}if(r.startsWith("seed ")){let n=t.replace(/^seed\s+/i,"").trim()||"command";return{feature:t,featureType:"seed",featureLabel:`Seed ${n}`,capability:"seed_command",action:n.toLowerCase().replace(/\s+/g,"_")}}if(r.startsWith("agent:")||r.includes("expert")){let n=t.replace(/^agent[:\s]*/i,"").trim()||t;return{feature:t,featureType:"agent",featureLabel:`Agent ${n}`,capability:"agent_access",action:"agent_invoke"}}return{feature:t,featureType:"general",featureLabel:t,capability:"premium_feature",action:"feature_access"}}function ii(e={}){let t=String(process.env.BOOTSPRING_UPGRADE_PROMPT_EXPERIMENT||"").trim(),r=String(process.env.BOOTSPRING_UPGRADE_PROMPT_VARIANT||"").trim(),n=String(process.env.BOOTSPRING_UPGRADE_PROMPT_PLACEMENT||"").trim();if(t.includes(":")){let[c,l]=t.split(":",2);c&&(r=c),l&&(n=l)}let s=Oa(e.placement||n),i=ht(e.variant||r||t||"control","control"),a=e.placement||e.variant?"override":t||r||n?"env":"default";return{variant:i,placement:s,source:a}}function oi(e,t="pro",r={}){let n=Ia(e),s=ii(r);return{...n,capability:ht(r.capability||n.capability,n.capability),action:ht(r.action||n.action,n.action),requiredTier:ht(t||"pro","pro"),userTier:$(),placement:s.placement,variant:s.variant}}function Jt(e,t="pro",r={}){let n=oi(e,t,r),s=In[n.featureType]||In.general,i=n.variant!=="control"||n.placement!=="inline",a=`${n.featureLabel} requires ${n.requiredTier} tier or higher.`,c="\x1B[36m",l="\x1B[33m",u="\x1B[2m",f="\x1B[1m",g="\x1B[0m",_=i?`${u}Experiment: variant=${n.variant}, placement=${n.placement}${g}
35
+ ${n}`:n;return f.default.writeFileSync(e,s,"utf-8"),!0}catch{return!1}}function Ps(e){try{let t=_.default.dirname(e);f.default.existsSync(t)||f.default.mkdirSync(t,{recursive:!0});let r={};if(f.default.existsSync(e)){let s=f.default.readFileSync(e,"utf-8");r=s.trim()?JSON.parse(s):{}}(!r.mcpServers||typeof r.mcpServers!="object")&&(r.mcpServers={});let n=r.mcpServers;return n.bootspring={command:"bootspring",args:["mcp"],env:{BOOTSPRING_ASSISTANT:"gemini"}},f.default.writeFileSync(e,`${JSON.stringify(r,null,2)}
36
+ `,"utf-8"),!0}catch{return!1}}var ha={claude:()=>_.default.join(X.default.homedir(),".claude.json"),cursor:()=>_.default.join(X.default.homedir(),".cursor","mcp.json"),codex:()=>_.default.join(X.default.homedir(),".codex","config.toml"),gemini:()=>_.default.join(X.default.homedir(),".gemini","settings.json"),zed:()=>_.default.join(X.default.homedir(),".config","zed","settings.json"),opencode:()=>_.default.join(X.default.homedir(),".opencode","config.json"),windsurf:()=>_.default.join(X.default.homedir(),".windsurf","mcp.json")};function _a(e){try{let t=_.default.dirname(e);f.default.existsSync(t)||f.default.mkdirSync(t,{recursive:!0});let r={};if(f.default.existsSync(e)){let i=f.default.readFileSync(e,"utf-8").replace(/\/\/.*$/gm,"").replace(/\/\*[\s\S]*?\*\//g,"");r=i.trim()?JSON.parse(i):{}}(!r.context_servers||typeof r.context_servers!="object")&&(r.context_servers={});let n=r.context_servers;return n.bootspring={command:{path:"bootspring",args:["mcp"]},settings:{BOOTSPRING_ASSISTANT:"zed"}},f.default.writeFileSync(e,`${JSON.stringify(r,null,2)}
37
+ `,"utf-8"),!0}catch{return!1}}function va(e,t){try{let r=_.default.dirname(e);f.default.existsSync(r)||f.default.mkdirSync(r,{recursive:!0});let n={};if(f.default.existsSync(e)){let i=f.default.readFileSync(e,"utf-8");n=i.trim()?JSON.parse(i):{}}(!n.mcpServers||typeof n.mcpServers!="object")&&(n.mcpServers={});let s=n.mcpServers;return s.bootspring={type:"stdio",command:"bootspring",args:["mcp"],env:{BOOTSPRING_ASSISTANT:t}},f.default.writeFileSync(e,`${JSON.stringify(n,null,2)}
38
+ `,"utf-8"),!0}catch{return!1}}function As(e){let t=ha[e](),r=!1;switch(e){case"claude":case"cursor":r=ws(t);break;case"codex":r=ks(t);break;case"gemini":r=Ps(t);break;case"zed":r=_a(t);break;case"opencode":case"windsurf":r=va(t,e);break}return{success:r,path:t}}var xs={};C(xs,{maybeAutoUploadTelemetry:()=>js,sendHealthReport:()=>Cs,sendHeartbeat:()=>Os,trackToolUsage:()=>Is});A();se();Mt();var $r=process.env.BOOTSPRING_SITE_URL||process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",ya=2e4,Rr=5e3,Pn=0,An=0;function Nr(){let e={"content-type":"application/json"},t=Qe();if(t)e["x-api-key"]=t;else{let r=ye();if(r)e.authorization=`Bearer ${r}`;else return null}return e}function Os(e){if(!Se())return;let t=Ne();if(!t?.id)return;let r=Date.now();if(r-Pn<ya)return;Pn=r;let n=Nr();if(!n)return;n["x-project-id"]=t.id;let s;try{s=Nt()}catch{s="unknown"}let i=JSON.stringify({projectId:t.id,status:e?.status||"online",activity:e?.activity||"cli",deviceId:s}),a=new AbortController,c=setTimeout(()=>a.abort(),Rr);fetch(`${$r}/api/v1/presence/heartbeat`,{method:"POST",headers:n,body:i,signal:a.signal}).catch(()=>{}).finally(()=>clearTimeout(c))}async function Cs(e){if(!Se())return;let t=Ne();if(!t?.id)return;let r=Nr();if(!r)return;r["x-project-id"]=t.id;let n=new AbortController,s=setTimeout(()=>n.abort(),Rr);try{await fetch(`${$r}/api/v1/health/report`,{method:"POST",headers:r,body:JSON.stringify({projectId:t.id,score:e.score,grade:e.grade,data:e.data}),signal:n.signal})}catch{}finally{clearTimeout(s)}}function Is(e){if(!Se())return;let t=Nr();if(!t)return;let r=Ne();r?.id&&(t["x-project-id"]=r.id);let n="mcp_calls";e.includes("agent")?n="agents_invoked":e.includes("skill")?n="skills_accessed":(e.includes("workflow")||e.includes("orchestrator"))&&(n="workflows_started");let s=JSON.stringify({type:n,count:1,metadata:{tool:e,source:"mcp"}}),i=new AbortController,a=setTimeout(()=>i.abort(),Rr);fetch(`${$r}/api/v1/track`,{method:"POST",headers:t,body:s,signal:i.signal}).catch(()=>{}).finally(()=>clearTimeout(a))}function js(){if(!Se())return;let e=Date.now(),t=3600*1e3;e-An<t||(An=e,Promise.resolve().then(()=>(os(),Er)).then(r=>{typeof r.uploadEvents=="function"&&r.uploadEvents().catch(()=>{})}).catch(()=>{}))}var $s={};C($s,{CURRENT_VERSION:()=>z,DEFAULT_INTERVAL_MS:()=>Lr,PACKAGE_NAME:()=>We,STATE_PATH:()=>Je,applyUpdate:()=>qr,checkForUpdates:()=>Ds,compareVersions:()=>Vt,ensureLatestVersion:()=>Ls,getInstallContext:()=>Kt,getLatestVersion:()=>Ht});A();var kt=y(require("fs")),Sa=y(require("os")),x=y(require("path")),Dr=require("child_process"),Rs=(we(),qe(Ee)),We=Rs.BOOTSPRING_PACKAGE_NAME,z=Rs.BOOTSPRING_VERSION||"0.0.0",Lr=Number.parseInt(process.env.BOOTSPRING_AUTO_UPDATE_INTERVAL_MS||`${360*60*1e3}`,10),Je=x.join(Sa.homedir(),".bootspring","update-state.json");function ba(){let e=[x.resolve(__dirname,".."),x.resolve(__dirname,"../.."),process.cwd()];for(let t of e)if(kt.existsSync(x.join(t,"package.json")))return t;return e[0]}function Ns(){return process.env.BOOTSPRING_NPM_COMMAND?process.env.BOOTSPRING_NPM_COMMAND:process.platform==="win32"?"npm.cmd":"npm"}function Vt(e,t){let r=String(e||"0.0.0").split(".").map(s=>Number.parseInt(s,10)||0),n=String(t||"0.0.0").split(".").map(s=>Number.parseInt(s,10)||0);for(let s=0;s<3;s+=1){if((r[s]||0)<(n[s]||0))return-1;if((r[s]||0)>(n[s]||0))return 1}return 0}function xn(){try{return JSON.parse(kt.readFileSync(Je,"utf8"))}catch{return{}}}function On(e){try{kt.mkdirSync(x.dirname(Je),{recursive:!0,mode:448}),kt.writeFileSync(Je,JSON.stringify(e,null,2))}catch{}}function Kt(){let e=ba(),t=x.resolve(process.argv[1]||x.join(e,"bin","bootspring.js")),r=`${x.sep}node_modules${x.sep}`,n=process.env.BOOTSPRING_AUTO_UPDATE_INSTALL_MODE;if(n==="global"||n==="local"){let s=n==="local"?process.env.BOOTSPRING_AUTO_UPDATE_PROJECT_ROOT||process.cwd():null;return{mode:n,packageRoot:e,projectRoot:s,scriptPath:t}}if(e.includes(`${x.sep}_npx${x.sep}`)||t.includes(`${x.sep}_npx${x.sep}`))return{mode:"ephemeral",packageRoot:e,projectRoot:null,scriptPath:t};if(!e.includes(r))return{mode:"development",packageRoot:e,projectRoot:null,scriptPath:t};if(t.includes(`${r}.bin${x.sep}`)||t.includes(`${r}@girardmedia${x.sep}bootspring${x.sep}bin${x.sep}`)){let[s]=e.split(r);return{mode:"local",packageRoot:e,projectRoot:s||process.cwd(),scriptPath:t}}return{mode:"global",packageRoot:e,projectRoot:null,scriptPath:t}}function Ta(e=[]){if(process.env.BOOTSPRING_SKIP_AUTO_UPDATE==="true"||process.env.BOOTSPRING_AUTO_UPDATE_APPLIED==="true"||process.env.CI)return!0;let t=Array.isArray(e)?e.filter(Boolean):[];if(t.length===0||t[0]==="help"||t[0]==="update"||t[0]==="--version"||t[0]==="-v"||t.includes("--help")||t.includes("-h"))return!0;let r=Kt();return r.mode==="ephemeral"||r.mode==="development"&&process.env.BOOTSPRING_ALLOW_DEV_AUTO_UPDATE!=="true"}function Ht(){try{let e=(0,Dr.execFileSync)(Ns(),["view",We,"version","--json"],{encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:1e4,env:{...process.env,npm_config_update_notifier:"false"}}).trim();return e?JSON.parse(e):null}catch{return null}}function qr(e){let t=e.mode==="local"?["install",`${We}@latest`]:["install","-g",`${We}@latest`];(0,Dr.execFileSync)(Ns(),t,{cwd:e.projectRoot||process.cwd(),encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:12e4,env:{...process.env,npm_config_update_notifier:"false"}})}function Ea(e=[]){let t=(0,Dr.spawnSync)(process.execPath,[process.argv[1],...e],{stdio:"inherit",env:{...process.env,BOOTSPRING_AUTO_UPDATE_APPLIED:"true"}});if(t.error)throw t.error;return typeof t.status=="number"?t.status:1}function Ds(e={}){let t=Ht(),r=e.currentVersion||z;return{current:r,latest:t,updateAvailable:t?Vt(r,t)<0:!1}}function Ls(e=[]){if(Ta(e))return{updated:!1,skipped:!0};let t=Kt(),r=xn(),n=Date.parse(r.lastCheckedAt||""),s=Date.now(),i=Number.isFinite(n)&&s-n<Lr,a=r.latestVersion||null;if((!i||r.currentVersion!==z)&&(a=Ht(),On({...r,currentVersion:z,latestVersion:a,lastCheckedAt:new Date(s).toISOString()})),!a||Vt(z,a)>=0)return{updated:!1,skipped:!1,current:z,latest:a};let c=t.mode==="local"?t.projectRoot||process.cwd():"global install";console.error(`[bootspring] Updating ${z} -> ${a} before continuing (${c}).`);try{return qr(t),On({...xn(),currentVersion:a,latestVersion:a,lastCheckedAt:new Date(s).toISOString(),lastUpdatedAt:new Date().toISOString()}),{updated:!0,current:z,latest:a,exitCode:Ea(e)}}catch(l){return console.error(`[bootspring] Auto-update failed: ${l.message}`),{updated:!1,skipped:!1,current:z,latest:a,error:l}}}var qs={};C(qs,{COMMANDS_SOURCE:()=>be,TARGET_DIRS:()=>nt,checkInstallation:()=>zs,getCommandFiles:()=>st,installAll:()=>Ms,installToTarget:()=>Mr,uninstallAll:()=>Gs});A();var q=y(require("fs")),lr=y(require("os")),F=y(require("path"));function wa(){let t=[process.env.BOOTSPRING_COMMANDS_SOURCE,F.resolve(__dirname,"../assets/claude-commands"),F.resolve(__dirname,"../claude-commands"),F.resolve(__dirname,"../../../../claude-commands"),F.resolve(process.cwd(),"claude-commands")].filter(Boolean);for(let r of t)if(q.existsSync(r))return r;return t[0]}var be=wa(),nt=[{name:"Claude Code",path:F.join(lr.homedir(),".claude","commands")},{name:"Codex",path:F.join(lr.homedir(),".codex","commands")},{name:"Generic",path:F.join(lr.homedir(),".ai-commands")}];function st(e=be){try{return q.readdirSync(e).filter(t=>t.endsWith(".md"))}catch{return[]}}function Mr(e,t={}){let{verbose:r=!1,force:n=!1,commandsSource:s=be}=t,i={installed:[],skipped:[],errors:[]};try{q.existsSync(e)||(q.mkdirSync(e,{recursive:!0}),r&&console.log(` Created ${e}`))}catch(a){return i.errors.push({file:e,error:a.message}),i}for(let a of st(s)){let c=F.join(s,a),l=F.join(e,a);try{if(q.existsSync(l)&&!n){i.skipped.push(a);continue}q.copyFileSync(c,l),i.installed.push(a)}catch(u){i.errors.push({file:a,error:u.message})}}return i}function Ms(e={}){let{verbose:t=!1,force:r=!1,commandsSource:n=be}=e,s={targets:[],totalInstalled:0,totalSkipped:0,totalErrors:0};for(let i of nt){t&&console.log(`
39
+ Installing to ${i.name}...`);let a=Mr(i.path,{verbose:t,force:r,commandsSource:n});s.targets.push({name:i.name,path:i.path,...a}),s.totalInstalled+=a.installed.length,s.totalSkipped+=a.skipped.length,s.totalErrors+=a.errors.length}return s}function zs(e=be){let t=st(e);return nt.map(r=>{let n=q.existsSync(r.path),s=0;if(n)try{s=q.readdirSync(r.path).filter(a=>t.includes(a)).length}catch{s=0}return{name:r.name,path:r.path,installed:n&&s>0,commandCount:s}})}function Gs(e={}){let{verbose:t=!1,commandsSource:r=be}=e,n=st(r),s={removed:0,notFound:0};for(let i of nt)if(q.existsSync(i.path))for(let a of n){let c=F.join(i.path,a);try{q.existsSync(c)?(q.unlinkSync(c),s.removed++,t&&console.log(` Removed ${c}`)):s.notFound++}catch{}}return s}se();Mt();var Fs={};C(Fs,{AGENT_TIERS:()=>Hs,CUSTOM_PROMPTS_TIERS:()=>Zs,DEFAULT_LIMITS:()=>me,DUAL_LLM_TIERS:()=>Qs,FEATURE_GATES:()=>he,FREE_AGENTS:()=>Ws,GENERATION_LIMITS:()=>Xs,PREMIUM_SKILL_CATEGORIES:()=>Js,PREMIUM_SKILL_PATTERNS:()=>Ys,PRESEED_PAID_COMMANDS:()=>Vs,SEED_PAID_COMMANDS:()=>Ks,TIER_HIERARCHY:()=>Us,cacheEntitlements:()=>ei,checkAgentAccess:()=>Oa,checkCustomPromptsAccess:()=>za,checkDualLlmAccess:()=>Ga,checkGenerationAccess:()=>Ma,checkLimit:()=>Ia,checkPreseedAccess:()=>ai,checkSeedAccess:()=>ci,checkSkillAccess:()=>Ca,clearCache:()=>xa,fetchEntitlements:()=>ti,formatTierBadge:()=>Ra,getCachedEntitlements:()=>Wt,getEntitlements:()=>ri,getLimits:()=>si,getTier:()=>$,getTierLevel:()=>Pt,getUpgradePrompt:()=>Jt,getUpgradePromptContext:()=>oi,getUpgradePromptExperiment:()=>ii,hasFeature:()=>Oe,isSkillPremium:()=>ni,meetsTierRequirement:()=>it,requireFeature:()=>Da,requirePreseedAccess:()=>La,requireSeedAccess:()=>qa,requireTier:()=>Na});A();var fe=y(require("fs")),ka=y(require("os")),Bs=y(require("path"));se();function zr(){return Ot}var fr=Bs.join(ka.homedir(),".bootspring"),Ye=Bs.join(fr,"entitlements.json"),Pa=300*1e3,Us={free:0,founder:1,pro:1,team:2,enterprise:3,custom:3},me={free:{projects:1,apiCallsPerMonth:100,devices:1,teamSeats:1,storage:"50MB"},founder:{projects:5,apiCallsPerMonth:5e3,devices:1,teamSeats:1,storage:"2GB"},pro:{projects:5,apiCallsPerMonth:5e3,devices:1,teamSeats:1,storage:"2GB"},team:{projects:15,apiCallsPerMonth:25e3,devices:2,teamSeats:3,storage:"25GB"},enterprise:{projects:50,apiCallsPerMonth:1e5,devices:5,teamSeats:10,storage:"250GB"},custom:{projects:999,apiCallsPerMonth:999999,devices:999,teamSeats:999,storage:"1TB"}},he={free:["agents.technical","skills.basic","workflows.basic","telemetry","preseed.setup","preseed.init","preseed.generate","preseed.sync","preseed.status","preseed.update","preseed.export","seed.setup","seed.init","seed.status","seed.export"],founder:["agents.technical","agents.business","skills.basic","skills.advanced","workflows.basic","workflows.advanced","telemetry","priority_support","preseed.*","seed.*"],pro:["agents.technical","agents.business","skills.basic","skills.advanced","workflows.basic","workflows.advanced","telemetry","priority_support","preseed.*","seed.*"],team:["agents.technical","agents.business","agents.enterprise","skills.basic","skills.advanced","skills.enterprise","workflows.basic","workflows.advanced","workflows.enterprise","telemetry","priority_support","team_features","presence","custom_policies","preseed.*","seed.*"],enterprise:["agents.*","skills.*","workflows.*","preseed.*","seed.*","telemetry","priority_support","team_features","presence","audit_logs","sso","custom_policies"],custom:["agents.*","skills.*","workflows.*","preseed.*","seed.*","telemetry","priority_support","team_features","presence","audit_logs","sso","custom_policies"]},Vs=["pull","push","workflow","merge","start"],Ks=["scaffold","synthesize","generate"],Hs={"business-strategy-expert":"pro","competitive-analysis-expert":"pro","financial-expert":"pro","fundraising-expert":"pro","growth-expert":"pro","investor-relations-expert":"pro","legal-expert":"pro","operations-expert":"pro","partnerships-expert":"pro","private-equity-expert":"pro","sales-expert":"pro","ui-ux-expert":"pro","content-expert":"pro","marketing-expert":"pro","product-expert":"pro"},Ws=new Set(["database-expert","frontend-expert"]),Js=["ai","payments","security","performance","deployment","email","notifications","realtime","search","seo","files","analytics"],Ys=["auth/mfa","auth/rbac","database/multi-tenant","database/full-text-search","testing/e2e","testing/coverage","state/react-query","ui/command-palette","ui/data-tables"],Xs={free:0,founder:25,pro:25,team:100,enterprise:500,custom:999999},Zs=new Set(["enterprise","custom"]),Qs=new Set(["enterprise","custom"]),Aa=["security/validation","deployment/docker"],Cn="https://bootspring.com/pricing",In={skill:{headline:"Unlock premium skill patterns",value:"Get verified advanced patterns and external catalog access for implementation speed."},workflow:{headline:"Unlock premium workflow packs",value:"Run launch and growth workflows with full checkpoint orchestration."},agent:{headline:"Unlock specialist agents",value:"Access business and enterprise experts for planning, strategy, and execution."},preseed:{headline:"Unlock cloud preseed commands",value:"Enable remote sync and workflow-aware document collaboration."},seed:{headline:"Unlock advanced seed generation",value:"Use scaffold and synthesis flows to generate production-ready project foundations."},general:{headline:"Unlock premium capabilities",value:"Upgrade to access higher-tier commands, workflows, and limits."}};function Wt(){try{if(fe.existsSync(Ye)){let e=JSON.parse(fe.readFileSync(Ye,"utf-8"));if(e.cachedAt&&Date.now()-new Date(e.cachedAt).getTime()<Pa)return e}}catch{return null}return null}function ei(e){try{fe.existsSync(fr)||fe.mkdirSync(fr,{recursive:!0,mode:448}),fe.writeFileSync(Ye,JSON.stringify({...e,cachedAt:new Date().toISOString()},null,2),{mode:384})}catch{}}function xa(){try{fe.existsSync(Ye)&&fe.unlinkSync(Ye)}catch{}}async function ti(){let e=zr();if(!e.isAuthenticated())return null;try{let r=await xr.resolveEntitlements();ei(r);let n=e.getUser();if(n&&r.tier!==n.tier){let s=e.getCredentials();s&&e.saveCredentials({...s,user:{...s.user,tier:r.tier}})}return r}catch{let t=Wt();if(t)return t;let r=e.getTier()||"free";return{tier:r,limits:me[r]||me.free,features:he[r]||he.free,agents:{denied:[]}}}}async function ri(e={}){let t=zr();if(!e.forceRefresh){let s=Wt();if(s)return s}let r=await ti();if(r)return r;let n=t.getTier()||"free";return{tier:n,limits:me[n]||me.free,features:he[n]||he.free,agents:{denied:[]}}}function $(){return Wt()?.tier||zr().getTier()||"free"}function Pt(e){return Us[e?.toLowerCase()||"free"]??0}function it(e,t=null){let r=t||$();return Pt(r)>=Pt(e)}function Oa(e){let t=$();if(Pt(t)===0)return Ws.has(e)?{allowed:!0,userTier:t}:{allowed:!1,requiredTier:"pro",userTier:t};let r=Hs[e];return r?{allowed:it(r,t),requiredTier:r,userTier:t}:{allowed:!0,userTier:t}}function ni(e){if(e.startsWith("external/"))return!0;if(Aa.includes(e))return!1;if(Ys.includes(e))return!0;let t=e.split("/")[0];return!!(t&&Js.includes(t))}function Ca(e){let t=$();return ni(e)?it("pro",t)?{allowed:!0,userTier:t}:{allowed:!1,reason:`This skill requires a Pro subscription. Current tier: ${t}`,userTier:t}:{allowed:!0,userTier:t}}function Oe(e){let t=$(),r=he[t]??he.free??[];for(let n of r){if(n===e)return!0;if(n.endsWith(".*")){let s=n.slice(0,-2);if(e.startsWith(s))return!0}}return!1}async function si(){let e=await ri();return e.limits||me[e.tier]||me.free}async function Ia(e,t){let n=(await si())[e],s=typeof n=="number"?n:0;return{allowed:t<s,limit:s,usage:t,remaining:Math.max(0,s-t)}}function ht(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function ja(e){let t=String(e||"").trim().toLowerCase();return t==="banner"?"banner":t==="footer"?"footer":"inline"}function $a(e){let t=String(e||"").trim()||"this feature",r=t.toLowerCase();if(r.startsWith("skill:")||r.startsWith("skill ")){let n=t.replace(/^skill[:\s]*/i,"").trim()||"premium skill";return{feature:t,featureType:"skill",featureLabel:`Skill ${n}`,capability:"premium_pattern",action:"skill_show"}}if(r.startsWith("workflow:")||r.startsWith("workflow ")){let n=t.replace(/^workflow[:\s]*/i,"").trim()||"workflow";return{feature:t,featureType:"workflow",featureLabel:`Workflow ${n}`,capability:"workflow_pack",action:"workflow_open"}}if(r.startsWith("preseed ")){let n=t.replace(/^preseed\s+/i,"").trim()||"command";return{feature:t,featureType:"preseed",featureLabel:`Preseed ${n}`,capability:"preseed_command",action:n.toLowerCase().replace(/\s+/g,"_")}}if(r.startsWith("seed ")){let n=t.replace(/^seed\s+/i,"").trim()||"command";return{feature:t,featureType:"seed",featureLabel:`Seed ${n}`,capability:"seed_command",action:n.toLowerCase().replace(/\s+/g,"_")}}if(r.startsWith("agent:")||r.includes("expert")){let n=t.replace(/^agent[:\s]*/i,"").trim()||t;return{feature:t,featureType:"agent",featureLabel:`Agent ${n}`,capability:"agent_access",action:"agent_invoke"}}return{feature:t,featureType:"general",featureLabel:t,capability:"premium_feature",action:"feature_access"}}function ii(e={}){let t=String(process.env.BOOTSPRING_UPGRADE_PROMPT_EXPERIMENT||"").trim(),r=String(process.env.BOOTSPRING_UPGRADE_PROMPT_VARIANT||"").trim(),n=String(process.env.BOOTSPRING_UPGRADE_PROMPT_PLACEMENT||"").trim();if(t.includes(":")){let[c,l]=t.split(":",2);c&&(r=c),l&&(n=l)}let s=ja(e.placement||n),i=ht(e.variant||r||t||"control","control"),a=e.placement||e.variant?"override":t||r||n?"env":"default";return{variant:i,placement:s,source:a}}function oi(e,t="pro",r={}){let n=$a(e),s=ii(r);return{...n,capability:ht(r.capability||n.capability,n.capability),action:ht(r.action||n.action,n.action),requiredTier:ht(t||"pro","pro"),userTier:$(),placement:s.placement,variant:s.variant}}function Jt(e,t="pro",r={}){let n=oi(e,t,r),s=In[n.featureType]||In.general,i=n.variant!=="control"||n.placement!=="inline",a=`${n.featureLabel} requires ${n.requiredTier} tier or higher.`,c="\x1B[36m",l="\x1B[33m",u="\x1B[2m",g="\x1B[1m",m="\x1B[0m",v=i?`${u}Experiment: variant=${n.variant}, placement=${n.placement}${m}
38
40
  `:"";if(n.placement==="banner")return`
39
- ${l}${f}Upgrade Required${g} ${u}${a} Current tier: ${n.userTier}.${g}
40
- ${f}${s.headline}.${g} ${u}${s.value}${g}
41
- ${c}bootspring billing upgrade${g} ${u}| ${On}${g}
42
- ${_}`;let w=n.placement==="footer"?`${u}Prompt placement: footer${g}
41
+ ${l}${g}Upgrade Required${m} ${u}${a} Current tier: ${n.userTier}.${m}
42
+ ${g}${s.headline}.${m} ${u}${s.value}${m}
43
+ ${c}bootspring billing upgrade${m} ${u}| ${Cn}${m}
44
+ ${v}`;let k=n.placement==="footer"?`${u}Prompt placement: footer${m}
43
45
  `:"";return`
44
- ${l}${f}Upgrade Required${g}
46
+ ${l}${g}Upgrade Required${m}
45
47
 
46
- ${u}${a}${g}
47
- ${u}Your current tier: ${n.userTier}${g}
48
+ ${u}${a}${m}
49
+ ${u}Your current tier: ${n.userTier}${m}
48
50
 
49
- ${f}${s.headline}${g}
50
- ${u}${s.value}${g}
51
- ${w}
51
+ ${g}${s.headline}${m}
52
+ ${u}${s.value}${m}
53
+ ${k}
52
54
 
53
- ${f}Upgrade options:${g}
54
- ${c}bootspring billing upgrade${g}
55
+ ${g}Upgrade options:${m}
56
+ ${c}bootspring billing upgrade${m}
55
57
 
56
- ${u}Or visit: ${On}${g}
57
- ${_}
58
- `}function ja(e){let t="\x1B[33m",r="\x1B[32m",n="\x1B[36m",s="\x1B[0m";switch(e?.toLowerCase()){case"pro":case"founder":return`${t}[PRO]${s}`;case"team":return`${n}[TEAM]${s}`;case"enterprise":case"custom":return`${n}[ENT]${s}`;default:return`${r}[FREE]${s}`}}function $a(e,t="this feature"){if(!it(e)){let r=new Error(`${t} requires ${e} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=e,r.userTier=$(),r.upgradePrompt=Jt(t,e),r}}function Ra(e){if(!xe(e)){let t=new Error(`${e} is not available on your current plan`);throw t.code="FEATURE_REQUIRED",t.feature=e,t.userTier=$(),t}}function ai(e){let t=$();return Vs.includes(e)?{allowed:xe(`preseed.${e}`)||xe("preseed.*"),requiredTier:"pro",userTier:t,feature:`preseed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`preseed ${e}`}}function ci(e){let t=$();return Ks.includes(e)?{allowed:xe(`seed.${e}`)||xe("seed.*"),requiredTier:"pro",userTier:t,feature:`seed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`seed ${e}`}}function Na(e){let t=ai(e);if(!t.allowed){let r=new Error(`preseed ${e} requires ${t.requiredTier} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=t.requiredTier,r.userTier=t.userTier,r.upgradePrompt=Jt(`preseed ${e}`,t.requiredTier),r}}function Da(e){let t=ci(e);if(!t.allowed){let r=new Error(`seed ${e} requires ${t.requiredTier} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=t.requiredTier,r.userTier=t.userTier,r.upgradePrompt=Jt(`seed ${e}`,t.requiredTier),r}}function La(){let e=$(),t=Xs[e]??0;return{allowed:t>0,limit:t,tier:e}}function qa(){return Zs.has($())}function Ma(){return Qs.has($())}var li={};O(li,{LOCAL_MODE:()=>ui,SERVER_MODE:()=>Ce,checkSkillAccess:()=>_i,checkWorkflowAccess:()=>yi,filterAccessibleSkills:()=>Ga,filterAccessibleWorkflows:()=>Fa,isExternalSkill:()=>hi,isPremiumWorkflow:()=>vi,resolveAccessContext:()=>gi,resolveWorkflowAccessContext:()=>mi});A();var ui="local",Ce="server",za=new Set(["free","founder","pro","team","enterprise","custom"]);function _t(e){return it("pro",e)}function pi(e){if(typeof e=="boolean")return e;if(e==null)return!1;let t=String(e).trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function di(e){return String(e||"").trim().toLowerCase()===Ce?Ce:ui}function fi(e){let t=String(e||"free").trim().toLowerCase();return za.has(t)?t:"free"}function gi(e={}){return{mode:di(e.mode||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:fi(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:pi(e.entitled??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Bt(e)}}function mi(e={}){return{mode:di(e.mode||process.env.BOOTSPRING_WORKFLOW_ACCESS_MODE||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:fi(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:pi(e.entitled??process.env.BOOTSPRING_WORKFLOWS_ENTITLED??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Bt(e)}}function hi(e){return String(e||"").trim().toLowerCase().startsWith("external/")}function jn(e){let t=String(e||"free").trim().toLowerCase();return t==="pro"||t==="premium"}function _i(e,t={}){let r=gi(t);if(hi(e)){let s=Ut(r.policyProfile,t);return s.allowExternalSkills?r.mode!==Ce?{allowed:!0,code:"external_local_mode",reason:"External skills are enabled in local mode.",context:r}:r.entitled||_t(r.tier)?{allowed:!0,code:"external_entitled",reason:"External skill access granted.",context:r}:{allowed:!1,code:"external_subscription_required",reason:"External skills require entitlement in server mode. Set BOOTSPRING_SKILLS_ENTITLED=true or use tier=pro/team/enterprise.",context:r}:{allowed:!1,code:"external_policy_blocked",reason:`External skills are blocked by ${s.id} policy profile.`,context:r}}return r.mode!==Ce?jn(t.skillTier)?{allowed:!0,code:"premium_local_mode",reason:"Premium patterns are enabled in local mode.",context:r}:{allowed:!0,code:"free_local_mode",reason:"Patterns are enabled in local mode.",context:r}:r.entitled||r.tier!=="free"||_t(r.tier)?jn(t.skillTier)?_t(r.tier)?{allowed:!0,code:"premium_entitled",reason:"Premium pattern access granted.",context:r}:{allowed:!1,code:"premium_subscription_required",reason:"Premium pattern requires Pro subscription. Upgrade at bootspring.com/pricing.",context:r}:{allowed:!0,code:"free_entitled",reason:"Free tier pattern access granted.",context:r}:{allowed:!1,code:"authentication_required",reason:"Patterns require authentication in server mode. Sign in at bootspring.com or use BOOTSPRING_SKILLS_ENTITLED=true for development.",context:r}}function Ga(e,t={}){let r=[],n=[];for(let s of e||[]){let i=_i(s,t);i.allowed?r.push(s):n.push({skillId:s,code:i.code,reason:i.reason})}return{allowed:r,denied:n}}function vi(e){return String(e?.tier||"free").toLowerCase()!=="free"}function yi(e,t={}){let r=mi(t),n=Ut(r.policyProfile,t);return Ir(e,n)?{allowed:!1,code:"workflow_policy_blocked",reason:`Workflow ${e?.key||e?.name||"unknown"} is blocked by ${n.id} policy profile.`,context:r}:vi(e)?r.mode!==Ce?{allowed:!0,code:"workflow_local_mode",reason:"Premium workflows are enabled in local mode.",context:r}:r.entitled||_t(r.tier)?{allowed:!0,code:"workflow_entitled",reason:"Premium workflow access granted.",context:r}:{allowed:!1,code:"workflow_subscription_required",reason:"Premium workflows require entitlement in server mode. Set BOOTSPRING_WORKFLOWS_ENTITLED=true or use tier=pro/team/enterprise.",context:r}:{allowed:!0,code:"workflow_free",reason:"Workflow is available on free tier.",context:r}}function Fa(e,t={}){let r=[],n=[];for(let s of e||[]){let i=yi(s,t);i.allowed?r.push(s):n.push({key:s?.key,name:s?.name,code:i.code,reason:i.reason})}return{allowed:r,denied:n}}var Si={};O(Si,{AIPluginSchema:()=>Pi,AgentConfigSchema:()=>Oi,AgentsConfigSchema:()=>Br,AnalyticsPluginSchema:()=>xi,AuthPluginSchema:()=>bi,BasePluginSchema:()=>Gr,CONFIG_FILES:()=>Ni,CONFIG_PRESETS:()=>W,ConfigSchema:()=>Zr,ContextConfigSchema:()=>Hr,DEFAULT_CONFIG:()=>ot,DashboardConfigSchema:()=>Jr,DatabasePluginSchema:()=>Ei,EmailPluginSchema:()=>Ai,MonitoringPluginSchema:()=>Ci,PathsConfigSchema:()=>Wr,PaymentsPluginSchema:()=>Ti,PluginSchema:()=>Ba,PluginsSchema:()=>Fr,ProjectConfigSchema:()=>Yr,QualityCheckSchema:()=>vt,QualityConfigSchema:()=>Kr,SecurityPluginSchema:()=>ki,SkillConfigSchema:()=>Ii,SkillsConfigSchema:()=>Ur,StackConfigSchema:()=>Xr,TestingPluginSchema:()=>wi,WorkflowConfigSchema:()=>$i,WorkflowPhaseSchema:()=>ji,WorkflowsConfigSchema:()=>Vr,applyPreset:()=>Ri,combinePresets:()=>Va,createCustomPreset:()=>Ja,deepMerge:()=>he,findConfigFile:()=>Li,findProjectRoot:()=>tn,formatValidationErrors:()=>en,getDefaults:()=>rc,getPreset:()=>Ua,getPresetsByTag:()=>Wa,getValidationHint:()=>ec,listPresets:()=>Ya,load:()=>Yt,loadWithValidation:()=>Qa,parseConfig:()=>tc,parsePresetString:()=>Ka,resolvePresetChain:()=>Qr,save:()=>Za,validate:()=>rn,validatePresets:()=>Ha,validateSection:()=>Di});A();var we=v(require("fs")),X=v(require("path"));A();var o=require("zod"),Gr=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.string().optional(),features:o.z.array(o.z.string()).optional().default([])}).passthrough(),bi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["clerk","nextauth","auth0","supabase","jwt","custom"]).optional(),features:o.z.array(o.z.enum(["social_login","email_password","magic_link","sso","mfa","rbac","passwordless"])).optional().default([])}).passthrough(),Ti=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["stripe","paddle","lemonsqueezy","paypal","custom"]).optional(),features:o.z.array(o.z.enum(["checkout","subscriptions","invoices","usage_billing","trials","coupons"])).optional().default([])}).passthrough(),Ei=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.enum(["prisma","drizzle","typeorm","kysely","custom"]).optional(),features:o.z.array(o.z.enum(["migrations","transactions","seeding","multi_tenant","full_text_search","soft_delete"])).optional().default([])}).passthrough(),wi=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.enum(["vitest","jest","playwright","cypress","custom"]).optional(),features:o.z.array(o.z.enum(["unit","integration","e2e","coverage","snapshot","mocking"])).optional().default([])}).passthrough(),ki=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.string().optional(),features:o.z.array(o.z.enum(["input_validation","rate_limiting","csrf","xss","sql_injection","audit","rbac","encryption","secrets_management"])).optional().default([])}).passthrough(),Pi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["anthropic","openai","google","cohere","custom"]).optional(),features:o.z.array(o.z.enum(["streaming","tool_use","embeddings","rag","agents","vision"])).optional().default([])}).passthrough(),Ai=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["resend","sendgrid","postmark","ses","mailgun","custom"]).optional(),features:o.z.array(o.z.enum(["transactional","marketing","templates","tracking"])).optional().default([])}).passthrough(),xi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["posthog","amplitude","mixpanel","google_analytics","custom"]).optional(),features:o.z.array(o.z.enum(["page_views","events","user_tracking","funnels","experiments"])).optional().default([])}).passthrough(),Ci=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["sentry","datadog","newrelic","logrocket","custom"]).optional(),features:o.z.array(o.z.enum(["error_tracking","performance","logs","alerts","apm"])).optional().default([])}).passthrough(),Fr=o.z.object({auth:bi.optional(),payments:Ti.optional(),database:Ei.optional(),testing:wi.optional(),security:ki.optional(),ai:Pi.optional(),email:Ai.optional(),analytics:xi.optional(),monitoring:Ci.optional()}).catchall(Gr),Ba=Gr,Oi=o.z.object({enabled:o.z.boolean().optional().default(!0),expertise:o.z.array(o.z.string()).optional(),customInstructions:o.z.string().optional(),priority:o.z.enum(["high","medium","low"]).optional().default("medium")}).passthrough(),Br=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),Oi).optional(),defaults:o.z.array(o.z.string()).optional(),settings:o.z.object({maxConcurrent:o.z.number().int().min(1).max(10).optional().default(3),timeout:o.z.number().int().min(1e3).max(3e5).optional().default(6e4),verbose:o.z.boolean().optional().default(!1)}).optional()}).passthrough(),Ii=o.z.object({enabled:o.z.boolean().optional().default(!0),tier:o.z.enum(["free","pro","premium"]).optional().default("free"),category:o.z.string().optional(),maxChars:o.z.number().int().min(100).optional()}).passthrough(),Ur=o.z.object({categories:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),Ii).optional(),external:o.z.object({enabled:o.z.boolean().optional().default(!1),manifestUrl:o.z.string().url().optional(),cacheDir:o.z.string().optional(),requireSignature:o.z.boolean().optional().default(!1)}).optional(),settings:o.z.object({defaultMaxChars:o.z.number().int().min(100).optional().default(5e4),summaryByDefault:o.z.boolean().optional().default(!1),includeExternal:o.z.boolean().optional().default(!1)}).optional()}).passthrough(),ji=o.z.object({name:o.z.string().min(1,"Phase name is required"),agents:o.z.array(o.z.string()).min(1,"At least one agent is required"),duration:o.z.string().optional(),parallel:o.z.boolean().optional().default(!1),description:o.z.string().optional()}).passthrough(),$i=o.z.object({name:o.z.string().min(1,"Workflow name is required"),description:o.z.string().optional(),tier:o.z.enum(["free","pro"]).optional().default("free"),pack:o.z.string().optional(),outcomes:o.z.array(o.z.string()).optional(),completionSignals:o.z.array(o.z.string()).optional(),phases:o.z.array(ji).min(1,"At least one phase is required")}).passthrough(),Vr=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),$i).optional(),default:o.z.string().optional(),settings:o.z.object({autoAdvance:o.z.boolean().optional().default(!0),pauseBetweenPhases:o.z.boolean().optional().default(!1),trackSignals:o.z.boolean().optional().default(!0),emitTelemetry:o.z.boolean().optional().default(!0)}).optional()}).passthrough(),vt=o.z.union([o.z.boolean(),o.z.object({enabled:o.z.boolean().optional().default(!0),checks:o.z.array(o.z.enum(["lint","typecheck","test","build","security","coverage","format"])).optional()})]),Kr=o.z.object({preCommit:vt.optional().default(!0),prePush:vt.optional().default(!1),preDeploy:vt.optional(),strictMode:o.z.boolean().optional().default(!1),coverage:o.z.object({statements:o.z.number().min(0).max(100).optional(),branches:o.z.number().min(0).max(100).optional(),functions:o.z.number().min(0).max(100).optional(),lines:o.z.number().min(0).max(100).optional()}).optional()}).passthrough(),Hr=o.z.object({includeEnvVars:o.z.boolean().optional().default(!0),includeTechStack:o.z.boolean().optional().default(!0),includePlugins:o.z.boolean().optional().default(!0),includeGitInfo:o.z.boolean().optional().default(!0),includeTodos:o.z.boolean().optional().default(!0),includeLearnings:o.z.boolean().optional().default(!0),customSections:o.z.array(o.z.object({title:o.z.string(),content:o.z.string()})).optional().default([]),maxSize:o.z.number().int().min(1e3).optional()}).passthrough(),Wr=o.z.object({context:o.z.string().optional().default("CLAUDE.md"),config:o.z.string().optional().default("bootspring.config.js"),todo:o.z.string().optional().default("planning/TODO.md"),roadmap:o.z.string().optional().default("ROADMAP.md"),changelog:o.z.string().optional().default("CHANGELOG.md"),state:o.z.string().optional().default(".bootspring")}).passthrough(),Jr=o.z.object({port:o.z.number().int().min(1024).max(65535).optional().default(3456),autoOpen:o.z.boolean().optional().default(!1),host:o.z.string().optional().default("localhost"),theme:o.z.enum(["light","dark","system"]).optional().default("system")}).passthrough(),Yr=o.z.object({name:o.z.string().min(1,"Project name is required"),description:o.z.string().optional().default(""),version:o.z.string().regex(/^\d+\.\d+\.\d+/,"Version must be semver format").optional().default("1.0.0"),author:o.z.string().optional(),license:o.z.string().optional(),repository:o.z.string().url().optional()}).passthrough(),Xr=o.z.object({framework:o.z.enum(["nextjs","remix","nuxt","sveltekit","astro","express","fastify","hono","custom"]).optional(),language:o.z.enum(["typescript","javascript"]).optional(),database:o.z.enum(["postgresql","mysql","mongodb","sqlite","supabase","planetscale","none"]).optional(),hosting:o.z.enum(["vercel","railway","render","fly","aws","gcp","azure","cloudflare","self-hosted","custom"]).optional()}).passthrough(),Zr=o.z.object({project:Yr.optional(),stack:Xr.optional(),plugins:Fr.optional(),agents:Br.optional(),skills:Ur.optional(),workflows:Vr.optional(),dashboard:Jr.optional(),quality:Kr.optional(),context:Hr.optional(),paths:Wr.optional(),mcp:o.z.object({enabled:o.z.boolean().optional().default(!1),servers:o.z.record(o.z.string(),o.z.object({command:o.z.string(),args:o.z.array(o.z.string()).optional(),env:o.z.record(o.z.string(),o.z.string()).optional()})).optional()}).optional()}).passthrough(),ot={project:{name:"My Project",description:"",version:"1.0.0"},stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!1,provider:"clerk"},payments:{enabled:!1,provider:"stripe"},database:{enabled:!0,provider:"prisma"},testing:{enabled:!0,provider:"vitest"},security:{enabled:!0},ai:{enabled:!1}},dashboard:{port:3456,autoOpen:!1},quality:{preCommit:!0,prePush:!1,strictMode:!1},paths:{context:"CLAUDE.md",config:"bootspring.config.js",todo:"planning/TODO.md"}};function he(e,t){let r={...e};for(let n of Object.keys(t)){let s=t[n],i=e[n];Array.isArray(s)?r[n]=[...s]:s!==null&&typeof s=="object"&&!Array.isArray(s)&&i!==null&&typeof i=="object"&&!Array.isArray(i)?r[n]=he(i,s):s!==void 0&&(r[n]=s)}return r}A();var W={"saas-starter":{name:"SaaS Starter",description:"Full SaaS setup with auth, payments, and database",tags:["fullstack","production","monetization"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!0,provider:"clerk",features:["email_password","social_login"]},payments:{enabled:!0,provider:"stripe",features:["checkout","subscriptions"]},database:{enabled:!0,provider:"prisma",features:["migrations","seeding"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration"]},security:{enabled:!0,features:["input_validation","rate_limiting"]},email:{enabled:!0,provider:"resend",features:["transactional"]},analytics:{enabled:!0,provider:"posthog",features:["events","user_tracking"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}},"api-only":{name:"API Only",description:"Headless API configuration without frontend",tags:["backend","headless","microservice"],extends:null,config:{stack:{framework:"express",language:"typescript",database:"postgresql",hosting:"railway"},plugins:{auth:{enabled:!0,provider:"jwt",features:["email_password"]},payments:{enabled:!1},database:{enabled:!0,provider:"prisma",features:["migrations","transactions"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration"]},security:{enabled:!0,features:["input_validation","rate_limiting","csrf"]},monitoring:{enabled:!0,provider:"sentry",features:["error_tracking","performance"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!0,strictMode:!0}}},"static-site":{name:"Static Site",description:"Simple static site setup with optional CMS",tags:["static","content","marketing"],extends:null,config:{stack:{framework:"astro",language:"typescript",database:"none",hosting:"vercel"},plugins:{auth:{enabled:!1},payments:{enabled:!1},database:{enabled:!1},testing:{enabled:!0,provider:"vitest",features:["unit"]},security:{enabled:!0,features:["xss"]},analytics:{enabled:!0,provider:"google_analytics",features:["page_views"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}},enterprise:{name:"Enterprise",description:"Enterprise-grade configuration with all security and quality features",tags:["enterprise","security","compliance"],extends:"saas-starter",config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"aws"},plugins:{auth:{enabled:!0,provider:"clerk",features:["sso","mfa","rbac"]},payments:{enabled:!0,provider:"stripe",features:["checkout","subscriptions","invoices"]},database:{enabled:!0,provider:"prisma",features:["migrations","transactions","multi_tenant","soft_delete"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration","e2e","coverage"]},security:{enabled:!0,features:["input_validation","rate_limiting","csrf","audit","rbac","encryption"]},monitoring:{enabled:!0,provider:"datadog",features:["error_tracking","performance","logs","apm"]},email:{enabled:!0,provider:"ses",features:["transactional","tracking"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!0,preDeploy:{enabled:!0,checks:["lint","typecheck","test","build","security"]},strictMode:!0,coverage:{statements:80,branches:75,functions:80,lines:80}}}},minimal:{name:"Minimal",description:"Bare minimum setup for quick prototyping",tags:["prototype","minimal","quick"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"none",hosting:"vercel"},plugins:{auth:{enabled:!1},payments:{enabled:!1},database:{enabled:!1},testing:{enabled:!1},security:{enabled:!0},ai:{enabled:!1}},quality:{preCommit:!1,prePush:!1,strictMode:!1}}},"ai-app":{name:"AI Application",description:"AI-powered application with Claude integration",tags:["ai","llm","anthropic"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!0,provider:"clerk",features:["email_password"]},payments:{enabled:!1},database:{enabled:!0,provider:"prisma",features:["migrations"]},testing:{enabled:!0,provider:"vitest",features:["unit","mocking"]},security:{enabled:!0,features:["input_validation","rate_limiting"]},ai:{enabled:!0,provider:"anthropic",features:["streaming","tool_use"]}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}}};function Ua(e){return W[e]??null}function Qr(e,t=new Set){let r=W[e];if(!r)throw new Error(`Unknown preset: ${e}. Available: ${Object.keys(W).join(", ")}`);if(t.has(e))throw new Error(`Circular preset inheritance detected: ${e}`);t.add(e);let n={...ot};if(r.extends){let s=Qr(r.extends,t);n=he(n,s)}return n=he(n,r.config),n}function Ri(e,t={}){let r=Array.isArray(e)?e:[e];if(r.length===0)throw new Error("At least one preset name is required");let n={...ot};for(let s of r){let i=s.trim(),a=Qr(i);n=he(n,a)}return n=he(n,t),n}function Va(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("combinePresets requires a non-empty array of preset names");return Ri(e,t)}function Ka(e){return!e||typeof e!="string"?[]:e.split(",").map(t=>t.trim()).filter(Boolean)}function Ha(e){let t=Array.isArray(e)?e:[e],r=[],n=[],s=Object.keys(W);for(let i of t)W[i]?n.push(i):r.push(`Unknown preset: "${i}". Available: ${s.join(", ")}`);return{valid:r.length===0,errors:r,validPresets:n}}function Wa(e){return Object.entries(W).filter(([,t])=>t.tags&&t.tags.includes(e)).map(([t])=>t)}function Ja(e,t,r={}){let n=W[e];if(!n)throw new Error(`Unknown base preset: ${e}`);return{name:t,description:`Custom preset based on ${n.name}`,tags:[...n.tags||[],"custom"],extends:e,config:r}}function Ya(e={}){let t=Object.entries(W);return e.tag&&(t=t.filter(([,r])=>r.tags&&r.tags.includes(e.tag))),t.map(([r,n])=>{let s={key:r,name:n.name,description:n.description};return e.verbose&&(s.tags=n.tags||[],s.extends=n.extends),s})}var Ni=["bootspring.config.js","bootspring.config.mjs","bootspring.config.json",".bootspringrc",".bootspringrc.js",".bootspringrc.json"];function en(e){return e.issues.map(t=>{let r=t.path.join("."),n=r?`${r}: `:"",s=t,i=t.code,a=t.message;return i==="invalid_type"&&"expected"in s?`${n}Expected ${s.expected}, received ${typeof s.input}`:i==="invalid_value"?`${n}Invalid value`:i==="too_small"&&"minimum"in s?`${n}Value must be at least ${s.minimum}`:i==="too_big"&&"maximum"in s?`${n}Value must be at most ${s.maximum}`:i==="invalid_format"?`${n}Invalid format`:`${n}${a}`})}var Xa={project:Yr,stack:Xr,plugins:Fr,agents:Br,skills:Ur,workflows:Vr,dashboard:Jr,quality:Kr,context:Hr,paths:Wr};function Di(e,t){let r=Xa[e];if(!r)return{valid:!1,errors:[`Unknown configuration section: ${e}`],data:null};let n=r.safeParse(t);return n.success?{valid:!0,errors:[],data:n.data}:{valid:!1,errors:en(n.error),data:null}}function tn(){let e=process.cwd(),t=X.parse(e).root;for(;e!==t;){if(we.existsSync(X.join(e,"package.json"))||we.existsSync(X.join(e,"bootspring.config.js"))||we.existsSync(X.join(e,".git")))return e;e=X.dirname(e)}return process.cwd()}function Li(e){for(let t of Ni){let r=X.join(e,t);if(we.existsSync(r))return r}return null}function Yt(e=null){let t=e??tn(),r=Li(t),n={};if(r)try{if(r.endsWith(".json")||r.endsWith(".bootspringrc")){let i=we.readFileSync(r,"utf-8");n=JSON.parse(i)}else delete require.cache[require.resolve(r)],n=require(r)}catch(i){let a=i instanceof Error?i.message:String(i);console.warn(`Warning: Could not load config from ${r}: ${a}`)}let s=he(ot,n);return s._projectRoot=t,s._configPath=r,s._bootspringDir=X.join(t,".bootspring"),s}function Za(e,t=null){let r=e._projectRoot??tn(),n=t??X.join(r,"bootspring.config.js"),s={...e};delete s._projectRoot,delete s._configPath,delete s._bootspringDir,delete s._validation;let i=`/**
58
+ ${u}Or visit: ${Cn}${m}
59
+ ${v}
60
+ `}function Ra(e){let t="\x1B[33m",r="\x1B[32m",n="\x1B[36m",s="\x1B[0m";switch(e?.toLowerCase()){case"pro":case"founder":return`${t}[PRO]${s}`;case"team":return`${n}[TEAM]${s}`;case"enterprise":case"custom":return`${n}[ENT]${s}`;default:return`${r}[FREE]${s}`}}function Na(e,t="this feature"){if(!it(e)){let r=new Error(`${t} requires ${e} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=e,r.userTier=$(),r.upgradePrompt=Jt(t,e),r}}function Da(e){if(!Oe(e)){let t=new Error(`${e} is not available on your current plan`);throw t.code="FEATURE_REQUIRED",t.feature=e,t.userTier=$(),t}}function ai(e){let t=$();return Vs.includes(e)?{allowed:Oe(`preseed.${e}`)||Oe("preseed.*"),requiredTier:"pro",userTier:t,feature:`preseed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`preseed ${e}`}}function ci(e){let t=$();return Ks.includes(e)?{allowed:Oe(`seed.${e}`)||Oe("seed.*"),requiredTier:"pro",userTier:t,feature:`seed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`seed ${e}`}}function La(e){let t=ai(e);if(!t.allowed){let r=new Error(`preseed ${e} requires ${t.requiredTier} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=t.requiredTier,r.userTier=t.userTier,r.upgradePrompt=Jt(`preseed ${e}`,t.requiredTier),r}}function qa(e){let t=ci(e);if(!t.allowed){let r=new Error(`seed ${e} requires ${t.requiredTier} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=t.requiredTier,r.userTier=t.userTier,r.upgradePrompt=Jt(`seed ${e}`,t.requiredTier),r}}function Ma(){let e=$(),t=Xs[e]??0;return{allowed:t>0,limit:t,tier:e}}function za(){return Zs.has($())}function Ga(){return Qs.has($())}var li={};C(li,{LOCAL_MODE:()=>ui,SERVER_MODE:()=>Ce,checkSkillAccess:()=>_i,checkWorkflowAccess:()=>yi,filterAccessibleSkills:()=>Ba,filterAccessibleWorkflows:()=>Ua,isExternalSkill:()=>hi,isPremiumWorkflow:()=>vi,resolveAccessContext:()=>gi,resolveWorkflowAccessContext:()=>mi});A();var ui="local",Ce="server",Fa=new Set(["free","founder","pro","team","enterprise","custom"]);function _t(e){return it("pro",e)}function pi(e){if(typeof e=="boolean")return e;if(e==null)return!1;let t=String(e).trim().toLowerCase();return t==="1"||t==="true"||t==="yes"||t==="on"}function di(e){return String(e||"").trim().toLowerCase()===Ce?Ce:ui}function fi(e){let t=String(e||"free").trim().toLowerCase();return Fa.has(t)?t:"free"}function gi(e={}){return{mode:di(e.mode||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:fi(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:pi(e.entitled??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Bt(e)}}function mi(e={}){return{mode:di(e.mode||process.env.BOOTSPRING_WORKFLOW_ACCESS_MODE||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:fi(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:pi(e.entitled??process.env.BOOTSPRING_WORKFLOWS_ENTITLED??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Bt(e)}}function hi(e){return String(e||"").trim().toLowerCase().startsWith("external/")}function jn(e){let t=String(e||"free").trim().toLowerCase();return t==="pro"||t==="premium"}function _i(e,t={}){let r=gi(t);if(hi(e)){let s=Ut(r.policyProfile,t);return s.allowExternalSkills?r.mode!==Ce?{allowed:!0,code:"external_local_mode",reason:"External skills are enabled in local mode.",context:r}:r.entitled||_t(r.tier)?{allowed:!0,code:"external_entitled",reason:"External skill access granted.",context:r}:{allowed:!1,code:"external_subscription_required",reason:"External skills require entitlement in server mode. Set BOOTSPRING_SKILLS_ENTITLED=true or use tier=pro/team/enterprise.",context:r}:{allowed:!1,code:"external_policy_blocked",reason:`External skills are blocked by ${s.id} policy profile.`,context:r}}return r.mode!==Ce?jn(t.skillTier)?{allowed:!0,code:"premium_local_mode",reason:"Premium patterns are enabled in local mode.",context:r}:{allowed:!0,code:"free_local_mode",reason:"Patterns are enabled in local mode.",context:r}:r.entitled||r.tier!=="free"||_t(r.tier)?jn(t.skillTier)?_t(r.tier)?{allowed:!0,code:"premium_entitled",reason:"Premium pattern access granted.",context:r}:{allowed:!1,code:"premium_subscription_required",reason:"Premium pattern requires Pro subscription. Upgrade at bootspring.com/pricing.",context:r}:{allowed:!0,code:"free_entitled",reason:"Free tier pattern access granted.",context:r}:{allowed:!1,code:"authentication_required",reason:"Patterns require authentication in server mode. Sign in at bootspring.com or use BOOTSPRING_SKILLS_ENTITLED=true for development.",context:r}}function Ba(e,t={}){let r=[],n=[];for(let s of e||[]){let i=_i(s,t);i.allowed?r.push(s):n.push({skillId:s,code:i.code,reason:i.reason})}return{allowed:r,denied:n}}function vi(e){return String(e?.tier||"free").toLowerCase()!=="free"}function yi(e,t={}){let r=mi(t),n=Ut(r.policyProfile,t);return Ir(e,n)?{allowed:!1,code:"workflow_policy_blocked",reason:`Workflow ${e?.key||e?.name||"unknown"} is blocked by ${n.id} policy profile.`,context:r}:vi(e)?r.mode!==Ce?{allowed:!0,code:"workflow_local_mode",reason:"Premium workflows are enabled in local mode.",context:r}:r.entitled||_t(r.tier)?{allowed:!0,code:"workflow_entitled",reason:"Premium workflow access granted.",context:r}:{allowed:!1,code:"workflow_subscription_required",reason:"Premium workflows require entitlement in server mode. Set BOOTSPRING_WORKFLOWS_ENTITLED=true or use tier=pro/team/enterprise.",context:r}:{allowed:!0,code:"workflow_free",reason:"Workflow is available on free tier.",context:r}}function Ua(e,t={}){let r=[],n=[];for(let s of e||[]){let i=yi(s,t);i.allowed?r.push(s):n.push({key:s?.key,name:s?.name,code:i.code,reason:i.reason})}return{allowed:r,denied:n}}var Si={};C(Si,{AIPluginSchema:()=>Pi,AgentConfigSchema:()=>Ci,AgentsConfigSchema:()=>Br,AnalyticsPluginSchema:()=>xi,AuthPluginSchema:()=>bi,BasePluginSchema:()=>Gr,CONFIG_FILES:()=>Ni,CONFIG_PRESETS:()=>W,ConfigSchema:()=>Zr,ContextConfigSchema:()=>Hr,DEFAULT_CONFIG:()=>ot,DashboardConfigSchema:()=>Jr,DatabasePluginSchema:()=>Ei,EmailPluginSchema:()=>Ai,MonitoringPluginSchema:()=>Oi,PathsConfigSchema:()=>Wr,PaymentsPluginSchema:()=>Ti,PluginSchema:()=>Va,PluginsSchema:()=>Fr,ProjectConfigSchema:()=>Yr,QualityCheckSchema:()=>vt,QualityConfigSchema:()=>Kr,SecurityPluginSchema:()=>ki,SkillConfigSchema:()=>Ii,SkillsConfigSchema:()=>Ur,StackConfigSchema:()=>Xr,TestingPluginSchema:()=>wi,WorkflowConfigSchema:()=>$i,WorkflowPhaseSchema:()=>ji,WorkflowsConfigSchema:()=>Vr,applyPreset:()=>Ri,combinePresets:()=>Ha,createCustomPreset:()=>Xa,deepMerge:()=>_e,findConfigFile:()=>Li,findProjectRoot:()=>tn,formatValidationErrors:()=>en,getDefaults:()=>sc,getPreset:()=>Ka,getPresetsByTag:()=>Ya,getValidationHint:()=>rc,listPresets:()=>Za,load:()=>Yt,loadWithValidation:()=>tc,parseConfig:()=>nc,parsePresetString:()=>Wa,resolvePresetChain:()=>Qr,save:()=>ec,validate:()=>rn,validatePresets:()=>Ja,validateSection:()=>Di});A();var ke=y(require("fs")),Z=y(require("path"));A();var o=require("zod"),Gr=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.string().optional(),features:o.z.array(o.z.string()).optional().default([])}).passthrough(),bi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["clerk","nextauth","auth0","supabase","jwt","custom"]).optional(),features:o.z.array(o.z.enum(["social_login","email_password","magic_link","sso","mfa","rbac","passwordless"])).optional().default([])}).passthrough(),Ti=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["stripe","paddle","lemonsqueezy","paypal","custom"]).optional(),features:o.z.array(o.z.enum(["checkout","subscriptions","invoices","usage_billing","trials","coupons"])).optional().default([])}).passthrough(),Ei=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.enum(["prisma","drizzle","typeorm","kysely","custom"]).optional(),features:o.z.array(o.z.enum(["migrations","transactions","seeding","multi_tenant","full_text_search","soft_delete"])).optional().default([])}).passthrough(),wi=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.enum(["vitest","jest","playwright","cypress","custom"]).optional(),features:o.z.array(o.z.enum(["unit","integration","e2e","coverage","snapshot","mocking"])).optional().default([])}).passthrough(),ki=o.z.object({enabled:o.z.boolean().optional().default(!0),provider:o.z.string().optional(),features:o.z.array(o.z.enum(["input_validation","rate_limiting","csrf","xss","sql_injection","audit","rbac","encryption","secrets_management"])).optional().default([])}).passthrough(),Pi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["anthropic","openai","google","cohere","custom"]).optional(),features:o.z.array(o.z.enum(["streaming","tool_use","embeddings","rag","agents","vision"])).optional().default([])}).passthrough(),Ai=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["resend","sendgrid","postmark","ses","mailgun","custom"]).optional(),features:o.z.array(o.z.enum(["transactional","marketing","templates","tracking"])).optional().default([])}).passthrough(),xi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["posthog","amplitude","mixpanel","google_analytics","custom"]).optional(),features:o.z.array(o.z.enum(["page_views","events","user_tracking","funnels","experiments"])).optional().default([])}).passthrough(),Oi=o.z.object({enabled:o.z.boolean().optional().default(!1),provider:o.z.enum(["sentry","datadog","newrelic","logrocket","custom"]).optional(),features:o.z.array(o.z.enum(["error_tracking","performance","logs","alerts","apm"])).optional().default([])}).passthrough(),Fr=o.z.object({auth:bi.optional(),payments:Ti.optional(),database:Ei.optional(),testing:wi.optional(),security:ki.optional(),ai:Pi.optional(),email:Ai.optional(),analytics:xi.optional(),monitoring:Oi.optional()}).catchall(Gr),Va=Gr,Ci=o.z.object({enabled:o.z.boolean().optional().default(!0),expertise:o.z.array(o.z.string()).optional(),customInstructions:o.z.string().optional(),priority:o.z.enum(["high","medium","low"]).optional().default("medium")}).passthrough(),Br=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),Ci).optional(),defaults:o.z.array(o.z.string()).optional(),settings:o.z.object({maxConcurrent:o.z.number().int().min(1).max(10).optional().default(3),timeout:o.z.number().int().min(1e3).max(3e5).optional().default(6e4),verbose:o.z.boolean().optional().default(!1)}).optional()}).passthrough(),Ii=o.z.object({enabled:o.z.boolean().optional().default(!0),tier:o.z.enum(["free","pro","premium"]).optional().default("free"),category:o.z.string().optional(),maxChars:o.z.number().int().min(100).optional()}).passthrough(),Ur=o.z.object({categories:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),Ii).optional(),external:o.z.object({enabled:o.z.boolean().optional().default(!1),manifestUrl:o.z.string().url().optional(),cacheDir:o.z.string().optional(),requireSignature:o.z.boolean().optional().default(!1)}).optional(),settings:o.z.object({defaultMaxChars:o.z.number().int().min(100).optional().default(5e4),summaryByDefault:o.z.boolean().optional().default(!1),includeExternal:o.z.boolean().optional().default(!1)}).optional()}).passthrough(),ji=o.z.object({name:o.z.string().min(1,"Phase name is required"),agents:o.z.array(o.z.string()).min(1,"At least one agent is required"),duration:o.z.string().optional(),parallel:o.z.boolean().optional().default(!1),description:o.z.string().optional()}).passthrough(),$i=o.z.object({name:o.z.string().min(1,"Workflow name is required"),description:o.z.string().optional(),tier:o.z.enum(["free","pro"]).optional().default("free"),pack:o.z.string().optional(),outcomes:o.z.array(o.z.string()).optional(),completionSignals:o.z.array(o.z.string()).optional(),phases:o.z.array(ji).min(1,"At least one phase is required")}).passthrough(),Vr=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),$i).optional(),default:o.z.string().optional(),settings:o.z.object({autoAdvance:o.z.boolean().optional().default(!0),pauseBetweenPhases:o.z.boolean().optional().default(!1),trackSignals:o.z.boolean().optional().default(!0),emitTelemetry:o.z.boolean().optional().default(!0)}).optional()}).passthrough(),vt=o.z.union([o.z.boolean(),o.z.object({enabled:o.z.boolean().optional().default(!0),checks:o.z.array(o.z.enum(["lint","typecheck","test","build","security","coverage","format"])).optional()})]),Kr=o.z.object({preCommit:vt.optional().default(!0),prePush:vt.optional().default(!1),preDeploy:vt.optional(),strictMode:o.z.boolean().optional().default(!1),coverage:o.z.object({statements:o.z.number().min(0).max(100).optional(),branches:o.z.number().min(0).max(100).optional(),functions:o.z.number().min(0).max(100).optional(),lines:o.z.number().min(0).max(100).optional()}).optional()}).passthrough(),Hr=o.z.object({includeEnvVars:o.z.boolean().optional().default(!0),includeTechStack:o.z.boolean().optional().default(!0),includePlugins:o.z.boolean().optional().default(!0),includeGitInfo:o.z.boolean().optional().default(!0),includeTodos:o.z.boolean().optional().default(!0),includeLearnings:o.z.boolean().optional().default(!0),customSections:o.z.array(o.z.object({title:o.z.string(),content:o.z.string()})).optional().default([]),maxSize:o.z.number().int().min(1e3).optional()}).passthrough(),Wr=o.z.object({context:o.z.string().optional().default("CLAUDE.md"),config:o.z.string().optional().default("bootspring.config.js"),todo:o.z.string().optional().default("planning/TODO.md"),roadmap:o.z.string().optional().default("ROADMAP.md"),changelog:o.z.string().optional().default("CHANGELOG.md"),state:o.z.string().optional().default(".bootspring")}).passthrough(),Jr=o.z.object({port:o.z.number().int().min(1024).max(65535).optional().default(3456),autoOpen:o.z.boolean().optional().default(!1),host:o.z.string().optional().default("localhost"),theme:o.z.enum(["light","dark","system"]).optional().default("system")}).passthrough(),Yr=o.z.object({name:o.z.string().min(1,"Project name is required"),description:o.z.string().optional().default(""),version:o.z.string().regex(/^\d+\.\d+\.\d+/,"Version must be semver format").optional().default("1.0.0"),author:o.z.string().optional(),license:o.z.string().optional(),repository:o.z.string().url().optional()}).passthrough(),Xr=o.z.object({framework:o.z.enum(["nextjs","remix","nuxt","sveltekit","astro","express","fastify","hono","custom"]).optional(),language:o.z.enum(["typescript","javascript"]).optional(),database:o.z.enum(["postgresql","mysql","mongodb","sqlite","supabase","planetscale","none"]).optional(),hosting:o.z.enum(["vercel","railway","render","fly","aws","gcp","azure","cloudflare","self-hosted","custom"]).optional()}).passthrough(),Zr=o.z.object({project:Yr.optional(),stack:Xr.optional(),plugins:Fr.optional(),agents:Br.optional(),skills:Ur.optional(),workflows:Vr.optional(),dashboard:Jr.optional(),quality:Kr.optional(),context:Hr.optional(),paths:Wr.optional(),mcp:o.z.object({enabled:o.z.boolean().optional().default(!1),servers:o.z.record(o.z.string(),o.z.object({command:o.z.string(),args:o.z.array(o.z.string()).optional(),env:o.z.record(o.z.string(),o.z.string()).optional()})).optional()}).optional()}).passthrough(),ot={project:{name:"My Project",description:"",version:"1.0.0"},stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!1,provider:"clerk"},payments:{enabled:!1,provider:"stripe"},database:{enabled:!0,provider:"prisma"},testing:{enabled:!0,provider:"vitest"},security:{enabled:!0},ai:{enabled:!1}},dashboard:{port:3456,autoOpen:!1},quality:{preCommit:!0,prePush:!1,strictMode:!1},paths:{context:"CLAUDE.md",config:"bootspring.config.js",todo:"planning/TODO.md"}};function _e(e,t){let r={...e};for(let n of Object.keys(t)){let s=t[n],i=e[n];Array.isArray(s)?r[n]=[...s]:s!==null&&typeof s=="object"&&!Array.isArray(s)&&i!==null&&typeof i=="object"&&!Array.isArray(i)?r[n]=_e(i,s):s!==void 0&&(r[n]=s)}return r}A();var W={"saas-starter":{name:"SaaS Starter",description:"Full SaaS setup with auth, payments, and database",tags:["fullstack","production","monetization"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!0,provider:"clerk",features:["email_password","social_login"]},payments:{enabled:!0,provider:"stripe",features:["checkout","subscriptions"]},database:{enabled:!0,provider:"prisma",features:["migrations","seeding"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration"]},security:{enabled:!0,features:["input_validation","rate_limiting"]},email:{enabled:!0,provider:"resend",features:["transactional"]},analytics:{enabled:!0,provider:"posthog",features:["events","user_tracking"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}},"api-only":{name:"API Only",description:"Headless API configuration without frontend",tags:["backend","headless","microservice"],extends:null,config:{stack:{framework:"express",language:"typescript",database:"postgresql",hosting:"railway"},plugins:{auth:{enabled:!0,provider:"jwt",features:["email_password"]},payments:{enabled:!1},database:{enabled:!0,provider:"prisma",features:["migrations","transactions"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration"]},security:{enabled:!0,features:["input_validation","rate_limiting","csrf"]},monitoring:{enabled:!0,provider:"sentry",features:["error_tracking","performance"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!0,strictMode:!0}}},"static-site":{name:"Static Site",description:"Simple static site setup with optional CMS",tags:["static","content","marketing"],extends:null,config:{stack:{framework:"astro",language:"typescript",database:"none",hosting:"vercel"},plugins:{auth:{enabled:!1},payments:{enabled:!1},database:{enabled:!1},testing:{enabled:!0,provider:"vitest",features:["unit"]},security:{enabled:!0,features:["xss"]},analytics:{enabled:!0,provider:"google_analytics",features:["page_views"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}},enterprise:{name:"Enterprise",description:"Enterprise-grade configuration with all security and quality features",tags:["enterprise","security","compliance"],extends:"saas-starter",config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"aws"},plugins:{auth:{enabled:!0,provider:"clerk",features:["sso","mfa","rbac"]},payments:{enabled:!0,provider:"stripe",features:["checkout","subscriptions","invoices"]},database:{enabled:!0,provider:"prisma",features:["migrations","transactions","multi_tenant","soft_delete"]},testing:{enabled:!0,provider:"vitest",features:["unit","integration","e2e","coverage"]},security:{enabled:!0,features:["input_validation","rate_limiting","csrf","audit","rbac","encryption"]},monitoring:{enabled:!0,provider:"datadog",features:["error_tracking","performance","logs","apm"]},email:{enabled:!0,provider:"ses",features:["transactional","tracking"]},ai:{enabled:!1}},quality:{preCommit:!0,prePush:!0,preDeploy:{enabled:!0,checks:["lint","typecheck","test","build","security"]},strictMode:!0,coverage:{statements:80,branches:75,functions:80,lines:80}}}},minimal:{name:"Minimal",description:"Bare minimum setup for quick prototyping",tags:["prototype","minimal","quick"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"none",hosting:"vercel"},plugins:{auth:{enabled:!1},payments:{enabled:!1},database:{enabled:!1},testing:{enabled:!1},security:{enabled:!0},ai:{enabled:!1}},quality:{preCommit:!1,prePush:!1,strictMode:!1}}},"ai-app":{name:"AI Application",description:"AI-powered application with Claude integration",tags:["ai","llm","anthropic"],extends:null,config:{stack:{framework:"nextjs",language:"typescript",database:"postgresql",hosting:"vercel"},plugins:{auth:{enabled:!0,provider:"clerk",features:["email_password"]},payments:{enabled:!1},database:{enabled:!0,provider:"prisma",features:["migrations"]},testing:{enabled:!0,provider:"vitest",features:["unit","mocking"]},security:{enabled:!0,features:["input_validation","rate_limiting"]},ai:{enabled:!0,provider:"anthropic",features:["streaming","tool_use"]}},quality:{preCommit:!0,prePush:!1,strictMode:!1}}}};function Ka(e){return W[e]??null}function Qr(e,t=new Set){let r=W[e];if(!r)throw new Error(`Unknown preset: ${e}. Available: ${Object.keys(W).join(", ")}`);if(t.has(e))throw new Error(`Circular preset inheritance detected: ${e}`);t.add(e);let n={...ot};if(r.extends){let s=Qr(r.extends,t);n=_e(n,s)}return n=_e(n,r.config),n}function Ri(e,t={}){let r=Array.isArray(e)?e:[e];if(r.length===0)throw new Error("At least one preset name is required");let n={...ot};for(let s of r){let i=s.trim(),a=Qr(i);n=_e(n,a)}return n=_e(n,t),n}function Ha(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("combinePresets requires a non-empty array of preset names");return Ri(e,t)}function Wa(e){return!e||typeof e!="string"?[]:e.split(",").map(t=>t.trim()).filter(Boolean)}function Ja(e){let t=Array.isArray(e)?e:[e],r=[],n=[],s=Object.keys(W);for(let i of t)W[i]?n.push(i):r.push(`Unknown preset: "${i}". Available: ${s.join(", ")}`);return{valid:r.length===0,errors:r,validPresets:n}}function Ya(e){return Object.entries(W).filter(([,t])=>t.tags&&t.tags.includes(e)).map(([t])=>t)}function Xa(e,t,r={}){let n=W[e];if(!n)throw new Error(`Unknown base preset: ${e}`);return{name:t,description:`Custom preset based on ${n.name}`,tags:[...n.tags||[],"custom"],extends:e,config:r}}function Za(e={}){let t=Object.entries(W);return e.tag&&(t=t.filter(([,r])=>r.tags&&r.tags.includes(e.tag))),t.map(([r,n])=>{let s={key:r,name:n.name,description:n.description};return e.verbose&&(s.tags=n.tags||[],s.extends=n.extends),s})}var Ni=["bootspring.config.js","bootspring.config.mjs","bootspring.config.json",".bootspringrc",".bootspringrc.js",".bootspringrc.json"];function en(e){return e.issues.map(t=>{let r=t.path.join("."),n=r?`${r}: `:"",s=t,i=t.code,a=t.message;return i==="invalid_type"&&"expected"in s?`${n}Expected ${s.expected}, received ${typeof s.input}`:i==="invalid_value"?`${n}Invalid value`:i==="too_small"&&"minimum"in s?`${n}Value must be at least ${s.minimum}`:i==="too_big"&&"maximum"in s?`${n}Value must be at most ${s.maximum}`:i==="invalid_format"?`${n}Invalid format`:`${n}${a}`})}var Qa={project:Yr,stack:Xr,plugins:Fr,agents:Br,skills:Ur,workflows:Vr,dashboard:Jr,quality:Kr,context:Hr,paths:Wr};function Di(e,t){let r=Qa[e];if(!r)return{valid:!1,errors:[`Unknown configuration section: ${e}`],data:null};let n=r.safeParse(t);return n.success?{valid:!0,errors:[],data:n.data}:{valid:!1,errors:en(n.error),data:null}}function tn(){let e=process.cwd(),t=Z.parse(e).root;for(;e!==t;){if(ke.existsSync(Z.join(e,"package.json"))||ke.existsSync(Z.join(e,"bootspring.config.js"))||ke.existsSync(Z.join(e,".git")))return e;e=Z.dirname(e)}return process.cwd()}function Li(e){for(let t of Ni){let r=Z.join(e,t);if(ke.existsSync(r))return r}return null}function Yt(e=null){let t=e??tn(),r=Li(t),n={};if(r)try{if(r.endsWith(".json")||r.endsWith(".bootspringrc")){let i=ke.readFileSync(r,"utf-8");n=JSON.parse(i)}else delete require.cache[require.resolve(r)],n=require(r)}catch(i){let a=i instanceof Error?i.message:String(i);console.warn(`Warning: Could not load config from ${r}: ${a}`)}let s=_e(ot,n);return s._projectRoot=t,s._configPath=r,s._bootspringDir=Z.join(t,".bootspring"),s}function ec(e,t=null){let r=e._projectRoot??tn(),n=t??Z.join(r,"bootspring.config.js"),s={...e};delete s._projectRoot,delete s._configPath,delete s._bootspringDir,delete s._validation;let i=`/**
59
61
  * Bootspring Configuration
60
62
  * https://bootspring.com/docs/configuration
61
63
  */
62
64
 
63
65
  module.exports = ${JSON.stringify(s,null,2)};
64
- `;try{return we.writeFileSync(n,i,"utf-8"),!0}catch(a){let c=a instanceof Error?a.message:String(a);return console.error(`Error saving config: ${c}`),!1}}function rn(e,t={}){let r={...e};delete r._projectRoot,delete r._configPath,delete r._bootspringDir,delete r._validation;let n=[],s=[];if(t.sections&&t.sections.length>0){let a=!0,c={};for(let l of t.sections){let u=r[l];if(u!==void 0){let f=Di(l,u);f.valid?c[l]=f.data:(a=!1,n.push(...f.errors))}}return{valid:a,errors:n,warnings:s,data:a?c:null}}let i=Zr.safeParse(r);return i.success?{valid:!0,errors:[],warnings:s,data:i.data}:{valid:!1,errors:en(i.error),warnings:s,data:null}}function Qa(e=null,t={}){let{validate:r=!0,strict:n=!1,silent:s=!1}=t,i=Yt(e);if(!r)return i._validation={skipped:!0},i;let a=rn(i);if(i._validation={valid:a.valid,errors:a.errors,warnings:a.warnings??[],validatedAt:new Date().toISOString()},!a.valid){if(n){let c=`Configuration validation failed:
66
+ `;try{return ke.writeFileSync(n,i,"utf-8"),!0}catch(a){let c=a instanceof Error?a.message:String(a);return console.error(`Error saving config: ${c}`),!1}}function rn(e,t={}){let r={...e};delete r._projectRoot,delete r._configPath,delete r._bootspringDir,delete r._validation;let n=[],s=[];if(t.sections&&t.sections.length>0){let a=!0,c={};for(let l of t.sections){let u=r[l];if(u!==void 0){let g=Di(l,u);g.valid?c[l]=g.data:(a=!1,n.push(...g.errors))}}return{valid:a,errors:n,warnings:s,data:a?c:null}}let i=Zr.safeParse(r);return i.success?{valid:!0,errors:[],warnings:s,data:i.data}:{valid:!1,errors:en(i.error),warnings:s,data:null}}function tc(e=null,t={}){let{validate:r=!0,strict:n=!1,silent:s=!1}=t,i=Yt(e);if(!r)return i._validation={skipped:!0},i;let a=rn(i);if(i._validation={valid:a.valid,errors:a.errors,warnings:a.warnings??[],validatedAt:new Date().toISOString()},!a.valid){if(n){let c=`Configuration validation failed:
65
67
  ${a.errors.map(l=>` - ${l}`).join(`
66
- `)}`;throw new Error(c)}s||(console.warn("\x1B[33mWarning: Configuration has validation issues:\x1B[0m"),a.errors.forEach(c=>{console.warn(` \x1B[33m- ${c}\x1B[0m`)}),console.warn("\x1B[33mThe configuration will still be used, but some features may not work correctly.\x1B[0m"))}return i}function ec(e){return{"stack.framework":"Valid frameworks: nextjs, remix, nuxt, sveltekit, astro, express, fastify, hono, custom","stack.language":"Valid languages: typescript, javascript","stack.database":"Valid databases: postgresql, mysql, mongodb, sqlite, supabase, planetscale, none","stack.hosting":"Valid hosting options: vercel, railway, render, fly, aws, gcp, azure, cloudflare, self-hosted, custom","plugins.auth.provider":"Valid auth providers: clerk, nextauth, auth0, supabase, jwt, custom","plugins.payments.provider":"Valid payment providers: stripe, paddle, lemonsqueezy, paypal, custom","plugins.database.provider":"Valid database ORMs: prisma, drizzle, typeorm, kysely, custom","plugins.testing.provider":"Valid test frameworks: vitest, jest, playwright, cypress, custom","plugins.ai.providers":"Valid AI providers: anthropic, openai, google, cohere, huggingface, custom","dashboard.port":"Port must be between 1024 and 65535","project.version":"Version must follow semver format (e.g., 1.0.0)"}[e]??null}function tc(e){let t={...e};delete t._projectRoot,delete t._configPath,delete t._bootspringDir,delete t._validation;let r=Zr.safeParse(t);return r.success?r.data:t}function rc(){return{...ot}}var qi={};O(qi,{generateSummary:()=>sc,get:()=>Mi,getEnabledPlugins:()=>zi,getGitInfo:()=>Fi,getProjectFiles:()=>Gi,getProjectState:()=>Bi,validate:()=>nc});A();var k=v(require("path")),y=v((Ee(),Le(Te)));function Mi(e={}){let t=e.config??Yt(),r=t._projectRoot??process.cwd();return{project:t.project,stack:t.stack,plugins:zi(t),files:Gi(r),git:Fi(r),state:Bi(r,t),timestamp:new Date().toISOString()}}function zi(e){let t={},r=e.plugins??{};for(let[n,s]of Object.entries(r))s&&s.enabled!==!1&&(t[n]={provider:s.provider??"default",features:s.features??[]});return t}function Gi(e){let t={hasPackageJson:y.fileExists(k.join(e,"package.json")),hasTsConfig:y.fileExists(k.join(e,"tsconfig.json")),hasClaudeMd:y.fileExists(k.join(e,"CLAUDE.md")),hasBootspringConfig:y.fileExists(k.join(e,"bootspring.config.js")),hasTodoMd:y.fileExists(k.join(e,"planning","TODO.md")),hasGit:y.fileExists(k.join(e,".git")),hasSrcDir:y.fileExists(k.join(e,"src")),hasAppDir:y.fileExists(k.join(e,"app")),hasPagesDir:y.fileExists(k.join(e,"pages")),structure:"flat"};return t.hasAppDir?t.structure="app-router":t.hasPagesDir?t.structure="pages-router":t.hasSrcDir&&(t.structure="src-based"),t}function Fi(e){let t=k.join(e,".git");if(!y.fileExists(t))return{initialized:!1};let r={initialized:!0},n=k.join(t,"HEAD");if(y.fileExists(n)){let i=y.readFile(n);if(i){let a=i.trim();a.startsWith("ref: refs/heads/")&&(r.branch=a.replace("ref: refs/heads/",""))}}let s=k.join(t,"config");if(y.fileExists(s)){let i=y.readFile(s);i&&(r.hasRemote=i.includes('[remote "origin"]'))}return r}function Bi(e,t){let r={phase:"unknown",health:"unknown",todos:0,lastGenerated:null},n=k.join(e,t.paths?.todo??"planning/TODO.md");if(y.fileExists(n)){let c=y.readFile(n);if(c){let l=c.match(/- \[ \]/g);r.todos=l?l.length:0}}let s=k.join(e,t.paths?.context??"CLAUDE.md");y.fileExists(s)&&(r.lastGenerated=y.getFileTime(s));let i=t;i._configPath?r.lastGenerated?r.phase="active":r.phase="initialized":r.phase="uninitialized";let a=[];return y.fileExists(k.join(e,"package.json"))||a.push("missing-package-json"),i._configPath||a.push("missing-config"),r.lastGenerated||a.push("missing-context"),a.length===0?r.health="good":a.length<=2?r.health="fair":r.health="needs-attention",r.issues=a,r}function nc(e={}){let t=e.config??Yt(),r=t._projectRoot??process.cwd(),n=[],s=0,i=10;t._configPath?(n.push({name:"Configuration",status:"pass",message:"bootspring.config.js found"}),s+=2):n.push({name:"Configuration",status:"fail",message:"bootspring.config.js missing"});let a=k.join(r,t.paths?.context??"CLAUDE.md");y.fileExists(a)?(n.push({name:"AI Context",status:"pass",message:"CLAUDE.md exists"}),s+=2):n.push({name:"AI Context",status:"fail",message:"CLAUDE.md missing - run bootspring generate"}),y.fileExists(k.join(r,"package.json"))?(n.push({name:"Package",status:"pass",message:"package.json found"}),s+=1):n.push({name:"Package",status:"warn",message:"package.json missing"}),y.fileExists(k.join(r,".git"))?(n.push({name:"Git",status:"pass",message:"Git repository initialized"}),s+=1):n.push({name:"Git",status:"warn",message:"Git not initialized"}),t.stack?.language==="typescript"?y.fileExists(k.join(r,"tsconfig.json"))?(n.push({name:"TypeScript",status:"pass",message:"tsconfig.json found"}),s+=1):n.push({name:"TypeScript",status:"fail",message:"tsconfig.json missing for TypeScript project"}):s+=1;let c=rn(t);return c.valid?(n.push({name:"Config Validation",status:"pass",message:"Configuration is valid"}),s+=2):n.push({name:"Config Validation",status:"fail",message:c.errors.join(", ")}),y.fileExists(k.join(r,t.paths?.todo??"planning/TODO.md"))?(n.push({name:"Todo Tracking",status:"pass",message:"planning/TODO.md exists"}),s+=1):n.push({name:"Todo Tracking",status:"fail",message:"planning/TODO.md not found"}),{valid:s>=i*.6,score:s,maxScore:i,percentage:Math.round(s/i*100),checks:n}}function sc(e={}){let t=Mi(e),r=["# Project Context","",`**Project**: ${t.project?.name??"Unknown"}`,`**Generated**: ${t.timestamp}`,"","## Stack",`- Framework: ${t.stack?.framework??"unknown"}`,`- Language: ${t.stack?.language??"unknown"}`,`- Database: ${t.stack?.database??"unknown"}`,`- Hosting: ${t.stack?.hosting??"unknown"}`,""];if(Object.keys(t.plugins).length>0){r.push("## Enabled Plugins");for(let[s,i]of Object.entries(t.plugins))r.push(`- **${s}**: ${i.provider}`);r.push("")}return r.push("## Project State"),r.push(`- Phase: ${t.state.phase}`),r.push(`- Health: ${t.state.health}`),r.push(`- Open Todos: ${t.state.todos}`),t.state.lastGenerated&&r.push(`- Context Last Generated: ${y.formatRelativeTime(t.state.lastGenerated)}`),r.push(""),t.git.initialized&&(r.push("## Git"),r.push(`- Branch: ${t.git.branch??"unknown"}`),r.push(`- Remote: ${t.git.hasRemote?"configured":"not configured"}`),r.push("")),r.join(`
67
- `)}os()});var Xi=tr((gl,Yi)=>{"use strict";P();var ic=Object.create,Zt=Object.defineProperty,oc=Object.getOwnPropertyDescriptor,ac=Object.getOwnPropertyNames,cc=Object.getPrototypeOf,lc=Object.prototype.hasOwnProperty,uc=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:!0})},Vi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ac(t))!lc.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=oc(t,s))||n.enumerable});return e},Qt=(e,t,r)=>(r=e!=null?ic(cc(e)):{},Vi(t||!e||!e.__esModule?Zt(r,"default",{value:e,enumerable:!0}):r,e)),pc=e=>Vi(Zt({},"__esModule",{value:!0}),e),Ki={};uc(Ki,{BOOTSPRING_PACKAGE_NAME:()=>Rc,BOOTSPRING_VERSION:()=>$c,COLORS:()=>d,REDACTED:()=>be,SENSITIVE_KEY_PATTERN:()=>Wi,createSpinner:()=>hc,createTable:()=>Cc,deepClone:()=>Ac,ensureDir:()=>Hi,fileExists:()=>Sc,formatDate:()=>Tc,formatRelativeTime:()=>Ec,getFileTime:()=>bc,getPackageJson:()=>Oc,isCI:()=>Pc,isMCPContext:()=>on,parseArgs:()=>xc,print:()=>mc,readFile:()=>vc,redactErrorMessage:()=>Nc,redactPatternMatches:()=>Ji,redactSensitiveData:()=>sn,redactSensitiveString:()=>Xt,requireMCP:()=>Ic,slugify:()=>wc,truncate:()=>kc,warnMCPLimited:()=>jc,writeFile:()=>yc});Yi.exports=pc(Ki);var dc=Qt(require("fs")),fc=Qt(require("path")),d={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"},gc=e=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e==null?String(e):JSON.stringify(e),R=(e=>console.log(e));R.info=e=>console.log(`${d.cyan}\u2139${d.reset} ${e}`);R.success=e=>console.log(`${d.green}\u2713${d.reset} ${e}`);R.warning=e=>console.log(`${d.yellow}\u26A0${d.reset} ${e}`);R.error=e=>console.log(`${d.red}\u2717${d.reset} ${e}`);R.debug=e=>{process.env.DEBUG&&console.log(`${d.dim}\u22EF ${e}${d.reset}`)};R.header=e=>console.log(`
68
+ `)}`;throw new Error(c)}s||(console.warn("\x1B[33mWarning: Configuration has validation issues:\x1B[0m"),a.errors.forEach(c=>{console.warn(` \x1B[33m- ${c}\x1B[0m`)}),console.warn("\x1B[33mThe configuration will still be used, but some features may not work correctly.\x1B[0m"))}return i}function rc(e){return{"stack.framework":"Valid frameworks: nextjs, remix, nuxt, sveltekit, astro, express, fastify, hono, custom","stack.language":"Valid languages: typescript, javascript","stack.database":"Valid databases: postgresql, mysql, mongodb, sqlite, supabase, planetscale, none","stack.hosting":"Valid hosting options: vercel, railway, render, fly, aws, gcp, azure, cloudflare, self-hosted, custom","plugins.auth.provider":"Valid auth providers: clerk, nextauth, auth0, supabase, jwt, custom","plugins.payments.provider":"Valid payment providers: stripe, paddle, lemonsqueezy, paypal, custom","plugins.database.provider":"Valid database ORMs: prisma, drizzle, typeorm, kysely, custom","plugins.testing.provider":"Valid test frameworks: vitest, jest, playwright, cypress, custom","plugins.ai.providers":"Valid AI providers: anthropic, openai, google, cohere, huggingface, custom","dashboard.port":"Port must be between 1024 and 65535","project.version":"Version must follow semver format (e.g., 1.0.0)"}[e]??null}function nc(e){let t={...e};delete t._projectRoot,delete t._configPath,delete t._bootspringDir,delete t._validation;let r=Zr.safeParse(t);return r.success?r.data:t}function sc(){return{...ot}}var qi={};C(qi,{generateSummary:()=>oc,get:()=>Mi,getEnabledPlugins:()=>zi,getGitInfo:()=>Fi,getProjectFiles:()=>Gi,getProjectState:()=>Bi,validate:()=>ic});A();var w=y(require("path")),S=y((we(),qe(Ee)));function Mi(e={}){let t=e.config??Yt(),r=t._projectRoot??process.cwd();return{project:t.project,stack:t.stack,plugins:zi(t),files:Gi(r),git:Fi(r),state:Bi(r,t),timestamp:new Date().toISOString()}}function zi(e){let t={},r=e.plugins??{};for(let[n,s]of Object.entries(r))s&&s.enabled!==!1&&(t[n]={provider:s.provider??"default",features:s.features??[]});return t}function Gi(e){let t={hasPackageJson:S.fileExists(w.join(e,"package.json")),hasTsConfig:S.fileExists(w.join(e,"tsconfig.json")),hasClaudeMd:S.fileExists(w.join(e,"CLAUDE.md")),hasBootspringConfig:S.fileExists(w.join(e,"bootspring.config.js")),hasTodoMd:S.fileExists(w.join(e,"planning","TODO.md")),hasGit:S.fileExists(w.join(e,".git")),hasSrcDir:S.fileExists(w.join(e,"src")),hasAppDir:S.fileExists(w.join(e,"app")),hasPagesDir:S.fileExists(w.join(e,"pages")),structure:"flat"};return t.hasAppDir?t.structure="app-router":t.hasPagesDir?t.structure="pages-router":t.hasSrcDir&&(t.structure="src-based"),t}function Fi(e){let t=w.join(e,".git");if(!S.fileExists(t))return{initialized:!1};let r={initialized:!0},n=w.join(t,"HEAD");if(S.fileExists(n)){let i=S.readFile(n);if(i){let a=i.trim();a.startsWith("ref: refs/heads/")&&(r.branch=a.replace("ref: refs/heads/",""))}}let s=w.join(t,"config");if(S.fileExists(s)){let i=S.readFile(s);i&&(r.hasRemote=i.includes('[remote "origin"]'))}return r}function Bi(e,t){let r={phase:"unknown",health:"unknown",todos:0,lastGenerated:null},n=w.join(e,t.paths?.todo??"planning/TODO.md");if(S.fileExists(n)){let c=S.readFile(n);if(c){let l=c.match(/- \[ \]/g);r.todos=l?l.length:0}}let s=w.join(e,t.paths?.context??"CLAUDE.md");S.fileExists(s)&&(r.lastGenerated=S.getFileTime(s));let i=t;i._configPath?r.lastGenerated?r.phase="active":r.phase="initialized":r.phase="uninitialized";let a=[];return S.fileExists(w.join(e,"package.json"))||a.push("missing-package-json"),i._configPath||a.push("missing-config"),r.lastGenerated||a.push("missing-context"),a.length===0?r.health="good":a.length<=2?r.health="fair":r.health="needs-attention",r.issues=a,r}function ic(e={}){let t=e.config??Yt(),r=t._projectRoot??process.cwd(),n=[],s=0,i=10;t._configPath?(n.push({name:"Configuration",status:"pass",message:"bootspring.config.js found"}),s+=2):n.push({name:"Configuration",status:"fail",message:"bootspring.config.js missing"});let a=w.join(r,t.paths?.context??"CLAUDE.md");S.fileExists(a)?(n.push({name:"AI Context",status:"pass",message:"CLAUDE.md exists"}),s+=2):n.push({name:"AI Context",status:"fail",message:"CLAUDE.md missing - run bootspring generate"}),S.fileExists(w.join(r,"package.json"))?(n.push({name:"Package",status:"pass",message:"package.json found"}),s+=1):n.push({name:"Package",status:"warn",message:"package.json missing"}),S.fileExists(w.join(r,".git"))?(n.push({name:"Git",status:"pass",message:"Git repository initialized"}),s+=1):n.push({name:"Git",status:"warn",message:"Git not initialized"}),t.stack?.language==="typescript"?S.fileExists(w.join(r,"tsconfig.json"))?(n.push({name:"TypeScript",status:"pass",message:"tsconfig.json found"}),s+=1):n.push({name:"TypeScript",status:"fail",message:"tsconfig.json missing for TypeScript project"}):s+=1;let c=rn(t);return c.valid?(n.push({name:"Config Validation",status:"pass",message:"Configuration is valid"}),s+=2):n.push({name:"Config Validation",status:"fail",message:c.errors.join(", ")}),S.fileExists(w.join(r,t.paths?.todo??"planning/TODO.md"))?(n.push({name:"Todo Tracking",status:"pass",message:"planning/TODO.md exists"}),s+=1):n.push({name:"Todo Tracking",status:"fail",message:"planning/TODO.md not found"}),{valid:s>=i*.6,score:s,maxScore:i,percentage:Math.round(s/i*100),checks:n}}function oc(e={}){let t=Mi(e),r=["# Project Context","",`**Project**: ${t.project?.name??"Unknown"}`,`**Generated**: ${t.timestamp}`,"","## Stack",`- Framework: ${t.stack?.framework??"unknown"}`,`- Language: ${t.stack?.language??"unknown"}`,`- Database: ${t.stack?.database??"unknown"}`,`- Hosting: ${t.stack?.hosting??"unknown"}`,""];if(Object.keys(t.plugins).length>0){r.push("## Enabled Plugins");for(let[s,i]of Object.entries(t.plugins))r.push(`- **${s}**: ${i.provider}`);r.push("")}return r.push("## Project State"),r.push(`- Phase: ${t.state.phase}`),r.push(`- Health: ${t.state.health}`),r.push(`- Open Todos: ${t.state.todos}`),t.state.lastGenerated&&r.push(`- Context Last Generated: ${S.formatRelativeTime(t.state.lastGenerated)}`),r.push(""),t.git.initialized&&(r.push("## Git"),r.push(`- Branch: ${t.git.branch??"unknown"}`),r.push(`- Remote: ${t.git.hasRemote?"configured":"not configured"}`),r.push("")),r.join(`
69
+ `)}os()});var Xi=tr((hl,Yi)=>{"use strict";P();var ac=Object.create,Zt=Object.defineProperty,cc=Object.getOwnPropertyDescriptor,lc=Object.getOwnPropertyNames,uc=Object.getPrototypeOf,pc=Object.prototype.hasOwnProperty,dc=(e,t)=>{for(var r in t)Zt(e,r,{get:t[r],enumerable:!0})},Vi=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of lc(t))!pc.call(e,s)&&s!==r&&Zt(e,s,{get:()=>t[s],enumerable:!(n=cc(t,s))||n.enumerable});return e},Qt=(e,t,r)=>(r=e!=null?ac(uc(e)):{},Vi(t||!e||!e.__esModule?Zt(r,"default",{value:e,enumerable:!0}):r,e)),fc=e=>Vi(Zt({},"__esModule",{value:!0}),e),Ki={};dc(Ki,{BOOTSPRING_PACKAGE_NAME:()=>Dc,BOOTSPRING_VERSION:()=>Nc,COLORS:()=>d,REDACTED:()=>Te,SENSITIVE_KEY_PATTERN:()=>Wi,createSpinner:()=>vc,createTable:()=>Ic,deepClone:()=>Oc,ensureDir:()=>Hi,fileExists:()=>Tc,formatDate:()=>wc,formatRelativeTime:()=>kc,getFileTime:()=>Ec,getPackageJson:()=>jc,isCI:()=>xc,isMCPContext:()=>on,parseArgs:()=>Cc,print:()=>_c,readFile:()=>Sc,redactErrorMessage:()=>Lc,redactPatternMatches:()=>Ji,redactSensitiveData:()=>sn,redactSensitiveString:()=>Xt,requireMCP:()=>$c,slugify:()=>Pc,truncate:()=>Ac,warnMCPLimited:()=>Rc,writeFile:()=>bc});Yi.exports=fc(Ki);var gc=Qt(require("fs")),mc=Qt(require("path")),d={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",bgBlack:"\x1B[40m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgWhite:"\x1B[47m"},hc=e=>typeof e=="string"||typeof e=="number"||typeof e=="boolean"||e==null?String(e):JSON.stringify(e),R=(e=>console.log(e));R.info=e=>console.log(`${d.cyan}\u2139${d.reset} ${e}`);R.success=e=>console.log(`${d.green}\u2713${d.reset} ${e}`);R.warning=e=>console.log(`${d.yellow}\u26A0${d.reset} ${e}`);R.error=e=>console.log(`${d.red}\u2717${d.reset} ${e}`);R.debug=e=>{process.env.DEBUG&&console.log(`${d.dim}\u22EF ${e}${d.reset}`)};R.header=e=>console.log(`
68
70
  ${d.bold}${d.cyan}${e}${d.reset}
69
71
  `);R.subheader=e=>console.log(`
70
- ${d.bold}${e}${d.reset}`);R.dim=e=>console.log(`${d.dim}${e}${d.reset}`);R.brand=e=>console.log(`${d.cyan}\u26A1${d.reset} ${e}`);R.keyValue=(e,t)=>console.log(` ${d.bold}${e}:${d.reset} ${t}`);R.list=(e,t=" ")=>{for(let r of e)console.log(`${t}- ${gc(r)}`)};R.apiError=(e,t)=>{if(t&&typeof t=="object"&&t.authHandled)return;let r=t instanceof Error?t.message:String(t);console.log(`${d.red}\u2717${d.reset} ${e}: ${r}`)};var mc=R;function hc(e){let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=null,s=process.stdout.isTTY,i=()=>{s&&process.stdout.clearLine&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))};return{start(){return s&&(process.stdout.write(`${d.cyan}${t[0]}${d.reset} ${e}`),n=setInterval(()=>{r=(r+1)%t.length,i(),process.stdout.write(`${d.cyan}${t[r]}${d.reset} ${e}`)},80)),this},succeed(c=e){return n&&clearInterval(n),i(),console.log(`${d.green}\u2713${d.reset} ${c}`),this},fail(c=e){return n&&clearInterval(n),i(),console.log(`${d.red}\u2717${d.reset} ${c}`),this},warn(c=e){return n&&clearInterval(n),i(),console.log(`${d.yellow}\u26A0${d.reset} ${c}`),this},info(c=e){return n&&clearInterval(n),i(),console.log(`${d.cyan}\u2139${d.reset} ${c}`),this},stop(){return n&&clearInterval(n),i(),this}}}var De=Qt(require("fs")),_c=Qt(require("path"));function Hi(e){try{return De.default.existsSync(e)||De.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function vc(e,t=null){try{return De.default.readFileSync(e,"utf-8")}catch{return t}}function yc(e,t){try{let r=_c.default.dirname(e);return Hi(r),De.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function Sc(e){try{return De.default.existsSync(e)}catch{return!1}}function bc(e){try{return De.default.statSync(e).mtime}catch{return null}}function Tc(e=new Date){return e.toISOString().split("T")[0]}function Ec(e){let r=new Date().getTime()-e.getTime(),n=Math.floor(r/1e3),s=Math.floor(n/60),i=Math.floor(s/60),a=Math.floor(i/24);return a>0?`${a} day${a>1?"s":""} ago`:i>0?`${i} hour${i>1?"s":""} ago`:s>0?`${s} minute${s>1?"s":""} ago`:"just now"}function wc(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function kc(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function Pc(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function on(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function Ac(e){return JSON.parse(JSON.stringify(e))}function xc(e){let t={_:[]};for(let r=0;r<e.length;r++){let n=e[r];if(n){if(n.startsWith("--")){let s=n.slice(2),i=e[r+1];if(s.includes("=")){let a=s.split("="),c=a[0],l=a.slice(1).join("=");c&&(t[c]=l)}else i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")&&n.length===2){let s=n.slice(1),i=e[r+1];i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")){let s=n.slice(1).split("");for(let i of s)i&&(t[i]=!0);continue}t._.push(n)}}return t}function Cc(e,t){let r=e.map((i,a)=>{let c=[i,...t.map(l=>String(l[a]??""))];return Math.max(...c.map(l=>l.length))}),n=r.map(i=>"\u2500".repeat(i+2)).join("\u253C"),s=i=>i.map((a,c)=>` ${String(a).padEnd(r[c]??0)} `).join("\u2502");return[s(e),n,...t.map(s)].join(`
71
- `)}function Oc(e){let t=fc.join(e,"package.json");try{return JSON.parse(dc.readFileSync(t,"utf-8"))}catch{return null}}function Ic(e,t={}){return on()?!0:t.silent?!1:t.brief?(console.log(`${d.dim}Note: ${e} has enhanced features when used with MCP integration.${d.reset}`),console.log(`${d.dim}Run "bootspring mcp" for setup instructions.${d.reset}
72
+ ${d.bold}${e}${d.reset}`);R.dim=e=>console.log(`${d.dim}${e}${d.reset}`);R.brand=e=>console.log(`${d.cyan}\u26A1${d.reset} ${e}`);R.keyValue=(e,t)=>console.log(` ${d.bold}${e}:${d.reset} ${t}`);R.list=(e,t=" ")=>{for(let r of e)console.log(`${t}- ${hc(r)}`)};R.apiError=(e,t)=>{if(t&&typeof t=="object"&&t.authHandled)return;let r=t instanceof Error?t.message:String(t);console.log(`${d.red}\u2717${d.reset} ${e}: ${r}`)};var _c=R;function vc(e){let t=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r=0,n=null,s=process.stdout.isTTY,i=()=>{s&&process.stdout.clearLine&&(process.stdout.clearLine(0),process.stdout.cursorTo(0))};return{start(){return s&&(process.stdout.write(`${d.cyan}${t[0]}${d.reset} ${e}`),n=setInterval(()=>{r=(r+1)%t.length,i(),process.stdout.write(`${d.cyan}${t[r]}${d.reset} ${e}`)},80)),this},succeed(c=e){return n&&clearInterval(n),i(),console.log(`${d.green}\u2713${d.reset} ${c}`),this},fail(c=e){return n&&clearInterval(n),i(),console.log(`${d.red}\u2717${d.reset} ${c}`),this},warn(c=e){return n&&clearInterval(n),i(),console.log(`${d.yellow}\u26A0${d.reset} ${c}`),this},info(c=e){return n&&clearInterval(n),i(),console.log(`${d.cyan}\u2139${d.reset} ${c}`),this},stop(){return n&&clearInterval(n),i(),this}}}var Le=Qt(require("fs")),yc=Qt(require("path"));function Hi(e){try{return Le.default.existsSync(e)||Le.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function Sc(e,t=null){try{return Le.default.readFileSync(e,"utf-8")}catch{return t}}function bc(e,t){try{let r=yc.default.dirname(e);return Hi(r),Le.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function Tc(e){try{return Le.default.existsSync(e)}catch{return!1}}function Ec(e){try{return Le.default.statSync(e).mtime}catch{return null}}function wc(e=new Date){return e.toISOString().split("T")[0]}function kc(e){let r=new Date().getTime()-e.getTime(),n=Math.floor(r/1e3),s=Math.floor(n/60),i=Math.floor(s/60),a=Math.floor(i/24);return a>0?`${a} day${a>1?"s":""} ago`:i>0?`${i} hour${i>1?"s":""} ago`:s>0?`${s} minute${s>1?"s":""} ago`:"just now"}function Pc(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function Ac(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function xc(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function on(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function Oc(e){return JSON.parse(JSON.stringify(e))}function Cc(e){let t={_:[]};for(let r=0;r<e.length;r++){let n=e[r];if(n){if(n.startsWith("--")){let s=n.slice(2),i=e[r+1];if(s.includes("=")){let a=s.split("="),c=a[0],l=a.slice(1).join("=");c&&(t[c]=l)}else i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")&&n.length===2){let s=n.slice(1),i=e[r+1];i&&!i.startsWith("-")?(t[s]=i,r++):t[s]=!0;continue}if(n.startsWith("-")){let s=n.slice(1).split("");for(let i of s)i&&(t[i]=!0);continue}t._.push(n)}}return t}function Ic(e,t){let r=e.map((i,a)=>{let c=[i,...t.map(l=>String(l[a]??""))];return Math.max(...c.map(l=>l.length))}),n=r.map(i=>"\u2500".repeat(i+2)).join("\u253C"),s=i=>i.map((a,c)=>` ${String(a).padEnd(r[c]??0)} `).join("\u2502");return[s(e),n,...t.map(s)].join(`
73
+ `)}function jc(e){let t=mc.join(e,"package.json");try{return JSON.parse(gc.readFileSync(t,"utf-8"))}catch{return null}}function $c(e,t={}){return on()?!0:t.silent?!1:t.brief?(console.log(`${d.dim}Note: ${e} has enhanced features when used with MCP integration.${d.reset}`),console.log(`${d.dim}Run "bootspring mcp" for setup instructions.${d.reset}
72
74
  `),!1):(console.log(`
73
75
  ${d.yellow}${d.bold}Limited Mode - MCP Integration Recommended${d.reset}
74
76
 
@@ -88,5 +90,5 @@ ${d.bold}Documentation:${d.reset}
88
90
  https://bootspring.com/docs/mcp-setup
89
91
 
90
92
  ${d.dim}Run "bootspring mcp" for server options${d.reset}
91
- `),!1)}function jc(e){on()||(console.log(`${d.dim}Note: ${e} - some features require MCP integration.${d.reset}`),console.log(`${d.dim}Run "bootspring mcp" for setup instructions.${d.reset}
92
- `))}var $c="3.3.2",Rc="@girardmedia/bootspring",be="[REDACTED]",Wi=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i;function Ji(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,be).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,be).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${be}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${be}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${be}`)}function Xt(e){return Ji(String(e||""))}function sn(e,t=0){if(t>10)return e;if(typeof e=="string")return Xt(e);if(Array.isArray(e))return e.map(n=>sn(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(Wi.test(n)){r[n]=be;continue}r[n]=sn(s,t+1)}return r}function Nc(e){return e?e instanceof Error?Xt(e.message||String(e)):Xt(String(e)):""}});var Zi=tr((hl,Dc)=>{Dc.exports={name:"bootspring-workspace",version:"3.3.2",private:!0,description:"Workspace tooling for the Bootspring monorepo",keywords:["ai","development","scaffolding","mcp","claude","agents","context","workflow","devtools"],author:"Bootspring",license:"SEE LICENSE IN LICENSE",repository:{type:"git",url:"git+https://github.com/Girard-Media/bootspring.git"},homepage:"https://bootspring.com",bugs:{url:"https://github.com/Girard-Media/bootspring/issues"},scripts:{start:"node monorepo/apps/cli/bin/bootspring.js",dashboard:"node monorepo/apps/cli/bin/bootspring.js dashboard",mcp:"node monorepo/apps/cli/dist/mcp-server.js","version:sync":"node scripts/sync-version-metadata.js","verify:version-sync":"node scripts/sync-version-metadata.js --check","release:prepare":"npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish","release:dry-run":"npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish && echo '\\n--- DRY RUN COMPLETE (no publish) ---'","release:full":"node scripts/release-full.js","smoke:publish":"node scripts/smoke-publish.js",pretest:"npm run build",test:"vitest run","test:e2e":"vitest run --config vitest.e2e.config.ts","test:launch-smoke":"vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js","test:seed-ingestion":"vitest run __tests__/unit/seed-ingestion-regression.test.js","test:watch":"vitest","test:coverage":"vitest run --coverage",lint:"eslint .","lint:fix":"eslint . --fix",typecheck:"npm run typecheck:workspace && tsc --noEmit","typecheck:workspace":"cd monorepo && pnpm turbo typecheck --filter=@girardmedia/bootspring --filter=@bootspring/server && cd ..","typecheck:active":"npm run typecheck:workspace",build:"npm run version:sync && npm run build:workspace && npm run sync:server-runtime","build:workspace":"cd monorepo && pnpm turbo build --filter=@girardmedia/bootspring --filter=@bootspring/server && cd ..","build:server-runtime":"cd monorepo && pnpm turbo build --filter=@bootspring/server && cd .. && npm run sync:server-runtime","sync:server-runtime":"node scripts/sync-server-runtime.js","server:bundle:prepare":"npm run build:server-runtime && npm run server:bundle:install","server:bundle:install":"npm --prefix monorepo/apps/server/deploy-bundle ci --omit=dev","server:bundle:migrate":"npm --prefix monorepo/apps/server/deploy-bundle run migrate","server:bundle:migrate:check":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:check","server:bundle:migrate:fresh":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:fresh","server:bundle:migrate:fresh:unsafe":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:fresh:unsafe","server:bundle:seed":"npm --prefix monorepo/apps/server/deploy-bundle run seed","server:bundle:verify:shared-schema":"npm --prefix monorepo/apps/server/deploy-bundle run verify:shared-schema","server:bundle:smoke:shared-billing":"npm --prefix monorepo/apps/server/deploy-bundle run smoke:shared-billing --","server:bundle:configure-shared-billing-gh":"bash monorepo/apps/server/compat-runtime/scripts/configure-shared-billing-smoke-gh.sh","build:cli":"npm --prefix monorepo/apps/cli run build","build:watch":"npm --prefix monorepo/apps/cli run dev",dev:"cd monorepo && pnpm turbo dev --filter=@girardmedia/bootspring --filter=@bootspring/server --concurrency=10","dev:cli":"npm --prefix monorepo/apps/cli run dev","dev:server":"npm --prefix monorepo/apps/server run dev","dev:test":"vitest","verify:lint-budget":"node scripts/check-lint-budgets.js","verify:release-gates":"node scripts/release-gate-check.js","verify:shared-contracts":"node scripts/verify-shared-contracts.js","verify:thin-client-contract":"node scripts/verify-thin-client-contract.js","verify:monorepo-assets":"npm run build:server-runtime && node scripts/verify-monorepo-asset-parity.js","build:mcp-contract":"node scripts/export-mcp-contract.js","verify:mcp-contract":"node scripts/export-mcp-contract.js --check","planning:sync":"node scripts/sync-planning-state.js","planning:sync:check":"node scripts/sync-planning-state.js --check","planning:realign":"node scripts/sync-planning-state.js --sync-runtime","verify:package":"node scripts/check-package-boundaries.js","verify:security":"node scripts/security-scan.js","verify:openapi":`node -e "const s=require('./docs/openapi.json');const p=Object.keys(s.paths);if(p.length<100){console.error('Expected 100+ paths, got '+p.length);process.exit(1)}console.log('OpenAPI: '+p.length+' paths OK')" && npx spectral lint docs/openapi.json 2>&1 | grep -q error && echo 'Spectral errors found' && exit 1 || echo 'OpenAPI spec valid'`,"verify:bundle-size":`node -e "const{execSync}=require('child_process');const out=execSync('cd monorepo/apps/cli && npm pack --dry-run 2>&1',{encoding:'utf8'});const m=out.match(/package size:\\s+([\\d.]+)\\s+(\\w+)/);if(!m){console.error('Could not parse pack size');process.exit(1)}let kb=parseFloat(m[1]);if(m[2]==='MB')kb*=1024;console.log('Packed:',Math.round(kb),'KB');if(kb>800){console.error('FAIL: exceeds 800 KB budget');process.exit(1)}console.log('OK: within 800 KB budget')"`,"db:sync":"node monorepo/packages/shared/db/sync.js","db:sync:check":"node monorepo/packages/shared/db/sync.js --check"},devDependencies:{"@eslint/js":"^9.39.2","@stoplight/spectral-cli":"^6.16.0","@swc/core":"^1.15.13","@types/node":"^25.3.1","@typescript-eslint/eslint-plugin":"^8.57.0","@typescript-eslint/parser":"^8.57.0","@vitest/coverage-v8":"^4.0.18",ajv:"^8.18.0",eslint:"^9.39.2",globals:"^17.3.0",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3",vitest:"^4.0.18",yaml:"^2.8.3",zod:"^4.3.6"},engines:{node:">=18.0.0"},overrides:{table:{ajv:"^8.12.0"},minimatch:"^10.2.1",hono:"4.12.18","@hono/node-server":"1.19.13",axios:">=1.16.0","simple-git":">=3.36.0","express-rate-limit":"^8.2.2","path-to-regexp@<0.1.13":"0.1.13","path-to-regexp@>=8.0.0 <8.4.0":"8.4.0","flatted@<3.4.2":"3.4.2","picomatch@>=4.0.0 <4.0.4":"4.0.4","brace-expansion@<1.1.13":"1.1.13","brace-expansion@>=2.0.0 <2.0.3":"2.0.3","brace-expansion@>=3.0.0 <3.0.2":"3.0.2","brace-expansion@>=4.0.0 <5.0.6":"5.0.6","vite@>=7.0.0 <7.3.2":"7.3.2"},packageManager:"pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c"}});P();var U=Ui(),E=Xi(),Qi=U.config,an=U.context,Lc=U.policies,qc={COLORS:E.COLORS,print:E.print,createSpinner:E.createSpinner,ensureDir:E.ensureDir,readFile:E.readFile,writeFile:E.writeFile,fileExists:E.fileExists,getFileTime:E.getFileTime,formatDate:E.formatDate,formatRelativeTime:E.formatRelativeTime,slugify:E.slugify,truncate:E.truncate,deepClone:E.deepClone,isCI:E.isCI,isMCPContext:E.isMCPContext,parseArgs:E.parseArgs,createTable:E.createTable,getPackageJson:E.getPackageJson,requireMCP:E.requireMCP,warnMCPLimited:E.warnMCPLimited},cn=U.entitlements,at=U.tierEnforcement,Mc=U.telemetry,ln=U.auth,zc=U.api,Gc=E,Fc=U.selfUpdate,Bc=U.setupCommands,Uc=Zi();module.exports={VERSION:Uc.version,config:Qi,context:an,utils:qc,policies:Lc,entitlements:cn,tierEnforcement:at,telemetry:Mc,auth:ln,api:zc,redaction:Gc,selfUpdate:Fc,setupCommands:Bc,loadConfig:Qi.load,getContext:an.get,validateContext:an.validate,checkSkillAccess:cn.checkSkillAccess,checkWorkflowAccess:cn.checkWorkflowAccess,getTier:at.getTier,checkAgentAccess:at.checkAgentAccess,hasFeature:at.hasFeature,meetsTierRequirement:at.meetsTierRequirement,isAuthenticated:ln.isAuthenticated,getUser:ln.getUser,BRAND:{name:"Bootspring",tagline:"Development scaffolding with intelligence",website:"https://bootspring.com",docs:"https://bootspring.com/docs",api:"https://api.bootspring.com"}};
93
+ `),!1)}function Rc(e){on()||(console.log(`${d.dim}Note: ${e} - some features require MCP integration.${d.reset}`),console.log(`${d.dim}Run "bootspring mcp" for setup instructions.${d.reset}
94
+ `))}var Nc="3.3.2",Dc="@girardmedia/bootspring",Te="[REDACTED]",Wi=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i;function Ji(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,Te).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,Te).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${Te}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${Te}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${Te}`)}function Xt(e){return Ji(String(e||""))}function sn(e,t=0){if(t>10)return e;if(typeof e=="string")return Xt(e);if(Array.isArray(e))return e.map(n=>sn(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(Wi.test(n)){r[n]=Te;continue}r[n]=sn(s,t+1)}return r}function Lc(e){return e?e instanceof Error?Xt(e.message||String(e)):Xt(String(e)):""}});var Zi=tr((vl,qc)=>{qc.exports={name:"bootspring-workspace",version:"3.3.2",private:!0,description:"Workspace tooling for the Bootspring monorepo",keywords:["ai","development","scaffolding","mcp","claude","agents","context","workflow","devtools"],author:"Bootspring",license:"SEE LICENSE IN LICENSE",repository:{type:"git",url:"git+https://github.com/Girard-Media/bootspring.git"},homepage:"https://bootspring.com",bugs:{url:"https://github.com/Girard-Media/bootspring/issues"},scripts:{start:"node monorepo/apps/cli/bin/bootspring.js",dashboard:"node monorepo/apps/cli/bin/bootspring.js dashboard",mcp:"node monorepo/apps/cli/dist/mcp-server.js","version:sync":"node scripts/sync-version-metadata.js","verify:version-sync":"node scripts/sync-version-metadata.js --check","release:prepare":"npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish","release:dry-run":"npm run version:sync && npm run build && npm test && npm run lint --if-present && npm run verify:package && npm run verify:thin-client-contract && npm run verify:mcp-contract && npm run verify:monorepo-assets && npm run verify:release-gates && npm run smoke:publish && echo '\\n--- DRY RUN COMPLETE (no publish) ---'","release:full":"node scripts/release-full.js","smoke:publish":"node scripts/smoke-publish.js",pretest:"npm run build",test:"vitest run","test:e2e":"vitest run --config vitest.e2e.config.ts","test:launch-smoke":"vitest run __tests__/unit/cli-first-run-smoke.test.js __tests__/unit/health-fresh-start.test.ts __tests__/unit/session-project-scope.test.ts __tests__/unit/auth-cli-mixed-states.test.ts __tests__/unit/api-client-project-auth-fallback.test.js __tests__/unit/cli-help-surface.test.js __tests__/unit/cli-command-manifest.test.js","test:seed-ingestion":"vitest run __tests__/unit/seed-ingestion-regression.test.js","test:watch":"vitest","test:coverage":"vitest run --coverage",lint:"eslint .","lint:fix":"eslint . --fix",typecheck:"npm run typecheck:workspace && tsc --noEmit","typecheck:workspace":"cd monorepo && pnpm turbo typecheck --filter=@girardmedia/bootspring --filter=@bootspring/server && cd ..","typecheck:active":"npm run typecheck:workspace",build:"npm run version:sync && npm run build:workspace && npm run sync:server-runtime","build:workspace":"cd monorepo && pnpm turbo build --filter=@girardmedia/bootspring --filter=@bootspring/server && cd ..","build:server-runtime":"cd monorepo && pnpm turbo build --filter=@bootspring/server && cd .. && npm run sync:server-runtime","sync:server-runtime":"node scripts/sync-server-runtime.js","server:bundle:prepare":"npm run build:server-runtime && npm run server:bundle:install","server:bundle:install":"npm --prefix monorepo/apps/server/deploy-bundle ci --omit=dev","server:bundle:migrate":"npm --prefix monorepo/apps/server/deploy-bundle run migrate","server:bundle:migrate:check":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:check","server:bundle:migrate:fresh":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:fresh","server:bundle:migrate:fresh:unsafe":"npm --prefix monorepo/apps/server/deploy-bundle run migrate:fresh:unsafe","server:bundle:seed":"npm --prefix monorepo/apps/server/deploy-bundle run seed","server:bundle:verify:shared-schema":"npm --prefix monorepo/apps/server/deploy-bundle run verify:shared-schema","server:bundle:smoke:shared-billing":"npm --prefix monorepo/apps/server/deploy-bundle run smoke:shared-billing --","server:bundle:configure-shared-billing-gh":"bash monorepo/apps/server/compat-runtime/scripts/configure-shared-billing-smoke-gh.sh","build:cli":"npm --prefix monorepo/apps/cli run build","build:watch":"npm --prefix monorepo/apps/cli run dev",dev:"cd monorepo && pnpm turbo dev --filter=@girardmedia/bootspring --filter=@bootspring/server --concurrency=10","dev:cli":"npm --prefix monorepo/apps/cli run dev","dev:server":"npm --prefix monorepo/apps/server run dev","dev:test":"vitest","verify:lint-budget":"node scripts/check-lint-budgets.js","verify:release-gates":"node scripts/release-gate-check.js","verify:shared-contracts":"node scripts/verify-shared-contracts.js","verify:thin-client-contract":"node scripts/verify-thin-client-contract.js","verify:monorepo-assets":"npm run build:server-runtime && node scripts/verify-monorepo-asset-parity.js","build:mcp-contract":"node scripts/export-mcp-contract.js","verify:mcp-contract":"node scripts/export-mcp-contract.js --check","planning:sync":"node scripts/sync-planning-state.js","planning:sync:check":"node scripts/sync-planning-state.js --check","planning:realign":"node scripts/sync-planning-state.js --sync-runtime","verify:package":"node scripts/check-package-boundaries.js","verify:security":"node scripts/security-scan.js","verify:openapi":`node -e "const s=require('./docs/openapi.json');const p=Object.keys(s.paths);if(p.length<100){console.error('Expected 100+ paths, got '+p.length);process.exit(1)}console.log('OpenAPI: '+p.length+' paths OK')" && npx spectral lint docs/openapi.json 2>&1 | grep -q error && echo 'Spectral errors found' && exit 1 || echo 'OpenAPI spec valid'`,"verify:bundle-size":`node -e "const{execSync}=require('child_process');const out=execSync('cd monorepo/apps/cli && npm pack --dry-run 2>&1',{encoding:'utf8'});const m=out.match(/package size:\\s+([\\d.]+)\\s+(\\w+)/);if(!m){console.error('Could not parse pack size');process.exit(1)}let kb=parseFloat(m[1]);if(m[2]==='MB')kb*=1024;console.log('Packed:',Math.round(kb),'KB');if(kb>800){console.error('FAIL: exceeds 800 KB budget');process.exit(1)}console.log('OK: within 800 KB budget')"`,"db:sync":"node monorepo/packages/shared/db/sync.js","db:sync:check":"node monorepo/packages/shared/db/sync.js --check"},devDependencies:{"@eslint/js":"^9.39.2","@stoplight/spectral-cli":"^6.16.0","@swc/core":"^1.15.13","@types/node":"^25.3.1","@typescript-eslint/eslint-plugin":"^8.57.0","@typescript-eslint/parser":"^8.57.0","@vitest/coverage-v8":"^4.0.18",ajv:"^8.18.0",eslint:"^9.39.2",globals:"^17.3.0",tsup:"^8.5.1",tsx:"^4.21.0",typescript:"^5.9.3",vitest:"^4.0.18",yaml:"^2.8.3",zod:"^4.3.6"},engines:{node:">=18.0.0"},overrides:{table:{ajv:"^8.12.0"},minimatch:"^10.2.1",hono:"4.12.18","@hono/node-server":"1.19.13",axios:">=1.16.0","simple-git":">=3.36.0","express-rate-limit":"^8.2.2","path-to-regexp@<0.1.13":"0.1.13","path-to-regexp@>=8.0.0 <8.4.0":"8.4.0","flatted@<3.4.2":"3.4.2","picomatch@>=4.0.0 <4.0.4":"4.0.4","brace-expansion@<1.1.13":"1.1.13","brace-expansion@>=2.0.0 <2.0.3":"2.0.3","brace-expansion@>=3.0.0 <3.0.2":"3.0.2","brace-expansion@>=4.0.0 <5.0.6":"5.0.6","vite@>=7.0.0 <7.3.2":"7.3.2"},packageManager:"pnpm@10.22.0+sha512.bf049efe995b28f527fd2b41ae0474ce29186f7edcb3bf545087bd61fbbebb2bf75362d1307fda09c2d288e1e499787ac12d4fcb617a974718a6051f2eee741c"}});P();var U=Ui(),E=Xi(),Qi=U.config,an=U.context,Mc=U.policies,zc={COLORS:E.COLORS,print:E.print,createSpinner:E.createSpinner,ensureDir:E.ensureDir,readFile:E.readFile,writeFile:E.writeFile,fileExists:E.fileExists,getFileTime:E.getFileTime,formatDate:E.formatDate,formatRelativeTime:E.formatRelativeTime,slugify:E.slugify,truncate:E.truncate,deepClone:E.deepClone,isCI:E.isCI,isMCPContext:E.isMCPContext,parseArgs:E.parseArgs,createTable:E.createTable,getPackageJson:E.getPackageJson,requireMCP:E.requireMCP,warnMCPLimited:E.warnMCPLimited},cn=U.entitlements,at=U.tierEnforcement,Gc=U.telemetry,ln=U.auth,Fc=U.api,Bc=E,Uc=U.selfUpdate,Vc=U.setupCommands,Kc=Zi();module.exports={VERSION:Kc.version,config:Qi,context:an,utils:zc,policies:Mc,entitlements:cn,tierEnforcement:at,telemetry:Gc,auth:ln,api:Fc,redaction:Bc,selfUpdate:Uc,setupCommands:Vc,loadConfig:Qi.load,getContext:an.get,validateContext:an.validate,checkSkillAccess:cn.checkSkillAccess,checkWorkflowAccess:cn.checkWorkflowAccess,getTier:at.getTier,checkAgentAccess:at.checkAgentAccess,hasFeature:at.hasFeature,meetsTierRequirement:at.meetsTierRequirement,isAuthenticated:ln.isAuthenticated,getUser:ln.getUser,BRAND:{name:"Bootspring",tagline:"Development scaffolding with intelligence",website:"https://bootspring.com",docs:"https://bootspring.com/docs",api:"https://api.bootspring.com"}};