@girardmedia/bootspring 3.4.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.js CHANGED
@@ -1,8 +1,11 @@
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(`
1
+ "use strict";var No=Object.create;var dt=Object.defineProperty;var Lo=Object.getOwnPropertyDescriptor;var Do=Object.getOwnPropertyNames;var Mo=Object.getPrototypeOf,qo=Object.prototype.hasOwnProperty;var X=(e,t)=>()=>(e&&(t=e(e=0)),t);var ur=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Go=(e,t)=>{for(var r in t)dt(e,r,{get:t[r],enumerable:!0})},wn=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Do(t))!qo.call(e,s)&&s!==r&&dt(e,s,{get:()=>t[s],enumerable:!(n=Lo(t,s))||n.enumerable});return e};var ft=(e,t,r)=>(r=e!=null?No(Mo(e)):{},wn(t||!e||!e.__esModule?dt(r,"default",{value:e,enumerable:!0}):r,e)),Ge=e=>wn(dt({},"__esModule",{value:!0}),e);var E=X(()=>{"use strict"});function Fo(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,Bo,I,zo,gt=X(()=>{"use strict";E();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"},Bo=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 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
- `)}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}
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}- ${Bo(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}`)};zo=I});function On(){let e=typeof process<"u"&&process.env||{},t={};return e.BOOTSPRING_BRAND_GLYPH&&(t.glyph=e.BOOTSPRING_BRAND_GLYPH),e.BOOTSPRING_BRAND_NAME&&(t.name=e.BOOTSPRING_BRAND_NAME),e.BOOTSPRING_BRAND_ACCENT&&(t.accent=e.BOOTSPRING_BRAND_ACCENT),t}function Vo(e){return le={...ht,...On(),...le??{},...e},le}function Cn(){return le||(le={...ht,...On()}),le}function Ko(){le=null}function Ho(e){return An[e]??An.info}function _t(e,t=10){let r=Math.max(0,Math.min(100,Math.round(e))),n=Math.round(r/100*t);return"\u2593".repeat(n)+"\u2591".repeat(t-n)+` ${r}%`}function In(e,t=0){let r=t>0?e.slice(-t):e;if(r.length===0)return"";let n=Math.min(...r),i=Math.max(...r)-n,a=mt.length-1;return r.map(c=>{if(!Number.isFinite(c))return mt[0];if(i===0)return mt[3];let l=Math.round((c-n)/i*a);return mt[Math.max(0,Math.min(a,l))]}).join("")}function xn(e){if(!Number.isFinite(e))return"0";if(Math.abs(e)>=1e3){let t=e/1e3;return(Number.isInteger(t)?String(t):t.toFixed(1).replace(/\.0$/,""))+"k"}return String(Math.round(e))}function Wo(e){return Number.isFinite(e)?"$"+e.toFixed(2):"$0.00"}function Jo(e){return typeof e=="string"?e:Array.isArray(e)?In(e):""}function pr(e,t){let r=Cn();return[`${r.glyph} ${r.name}`,e,t].filter(Boolean).join(" \xB7 ")}function dr(e){let t=[];typeof e.tools=="number"&&t.push(`${xn(e.tools)} tools`),typeof e.tokens=="number"&&t.push(`${xn(e.tokens)} tok`),typeof e.cost=="number"&&t.push(Wo(e.cost)),typeof e.contextPct=="number"&&t.push(`ctx ${Math.round(e.contextPct)}%`);let r=Jo(e.burn);return r&&t.push(`burn ${r}`),t.join(" \xB7 ")}function jn(e){let t=[pr(e.surface,e.subtitle)];typeof e.progress=="number"&&t.push(_t(e.progress));let r=dr(e);return r&&t.push(r),t.join(" ")}function Yo(e,t=!0){let r=jn(e);if(!t)return r;let n=pr(e.surface,e.subtitle),s=r.slice(n.length),i=p;return`${i.cyan}${i.bold}${n}${i.reset}${i.dim}${s}${i.reset}`}function $n(e={}){let t=e.url??`http://localhost:${e.port??4179}`,r=[`\u2192 ${e.label??"live"}: ${t}`];return e.next&&r.push(`next: ${e.next}`),r.join(" \xB7 ")}function fr(e){return pr(e.surface,e.subtitle)}function Rn(e){let t=`\u2500 ${e} `,r=Math.max(t.length+1,Xo),n="\u256D"+t+"\u2500".repeat(r-t.length)+"\u256E",s="\u2570"+"\u2500".repeat(r)+"\u256F";return{top:n,bottom:s}}function Nn(e){let t=[];e.title&&t.push(` ${e.title}`);for(let r of e.rows??[])t.push(` ${r}`);if(e.vitals){let r=dr(e.vitals);r&&t.push(` ${r}`),typeof e.progress!="number"&&typeof e.vitals.progress=="number"&&t.push(` ${_t(e.vitals.progress)}`)}if(typeof e.progress=="number"&&t.push(` ${_t(e.progress)}`),e.footer&&t.push(` ${e.footer}`),e.live){let r=e.live===!0?{}:e.live;t.push(` ${$n(r)}`)}return t}function Zo(e){let{top:t,bottom:r}=Rn(fr(e));return"```\n"+[t,r,...Nn(e)].join(`
5
+ `)+"\n```"}function Qo(e,t=!0){let{top:r,bottom:n}=Rn(fr(e)),s=Nn(e);if(!t)return[r,n,...s].join(`
6
+ `);let i=p;return[`${i.cyan}${i.bold}${r}${i.reset}`,`${i.cyan}${n}${i.reset}`,...s.map(c=>`${i.dim}${c}${i.reset}`)].join(`
7
+ `)}function ea(e){return fr(e)}var ht,Uo,le,An,mt,Xo,Ln=X(()=>{"use strict";E();gt();ht={glyph:"\u26A1",name:"Bootspring",accent:"#3b6cff"},Uo={glyph:ht.glyph,name:ht.name},le=null;An={ok:"\u2713",fail:"\u2717",active:"\u25B8",pending:"\u25CB",warn:"!",info:"\xB7"};mt=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];Xo=30});function Mn(e){try{return ue.default.existsSync(e)||ue.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function ta(e,t=null){try{return ue.default.readFileSync(e,"utf-8")}catch{return t}}function ra(e,t){try{let r=Dn.default.dirname(e);return Mn(r),ue.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function na(e){try{return ue.default.existsSync(e)}catch{return!1}}function sa(e){try{return ue.default.statSync(e).mtime}catch{return null}}function ia(e=new Date){return e.toISOString().split("T")[0]}function oa(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 aa(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function ca(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function la(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function vt(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function ua(e){return JSON.parse(JSON.stringify(e))}var ue,Dn,gr=X(()=>{"use strict";E();ue=ft(require("fs")),Dn=ft(require("path"))});function pa(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 da(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(`
8
+ `)}function fa(e){let t=Gn.join(e,"package.json");try{return JSON.parse(qn.readFileSync(t,"utf-8"))}catch{return null}}function ga(e,t={}){return vt()?!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
9
  `),!1):(console.log(`
7
10
  ${p.yellow}${p.bold}Limited Mode - MCP Integration Recommended${p.reset}
8
11
 
@@ -22,26 +25,26 @@ ${p.bold}Documentation:${p.reset}
22
25
  https://bootspring.com/docs/mcp-setup
23
26
 
24
27
  ${p.dim}Run "bootspring mcp" for server options${p.reset}
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=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]
28
+ `),!1)}function ma(e){vt()||(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}
29
+ `))}var qn,Gn,Bn=X(()=>{"use strict";E();qn=ft(require("fs")),Gn=ft(require("path"));gt();gr()});var ha,_a,zn=X(()=>{"use strict";E();ha="3.4.1",_a="@girardmedia/bootspring"});function Un(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,pe).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,pe).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${pe}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${pe}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${pe}`)}function yt(e){return Un(String(e||""))}function mr(e,t=0){if(t>10)return e;if(typeof e=="string")return yt(e);if(Array.isArray(e))return e.map(n=>mr(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(Fn.test(n)){r[n]=pe;continue}r[n]=mr(s,t+1)}return r}function va(e){return e?e instanceof Error?yt(e.message||String(e)):yt(String(e)):""}var pe,Fn,Vn=X(()=>{"use strict";E();pe="[REDACTED]",Fn=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i});var Pe={};Go(Pe,{BOOTSPRING_PACKAGE_NAME:()=>_a,BOOTSPRING_VERSION:()=>ha,BRAND:()=>Uo,COLORS:()=>p,REDACTED:()=>pe,SENSITIVE_KEY_PATTERN:()=>Fn,activeBrand:()=>Cn,brandLine:()=>ea,card:()=>Zo,cardAnsi:()=>Qo,configureBrand:()=>Vo,createSpinner:()=>Fo,createTable:()=>da,deepClone:()=>ua,ensureDir:()=>Mn,fileExists:()=>na,formatDate:()=>ia,formatRelativeTime:()=>oa,getFileTime:()=>sa,getPackageJson:()=>fa,isCI:()=>la,isMCPContext:()=>vt,liveLink:()=>$n,parseArgs:()=>pa,print:()=>zo,progressBar:()=>_t,readFile:()=>ta,redactErrorMessage:()=>va,redactPatternMatches:()=>Un,redactSensitiveData:()=>mr,redactSensitiveString:()=>yt,requireMCP:()=>ga,resetBrand:()=>Ko,slugify:()=>aa,sparkline:()=>In,statusGlyph:()=>Ho,truncate:()=>ca,vitalsMetrics:()=>dr,vitalsStrip:()=>jn,vitalsStripAnsi:()=>Yo,warnMCPLimited:()=>ma,writeFile:()=>ra});var we=X(()=>{"use strict";E();Ln();Bn();zn();Vn();gt();gr()});var mo=ur((vu,mn)=>{"use strict";E();var ya=Object.create,$t=Object.defineProperty,Sa=Object.getOwnPropertyDescriptor,ns=Object.getOwnPropertyNames,ba=Object.getPrototypeOf,Ta=Object.prototype.hasOwnProperty,Rt=(e,t)=>function(){return e&&(t=(0,e[ns(e)[0]])(e=0)),t},C=(e,t)=>{for(var r in t)$t(e,r,{get:t[r],enumerable:!0})},Pt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ns(t))!Ta.call(e,s)&&s!==r&&$t(e,s,{get:()=>t[s],enumerable:!(n=Sa(t,s))||n.enumerable});return e},Ea=(e,t,r)=>(Pt(e,t,"default"),r&&Pt(r,t,"default")),y=(e,t,r)=>(r=e!=null?ya(ba(e)):{},Pt(t||!e||!e.__esModule?$t(r,"default",{value:e,enumerable:!0}):r,e)),ka=e=>Pt($t({},"__esModule",{value:!0}),e),A=Rt({"../../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"}}),Nt={};C(Nt,{BOOTSPRING_DIR:()=>B,CONFIG_FILE:()=>xe,CREDENTIALS_FILE:()=>L,DEVICE_FILE:()=>ee,clearCredentials:()=>Qe,clearDeviceInfo:()=>fs,clearProjectApiKey:()=>qt,clearProjectScopedSession:()=>Cr,decrypt:()=>Lt,encrypt:()=>Pr,ensureBootspringDir:()=>ye,findNearestProjectConfigPath:()=>et,generateDeviceFingerprint:()=>Fe,getApiKey:()=>tt,getConfig:()=>us,getCredentials:()=>Y,getCredentialsPath:()=>ds,getDeviceContext:()=>Ne,getDeviceId:()=>Bt,getDeviceInfo:()=>Gt,getLegacyProjectApiKey:()=>me,getProjectScopedSessionState:()=>wr,getProjectScopedToken:()=>Dt,getRefreshToken:()=>Re,getStoredApiKey:()=>Mt,getTier:()=>os,getToken:()=>Se,getTokenExpiryStatus:()=>ss,getUser:()=>Ar,isApiKeyAuth:()=>is,isAuthenticated:()=>be,login:()=>rt,loginWithApiKey:()=>cs,logout:()=>Ir,readNearestProjectConfig:()=>se,saveApiKeyToProject:()=>as,saveConfig:()=>ps,saveCredentials:()=>H,saveProjectScopedSession:()=>Or,updateTokens:()=>ls,writeNearestProjectConfig:()=>$e});function Pa(){try{if(T.default.existsSync(St))return Buffer.from(T.default.readFileSync(St,"utf-8").trim(),"hex")}catch(t){Le("salt file read failed, regenerating",t)}ye();let e=W.default.randomBytes(32);return T.default.writeFileSync(St,e.toString("hex"),{mode:384}),e}function br(){let e=Pa(),t=Fe();return W.default.scryptSync(t,e,32)}function wa(){let e=O.default.hostname()+O.default.userInfo().username;return W.default.createHash("sha256").update(e).digest()}function ye(){T.default.existsSync(B)||T.default.mkdirSync(B,{recursive:!0,mode:448})}function Pr(e){let t=br(),r=W.default.randomBytes(16),n=W.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 hr(e,t){let r=Buffer.from(e.iv,"hex"),n=W.default.createDecipheriv("aes-256-cbc",t,r),s=n.update(e.data,"hex","utf8");return s+=n.final("utf8"),JSON.parse(s)}function Lt(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 hr(r,br());try{return hr(r,br())}catch{return hr(r,wa())}}function Y(){if(fe)return fe.value;try{if(T.default.existsSync(L)){let e=JSON.parse(T.default.readFileSync(L,"utf-8")),t=Lt(e);return(e&&typeof e=="object"&&!e.iv&&!e.data||e&&typeof e=="object"&&e.iv&&e.v!==2)&&H(t),fe={resolved:!0,value:t},t}}catch{jr=!0;try{T.default.unlinkSync(L)}catch(e){Le("failed to delete corrupt credentials file",e)}}return fe={resolved:!0,value:null},null}function H(e){ye();let t=Pr({...e});T.default.writeFileSync(L,JSON.stringify(t,null,2),{mode:384}),fe=null}function Qe(){try{T.default.existsSync(L)&&T.default.unlinkSync(L)}catch{}fe=null,jr=!1}function Se(){let e=Y();return!e||e.expiresAt&&new Date(e.expiresAt)<new Date?null:e.token??null}function ss(e=300*1e3){let t=Y();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 et(){let e=process.cwd();for(let t=0;t<10;t++){let r=K.default.join(e,".bootspring.json");if(T.default.existsSync(r))return r;let n=K.default.dirname(e);if(n===e)break;e=n}return null}function se(){try{let e=et();if(!e)return null;let t=JSON.parse(T.default.readFileSync(e,"utf-8"));return{path:e,config:t}}catch{return null}}function $e(e,t){try{return T.default.writeFileSync(e,JSON.stringify(t,null,2)),!0}catch{return!1}}function wr(){let e=se();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 me(){let e=se();if(!e)return null;let t=e.config.apiKey;return typeof t=="string"&&t.length>0?t:null}function Dt(){let e=wr();if(!e)return null;let t=new Date(e.expiresAt).getTime();return!Number.isFinite(t)||Date.now()>=t-6e4?null:e.token}function Mt(){let e=Y();return typeof e?.apiKey=="string"&&e.apiKey.length>0?e.apiKey:null}function tt(){let e=process.env.BOOTSPRING_API_KEY;if(e)return e;if(Se())return null;let t=Dt();if(t)return t;let r=Mt();if(r)return r;let n=me();return n||null}function is(){return process.env.BOOTSPRING_API_KEY?!0:Se()?!1:!!(Dt()||Mt()||me())}function Re(){return Y()?.refreshToken||null}function be(){return!!(Se()||tt()||Re())}function Ar(){return Y()?.user||null}function os(){let e=process.env.BOOTSPRING_USER_TIER;return e?e.toLowerCase():Ar()?.tier||"free"}function xr(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 rt(e){let t=e.expiresIn||"15m",r=xr(t),n=new Date(Date.now()+r).toISOString();H({token:e.token,refreshToken:e.refreshToken,expiresAt:n,user:e.user}),e.token&&Or(e.token,{expiresAt:n,source:"device-flow"})}function as(e){try{let t=se();if(!t)return!1;let r={...t.config};return r.apiKey=e,$e(t.path,r)}catch{return!1}}function qt(){try{let e=se();if(!e)return!1;let t={...e.config};return Object.prototype.hasOwnProperty.call(t,"apiKey")?(delete t.apiKey,$e(e.path,t)):!1}catch{return!1}}function cs(e,t){H({apiKey:e,user:t}),qt()}function ls(e){let t=Y()||{},r=e.expiresIn||"15m",n=xr(r),s=new Date(Date.now()+n).toISOString();H({...t,token:e.token,refreshToken:e.refreshToken,expiresAt:s})}function Or(e,t={}){try{let r=se();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()+xr(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,$e(r.path,s)}catch{return!1}}function Cr(){try{let e=se();if(!e||!e.config.projectAuth)return!1;let t={...e.config};return delete t.projectAuth,$e(e.path,t)}catch{return!1}}function Ir(){Qe(),Cr(),qt()}function us(){try{if(T.default.existsSync(xe))return JSON.parse(T.default.readFileSync(xe,"utf-8"))}catch(e){Le("failed to read config file",e)}return{}}function ps(e){ye(),T.default.writeFileSync(xe,JSON.stringify(e,null,2))}function ds(){return L}function Fe(){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 W.default.createHash("sha256").update(e.join("|")).digest("hex")}function Gt(){ye();try{if(T.default.existsSync(ee)){let t=JSON.parse(T.default.readFileSync(ee,"utf-8"));if(t.fingerprint===Fe())return t}}catch(t){Le("failed to read device file, regenerating",t)}let e={deviceId:W.default.randomUUID(),fingerprint:Fe(),createdAt:new Date().toISOString(),platform:O.default.platform(),arch:O.default.arch(),hostname:O.default.hostname()};return T.default.writeFileSync(ee,JSON.stringify(e,null,2),{mode:384}),e}function Bt(){return Gt().deviceId}function Ne(e="0.0.0"){let t=Gt(),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:K.default.basename(r),cwdFull:r}}function fs(){try{T.default.existsSync(ee)&&T.default.unlinkSync(ee)}catch(e){Le("failed to delete device file",e)}}var T,K,O,W,Le,B,L,xe,ee,St,fe,jr,ie=Rt({"src/auth.ts"(){"use strict";A(),T=y(require("fs")),K=y(require("path")),O=y(require("os")),W=y(require("crypto")),Le=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:auth]",...e):()=>{},B=K.default.join(O.default.homedir(),".bootspring"),L=K.default.join(B,"credentials.json"),xe=K.default.join(B,"config.json"),ee=K.default.join(B,"device.json"),St=K.default.join(B,".encryption-salt"),fe=null,jr=!1}}),$r={};C($r,{LOCAL_CONFIG_NAME:()=>Oe,SESSION_FILE:()=>te,addRecentProject:()=>vs,clearSession:()=>gs,createLocalConfig:()=>ys,findLocalConfig:()=>Ft,getCurrentProject:()=>ms,getEffectiveProject:()=>De,getRecentProjects:()=>_s,getSession:()=>oe,getSessionState:()=>Ss,saveSession:()=>zt,setCurrentProject:()=>hs});function oe(){try{if(D.default.existsSync(te))return JSON.parse(D.default.readFileSync(te,"utf-8"))}catch(e){Ut("failed to read session file",e)}return null}function zt(e){ye();let t={...e,updatedAt:new Date().toISOString()};D.default.writeFileSync(te,JSON.stringify(t,null,2))}function gs(){try{D.default.existsSync(te)&&D.default.unlinkSync(te)}catch(e){Ut("failed to delete session file",e)}}function ms(){return oe()?.project||null}function Aa(e){return bs.some(t=>D.default.existsSync(F.default.join(e,t)))}function wt(e){let t=F.default.resolve(e);try{return D.default.realpathSync.native(t)}catch{try{return D.default.realpathSync(t)}catch{return t}}}function xa(e){let t=wt(e);for(let r=0;r<10;r++){if(Aa(t))return t;let n=F.default.dirname(t);if(n===t)break;t=n}return null}function Oa(e){let t=wt(e),r=xa(t);return r?{dir:r,mode:"tree"}:{dir:t,mode:"exact"}}function hs(e,t){let r=oe()||{};if(e){let n=Oa(t||process.cwd());r.project=e,r.projectScopeDir=n.dir,r.projectScopeMode=n.mode}else delete r.project,delete r.projectScopeDir,delete r.projectScopeMode;zt(r)}function _s(){return oe()?.recentProjects||[]}function vs(e){let t=oe()||{},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),zt(t)}function Ft(e){let t=e||process.cwd();for(let r=0;r<10;r++){let n=F.default.join(t,Oe);if(D.default.existsSync(n))try{return{...JSON.parse(D.default.readFileSync(n,"utf-8")),_path:n,_dir:t}}catch(i){Ut("failed to parse local config at",n,i)}let s=F.default.dirname(t);if(s===t)break;t=s}return null}function De(e){let t=Ft(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=oe(),n=r?.project;if(!n||!r?.projectScopeDir)return null;let s=wt(r.projectScopeDir),i=wt(e||process.cwd());return(()=>{if(r.projectScopeMode==="exact")return i===s;let c=F.default.relative(s,i);return c===""||!c.startsWith("..")&&!F.default.isAbsolute(c)})()?{...n,source:"session"}:null}function ys(e,t){let r=F.default.join(e,Oe),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 Ss(){let e=oe(),t=De(),r=Ft();return{hasSession:!!e,project:t,source:t?.source||null,hasLocalConfig:!!r,localConfigPath:r?._path,recentProjects:e?.recentProjects||[],lastUpdated:e?.updatedAt||null}}var D,F,Ut,te,Oe,bs,Vt=Rt({"src/session.ts"(){"use strict";A(),D=y(require("fs")),F=y(require("path")),ie(),Ut=process.env.BOOTSPRING_DEBUG?(...e)=>console.debug("[bootspring:session]",...e):()=>{},te=F.default.join(B,"session.json"),Oe=".bootspring.json",bs=[Oe,"bootspring.config.js",".git"]}}),Rr={};C(Rr,{ASSISTANTS:()=>ws,ASSISTANT_FIRST_SUCCESS_EVENT:()=>Ke,ASSISTANT_RETURN_EVENT:()=>He,ASSISTANT_SETUP_EVENT:()=>Kt,BILLING_UPGRADE_STARTED_EVENT:()=>xt,MAX_EVENTS_LIMIT:()=>At,UPGRADE_COMPLETED_EVENT:()=>Dr,UPGRADE_PROMPT_EVENT:()=>Ot,clearEvents:()=>ks,emitEvent:()=>Ue,ensureTelemetryDir:()=>Es,getAssistantActivationFunnel:()=>qa,getStatus:()=>Ma,getTelemetryDir:()=>Nr,getTelemetryFile:()=>nt,getUpgradeConversionFunnel:()=>Ba,inferAssistantFromEnvironment:()=>Ca,listEvents:()=>re,track:()=>Os,trackAssistantSetup:()=>Na,trackAssistantUsageSuccess:()=>La,uploadEvents:()=>Va});function Me(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 Ca(e=process.env){let t=Me(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 Ts(e,t="unknown"){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ia(e){let t=Ts(e,"updated");return As.has(t)?t:"other"}function Kn(e){let t=Ts(e,"unknown");return xs.has(t)?t:"other"}function Nr(e=process.cwd()){return Lr.join(e,".bootspring","telemetry")}function nt(e=process.cwd()){return Lr.join(Nr(e),"events.jsonl")}function Es(e=process.cwd()){let t=Nr(e);return ne.mkdirSync(t,{recursive:!0}),t}function Ue(e,t={},r={}){let n=r.projectRoot||process.cwd();Es(n);let s=nt(n),a={timestamp:(r.now?new Date(r.now):new Date).toISOString(),event:String(e||"").trim(),payload:(0,Ve.redactSensitiveData)(t||{})};return ne.appendFileSync(s,`${JSON.stringify(a)}
30
+ `,"utf-8"),a}function ja(e,t={}){return re({projectRoot:t.projectRoot}).filter(r=>Me(r?.payload?.assistant)===e)}function $a(e){return e>=7?"d7_plus":e>=2?"d2_6":e>=1?"d1":"d0"}function Ra(e){let r=String(e?.payload?.occurredAt||"").trim()||String(e?.timestamp||"").trim(),n=new Date(r).getTime();return Number.isFinite(n)?n:null}function de(e){let t=String(e?.payload?.occurredAt||"").trim();return t||String(e?.timestamp||"").trim()||null}function Na(e,t={},r={}){let n=Me(e);return n?Ue(Kt,{assistant:n,status:Ia(t.status)},r):null}function La(e,t={},r={}){let n=Me(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=ja(n,{projectRoot:s}),c=a.find(g=>g.event===Ke);if(!c)return Ue(Ke,{assistant:n,source:Kn(t.source||"mcp")},{projectRoot:s,now:i}),{assistant:n,firstSuccessTracked:!0,returnTracked:!1,daysSinceFirst:0};let l=Ra(c),u=l!==null?Math.floor((i.getTime()-l)/(1440*60*1e3)):0;if(u>=1){let g=$a(u);if(!a.some(v=>v.event!==He?!1:String(v?.payload?.window||"")===g))return Ue(He,{assistant:n,source:Kn(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 Da(e){try{return JSON.parse(e)}catch{return null}}function re(e={}){let t=e.projectRoot||process.cwd(),r=nt(t);if(!ne.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=ne.readFileSync(r,"utf-8").split(`
31
+ `).filter(Boolean).map(Da).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,At):At;return l=l.slice(-u),l}function ks(e={}){let t=e.projectRoot||process.cwd(),r=nt(t),n=re({projectRoot:t});return ne.existsSync(r)&&ne.writeFileSync(r,"","utf-8"),{cleared:n.length,file:r}}function Ma(e={}){let t=e.projectRoot||process.cwd(),r=nt(t),n=re({projectRoot:t}),s=n.length>0?n[n.length-1]:null;return{file:r,exists:ne.existsSync(r),count:n.length,lastEventAt:s?.timestamp??null}}function Hn(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 _r(e,t){let r=e.filter(u=>Me(u?.payload?.assistant)===t),n=r.find(u=>u.event===Kt)||null,s=r.find(u=>u.event===Ke)||null,i=r.filter(u=>u.event===He),a=s?i.some(u=>{let g=Hn(de(s),de(u));return g!==null&&g>=1}):!1,c=s?i.some(u=>{let g=Hn(de(s),de(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:de(n),firstSuccessAt:de(s),lastReturnAt:de(l)}}function qa(e={}){let t=e.projectRoot||process.cwd(),r=Me(e.assistant),n=re({projectRoot:t,from:e.from,to:e.to}),s={claude:_r(n,"claude"),codex:_r(n,"codex"),gemini:_r(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 vr(e,t){return t?Number((e/t).toFixed(4)):0}function Be(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ga(e={}){let t=e.feature||e.skillId||e.workflow||e.agent||"unknown";return{capability:Be(e.capability,"unknown"),featureType:Be(e.featureType,"general"),feature:Be(t,"unknown"),placement:Be(e.placement,"inline"),variant:Be(e.variant,"control")}}function Ba(e={}){let t=e.projectRoot||process.cwd(),r=re({projectRoot:t}),n={};for(let i of r){if(i.event!==Ot&&i.event!==xt&&i.event!==Dr)continue;let a=Ga(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===Ot){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===xt){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=vr(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:vr(s.started,s.prompted),conversionRate:vr(s.converted,s.prompted)},capabilities:n}}function za(e){return new Promise(t=>setTimeout(t,e))}function Fa(e,t){let r=[];for(let n=0;n<e.length;n+=t)r.push(e.slice(n,n+t));return r}async function Ua(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,Ve.redactErrorMessage)(u)};l+=1;let g=c*2**(l-1);await za(g)}}async function Va(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=re({projectRoot:t,event:a,limit:c});if(m.length===0)return{uploaded:0,remaining:0,endpoint:s};let v=e.apiKey??null,w=e.projectId??null;if(!v)try{let ae=await Promise.resolve().then(()=>(ie(),Nt)),ce=await Promise.resolve().then(()=>(Vt(),$r));v=ae.getApiKey();let pt=ce.getEffectiveProject();w=w??pt?.id??null}catch{}let b={"content-type":"application/json",accept:"application/json","user-agent":`bootspring-cli/${Ve.BOOTSPRING_VERSION||"unknown"}`};v?b["x-api-key"]=v:i&&(b.authorization=`Bearer ${i}`),w&&(b["x-project-id"]=w);let N=Fa(m,u),kn=0,Pn=0,ut=[];for(let ae=0;ae<N.length;ae++){let ce=N[ae];if(!ce)continue;let pt=Ps.createHash("sha1").update(JSON.stringify(ce)).digest("hex"),lr=await Ua(s,{source:"bootspring",batch:{index:ae,total:N.length,id:pt},events:ce},{...b,"x-bootspring-batch-id":pt},e);if(Pn+=lr.attempts??1,!lr.success){ut.push({index:ae,count:ce.length,error:(0,Ve.redactErrorMessage)(lr.error??"upload_failed")});continue}kn+=ce.length}if(ut.length>0)throw new Error(`Telemetry upload failed for ${ut.length}/${N.length} batches`);g&&ks({projectRoot:t});let Ro=g?0:re({projectRoot:t}).length;return{uploaded:kn,attempted:m.length,batches:N.length,attempts:Pn,remaining:Ro,endpoint:s,failedBatches:ut}}var ne,Lr,Ps,Ve,At,ws,Kt,Ke,He,xt,Ot,Dr,As,xs,Os,Cs=Rt({"src/telemetry.ts"(){"use strict";A(),ne=y(require("fs")),Lr=y(require("path")),Ps=y(require("crypto")),Ve=(we(),Ge(Pe)),At=1e4,ws=["claude","codex","gemini"],Kt="assistant_setup",Ke="assistant_first_success",He="assistant_return",xt="billing_upgrade_started",Ot="premium_prompted",Dr="premium_unlocked",As=new Set(["installed","updated","skipped","failed","created","unchanged"]),xs=new Set(["mcp","cli","setup","dashboard","api","unknown"]),Os=Ue}}),Mr={};C(Mr,{API_BASE:()=>st,API_VERSION:()=>Ht,BOOTSPRING_DIR:()=>B,BootspringClient:()=>zs,COMMANDS_SOURCE:()=>Te,CONFIG_FILE:()=>xe,CREDENTIALS_FILE:()=>L,CURRENT_VERSION:()=>G,DEFAULT_INTERVAL_MS:()=>Wr,DEFAULT_POLICY_PROFILE:()=>We,DEVICE_FILE:()=>ee,LIMITS:()=>Ce,LOCAL_CONFIG_NAME:()=>Oe,PACKAGE_NAME:()=>Ye,PATTERNS:()=>Ct,POLICY_PROFILES:()=>Je,SESSION_FILE:()=>te,SHELL_DANGEROUS_CHARS:()=>Qa,STATE_PATH:()=>Xe,TARGET_DIRS:()=>it,addRecentProject:()=>vs,api:()=>qr,apiLogin:()=>$s,applyUpdate:()=>Jr,auth:()=>Nt,callMcpTool:()=>qs,checkForUpdates:()=>oi,checkInstallation:()=>ui,classifyError:()=>j,clearCredentials:()=>Qe,clearDeviceInfo:()=>fs,clearProjectApiKey:()=>qt,clearProjectScopedSession:()=>Cr,clearSession:()=>gs,compareVersions:()=>Xt,config:()=>Ui,context:()=>co,createClient:()=>Xa,createLocalConfig:()=>ys,decrypt:()=>Lt,encrypt:()=>Pr,ensureBootspringDir:()=>ye,ensureLatestVersion:()=>ai,entitlements:()=>$i,findLocalConfig:()=>Ft,findNearestProjectConfigPath:()=>et,generateDeviceFingerprint:()=>Fe,getApiKey:()=>tt,getCommandFiles:()=>ot,getConfig:()=>us,getCredentials:()=>Y,getCredentialsPath:()=>ds,getCurrentProject:()=>ms,getDeviceContext:()=>Ne,getDeviceId:()=>Bt,getDeviceInfo:()=>Gt,getEffectiveProject:()=>De,getInstallContext:()=>Zt,getLatestVersion:()=>Qt,getLegacyProjectApiKey:()=>me,getMcpResource:()=>Bs,getPolicyProfile:()=>Yt,getProjectScopedSessionState:()=>wr,getProjectScopedToken:()=>Dt,getRecentProjects:()=>_s,getRefreshToken:()=>Re,getSession:()=>oe,getSessionState:()=>Ss,getStoredApiKey:()=>Mt,getTier:()=>os,getToken:()=>Se,getTokenExpiryStatus:()=>ss,getUser:()=>Ar,healthCheck:()=>js,installAll:()=>li,installToTarget:()=>Yr,isApiKeyAuth:()=>is,isAuthenticated:()=>be,isWorkflowBlocked:()=>zr,listMcpResources:()=>Gs,listMcpTools:()=>Ms,login:()=>rt,loginWithApiKey:()=>cs,logout:()=>Ir,maybeAutoUploadTelemetry:()=>ri,normalizeProfile:()=>Wt,policies:()=>Fs,pollDeviceToken:()=>Ns,presence:()=>Zs,readNearestProjectConfig:()=>se,refreshSession:()=>Ls,registerMcpForAssistant:()=>Xs,remoteLogout:()=>Ds,request:()=>q,resolvePolicyProfile:()=>Jt,runDiagnostics:()=>Hs,saveApiKeyToProject:()=>as,saveConfig:()=>ps,saveCredentials:()=>H,saveProjectScopedSession:()=>Or,saveSession:()=>zt,selfHeal:()=>Vs,selfUpdate:()=>ni,sendHealthReport:()=>ei,sendHeartbeat:()=>Qs,session:()=>$r,setAuthFailureHandler:()=>Is,setCurrentProject:()=>hs,setupCommands:()=>ci,startDeviceFlow:()=>Rs,stripUnsafeControlChars:()=>Us,telemetry:()=>Rr,tierEnforcement:()=>di,trackToolUsage:()=>ti,tryHeal:()=>Ks,uninstallAll:()=>pi,updateTokens:()=>ls,validateNumericId:()=>ec,validateSlug:()=>rc,validateStringLength:()=>Fr,validateTodoText:()=>tc,writeNearestProjectConfig:()=>$e});mn.exports=ka(Mr);A();Ea(Mr,(we(),Ge(Pe)),mn.exports);ie();var qr={};C(qr,{API_BASE:()=>st,API_VERSION:()=>Ht,apiLogin:()=>$s,callMcpTool:()=>qs,getMcpResource:()=>Bs,healthCheck:()=>js,listMcpResources:()=>Gs,listMcpTools:()=>Ms,pollDeviceToken:()=>Ns,refreshSession:()=>Ls,remoteLogout:()=>Ds,request:()=>q,setAuthFailureHandler:()=>Is,startDeviceFlow:()=>Rs});A();var Gr=y(require("https")),Br=y(require("http"));ie();var bt=(we(),Ge(Pe)),st=process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",Ht="v1",Tr=null;function Is(e){Tr=e}var Wn=new Map,Ka=6e4;function Ha(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,bt.redactSensitiveString)(r)}var ze=null;async function Wa(){let e=Re();return e?ze||(ze=(async()=>{try{let t=new URL(`/api/${Ht}/auth/refresh`,st),n=t.protocol==="https:"?Gr.default:Br.default,s=JSON.stringify({refreshToken:e,device:Ne()}),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 rt(i),i.token||null}catch{return null}finally{ze=null}})(),ze):null}async function Ja(){let e=Se();if(!e){let r=Y();r?.refreshToken&&r?.expiresAt&&(e=await Wa())}if(e)return{Authorization:`Bearer ${e}`};let t=tt();return t?t.startsWith("eyJ")?{Authorization:`Bearer ${t}`}:{"X-API-Key":t}:{}}function Ya(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 Jn(e,t,r,n){let s=await Ja(),i=Ya(new URL(`/api/${Ht}${t}`,st),e==="GET"?r:null),c=i.protocol==="https:"?Gr.default:Br.default,l={"Content-Type":"application/json","User-Agent":"bootspring-core","X-Device-Id":Bt(),...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<Ka)return g.data}return new Promise((u,g)=>{let m=c.request(i,{method:e,headers:l,timeout:n.timeout||3e4},v=>{let w="";v.on("data",h=>w+=h),v.on("end",()=>{try{let h=JSON.parse(w);if(v.statusCode>=400){let b=h,N=Object.assign(new Error((0,bt.redactSensitiveString)(String(b.message||b.error||"API Error"))),{status:v.statusCode,code:String(b.error||b.code||""),details:(0,bt.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(Ha(w,v.statusCode)),{status:v.statusCode});g(h)}else u(w)}})});m.on("error",v=>{let w=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,bt.redactSensitiveString)(v.message||String(v))),{code:v.code});g(w)}),r&&e!=="GET"&&m.write(JSON.stringify(r)),m.end()})}async function q(e,t,r=null,n={}){try{return await Jn(e,t,r,n)}catch(s){let i=s;if(i.status===401&&Tr&&!n._authRetried){if(await Tr())return Jn(e,t,r,{...n,_authRetried:!0,noCache:!0});i.authHandled=!0}throw s}}async function js(){try{let e=new URL("/health",st);return new Promise(t=>{(e.protocol==="https:"?Gr.default:Br.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 $s(e,t){let r=await q("POST","/auth/login",{email:e,password:t,device:Ne()});return rt(r),r}async function Rs(){return q("POST","/auth/device",{device:Ne()},{noCache:!0})}async function Ns(e){return q("POST","/auth/device/token",{device_code:e},{noCache:!0})}async function Ls(){let e=Re();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:Ne()},{noCache:!0});return rt(t),t}async function Ds(){let e=Re();try{return await q("POST","/auth/logout",{refreshToken:e},{noCache:!0})}finally{Ir()}}async function Ms(){return q("GET","/mcp/tools")}async function qs(e,t){return q("POST","/mcp/tool",{tool:e,arguments:t})}async function Gs(){return q("GET","/mcp/resources")}async function Bs(e){return q("GET",`/mcp/resources/${encodeURIComponent(e)}`)}A();var zs=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 Xa(e){return new zs(e)}var Fs={};C(Fs,{DEFAULT_POLICY_PROFILE:()=>We,POLICY_PROFILES:()=>Je,getPolicyProfile:()=>Yt,isWorkflowBlocked:()=>zr,normalizeProfile:()=>Wt,resolvePolicyProfile:()=>Jt});A();var We="startup",Je={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 Wt(e){let t=String(e||We).trim().toLowerCase();return Je[t]?t:We}function Za(e){return e?String(e).split(",").map(t=>t.trim()).filter(Boolean):[]}function Jt(e={}){return Wt(e.policyProfile||process.env.BOOTSPRING_POLICY_PROFILE)}function Yt(e,t={}){let r=Wt(e),n=Je[r]||Je[We],s=Za(t.blockedWorkflows||process.env.BOOTSPRING_POLICY_BLOCKED_WORKFLOWS);return{...n,blockedWorkflows:Array.from(new Set([...n.blockedWorkflows||[],...s]))}}function zr(e,t){let r=String(e?.key||"").trim();return r?(t.blockedWorkflows||[]).includes(r):!1}Vt();A();var Ce={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},Ct={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]+$/},Qa=/[;&|`$(){}[\]<>\\!#*?"'\n\r\t]/;function Us(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 Fr(e,t=Ce.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 ec(e,t={}){let{min:r=Ce.MIN_ID,max:n=Ce.MAX_ID}=t,s;if(typeof e=="string"){let i=e.trim();if(!Ct.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 tc(e){let t=Fr(e,Ce.MAX_TODO_LENGTH,1);return t.valid?{valid:!0,sanitized:Us(e,{allowNewlines:!0})}:t}function rc(e){if(typeof e!="string")return{valid:!1,error:"Slug must be a string"};let t=Fr(e,Ce.MAX_FILENAME_LENGTH,1);if(!t.valid)return t;if(!Ct.SLUG.test(e)){let r=e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/^[^a-z]+/,"").replace(/-+/g,"-").replace(/-$/,"");return r.length===0||!Ct.SLUG.test(r)?{valid:!1,error:"Invalid slug format"}:{valid:!1,error:"Slug contains invalid characters",sanitized:r}}return{valid:!0,sanitized:e}}var Vs={};C(Vs,{classifyError:()=>j,registerMcpForAssistant:()=>Xs,runDiagnostics:()=>Hs,tryHeal:()=>Ks});A();var f=y(require("fs")),_=y(require("path")),Z=y(require("os")),Er=require("child_process");ie();var nc=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 sc={"auth-corrupt-credentials":()=>{try{Qe();let e=me();if(e)return H({apiKey:e}),{issue:j({message:"bad decrypt"}),healed:!0,detail:"Re-encrypted credentials from project API key."}}catch(e){nc("credential recovery failed",e)}return{issue:j({message:"bad decrypt"}),healed:!1,detail:"No fallback API key available."}},"auth-expired":()=>{let e=me();return e?(H({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=et();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,Er.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 Ks(e){let t=sc[e.id];if(!t)return{issue:e,healed:!1};try{return t()}catch{return{issue:e,healed:!1}}}function Hs(e=!1){let t=[],r=process.cwd(),n=Z.default.homedir();if(be())t.push({id:"auth",status:"ok",message:"Authenticated"});else if(e){let h=me();h?(H({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(L))try{let h=JSON.parse(f.default.readFileSync(L,"utf-8"));Lt(h),t.push({id:"credentials",status:"ok",message:"Credentials file readable."})}catch{e?(Qe(),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=et();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,Er.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,Er.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:yr(u.claude),codex:ic(u.codex),gemini:yr(u.gemini),project:yr(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))&&(Js(u.codex)?h.push("Codex"):b.push("Codex")),f.default.existsSync(_.default.dirname(u.gemini))&&(Ys(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 w=_.default.join(r,"planning","BUILD_STATE.json");if(f.default.existsSync(w))try{let h=JSON.parse(f.default.readFileSync(w,"utf-8"));if(!h.implementationQueue||!Array.isArray(h.implementationQueue))if(e){let b=w+".bak";f.default.copyFileSync(w,b),h.implementationQueue=h.implementationQueue||[],f.default.writeFileSync(w,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 yr(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 ic(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)}
32
+ `,"utf-8"),!0}catch{return!1}}function Js(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
33
  command = "bootspring"
31
34
  args = ["mcp"]
32
35
  env = { BOOTSPRING_ASSISTANT = "codex" }
33
36
  `,s=r.length>0?`${r.trimEnd()}
34
37
 
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
+ ${n}`:n;return f.default.writeFileSync(e,s,"utf-8"),!0}catch{return!1}}function Ys(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)}
39
+ `,"utf-8"),!0}catch{return!1}}var oc={claude:()=>_.default.join(Z.default.homedir(),".claude.json"),cursor:()=>_.default.join(Z.default.homedir(),".cursor","mcp.json"),codex:()=>_.default.join(Z.default.homedir(),".codex","config.toml"),gemini:()=>_.default.join(Z.default.homedir(),".gemini","settings.json"),zed:()=>_.default.join(Z.default.homedir(),".config","zed","settings.json"),opencode:()=>_.default.join(Z.default.homedir(),".opencode","config.json"),windsurf:()=>_.default.join(Z.default.homedir(),".windsurf","mcp.json")};function ac(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)}
40
+ `,"utf-8"),!0}catch{return!1}}function cc(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)}
41
+ `,"utf-8"),!0}catch{return!1}}function Xs(e){let t=oc[e](),r=!1;switch(e){case"claude":case"cursor":r=Ws(t);break;case"codex":r=Js(t);break;case"gemini":r=Ys(t);break;case"zed":r=ac(t);break;case"opencode":case"windsurf":r=cc(t,e);break}return{success:r,path:t}}var Zs={};C(Zs,{maybeAutoUploadTelemetry:()=>ri,sendHealthReport:()=>ei,sendHeartbeat:()=>Qs,trackToolUsage:()=>ti});A();ie();Vt();var Ur=process.env.BOOTSPRING_SITE_URL||process.env.BOOTSPRING_API_URL||"https://api.bootspring.com",lc=2e4,Vr=5e3,Yn=0,Xn=0;function Kr(){let e={"content-type":"application/json"},t=tt();if(t)e["x-api-key"]=t;else{let r=Se();if(r)e.authorization=`Bearer ${r}`;else return null}return e}function Qs(e){if(!be())return;let t=De();if(!t?.id)return;let r=Date.now();if(r-Yn<lc)return;Yn=r;let n=Kr();if(!n)return;n["x-project-id"]=t.id;let s;try{s=Bt()}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(),Vr);fetch(`${Ur}/api/v1/presence/heartbeat`,{method:"POST",headers:n,body:i,signal:a.signal}).catch(()=>{}).finally(()=>clearTimeout(c))}async function ei(e){if(!be())return;let t=De();if(!t?.id)return;let r=Kr();if(!r)return;r["x-project-id"]=t.id;let n=new AbortController,s=setTimeout(()=>n.abort(),Vr);try{await fetch(`${Ur}/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 ti(e){if(!be())return;let t=Kr();if(!t)return;let r=De();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(),Vr);fetch(`${Ur}/api/v1/track`,{method:"POST",headers:t,body:s,signal:i.signal}).catch(()=>{}).finally(()=>clearTimeout(a))}function ri(){if(!be())return;let e=Date.now(),t=3600*1e3;e-Xn<t||(Xn=e,Promise.resolve().then(()=>(Cs(),Rr)).then(r=>{typeof r.uploadEvents=="function"&&r.uploadEvents().catch(()=>{})}).catch(()=>{}))}var ni={};C(ni,{CURRENT_VERSION:()=>G,DEFAULT_INTERVAL_MS:()=>Wr,PACKAGE_NAME:()=>Ye,STATE_PATH:()=>Xe,applyUpdate:()=>Jr,checkForUpdates:()=>oi,compareVersions:()=>Xt,ensureLatestVersion:()=>ai,getInstallContext:()=>Zt,getLatestVersion:()=>Qt});A();var It=y(require("fs")),uc=y(require("os")),x=y(require("path")),Hr=require("child_process"),si=(we(),Ge(Pe)),Ye=si.BOOTSPRING_PACKAGE_NAME,G=si.BOOTSPRING_VERSION||"0.0.0",Wr=Number.parseInt(process.env.BOOTSPRING_AUTO_UPDATE_INTERVAL_MS||`${360*60*1e3}`,10),Xe=x.join(uc.homedir(),".bootspring","update-state.json");function pc(){let e=[x.resolve(__dirname,".."),x.resolve(__dirname,"../.."),process.cwd()];for(let t of e)if(It.existsSync(x.join(t,"package.json")))return t;return e[0]}function ii(){return process.env.BOOTSPRING_NPM_COMMAND?process.env.BOOTSPRING_NPM_COMMAND:process.platform==="win32"?"npm.cmd":"npm"}function Xt(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 Zn(){try{return JSON.parse(It.readFileSync(Xe,"utf8"))}catch{return{}}}function Qn(e){try{It.mkdirSync(x.dirname(Xe),{recursive:!0,mode:448}),It.writeFileSync(Xe,JSON.stringify(e,null,2))}catch{}}function Zt(){let e=pc(),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 dc(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=Zt();return r.mode==="ephemeral"||r.mode==="development"&&process.env.BOOTSPRING_ALLOW_DEV_AUTO_UPDATE!=="true"}function Qt(){try{let e=(0,Hr.execFileSync)(ii(),["view",Ye,"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 Jr(e){let t=e.mode==="local"?["install",`${Ye}@latest`]:["install","-g",`${Ye}@latest`];(0,Hr.execFileSync)(ii(),t,{cwd:e.projectRoot||process.cwd(),encoding:"utf8",stdio:["ignore","pipe","pipe"],timeout:12e4,env:{...process.env,npm_config_update_notifier:"false"}})}function fc(e=[]){let t=(0,Hr.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 oi(e={}){let t=Qt(),r=e.currentVersion||G;return{current:r,latest:t,updateAvailable:t?Xt(r,t)<0:!1}}function ai(e=[]){if(dc(e))return{updated:!1,skipped:!0};let t=Zt(),r=Zn(),n=Date.parse(r.lastCheckedAt||""),s=Date.now(),i=Number.isFinite(n)&&s-n<Wr,a=r.latestVersion||null;if((!i||r.currentVersion!==G)&&(a=Qt(),Qn({...r,currentVersion:G,latestVersion:a,lastCheckedAt:new Date(s).toISOString()})),!a||Xt(G,a)>=0)return{updated:!1,skipped:!1,current:G,latest:a};let c=t.mode==="local"?t.projectRoot||process.cwd():"global install";console.error(`[bootspring] Updating ${G} -> ${a} before continuing (${c}).`);try{return Jr(t),Qn({...Zn(),currentVersion:a,latestVersion:a,lastCheckedAt:new Date(s).toISOString(),lastUpdatedAt:new Date().toISOString()}),{updated:!0,current:G,latest:a,exitCode:fc(e)}}catch(l){return console.error(`[bootspring] Auto-update failed: ${l.message}`),{updated:!1,skipped:!1,current:G,latest:a,error:l}}}var ci={};C(ci,{COMMANDS_SOURCE:()=>Te,TARGET_DIRS:()=>it,checkInstallation:()=>ui,getCommandFiles:()=>ot,installAll:()=>li,installToTarget:()=>Yr,uninstallAll:()=>pi});A();var M=y(require("fs")),Sr=y(require("os")),z=y(require("path"));function gc(){let t=[process.env.BOOTSPRING_COMMANDS_SOURCE,z.resolve(__dirname,"../assets/claude-commands"),z.resolve(__dirname,"../claude-commands"),z.resolve(__dirname,"../../../../claude-commands"),z.resolve(process.cwd(),"claude-commands")].filter(Boolean);for(let r of t)if(M.existsSync(r))return r;return t[0]}var Te=gc(),it=[{name:"Claude Code",path:z.join(Sr.homedir(),".claude","commands")},{name:"Codex",path:z.join(Sr.homedir(),".codex","commands")},{name:"Generic",path:z.join(Sr.homedir(),".ai-commands")}];function ot(e=Te){try{return M.readdirSync(e).filter(t=>t.endsWith(".md"))}catch{return[]}}function Yr(e,t={}){let{verbose:r=!1,force:n=!1,commandsSource:s=Te}=t,i={installed:[],skipped:[],errors:[]};try{M.existsSync(e)||(M.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 ot(s)){let c=z.join(s,a),l=z.join(e,a);try{if(M.existsSync(l)&&!n){i.skipped.push(a);continue}M.copyFileSync(c,l),i.installed.push(a)}catch(u){i.errors.push({file:a,error:u.message})}}return i}function li(e={}){let{verbose:t=!1,force:r=!1,commandsSource:n=Te}=e,s={targets:[],totalInstalled:0,totalSkipped:0,totalErrors:0};for(let i of it){t&&console.log(`
42
+ Installing to ${i.name}...`);let a=Yr(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 ui(e=Te){let t=ot(e);return it.map(r=>{let n=M.existsSync(r.path),s=0;if(n)try{s=M.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 pi(e={}){let{verbose:t=!1,commandsSource:r=Te}=e,n=ot(r),s={removed:0,notFound:0};for(let i of it)if(M.existsSync(i.path))for(let a of n){let c=z.join(i.path,a);try{M.existsSync(c)?(M.unlinkSync(c),s.removed++,t&&console.log(` Removed ${c}`)):s.notFound++}catch{}}return s}ie();Vt();var di={};C(di,{AGENT_TIERS:()=>_i,CUSTOM_PROMPTS_TIERS:()=>Ti,DEFAULT_LIMITS:()=>he,DUAL_LLM_TIERS:()=>Ei,FEATURE_GATES:()=>_e,FREE_AGENTS:()=>vi,GENERATION_LIMITS:()=>bi,PREMIUM_SKILL_CATEGORIES:()=>yi,PREMIUM_SKILL_PATTERNS:()=>Si,PRESEED_PAID_COMMANDS:()=>mi,SEED_PAID_COMMANDS:()=>hi,TIER_HIERARCHY:()=>gi,cacheEntitlements:()=>ki,checkAgentAccess:()=>yc,checkCustomPromptsAccess:()=>Cc,checkDualLlmAccess:()=>Ic,checkGenerationAccess:()=>Oc,checkLimit:()=>bc,checkPreseedAccess:()=>Ii,checkSeedAccess:()=>ji,checkSkillAccess:()=>Sc,clearCache:()=>vc,fetchEntitlements:()=>Pi,formatTierBadge:()=>kc,getCachedEntitlements:()=>er,getEntitlements:()=>wi,getLimits:()=>xi,getTier:()=>$,getTierLevel:()=>jt,getUpgradePrompt:()=>tr,getUpgradePromptContext:()=>Ci,getUpgradePromptExperiment:()=>Oi,hasFeature:()=>Ie,isSkillPremium:()=>Ai,meetsTierRequirement:()=>at,requireFeature:()=>wc,requirePreseedAccess:()=>Ac,requireSeedAccess:()=>xc,requireTier:()=>Pc});A();var ge=y(require("fs")),mc=y(require("os")),fi=y(require("path"));ie();function Xr(){return Nt}var kr=fi.join(mc.homedir(),".bootspring"),Ze=fi.join(kr,"entitlements.json"),hc=300*1e3,gi={free:0,founder:1,pro:1,team:2,enterprise:3,custom:3},he={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"}},_e={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"]},mi=["pull","push","workflow","merge","start"],hi=["scaffold","synthesize","generate"],_i={"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"},vi=new Set(["database-expert","frontend-expert"]),yi=["ai","payments","security","performance","deployment","email","notifications","realtime","search","seo","files","analytics"],Si=["auth/mfa","auth/rbac","database/multi-tenant","database/full-text-search","testing/e2e","testing/coverage","state/react-query","ui/command-palette","ui/data-tables"],bi={free:0,founder:25,pro:25,team:100,enterprise:500,custom:999999},Ti=new Set(["enterprise","custom"]),Ei=new Set(["enterprise","custom"]),_c=["security/validation","deployment/docker"],es="https://bootspring.com/pricing",ts={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 er(){try{if(ge.existsSync(Ze)){let e=JSON.parse(ge.readFileSync(Ze,"utf-8"));if(e.cachedAt&&Date.now()-new Date(e.cachedAt).getTime()<hc)return e}}catch{return null}return null}function ki(e){try{ge.existsSync(kr)||ge.mkdirSync(kr,{recursive:!0,mode:448}),ge.writeFileSync(Ze,JSON.stringify({...e,cachedAt:new Date().toISOString()},null,2),{mode:384})}catch{}}function vc(){try{ge.existsSync(Ze)&&ge.unlinkSync(Ze)}catch{}}async function Pi(){let e=Xr();if(!e.isAuthenticated())return null;try{let r=await qr.resolveEntitlements();ki(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=er();if(t)return t;let r=e.getTier()||"free";return{tier:r,limits:he[r]||he.free,features:_e[r]||_e.free,agents:{denied:[]}}}}async function wi(e={}){let t=Xr();if(!e.forceRefresh){let s=er();if(s)return s}let r=await Pi();if(r)return r;let n=t.getTier()||"free";return{tier:n,limits:he[n]||he.free,features:_e[n]||_e.free,agents:{denied:[]}}}function $(){return er()?.tier||Xr().getTier()||"free"}function jt(e){return gi[e?.toLowerCase()||"free"]??0}function at(e,t=null){let r=t||$();return jt(r)>=jt(e)}function yc(e){let t=$();if(jt(t)===0)return vi.has(e)?{allowed:!0,userTier:t}:{allowed:!1,requiredTier:"pro",userTier:t};let r=_i[e];return r?{allowed:at(r,t),requiredTier:r,userTier:t}:{allowed:!0,userTier:t}}function Ai(e){if(e.startsWith("external/"))return!0;if(_c.includes(e))return!1;if(Si.includes(e))return!0;let t=e.split("/")[0];return!!(t&&yi.includes(t))}function Sc(e){let t=$();return Ai(e)?at("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 Ie(e){let t=$(),r=_e[t]??_e.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 xi(){let e=await wi();return e.limits||he[e.tier]||he.free}async function bc(e,t){let n=(await xi())[e],s=typeof n=="number"?n:0;return{allowed:t<s,limit:s,usage:t,remaining:Math.max(0,s-t)}}function Tt(e,t){return String(e||"").trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||t}function Tc(e){let t=String(e||"").trim().toLowerCase();return t==="banner"?"banner":t==="footer"?"footer":"inline"}function Ec(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 Oi(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=Tc(e.placement||n),i=Tt(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 Ci(e,t="pro",r={}){let n=Ec(e),s=Oi(r);return{...n,capability:Tt(r.capability||n.capability,n.capability),action:Tt(r.action||n.action,n.action),requiredTier:Tt(t||"pro","pro"),userTier:$(),placement:s.placement,variant:s.variant}}function tr(e,t="pro",r={}){let n=Ci(e,t,r),s=ts[n.featureType]||ts.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}
40
43
  `:"";if(n.placement==="banner")return`
41
44
  ${l}${g}Upgrade Required${m} ${u}${a} Current tier: ${n.userTier}.${m}
42
45
  ${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}
46
+ ${c}bootspring billing upgrade${m} ${u}| ${es}${m}
47
+ ${v}`;let w=n.placement==="footer"?`${u}Prompt placement: footer${m}
45
48
  `:"";return`
46
49
  ${l}${g}Upgrade Required${m}
47
50
 
@@ -50,27 +53,30 @@ ${u}Your current tier: ${n.userTier}${m}
50
53
 
51
54
  ${g}${s.headline}${m}
52
55
  ${u}${s.value}${m}
53
- ${k}
56
+ ${w}
54
57
 
55
58
  ${g}Upgrade options:${m}
56
59
  ${c}bootspring billing upgrade${m}
57
60
 
58
- ${u}Or visit: ${Cn}${m}
61
+ ${u}Or visit: ${es}${m}
59
62
  ${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=`/**
63
+ `}function kc(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 Pc(e,t="this feature"){if(!at(e)){let r=new Error(`${t} requires ${e} tier or higher`);throw r.code="TIER_REQUIRED",r.requiredTier=e,r.userTier=$(),r.upgradePrompt=tr(t,e),r}}function wc(e){if(!Ie(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 Ii(e){let t=$();return mi.includes(e)?{allowed:Ie(`preseed.${e}`)||Ie("preseed.*"),requiredTier:"pro",userTier:t,feature:`preseed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`preseed ${e}`}}function ji(e){let t=$();return hi.includes(e)?{allowed:Ie(`seed.${e}`)||Ie("seed.*"),requiredTier:"pro",userTier:t,feature:`seed ${e}`}:{allowed:!0,requiredTier:"free",userTier:t,feature:`seed ${e}`}}function Ac(e){let t=Ii(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=tr(`preseed ${e}`,t.requiredTier),r}}function xc(e){let t=ji(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=tr(`seed ${e}`,t.requiredTier),r}}function Oc(){let e=$(),t=bi[e]??0;return{allowed:t>0,limit:t,tier:e}}function Cc(){return Ti.has($())}function Ic(){return Ei.has($())}var $i={};C($i,{LOCAL_MODE:()=>Ri,SERVER_MODE:()=>je,checkSkillAccess:()=>Bi,checkWorkflowAccess:()=>Fi,filterAccessibleSkills:()=>$c,filterAccessibleWorkflows:()=>Rc,isExternalSkill:()=>Gi,isPremiumWorkflow:()=>zi,resolveAccessContext:()=>Mi,resolveWorkflowAccessContext:()=>qi});A();var Ri="local",je="server",jc=new Set(["free","founder","pro","team","enterprise","custom"]);function Et(e){return at("pro",e)}function Ni(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 Li(e){return String(e||"").trim().toLowerCase()===je?je:Ri}function Di(e){let t=String(e||"free").trim().toLowerCase();return jc.has(t)?t:"free"}function Mi(e={}){return{mode:Li(e.mode||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:Di(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:Ni(e.entitled??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Jt(e)}}function qi(e={}){return{mode:Li(e.mode||process.env.BOOTSPRING_WORKFLOW_ACCESS_MODE||process.env.BOOTSPRING_SKILL_ACCESS_MODE),tier:Di(e.tier||process.env.BOOTSPRING_USER_TIER||"free"),entitled:Ni(e.entitled??process.env.BOOTSPRING_WORKFLOWS_ENTITLED??process.env.BOOTSPRING_SKILLS_ENTITLED),policyProfile:Jt(e)}}function Gi(e){return String(e||"").trim().toLowerCase().startsWith("external/")}function rs(e){let t=String(e||"free").trim().toLowerCase();return t==="pro"||t==="premium"}function Bi(e,t={}){let r=Mi(t);if(Gi(e)){let s=Yt(r.policyProfile,t);return s.allowExternalSkills?r.mode!==je?{allowed:!0,code:"external_local_mode",reason:"External skills are enabled in local mode.",context:r}:r.entitled||Et(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!==je?rs(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"||Et(r.tier)?rs(t.skillTier)?Et(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 $c(e,t={}){let r=[],n=[];for(let s of e||[]){let i=Bi(s,t);i.allowed?r.push(s):n.push({skillId:s,code:i.code,reason:i.reason})}return{allowed:r,denied:n}}function zi(e){return String(e?.tier||"free").toLowerCase()!=="free"}function Fi(e,t={}){let r=qi(t),n=Yt(r.policyProfile,t);return zr(e,n)?{allowed:!1,code:"workflow_policy_blocked",reason:`Workflow ${e?.key||e?.name||"unknown"} is blocked by ${n.id} policy profile.`,context:r}:zi(e)?r.mode!==je?{allowed:!0,code:"workflow_local_mode",reason:"Premium workflows are enabled in local mode.",context:r}:r.entitled||Et(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 Rc(e,t={}){let r=[],n=[];for(let s of e||[]){let i=Fi(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 Ui={};C(Ui,{AIPluginSchema:()=>Yi,AgentConfigSchema:()=>eo,AgentsConfigSchema:()=>en,AnalyticsPluginSchema:()=>Zi,AuthPluginSchema:()=>Vi,BasePluginSchema:()=>Zr,CONFIG_FILES:()=>io,CONFIG_PRESETS:()=>J,ConfigSchema:()=>un,ContextConfigSchema:()=>sn,DEFAULT_CONFIG:()=>ct,DashboardConfigSchema:()=>an,DatabasePluginSchema:()=>Hi,EmailPluginSchema:()=>Xi,MonitoringPluginSchema:()=>Qi,PathsConfigSchema:()=>on,PaymentsPluginSchema:()=>Ki,PluginSchema:()=>Nc,PluginsSchema:()=>Qr,ProjectConfigSchema:()=>cn,QualityCheckSchema:()=>kt,QualityConfigSchema:()=>nn,SecurityPluginSchema:()=>Ji,SkillConfigSchema:()=>to,SkillsConfigSchema:()=>tn,StackConfigSchema:()=>ln,TestingPluginSchema:()=>Wi,WorkflowConfigSchema:()=>no,WorkflowPhaseSchema:()=>ro,WorkflowsConfigSchema:()=>rn,applyPreset:()=>so,combinePresets:()=>Dc,createCustomPreset:()=>Bc,deepMerge:()=>ve,findConfigFile:()=>ao,findProjectRoot:()=>fn,formatValidationErrors:()=>dn,getDefaults:()=>Wc,getPreset:()=>Lc,getPresetsByTag:()=>Gc,getValidationHint:()=>Kc,listPresets:()=>zc,load:()=>rr,loadWithValidation:()=>Vc,parseConfig:()=>Hc,parsePresetString:()=>Mc,resolvePresetChain:()=>pn,save:()=>Uc,validate:()=>gn,validatePresets:()=>qc,validateSection:()=>oo});A();var Ae=y(require("fs")),Q=y(require("path"));A();var o=require("zod"),Zr=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(),Vi=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(),Ki=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(),Hi=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(),Ji=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(),Yi=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(),Xi=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(),Zi=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(),Qi=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(),Qr=o.z.object({auth:Vi.optional(),payments:Ki.optional(),database:Hi.optional(),testing:Wi.optional(),security:Ji.optional(),ai:Yi.optional(),email:Xi.optional(),analytics:Zi.optional(),monitoring:Qi.optional()}).catchall(Zr),Nc=Zr,eo=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(),en=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),eo).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(),to=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(),tn=o.z.object({categories:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),to).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(),ro=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(),no=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(ro).min(1,"At least one phase is required")}).passthrough(),rn=o.z.object({enabled:o.z.record(o.z.string(),o.z.boolean()).optional(),custom:o.z.record(o.z.string(),no).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(),kt=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()})]),nn=o.z.object({preCommit:kt.optional().default(!0),prePush:kt.optional().default(!1),preDeploy:kt.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(),sn=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(),on=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(),an=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(),cn=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(),ln=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(),un=o.z.object({project:cn.optional(),stack:ln.optional(),plugins:Qr.optional(),agents:en.optional(),skills:tn.optional(),workflows:rn.optional(),dashboard:an.optional(),quality:nn.optional(),context:sn.optional(),paths:on.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(),ct={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 ve(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]=ve(i,s):s!==void 0&&(r[n]=s)}return r}A();var J={"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 Lc(e){return J[e]??null}function pn(e,t=new Set){let r=J[e];if(!r)throw new Error(`Unknown preset: ${e}. Available: ${Object.keys(J).join(", ")}`);if(t.has(e))throw new Error(`Circular preset inheritance detected: ${e}`);t.add(e);let n={...ct};if(r.extends){let s=pn(r.extends,t);n=ve(n,s)}return n=ve(n,r.config),n}function so(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={...ct};for(let s of r){let i=s.trim(),a=pn(i);n=ve(n,a)}return n=ve(n,t),n}function Dc(e,t={}){if(!Array.isArray(e)||e.length===0)throw new Error("combinePresets requires a non-empty array of preset names");return so(e,t)}function Mc(e){return!e||typeof e!="string"?[]:e.split(",").map(t=>t.trim()).filter(Boolean)}function qc(e){let t=Array.isArray(e)?e:[e],r=[],n=[],s=Object.keys(J);for(let i of t)J[i]?n.push(i):r.push(`Unknown preset: "${i}". Available: ${s.join(", ")}`);return{valid:r.length===0,errors:r,validPresets:n}}function Gc(e){return Object.entries(J).filter(([,t])=>t.tags&&t.tags.includes(e)).map(([t])=>t)}function Bc(e,t,r={}){let n=J[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 zc(e={}){let t=Object.entries(J);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 io=["bootspring.config.js","bootspring.config.mjs","bootspring.config.json",".bootspringrc",".bootspringrc.js",".bootspringrc.json"];function dn(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 Fc={project:cn,stack:ln,plugins:Qr,agents:en,skills:tn,workflows:rn,dashboard:an,quality:nn,context:sn,paths:on};function oo(e,t){let r=Fc[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:dn(n.error),data:null}}function fn(){let e=process.cwd(),t=Q.parse(e).root;for(;e!==t;){if(Ae.existsSync(Q.join(e,"package.json"))||Ae.existsSync(Q.join(e,"bootspring.config.js"))||Ae.existsSync(Q.join(e,".git")))return e;e=Q.dirname(e)}return process.cwd()}function ao(e){for(let t of io){let r=Q.join(e,t);if(Ae.existsSync(r))return r}return null}function rr(e=null){let t=e??fn(),r=ao(t),n={};if(r)try{if(r.endsWith(".json")||r.endsWith(".bootspringrc")){let i=Ae.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=ve(ct,n);return s._projectRoot=t,s._configPath=r,s._bootspringDir=Q.join(t,".bootspring"),s}function Uc(e,t=null){let r=e._projectRoot??fn(),n=t??Q.join(r,"bootspring.config.js"),s={...e};delete s._projectRoot,delete s._configPath,delete s._bootspringDir,delete s._validation;let i=`/**
61
64
  * Bootspring Configuration
62
65
  * https://bootspring.com/docs/configuration
63
66
  */
64
67
 
65
68
  module.exports = ${JSON.stringify(s,null,2)};
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:
69
+ `;try{return Ae.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 gn(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=oo(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=un.safeParse(r);return i.success?{valid:!0,errors:[],warnings:s,data:i.data}:{valid:!1,errors:dn(i.error),warnings:s,data:null}}function Vc(e=null,t={}){let{validate:r=!0,strict:n=!1,silent:s=!1}=t,i=rr(e);if(!r)return i._validation={skipped:!0},i;let a=gn(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:
67
70
  ${a.errors.map(l=>` - ${l}`).join(`
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(`
71
+ `)}`;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 Kc(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 Hc(e){let t={...e};delete t._projectRoot,delete t._configPath,delete t._bootspringDir,delete t._validation;let r=un.safeParse(t);return r.success?r.data:t}function Wc(){return{...ct}}var co={};C(co,{generateSummary:()=>Yc,get:()=>lo,getEnabledPlugins:()=>uo,getGitInfo:()=>fo,getProjectFiles:()=>po,getProjectState:()=>go,validate:()=>Jc});A();var P=y(require("path")),S=y((we(),Ge(Pe)));function lo(e={}){let t=e.config??rr(),r=t._projectRoot??process.cwd();return{project:t.project,stack:t.stack,plugins:uo(t),files:po(r),git:fo(r),state:go(r,t),timestamp:new Date().toISOString()}}function uo(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 po(e){let t={hasPackageJson:S.fileExists(P.join(e,"package.json")),hasTsConfig:S.fileExists(P.join(e,"tsconfig.json")),hasClaudeMd:S.fileExists(P.join(e,"CLAUDE.md")),hasBootspringConfig:S.fileExists(P.join(e,"bootspring.config.js")),hasTodoMd:S.fileExists(P.join(e,"planning","TODO.md")),hasGit:S.fileExists(P.join(e,".git")),hasSrcDir:S.fileExists(P.join(e,"src")),hasAppDir:S.fileExists(P.join(e,"app")),hasPagesDir:S.fileExists(P.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 fo(e){let t=P.join(e,".git");if(!S.fileExists(t))return{initialized:!1};let r={initialized:!0},n=P.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=P.join(t,"config");if(S.fileExists(s)){let i=S.readFile(s);i&&(r.hasRemote=i.includes('[remote "origin"]'))}return r}function go(e,t){let r={phase:"unknown",health:"unknown",todos:0,lastGenerated:null},n=P.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=P.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(P.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 Jc(e={}){let t=e.config??rr(),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=P.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(P.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(P.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(P.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=gn(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(P.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 Yc(e={}){let t=lo(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(`
72
+ `)}Cs()});var Io=ur((bu,Co)=>{"use strict";E();var Xc=Object.create,ar=Object.defineProperty,Zc=Object.getOwnPropertyDescriptor,Qc=Object.getOwnPropertyNames,el=Object.getPrototypeOf,tl=Object.prototype.hasOwnProperty,rl=(e,t)=>{for(var r in t)ar(e,r,{get:t[r],enumerable:!0})},vo=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Qc(t))!tl.call(e,s)&&s!==r&&ar(e,s,{get:()=>t[s],enumerable:!(n=Zc(t,s))||n.enumerable});return e},cr=(e,t,r)=>(r=e!=null?Xc(el(e)):{},vo(t||!e||!e.__esModule?ar(r,"default",{value:e,enumerable:!0}):r,e)),nl=e=>vo(ar({},"__esModule",{value:!0}),e),yo={};rl(yo,{BOOTSPRING_PACKAGE_NAME:()=>Dl,BOOTSPRING_VERSION:()=>Ll,BRAND:()=>al,COLORS:()=>d,REDACTED:()=>Ee,SENSITIVE_KEY_PATTERN:()=>xo,activeBrand:()=>bo,brandLine:()=>_l,card:()=>ml,cardAnsi:()=>hl,configureBrand:()=>cl,createSpinner:()=>ol,createTable:()=>jl,deepClone:()=>Cl,ensureDir:()=>Ao,fileExists:()=>El,formatDate:()=>Pl,formatRelativeTime:()=>wl,getFileTime:()=>kl,getPackageJson:()=>$l,isCI:()=>Ol,isMCPContext:()=>Sn,liveLink:()=>ko,parseArgs:()=>Il,print:()=>il,progressBar:()=>ir,readFile:()=>bl,redactErrorMessage:()=>Ml,redactPatternMatches:()=>Oo,redactSensitiveData:()=>hn,redactSensitiveString:()=>or,requireMCP:()=>Rl,resetBrand:()=>ll,slugify:()=>Al,sparkline:()=>To,statusGlyph:()=>ul,truncate:()=>xl,vitalsMetrics:()=>vn,vitalsStrip:()=>Eo,vitalsStripAnsi:()=>fl,warnMCPLimited:()=>Nl,writeFile:()=>Tl});Co.exports=nl(yo);var 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"},sl=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(`
70
73
  ${d.bold}${d.cyan}${e}${d.reset}
71
74
  `);R.subheader=e=>console.log(`
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}
75
+ ${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}- ${sl(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 il=R;function ol(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 sr={glyph:"\u26A1",name:"Bootspring",accent:"#3b6cff"},al={glyph:sr.glyph,name:sr.name},ke=null;function So(){let e=typeof process<"u"&&process.env||{},t={};return e.BOOTSPRING_BRAND_GLYPH&&(t.glyph=e.BOOTSPRING_BRAND_GLYPH),e.BOOTSPRING_BRAND_NAME&&(t.name=e.BOOTSPRING_BRAND_NAME),e.BOOTSPRING_BRAND_ACCENT&&(t.accent=e.BOOTSPRING_BRAND_ACCENT),t}function cl(e){return ke={...sr,...So(),...ke??{},...e},ke}function bo(){return ke||(ke={...sr,...So()}),ke}function ll(){ke=null}var ho={ok:"\u2713",fail:"\u2717",active:"\u25B8",pending:"\u25CB",warn:"!",info:"\xB7"};function ul(e){return ho[e]??ho.info}function ir(e,t=10){let r=Math.max(0,Math.min(100,Math.round(e))),n=Math.round(r/100*t);return"\u2593".repeat(n)+"\u2591".repeat(t-n)+` ${r}%`}var nr=["\u2581","\u2582","\u2583","\u2584","\u2585","\u2586","\u2587","\u2588"];function To(e,t=0){let r=t>0?e.slice(-t):e;if(r.length===0)return"";let n=Math.min(...r),i=Math.max(...r)-n,a=nr.length-1;return r.map(c=>{if(!Number.isFinite(c))return nr[0];if(i===0)return nr[3];let l=Math.round((c-n)/i*a);return nr[Math.max(0,Math.min(a,l))]}).join("")}function _o(e){if(!Number.isFinite(e))return"0";if(Math.abs(e)>=1e3){let t=e/1e3;return(Number.isInteger(t)?String(t):t.toFixed(1).replace(/\.0$/,""))+"k"}return String(Math.round(e))}function pl(e){return Number.isFinite(e)?"$"+e.toFixed(2):"$0.00"}function dl(e){return typeof e=="string"?e:Array.isArray(e)?To(e):""}function _n(e,t){let r=bo();return[`${r.glyph} ${r.name}`,e,t].filter(Boolean).join(" \xB7 ")}function vn(e){let t=[];typeof e.tools=="number"&&t.push(`${_o(e.tools)} tools`),typeof e.tokens=="number"&&t.push(`${_o(e.tokens)} tok`),typeof e.cost=="number"&&t.push(pl(e.cost)),typeof e.contextPct=="number"&&t.push(`ctx ${Math.round(e.contextPct)}%`);let r=dl(e.burn);return r&&t.push(`burn ${r}`),t.join(" \xB7 ")}function Eo(e){let t=[_n(e.surface,e.subtitle)];typeof e.progress=="number"&&t.push(ir(e.progress));let r=vn(e);return r&&t.push(r),t.join(" ")}function fl(e,t=!0){let r=Eo(e);if(!t)return r;let n=_n(e.surface,e.subtitle),s=r.slice(n.length),i=d;return`${i.cyan}${i.bold}${n}${i.reset}${i.dim}${s}${i.reset}`}function ko(e={}){let t=e.url??`http://localhost:${e.port??4179}`,r=[`\u2192 ${e.label??"live"}: ${t}`];return e.next&&r.push(`next: ${e.next}`),r.join(" \xB7 ")}var gl=30;function yn(e){return _n(e.surface,e.subtitle)}function Po(e){let t=`\u2500 ${e} `,r=Math.max(t.length+1,gl),n="\u256D"+t+"\u2500".repeat(r-t.length)+"\u256E",s="\u2570"+"\u2500".repeat(r)+"\u256F";return{top:n,bottom:s}}function wo(e){let t=[];e.title&&t.push(` ${e.title}`);for(let r of e.rows??[])t.push(` ${r}`);if(e.vitals){let r=vn(e.vitals);r&&t.push(` ${r}`),typeof e.progress!="number"&&typeof e.vitals.progress=="number"&&t.push(` ${ir(e.vitals.progress)}`)}if(typeof e.progress=="number"&&t.push(` ${ir(e.progress)}`),e.footer&&t.push(` ${e.footer}`),e.live){let r=e.live===!0?{}:e.live;t.push(` ${ko(r)}`)}return t}function ml(e){let{top:t,bottom:r}=Po(yn(e));return"```\n"+[t,r,...wo(e)].join(`
76
+ `)+"\n```"}function hl(e,t=!0){let{top:r,bottom:n}=Po(yn(e)),s=wo(e);if(!t)return[r,n,...s].join(`
77
+ `);let i=d;return[`${i.cyan}${i.bold}${r}${i.reset}`,`${i.cyan}${n}${i.reset}`,...s.map(c=>`${i.dim}${c}${i.reset}`)].join(`
78
+ `)}function _l(e){return yn(e)}var vl=cr(require("fs")),yl=cr(require("path")),qe=cr(require("fs")),Sl=cr(require("path"));function Ao(e){try{return qe.default.existsSync(e)||qe.default.mkdirSync(e,{recursive:!0}),!0}catch{return!1}}function bl(e,t=null){try{return qe.default.readFileSync(e,"utf-8")}catch{return t}}function Tl(e,t){try{let r=Sl.default.dirname(e);return Ao(r),qe.default.writeFileSync(e,t,"utf-8"),!0}catch{return!1}}function El(e){try{return qe.default.existsSync(e)}catch{return!1}}function kl(e){try{return qe.default.statSync(e).mtime}catch{return null}}function Pl(e=new Date){return e.toISOString().split("T")[0]}function wl(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 Al(e){return e.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}function xl(e,t=50){return e.length<=t?e:e.slice(0,t-3)+"..."}function Ol(){return!!(process.env.CI||process.env.CONTINUOUS_INTEGRATION||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS)}function Sn(){return!!(process.env.BOOTSPRING_MCP||process.env.MCP_SERVER||process.env.CLAUDE_CODE_MCP)}function Cl(e){return JSON.parse(JSON.stringify(e))}function Il(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 jl(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(`
79
+ `)}function $l(e){let t=yl.join(e,"package.json");try{return JSON.parse(vl.readFileSync(t,"utf-8"))}catch{return null}}function Rl(e,t={}){return Sn()?!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}
74
80
  `),!1):(console.log(`
75
81
  ${d.yellow}${d.bold}Limited Mode - MCP Integration Recommended${d.reset}
76
82
 
@@ -90,5 +96,5 @@ ${d.bold}Documentation:${d.reset}
90
96
  https://bootspring.com/docs/mcp-setup
91
97
 
92
98
  ${d.dim}Run "bootspring mcp" for server options${d.reset}
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"}};
99
+ `),!1)}function Nl(e){Sn()||(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}
100
+ `))}var Ll="3.4.0",Dl="@girardmedia/bootspring",Ee="[REDACTED]",xo=/(?:^|[_-])(api[_-]?key|token|refresh[_-]?token|authorization|x[_-]?api[_-]?key|project[_-]?id)$/i;function Oo(e){return e.replace(/\b(?:bs|sk)_(?:live|test)_[A-Za-z0-9_-]{8,}\b/g,Ee).replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,Ee).replace(/\bBearer\s+[A-Za-z0-9._-]+\b/gi,`Bearer ${Ee}`).replace(/\bproj_[A-Za-z0-9_-]{6,}\b/g,`proj_${Ee}`).replace(/(["']?(?:authorization|x-api-key|apiKey|token|refreshToken|projectId)["']?\s*[:=]\s*["']?)([^"',\s}]+)/gi,`$1${Ee}`)}function or(e){return Oo(String(e||""))}function hn(e,t=0){if(t>10)return e;if(typeof e=="string")return or(e);if(Array.isArray(e))return e.map(n=>hn(n,t+1));if(!e||typeof e!="object")return e;let r={};for(let[n,s]of Object.entries(e)){if(xo.test(n)){r[n]=Ee;continue}r[n]=hn(s,t+1)}return r}function Ml(e){return e?e instanceof Error?or(e.message||String(e)):or(String(e)):""}});var jo=ur((Eu,ql)=>{ql.exports={name:"bootspring-workspace",version:"3.4.1",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 run typecheck && 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:lockfile-sync":"node scripts/verify-lockfile-sync.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"}});E();var U=mo(),k=Io(),$o=U.config,bn=U.context,Gl=U.policies,Bl={COLORS:k.COLORS,print:k.print,createSpinner:k.createSpinner,ensureDir:k.ensureDir,readFile:k.readFile,writeFile:k.writeFile,fileExists:k.fileExists,getFileTime:k.getFileTime,formatDate:k.formatDate,formatRelativeTime:k.formatRelativeTime,slugify:k.slugify,truncate:k.truncate,deepClone:k.deepClone,isCI:k.isCI,isMCPContext:k.isMCPContext,parseArgs:k.parseArgs,createTable:k.createTable,getPackageJson:k.getPackageJson,requireMCP:k.requireMCP,warnMCPLimited:k.warnMCPLimited},Tn=U.entitlements,lt=U.tierEnforcement,zl=U.telemetry,En=U.auth,Fl=U.api,Ul=k,Vl=U.selfUpdate,Kl=U.setupCommands,Hl=jo();module.exports={VERSION:Hl.version,config:$o,context:bn,utils:Bl,policies:Gl,entitlements:Tn,tierEnforcement:lt,telemetry:zl,auth:En,api:Fl,redaction:Ul,selfUpdate:Vl,setupCommands:Kl,loadConfig:$o.load,getContext:bn.get,validateContext:bn.validate,checkSkillAccess:Tn.checkSkillAccess,checkWorkflowAccess:Tn.checkWorkflowAccess,getTier:lt.getTier,checkAgentAccess:lt.checkAgentAccess,hasFeature:lt.hasFeature,meetsTierRequirement:lt.meetsTierRequirement,isAuthenticated:En.isAuthenticated,getUser:En.getUser,BRAND:{name:"Bootspring",tagline:"Development scaffolding with intelligence",website:"https://bootspring.com",docs:"https://bootspring.com/docs",api:"https://api.bootspring.com"}};