codebase-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,608 @@
1
+ #!/usr/bin/env node
2
+ var sn=Object.defineProperty;var $=(e,t)=>()=>(e&&(t=e(e=0)),t);var yt=(e,t)=>{for(var s in t)sn(e,s,{get:t[s],enumerable:!0})};function U(e){Z=e}function kt(e){nn=e}function l(e){Z||console.log(e)}function h(e){Z||console.log(` ${D.green}[\u2713]${D.reset} ${e}`)}function w(e){console.error(` ${D.red}[\u2717]${D.reset} ${e}`)}function S(e){Z||console.log(` ${D.yellow}[!]${D.reset} ${e}`)}function y(e){Z||console.log(` ${D.cyan}[i]${D.reset} ${e}`)}function wt(e){Z||console.log(`${D.dim}${e}${D.reset}`)}function v(e){return`${D.bold}${e}${D.reset}`}function j(e){Z||console.log(`
3
+ ${D.bold}${e}${D.reset}`)}function _e(e,t){return process.stdout.isTTY&&!B?`\x1B]8;;${t}\x1B\\${e}\x1B]8;;\x1B\\`:`${e} (${t})`}function G(e){return`${D.dim}${e}${D.reset}`}function k(e){return`${D.cyan}${e}${D.reset}`}var B,D,Z,nn,I=$(()=>{"use strict";B=!!process.env.NO_COLOR,D={reset:B?"":"\x1B[0m",green:B?"":"\x1B[32m",red:B?"":"\x1B[31m",yellow:B?"":"\x1B[33m",cyan:B?"":"\x1B[36m",blue:B?"":"\x1B[34m",magenta:B?"":"\x1B[35m",dim:B?"":"\x1B[2m",bold:B?"":"\x1B[1m"},Z=!1,nn=!1});function Et(e,t){let s=an(t);return e.filter(n=>s.test(n))}function an(e){let t="^",s=0;for(;s<e.length;){let n=e[s];if(n==="*")e[s+1]==="*"?e[s+2]==="/"?(t+="(?:.*/)?",s+=3):(t+=".*",s+=2):(t+="[^/]*",s++);else if(n==="?")t+="[^/]",s++;else if(n==="{"){let i=e.indexOf("}",s);if(i!==-1){let o=e.slice(s+1,i).split(",");t+="(?:"+o.map(Qe).join("|")+")",s=i+1}else t+=Qe(n),s++}else t+=Qe(n),s++}return t+="$",new RegExp(t)}function Qe(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var St=$(()=>{"use strict"});import{readdir as cn,readFile as ln}from"fs/promises";import{existsSync as un}from"fs";import{join as Ye,relative as dn}from"path";import{execFile as pn}from"child_process";async function Rt(e,t={}){let s=new Set([...fn,...t.ignore??[]]),n=await _t(e,e,s,t.depth??10),i=new Set(n);return{root:e,files:n,async readFile(o){try{return await ln(Ye(e,o),"utf-8")}catch{return""}},fileExists(o){return i.has(o)?!0:un(Ye(e,o))},glob(o){return Et(n,o)},async exec(o){return new Promise(r=>{pn("sh",["-c",o],{cwd:e,timeout:1e4},(a,c)=>{r(a?"":c.trim())})})}}}async function _t(e,t,s,n,i=0){if(i>n)return[];let o=[];try{let r=await cn(t,{withFileTypes:!0});for(let a of r){if(s.has(a.name)||a.isDirectory()&&a.name.startsWith(".")&&!new Set([".github",".husky",".circleci"]).has(a.name))continue;let c=Ye(t,a.name),u=dn(e,c);if(a.isDirectory()){o.push(u+"/");let g=await _t(e,c,s,n,i+1);o.push(...g)}else o.push(u)}}catch{}return o}var fn,Pt=$(()=>{"use strict";St();fn=new Set(["node_modules",".git","dist","build",".next",".nuxt",".output","__pycache__","vendor",".venv","venv","target","coverage",".cache",".turbo",".vercel",".netlify",".parcel-cache",".svelte-kit",".angular","out","bin","obj"])});async function mn(e){let t=await e.readFile("package.json");if(t)try{let r=JSON.parse(t);if(r.name)return r.name}catch{}let s=await e.readFile("Cargo.toml");if(s){let r=s.match(/^name\s*=\s*"([^"]+)"/m);if(r)return r[1]}let n=await e.readFile("pyproject.toml");if(n){let r=n.match(/^name\s*=\s*"([^"]+)"/m);if(r)return r[1]}let i=await e.readFile("go.mod");if(i){let r=i.match(/^module\s+(\S+)/m);if(r)return r[1].split("/").pop()||r[1]}let o=await e.exec("git remote get-url origin 2>/dev/null");return o?o.replace(/.*[:/]/,"").replace(/\.git$/,""):e.root.split("/").pop()||"unknown"}async function gn(e){let t=await e.readFile("package.json");if(t)try{let i=JSON.parse(t);if(i.description)return i.description}catch{}let s=await e.readFile("Cargo.toml");if(s){let i=s.match(/^description\s*=\s*"([^"]+)"/m);if(i)return i[1]}let n=await e.readFile("pyproject.toml");if(n){let i=n.match(/^description\s*=\s*"([^"]+)"/m);if(i)return i[1]}return null}async function hn(e){let t=["README.md","readme.md","README","README.txt","README.rst"],s="";for(let a of t)if(s=await e.readFile(a),s)break;if(!s)return null;let n=s.split(`
4
+ `),i=!1,o=[];for(let a of n){let c=a.trim();if(c.startsWith("#")){if(i)break;continue}if(!c||c.startsWith("![")||c.startsWith("[![")||c.startsWith("<")){if(i)break;continue}i=!0,o.push(c)}return o.join(" ").slice(0,300)||null}var Dt,Ot=$(()=>{"use strict";Dt={name:"project",category:"project",async detect(e){let[t,s,n]=await Promise.all([mn(e),gn(e),hn(e)]);return{name:t,description:s||n||null}}}});async function bn(e){return await e.exec("git remote get-url origin 2>/dev/null")||null}async function yn(e){let t=await e.exec("git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null");if(t)return t.replace("refs/remotes/origin/","");let s=await e.exec("git branch --list main master 2>/dev/null");return s.includes("main")?"main":s.includes("master")?"master":await e.exec("git branch --show-current 2>/dev/null")||null}async function kn(e){let t=await e.exec("git branch -a --sort=-committerdate --format='%(refname:short)' 2>/dev/null");return t?t.split(`
5
+ `).map(s=>s.trim().replace(/^origin\//,"")).filter(s=>s&&s!=="HEAD").filter((s,n,i)=>i.indexOf(s)===n).slice(0,10):[]}async function wn(e){let t=await e.readFile("package.json");if(t)try{if(JSON.parse(t).workspaces)return!0}catch{}return e.fileExists("pnpm-workspace.yaml")||e.fileExists("lerna.json")||e.fileExists("turbo.json")||e.fileExists("nx.json")||e.fileExists("rush.json")}async function vn(e){if(e.fileExists("turbo.json"))return"turborepo";if(e.fileExists("nx.json"))return"nx";if(e.fileExists("lerna.json"))return"lerna";if(e.fileExists("rush.json"))return"rush";if(e.fileExists("pnpm-workspace.yaml"))return"pnpm";let t=await e.readFile("package.json");if(t)try{if(JSON.parse(t).workspaces)return"npm/yarn"}catch{}return null}var At,It=$(()=>{"use strict";At={name:"repo",category:"repo",async detect(e){let[t,s,n,i,o]=await Promise.all([bn(e),yn(e),kn(e),wn(e),vn(e)]);return{url:t,default_branch:s,is_monorepo:i,workspace_manager:i?o:null,active_branches:n}}}});import{existsSync as jn}from"fs";import{join as xn}from"path";function En(e,t){let s={},n=[];for(let o of e){let a=o.replace(/\/$/,"").split("/");if(a.length===1&&!o.endsWith("/")){n.push(a[0]);continue}if(a.length<2)continue;let c=a[0]+"/";a.length===2&&!o.endsWith("/")?(s[c]||(s[c]=new Set),s[c].add(a[1])):a.length>=3&&(s[c]||(s[c]=new Set),s[c].add(a[1]+"/"))}let i={};if(n.length>0){let o=n.sort();i["./"]=o.length>15?[...o.slice(0,13),`... (${o.length} files)`]:o}for(let[o,r]of Object.entries(s)){let a=[...r].sort();i[o]=a.length>20?[...a.slice(0,18),`... (${a.length} items)`]:a}return i}var $n,Cn,Nt,Ft=$(()=>{"use strict";$n=["src/index.ts","src/index.js","src/main.ts","src/main.js","src/app.ts","src/app.js","src/server.ts","src/server.js","src/app/layout.tsx","src/app/page.tsx","app/layout.tsx","pages/_app.tsx","pages/_app.js","pages/index.tsx","index.ts","index.js","main.ts","main.js","app/main.py","main.py","app.py","manage.py","main.go","cmd/main.go","src/main.rs","src/lib.rs","lib/main.dart","Program.cs"],Cn=["dist","build",".next","out","target","bin","obj",".output",".nuxt",".svelte-kit",".vercel"],Nt={name:"structure",category:"structure",async detect(e){let t=$n.filter(i=>e.fileExists(i)),s=Cn.filter(i=>jn(xn(e.root,i))),n=En(e.files,4);return{entry_points:t,build_output:s,tree:n}}}});function An(e){let t={};for(let s of e.files){if(s.endsWith("/"))continue;let n="."+s.split(".").pop(),i=Sn[n];i&&(t[i]=(t[i]||0)+1)}return Object.entries(t).sort((s,n)=>n[1]-s[1]).map(([s])=>s)}async function In(e){let t=await e.readFile("package.json");if(!t)return{};try{let s=JSON.parse(t);return{...s.dependencies||{},...s.devDependencies||{}}}catch{return{}}}function Nn(e){let t=[];for(let[n,i]of Object.entries(e)){let o=Rn[n];if(o){let r=i.replace(/^[\^~>=<]+/,"").split(".").slice(0,2).join(".");t.push(`${o}@${r}`)}}let s=Fn(e);return t.push(...s),[...new Set(t)]}function Fn(e){let t=[],s=Object.keys(e).join(" ");if(s.includes("next")){let n=e.next?.replace(/^[\^~>=<]+/,"").split(".").slice(0,2).join("."),i=[];n&&(parseFloat(n)>=13&&i.push("app-router available"),i.push(n)),t.push(i.length>0?`next.js@${i.join(" ")}`:"next.js")}if(s.includes("vue")){let n=e.vue?.replace(/^[\^~>=<]+/,"");if(n){let i=parseInt(n.split(".")[0],10);t.push(i>=3?`vue@${n}`:`vue@${n}`)}else t.push("vue");if(s.includes("nuxt")){let i=e.nuxt?.replace(/^[\^~>=<]+/,"");if(i){let o=parseInt(i.split(".")[0],10);t.push(o>=3?`nuxt@${i} (Nuxt 3)`:`nuxt@${i} (Nuxt 2)`)}else t.push("nuxt")}}if(s.includes("@sveltejs/kit")){let n=e["@sveltejs/kit"]?.replace(/^[\^~>=<]+/,"");t.push(n?`sveltekit@${n}`:"sveltekit")}if(s.includes("astro")){let n=e.astro?.replace(/^[\^~>=<]+/,""),i=[];e["@astrojs/react"]&&i.push("react"),e["@astrojs/vue"]&&i.push("vue"),e["@astrojs/svelte"]&&i.push("svelte"),e["@astrojs/preact"]&&i.push("preact"),e["@astrojs/solid-js"]&&i.push("solid"),i.length>0?t.push(n?`astro@${n} (${i.join(", ")})`:`astro (${i.join(", ")})`):t.push(n?`astro@${n}`:"astro")}if(s.includes("@remix-run/react")||s.includes("@remix-run/node")){let n=e["@remix-run/react"]?.replace(/^[\^~>=<]+/,"")||e["@remix-run/node"]?.replace(/^[\^~>=<]+/,"");t.push(n?`remix@${n}`:"remix")}if(s.includes("@angular/core")){let n=e["@angular/core"]?.replace(/^[\^~>=<]+/,"").split(".").slice(0,2).join(".");t.push(n?`angular@${n}`:"angular")}if(s.includes("gatsby")){let n=e.gatsby?.replace(/^[\^~>=<]+/,"");t.push(n?`gatsby@${n}`:"gatsby")}return t}function qn(e,t){return e.fileExists("pnpm-lock.yaml")?"pnpm":e.fileExists("yarn.lock")?"yarn":e.fileExists("bun.lockb")||e.fileExists("bun.lock")?"bun":e.fileExists("package-lock.json")?"npm":e.fileExists("Cargo.lock")?"cargo":e.fileExists("poetry.lock")?"poetry":e.fileExists("Pipfile.lock")?"pipenv":e.fileExists("go.sum")?"go modules":e.fileExists("Gemfile.lock")?"bundler":e.fileExists("composer.lock")?"composer":Object.keys(t).length>0?"npm":null}function Xe(e,t){for(let s of Object.keys(e))if(t[s])return t[s];return null}function Mn(e,t){let s=new Set;for(let n of Object.keys(e))t[n]&&s.add(t[n]);return[...s]}async function Ln(e){let t=await e.readFile("prisma/schema.prisma");if(!t)return null;let s=t.match(/datasource\s+\w+\s*\{([^}]+)\}/);if(!s)return null;let n=s[1].match(/provider\s*=\s*"(.*?)"/);if(!n)return null;let i=n[1].toLowerCase();return i==="postgresql"||i==="postgres"?"postgresql":i==="mysql"?"mysql":i==="sqlite"?"sqlite":i==="sqlserver"?"sqlserver":i==="mongodb"?"mongodb":i==="cockroachdb"?"cockroachdb":i}async function Tn(e){let t=[],s=["migrations/","prisma/migrations/","db/migrate/","database/migrations/","src/migrations/","server/migrations/","api/migrations/","migrate/","sql/","db/sql/"];for(let r of s)if(e.files.some(a=>a.startsWith(r))){let a=await Hn(e,r);a&&!t.includes(a)&&t.push(a)}let n=await Gn(e);for(let r of n)t.includes(r)||t.push(r);let i=await Bn(e);for(let r of i)t.includes(r)||t.push(r);let o=await Un(e);for(let r of o)t.includes(r)||t.push(r);return t}async function Hn(e,t){let s=e.files.filter(n=>n.startsWith(t));for(let n of s){let i=await e.readFile(n);if(!i)continue;let o=i.toLowerCase();if(o.includes("create table")||o.includes("alter table")){if(o.includes("postgresql")||o.includes("serial")||o.includes("bigserial"))return"postgresql";if(o.includes("mysql")||o.includes("engine=innodb"))return"mysql";if(o.includes("sqlite"))return"sqlite";if(o.includes("mongodb")||o.includes("mongoose"))return"mongodb";if(o.includes("redis"))return"redis";if(o.includes("elasticsearch"))return"elasticsearch"}}return null}async function Gn(e){let t=[],s=["docker-compose.yml","docker-compose.yaml","docker-compose.dev.yml","docker-compose.prod.yml","compose.yml","compose.yaml"];for(let n of s){if(!e.fileExists(n))continue;let i=await e.readFile(n);if(!i)continue;let o=i.toLowerCase();(o.includes("postgres")||o.includes("postgresql"))&&t.push("postgresql"),o.includes("mysql")&&t.push("mysql"),o.includes("mariadb")&&t.push("mariadb"),(o.includes("mongodb")||o.includes("mongo"))&&t.push("mongodb"),o.includes("redis")&&t.push("redis"),o.includes("elasticsearch")&&t.push("elasticsearch"),o.includes("cassandra")&&t.push("cassandra"),o.includes("couchdb")&&t.push("couchdb"),o.includes("neo4j")&&t.push("neo4j"),o.includes("rabbitmq")&&t.push("rabbitmq"),o.includes("dynamodb")&&t.push("dynamodb")}return t}async function Bn(e){let t=[],s=await e.readFile("ormconfig.json")||await e.readFile("ormconfig.js")||await e.readFile("src/data-source.ts");if(s){let r=s.toLowerCase();(r.includes("postgres")||r.includes("pg"))&&t.push("postgresql"),r.includes("mysql")&&t.push("mysql"),r.includes("sqlite")&&t.push("sqlite"),r.includes("mongodb")&&t.push("mongodb")}let n=[".sequelizerc","config/database.js","config/config.js"];for(let r of n){let a=await e.readFile(r);if(a){let c=a.toLowerCase();c.includes("postgres")&&t.push("postgresql"),c.includes("mysql")&&t.push("mysql"),c.includes("sqlite")&&t.push("sqlite"),c.includes("mariadb")&&t.push("mariadb")}}let i=await e.readFile("mikro-orm.config.ts")||await e.readFile("mikro-orm.config.js");if(i){let r=i.toLowerCase();r.includes("postgres")&&t.push("postgresql"),r.includes("mysql")&&t.push("mysql"),r.includes("sqlite")&&t.push("sqlite"),r.includes("mongodb")&&t.push("mongodb")}let o=["drizzle.config.ts","drizzle.config.js","drizzle.config.json"];for(let r of o){let a=await e.readFile(r);if(a){let c=a.toLowerCase();(c.includes("postgres")||c.includes("pg"))&&t.push("postgresql"),c.includes("mysql")&&t.push("mysql"),c.includes("sqlite")&&t.push("sqlite")}}return t}async function Un(e){let t=[],s=e.files.filter(n=>n.endsWith(".sql")||n.includes("schema")||n.includes("migrate")||n.includes("migration"));for(let n of s){let i=await e.readFile(n);if(!i)continue;let o=i.toLowerCase();(o.includes("serial")||o.includes("bigserial")||o.includes("text[]")||o.includes("jsonb")||o.includes("create extension")||o.includes("pg_"))&&(t.includes("postgresql")||t.push("postgresql")),(o.includes("engine=innodb")||o.includes("auto_increment")||o.includes("tinyint")||o.includes("mediumint")||o.includes("enum("))&&(t.includes("mysql")||t.push("mysql")),(o.includes("autoincrement")||o.includes("integer primary key"))&&(t.includes("sqlite")||t.push("sqlite"))}return t}async function Jn(e){let t=await e.readFile("pyproject.toml"),s=await e.readFile("requirements.txt"),n=await e.readFile("setup.py"),i=t+`
6
+ `+s+`
7
+ `+n;if(i.includes("fastapi")){let o=se(s,"fastapi")||se(t,"fastapi");return o?`fastapi@${o}`:"fastapi"}if(i.includes("django")){let o=se(s,"django")||se(t,"django"),r=[];o&&r.push(o);let a=await Wn(e);a.length>0&&r.push(`apps: ${a.join(", ")}`);let c=await Kn(e);return c&&r.push(c),r.length>0?`django@${r.join(" ")}`:o?`django@${o}`:"django"}if(i.includes("flask")){let o=se(s,"flask")||se(t,"flask");return o?`flask@${o}`:"flask"}return i.includes("starlette")?"starlette":i.includes("tornado")?"tornado":i.includes("aiohttp")?"aiohttp":i.includes("sanic")?"sanic":i.includes("pyramid")?"pyramid":i.includes("bottle")?"bottle":i.includes("cherrypy")?"cherrypy":i.includes("falcon")?"falcon":i.includes("masonite")?"masonite":i.includes("torch")||i.includes("pytorch")?"pytorch":i.includes("tensorflow")?"tensorflow":i.includes("keras")?"keras":i.includes("scikit-learn")?"scikit-learn":i.includes("pandas")?"pandas":i.includes("numpy")?"numpy":i.includes("celery")?"celery":i.includes("rq")?"rq":null}async function Wn(e){let t=[],s=e.files.filter(n=>n.includes("settings.py")||n.includes("settings/")||n.match(/settings.*\.py$/));for(let n of s.slice(0,3))try{let i=await e.readFile(n);if(!i)continue;let o=i.match(/INSTALLED_APPS\s*=\s*\[([\s\S]*?)\]/);if(o){let r=o[1],a=r.match(/'([^']+)'/g)||r.match(/"([^"]+)"/g)||[];for(let c of a){let u=c.replace(/['"]/g,"");!u.startsWith("django.")&&u.includes(".")&&t.push(u.split(".")[0])}}}catch{}return[...new Set(t)].slice(0,5)}async function Kn(e){let t=e.files.some(i=>i.endsWith("settings.py")),s=e.files.some(i=>i.includes("settings/")&&i.endsWith(".py"));return e.files.some(i=>i.includes("settings_dev.py")||i.includes("settings.dev"))?"settings:dev":s?"settings:dir":t?"settings:py":null}async function zn(e){let t=await e.readFile("go.mod");if(!t)return null;let s=[];if(t.includes("github.com/gin-gonic/gin")){let n=de(t,"github.com/gin-gonic/gin");s.push(n?`gin@${n}`:"gin")}if(t.includes("github.com/gofiber/fiber")){let n=de(t,"github.com/gofiber/fiber");s.push(n?`fiber@${n}`:"fiber")}if(t.includes("github.com/labstack/echo")){let n=de(t,"github.com/labstack/echo");s.push(n?`echo@${n}`:"echo")}if(t.includes("github.com/gorilla/mux")){let n=de(t,"github.com/gorilla/mux");s.push(n?`gorilla/mux@${n}`:"gorilla/mux")}if(t.includes("go-chi/chi")){let n=de(t,"go-chi/chi");s.push(n?`chi@${n}`:"chi")}return t.includes("grpc")&&s.push("grpc"),t.includes("net/http")&&s.push("net/http (std)"),s.length>0?s.join(", "):null}async function Vn(e){let t=await e.readFile("Cargo.toml");if(!t)return null;let s=[];if(t.includes("actix-web")){let n=Pe(t,"actix-web");s.push(n?`actix-web@${n}`:"actix-web")}if(t.includes("axum")){let n=Pe(t,"axum");s.push(n?`axum@${n}`:"axum")}if(t.includes("rocket")){let n=Pe(t,"rocket");s.push(n?`rocket@${n}`:"rocket")}if(t.includes("warp")&&s.push("warp"),t.includes("tokio")){let n=Pe(t,"tokio");s.push(n?`tokio@${n}`:"tokio")}return t.includes("hyper")&&s.push("hyper"),t.includes("tonic")&&s.push("tonic (grpc)"),s.length>0?s.join(", "):null}async function Qn(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=t+`
8
+ `+s+`
9
+ `+n;if(i.includes("spring-boot")){let o=De(t,"spring-boot-starter-parent")||Oe(s,"org.springframework.boot");return o?`spring boot@${o}`:"spring boot"}if(i.includes("spring-framework")||i.includes("spring-core")){let o=De(t,"spring-framework")||Oe(s,"org.springframework");return o?`spring@${o}`:"spring"}if(i.includes("micronaut")){let o=De(t,"micronaut")||Oe(s,"io.micronaut");return o?`micronaut@${o}`:"micronaut"}if(i.includes("quarkus")){let o=De(t,"quarkus")||Oe(s,"io.quarkus");return o?`quarkus@${o}`:"quarkus"}return i.includes("jakarta")?"jakarta ee":i.includes("javax")?"java ee":i.includes("vertx")?"vert.x":i.includes("kafka")?"kafka":null}async function Yn(e){let t=await e.readFile("Gemfile"),s=await e.readFile(".gemspec"),n=t+`
10
+ `+s;if(n.includes("rails")){let i=qt(n,"rails"),o=[];i&&o.push(i);let r=await Xn(e);return r.length>0&&o.push(r.join(", ")),o.length>0?`rails@${o.join(" ")}`:`rails@${i||"unknown"}`}if(n.includes("sinatra")){let i=qt(n,"sinatra");return i?`sinatra@${i}`:"sinatra"}return n.includes("grape")?"grape":n.includes("hanami")?"hanami":n.includes("roda")?"roda":n.includes("padrino")?"padrino":n.includes("sidekiq")?"sidekiq":n.includes("resque")?"resque":n.includes("puma")?"puma":n.includes("unicorn")?"unicorn":null}async function Xn(e){let t=[],s=await e.readFile("Gemfile");return s&&(s.includes("devise")&&t.push("devise"),s.includes("pundit")&&t.push("pundit"),s.includes("cancancan")&&t.push("cancancan"),s.includes("rspec-rails")&&t.push("rspec"),s.includes("minitest")&&t.push("minitest"),s.includes("factory_bot_rails")&&t.push("factory_bot"),s.includes("faker")&&t.push("faker"),s.includes("sidekiq")&&t.push("sidekiq"),(s.includes("redis")||s.includes("redis-rails"))&&t.push("redis"),s.includes("pg")&&t.push("postgresql"),s.includes("mysql2")&&t.push("mysql"),s.includes("sqlite3")&&t.push("sqlite"),s.includes("aws-sdk")&&t.push("aws"),s.includes("bootstrap")&&t.push("bootstrap"),s.includes("tailwindcss-rails")&&t.push("tailwind")),t.slice(0,5)}async function Zn(e){let t=await e.readFile("composer.json");if(!t)return null;try{let s=JSON.parse(t),n={...s.require||{},...s["require-dev"]||{}},i=Object.keys(n).join(" ");if(i.includes("laravel")){let o=n["laravel/framework"]||n["laravel/lumen"];return o?`laravel@${o.replace(/^[\^~>=<]+/,"")}`:"laravel"}if(i.includes("symfony")){let o=n["symfony/framework-bundle"];return o?`symfony@${o.replace(/^[\^~>=<]+/,"")}`:"symfony"}if(i.includes("slim")){let o=n["slim/slim"];return o?`slim@${o.replace(/^[\^~>=<]+/,"")}`:"slim"}if(i.includes("codeigniter"))return"codeigniter";if(i.includes("cakephp"))return"cakephp";if(i.includes("yii")){let o=n["yiisoft/yii2"];return o?`yii@${o.replace(/^[\^~>=<]+/,"")}`:"yii"}if(i.includes("lumen"))return"lumen"}catch{}return null}async function ei(e){let t=e.files.filter(n=>n.endsWith(".csproj"));if(t.length===0)return null;let s=[];for(let n of t){let i=await e.readFile(n);if(i.includes("Microsoft.AspNetCore")){let o=ti(i,"Microsoft.AspNetCore.App");s.push(o?`asp.net core@${o}`:"asp.net core")}i.includes("EntityFramework")&&s.push("entity framework"),i.includes("NUnit")&&s.push("nunit"),i.includes("xUnit")&&s.push("xunit"),i.includes("Moq")&&s.push("moq")}return s.length>0?s.join(", "):null}function se(e,t){if(!e)return null;let s=[new RegExp(`${t}===?\\s*([\\d.]+)`),new RegExp(`${t}>=?\\s*([\\d.]+)`),new RegExp(`${t}~=?\\s*([\\d.]+)`),new RegExp(`${t}@([\\d.]+)`),new RegExp(`"${t}":\\s*"([\\d.]+)"`),new RegExp(`'${t}':\\s*'([\\d.]+)'`)];for(let n of s){let i=e.match(n);if(i)return i[1]}return null}function de(e,t){let s=new RegExp(`${t}\\s+v([\\d.]+)`),n=e.match(s);return n?n[1]:null}function Pe(e,t){let s=new RegExp(`${t}\\s*=\\s*"([\\d.]+)"`),n=e.match(s);return n?n[1]:null}function De(e,t){if(!e)return null;let s=new RegExp(`<artifactId>${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}</artifactId>[\\s\\S]*?<version>([\\d.]+)</version>`),n=e.match(s);return n?n[1]:null}function Oe(e,t){if(!e)return null;let s=[new RegExp(`${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}:[^:]*:([\\d.]+)`),new RegExp(`${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}:([\\d.]+)`)];for(let n of s){let i=e.match(n);if(i)return i[1]}return null}function qt(e,t){let s=new RegExp(`gem\\s+['"]${t}['"][^,]*,\\s*['"]~?>?\\s*([\\d.]+)['"]`),n=e.match(s);return n?n[1]:null}function ti(e,t){let s=new RegExp(`<PackageReference\\s+Include="${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}"[^>]*Version="([\\d.]+)"`),n=e.match(s);return n?n[1]:null}var Sn,Rn,_n,Pn,Dn,On,Mt,Lt=$(()=>{"use strict";Sn={".ts":"typescript",".tsx":"typescript-react",".js":"javascript",".jsx":"javascript-react",".mjs":"javascript",".cjs":"javascript",".py":"python",".pyi":"python",".go":"go",".rs":"rust",".java":"java",".kt":"kotlin",".kts":"kotlin",".cs":"csharp",".rb":"ruby",".php":"php",".swift":"swift",".dart":"dart",".ex":"elixir",".exs":"elixir",".zig":"zig",".scala":"scala",".sc":"scala",".cpp":"c++",".cc":"c++",".cxx":"c++",".hpp":"c++",".h":"c++",".c":"c",".sh":"shell",".bash":"shell",".zsh":"shell",".fish":"shell",".ps1":"powershell",".lua":"lua",".r":"r",".R":"r",".m":"matlab",".mlx":"matlab",".jl":"julia",".nim":"nim",".cr":"crystal",".v":"v",".wasm":"webassembly",".wat":"webassembly",".graphql":"graphql",".gql":"graphql",".sol":"solidity",".move":"move",".mo":"motoko",".toml":"toml",".yaml":"yaml",".yml":"yaml",".json":"json",".xml":"xml",".md":"markdown"},Rn={next:"next.js",react:"react","react-dom":"react",vue:"vue",nuxt:"nuxt","@angular/core":"angular",svelte:"svelte","@sveltejs/kit":"sveltekit",express:"express",fastify:"fastify",hono:"hono",koa:"koa",nestjs:"nestjs","@nestjs/core":"nestjs",remix:"remix","@remix-run/react":"remix",astro:"astro",gatsby:"gatsby",electron:"electron",tauri:"tauri","react-native":"react-native",expo:"expo","@trpc/server":"trpc","@trpc/client":"trpc"},_n={pg:"postgresql",postgres:"postgresql","pg-promise":"postgresql",mysql2:"mysql",mysql:"mysql","@mysql/xdevapi":"mysql","better-sqlite3":"sqlite",sqlite3:"sqlite","sql.js":"sqlite",mongodb:"mongodb",mongoose:"mongodb",mongoodb:"mongodb",redis:"redis",ioredis:"redis","@redis/client":"redis","redis-mock":"redis","cassandra-driver":"cassandra","express-cassandra":"cassandra",elasticsearch:"elasticsearch","@elastic/elasticsearch":"elasticsearch","@elastic/elasticsearch-ng":"elasticsearch","neo4j-driver":"neo4j",neo4j:"neo4j",couchbase:"couchbase",ottoman:"couchbase",rethinkdb:"rethinkdb",rethinkdbdash:"rethinkdb",level:"leveldb",levelup:"leveldb","aws-sdk":"dynamodb","@aws-sdk/client-dynamodb":"dynamodb",mssql:"mssql",tedious:"mssql",msnodesqlv8:"mssql",oracledb:"oracle","node-oracledb":"oracle","pg-copy-streams":"postgresql","pg-pool":"postgresql","pg-native":"postgresql"," knex":"knex",minio:"minio",firebird:"firebird","node-firebird":"firebird","hdb-pool":"sap-hana","snowflake-sdk":"snowflake","cassandra-client":"scylladb"},Pn={prisma:"prisma","@prisma/client":"prisma","drizzle-orm":"drizzle",typeorm:"typeorm",sequelize:"sequelize","@mikro-orm/core":"mikro-orm",knex:"knex",mongoose:"mongoose"},Dn={tailwindcss:"tailwindcss","styled-components":"styled-components","@emotion/react":"emotion",sass:"sass","@chakra-ui/react":"chakra-ui","@mui/material":"material-ui","@mantine/core":"mantine"},On={vite:"vite",webpack:"webpack",esbuild:"esbuild",tsup:"tsup",rollup:"rollup",parcel:"parcel",turbopack:"turbopack",unbuild:"unbuild",pkgroll:"pkgroll","@swc/core":"swc",snowpack:"snowpack"},Mt={name:"stack",category:"stack",async detect(e){let t=An(e),s=await In(e),n=Nn(s),i=qn(e,s),o=Mn(s,_n),r=Xe(s,Pn),a=Xe(s,Dn),c=Xe(s,On);if(r==="prisma"){let R=await Ln(e);R&&!o.includes(R)&&o.unshift(R)}let u=await Tn(e);for(let R of u)o.includes(R)||o.push(R);let[g,f,p,d,m,C,P]=await Promise.all([Jn(e),zn(e),Vn(e),Qn(e),Yn(e),Zn(e),ei(e)]);return g&&n.push(g),f&&n.push(f),p&&n.push(p),d&&n.push(d),m&&n.push(m),C&&n.push(C),P&&n.push(P),{languages:[...new Set(t)],frameworks:[...new Set(n)],package_manager:i,database:o.length>1?o.join(" + "):o[0]||null,orm:r,styling:a,build_tool:c}}}});async function si(e){let t=await e.readFile("package.json");if(!t)return fe();try{let n=JSON.parse(t).scripts||{},i="npm run";e.fileExists("pnpm-lock.yaml")?i="pnpm":e.fileExists("yarn.lock")?i="yarn":(e.fileExists("bun.lockb")||e.fileExists("bun.lock"))&&(i="bun run");let o={dev:pe(n,["dev","start","serve"],i),build:pe(n,["build","compile"],i),test:pe(n,["test","test:unit","test:run"],i),lint:pe(n,["lint","lint:check"],i),format:pe(n,["format","fmt","prettier"],i)},r=["typecheck","check","deploy","preview","clean","db:migrate","db:seed","generate","codegen","storybook"];for(let a of r)n[a]&&(o[a]=`${i} ${a}`);return o}catch{return fe()}}function pe(e,t,s){for(let n of t)if(e[n])return`${s} ${n}`;return null}async function ni(e){let t=await e.readFile("Makefile");if(!t)return fe();let s=new Set;for(let n of t.split(`
11
+ `)){let i=n.match(/^([a-zA-Z_-]+)\s*:/);i&&s.add(i[1])}return{dev:s.has("dev")?"make dev":s.has("run")?"make run":null,build:s.has("build")?"make build":null,test:s.has("test")?"make test":null,lint:s.has("lint")?"make lint":null,format:s.has("format")?"make format":s.has("fmt")?"make fmt":null}}async function ii(e){if(e.fileExists("Cargo.toml"))return{dev:"cargo run",build:"cargo build",test:"cargo test",lint:"cargo clippy",format:"cargo fmt"};if(e.fileExists("go.mod"))return{dev:"go run .",build:"go build .",test:"go test ./...",lint:e.fileExists(".golangci.yml")||e.fileExists(".golangci.yaml")?"golangci-lint run":null,format:"go fmt ./..."};if(e.fileExists("pyproject.toml")||e.fileExists("requirements.txt")||e.fileExists("setup.py")){let s=e.fileExists("poetry.lock")?"poetry run":e.fileExists("Pipfile.lock")?"pipenv run":e.fileExists("uv.lock")?"uv run":"python -m",n=e.files.some(f=>f.includes("pytest")||f.includes("test_"))||e.fileExists("pytest.ini"),i=e.fileExists("ruff.toml")||e.fileExists(".ruff.toml")||e.fileExists("pyproject.toml"),o=e.fileExists("pyproject.toml")||e.fileExists(".black"),r=e.fileExists("mypy.ini")||e.fileExists(".mypy.ini"),a=e.fileExists("manage.py"),c=e.files.some(f=>f.includes("main.py")||f.includes("app.py")),u=null;a?u=`${s} python manage.py runserver`:c?u=`${s} uvicorn main:app --reload`:e.fileExists("vite.config.ts")&&(u=`${s} vite`);let g=null;return e.fileExists("pyproject.toml")&&(g=`${s} build`),{dev:u,build:g,test:n?`${s} pytest`:`${s} unittest`,lint:i?`${s} ruff check .`:r?`${s} mypy .`:null,format:i?`${s} ruff format .`:o?`${s} black .`:null}}if(e.fileExists("pom.xml"))return{dev:"mvn spring-boot:run",build:"mvn compile",test:"mvn test",lint:"mvn checkstyle:check",format:null};if(e.fileExists("build.gradle")||e.fileExists("build.gradle.kts"))return{dev:"./gradlew bootRun",build:"./gradlew build",test:"./gradlew test",lint:"./gradlew checkstyleMain",format:null};if(e.fileExists("build.gradle.kts"))return{dev:"./gradlew run",build:"./gradlew build",test:"./gradlew test",lint:"./gradlew ktlintCheck",format:"./gradlew ktlintFormat"};if(e.files.some(s=>s.endsWith(".csproj")||s.endsWith(".sln")))return{dev:"dotnet run",build:"dotnet build",test:"dotnet test",lint:null,format:"dotnet format"};if(e.fileExists("Gemfile")){let s="bundle exec",n=e.fileExists("bin/rails")||e.files.some(o=>o.includes("config/application.rb")),i=e.fileExists("Rakefile");return{dev:n?`${s} rails server`:null,build:null,test:n?`${s} rails test`:i?`${s} rake test`:`${s} rspec`,lint:e.fileExists(".rubocop.yml")?`${s} rubocop`:null,format:e.fileExists(".rubocop.yml")?`${s} rubocop -a`:null}}if(e.fileExists("composer.json")){let s="composer",n=e.fileExists("artisan")||e.files.some(o=>o.includes("config/app.php")),i=e.files.some(o=>o.includes("symfony"));return{dev:n?"php artisan serve":i?"symfony server:start":"php -S localhost:8000",build:`${s} install`,test:n?"php artisan test":`${s} test`,lint:e.fileExists("phpunit.xml")||e.fileExists("phpunit.xml.dist")?`${s} phpunit`:null,format:e.fileExists(".php-cs-fixer.php")?"vendor/bin/php-cs-fixer fix":null}}if(e.fileExists("Package.swift")||e.files.some(s=>s.endsWith(".xcodeproj")))return{dev:"swift run",build:"swift build",test:"swift test",lint:null,format:"swift format ."};if(e.fileExists("pubspec.yaml"))return{dev:e.fileExists("lib/main.dart")?"flutter run":"dart run",build:e.fileExists("lib/main.dart")?"flutter build":"dart compile exe",test:"flutter test",lint:"flutter analyze",format:"dart format ."};if(e.fileExists("mix.exs"))return{dev:"mix phx.server",build:"mix compile",test:"mix test",lint:"mix format --check-formatted",format:"mix format"};if(e.fileExists("build.sbt"))return{dev:"sbt run",build:"sbt compile",test:"sbt test",lint:"sbt scalafmtCheck",format:"sbt scalafmt"};if(e.fileExists("CMakeLists.txt"))return{dev:null,build:"cmake --build build",test:"ctest --test-dir build",lint:null,format:null};let t=e.fileExists("Cargo.toml")||e.fileExists("go.mod")||e.fileExists("pyproject.toml")||e.fileExists("requirements.txt")||e.fileExists("setup.py")||e.fileExists("pom.xml")||e.fileExists("build.gradle")||e.fileExists("build.gradle.kts")||e.fileExists("Gemfile")||e.fileExists("composer.json")||e.fileExists("Package.swift")||e.fileExists("pubspec.yaml")||e.fileExists("mix.exs")||e.fileExists("build.sbt")||e.fileExists("CMakeLists.txt");return e.fileExists("Makefile")&&!t?fe():e.files.some(s=>s.endsWith(".sh"))?{dev:null,build:null,test:null,lint:"shellcheck *.sh",format:"shfmt -w *.sh"}:fe()}function fe(){return{dev:null,build:null,test:null,lint:null,format:null}}var Tt,Ht=$(()=>{"use strict";Tt={name:"commands",category:"commands",async detect(e){let t=await si(e);if(Object.values(t).some(Boolean))return t;let s=await ni(e);return Object.values(s).some(Boolean)?s:await ii(e)}}});function Ae(e,t){return e.filter(s=>t.has(s)).sort()}function ai(e){let t=[],s=[],n=e.match(/\[project\]\s[\s\S]*?dependencies\s*=\s*\[([\s\S]*?)\]/);n&&t.push(...Bt(n[1]));let i=e.match(/\[project\.optional-dependencies\]\s*[\s\S]*?(?=\n\[|$)/);if(i){let a=i[0].matchAll(/\w+\s*=\s*\[([\s\S]*?)\]/g);for(let c of a)s.push(...Bt(c[1]))}let o=e.match(/\[tool\.poetry\.dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);if(o){let a=Ie(o[1]);t.push(...a.filter(c=>c!=="python"))}let r=e.match(/\[tool\.poetry\.(?:group\.dev\.|dev-)dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);return r&&s.push(...Ie(r[1])),t.length===0&&s.length===0?null:{direct:t,dev:s}}function Bt(e){let t=[],s=e.matchAll(/"([^"]+)"|'([^']+)'/g);for(let n of s){let o=(n[1]||n[2]).split(/[>=<!;\[]/)[0].trim().toLowerCase();o&&t.push(o)}return t}function Ie(e){let t=[];for(let s of e.split(`
12
+ `)){let n=s.trim();if(!n||n.startsWith("#"))continue;let i=n.match(/^([a-zA-Z0-9_-]+)\s*=/);i&&t.push(i[1].toLowerCase())}return t}function ci(e){let t=[];for(let s of e.split(`
13
+ `)){let n=s.trim();if(!n||n.startsWith("#")||n.startsWith("-"))continue;let i=n.split(/[>=<!;\[]/)[0].trim().toLowerCase();i&&t.push(i)}return t}function li(e){let t=[],s=[],n=e.match(/\[dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);n&&t.push(...Ie(n[1]));let i=e.match(/\[dev-dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);return i&&s.push(...Ie(i[1])),{direct:t,dev:s}}function ui(e){let t=[],s=e.matchAll(/require\s*\(([\s\S]*?)\)/g);for(let i of s)for(let o of i[1].split(`
14
+ `)){let r=o.trim();if(!r||r.startsWith("//"))continue;let a=r.split(/\s+/);a[0]&&t.push(a[0])}let n=e.matchAll(/^require\s+(\S+)[ \t]+\S+/gm);for(let i of n)t.push(i[1]);return t}async function di(e){let t=await e.readFile("Gemfile");if(!t)return{direct_count:0,dev_count:0,notable:[]};let s=[],n=[];for(let i of t.split(`
15
+ `)){let o=i.match(/gem\s+["']([^"']+)["']/);o&&(s.push(o[1]),ne.has(o[1])&&n.push(o[1]))}return{direct_count:s.length,dev_count:0,notable:[...new Set(n)].sort()}}async function pi(e){let t=await e.readFile("composer.json");if(!t)return{direct_count:0,dev_count:0,notable:[]};try{let s=JSON.parse(t),n=s.require||{},i=s["require-dev"]||{},o={...n,...i},r=Object.keys(o).filter(a=>ne.has(a)).sort();return{direct_count:Object.keys(n).length,dev_count:Object.keys(i).length,notable:r}}catch{return{direct_count:0,dev_count:0,notable:[]}}}async function fi(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=(t||"")+`
16
+ `+(s||"")+`
17
+ `+(n||"");if(!i.trim())return{direct_count:0,dev_count:0,notable:[]};let o=[],r=[],a=/<artifactId>([^<]+)<\/artifactId>/g,c;for(;(c=a.exec(i))!==null;)o.push(c[1]),ne.has(c[1])&&r.push(c[1]);let u=/(?:implementation|compile|api)\s+['"]([^:'"]+)/g;for(;(c=u.exec(i))!==null;){let g=c[1].split(":").pop();g&&(o.push(g),ne.has(g)&&r.push(g))}return{direct_count:[...new Set(o)].length,dev_count:0,notable:[...new Set(r)].sort()}}async function mi(e){let t=e.files.filter(i=>i.endsWith(".csproj"));if(t.length===0)return{direct_count:0,dev_count:0,notable:[]};let s=[],n=[];for(let i of t){let o=await e.readFile(i),r=/<PackageReference\s+Include="([^"]+)"/g,a;for(;(a=r.exec(o))!==null;){s.push(a[1]);let c=a[1].split(".")[0].toLowerCase();ne.has(c)&&n.push(a[1])}}return{direct_count:[...new Set(s)].length,dev_count:0,notable:[...new Set(n)].sort()}}function gi(e){return e.fileExists("pnpm-lock.yaml")?"pnpm-lock.yaml":e.fileExists("yarn.lock")?"yarn.lock":e.fileExists("package-lock.json")?"package-lock.json":e.fileExists("bun.lockb")||e.fileExists("bun.lock")?"bun.lock":e.fileExists("Cargo.lock")?"Cargo.lock":e.fileExists("poetry.lock")?"poetry.lock":e.fileExists("Pipfile.lock")?"Pipfile.lock":e.fileExists("uv.lock")?"uv.lock":e.fileExists("go.sum")?"go.sum":e.fileExists("Gemfile.lock")?"Gemfile.lock":e.fileExists("composer.lock")?"composer.lock":e.fileExists(".mvn/jvm.config")?"maven":e.fileExists(".gradle")?"gradle":e.fileExists("Package.resolved")?"swift":e.fileExists("pubspec.lock")?"pubspec.lock":e.fileExists("mix.lock")?"mix.lock":e.fileExists("project/target/resolution-cache")?"sbt":e.fileExists("packages.lock.json")?"nuget":null}var ne,Gt,oi,ri,Ut,Jt=$(()=>{"use strict";ne=new Set(["next","react","vue","angular","svelte","nuxt","remix","astro","gatsby","express","fastify","hono","nestjs","koa","solid","solid-js","qwik","prisma","@prisma/client","drizzle-orm","typeorm","sequelize","mongoose","knex","zustand","redux","@reduxjs/toolkit","mobx","jotai","recoil","pinia","vuex","@tanstack/react-query","@swr/core","react-query","zod","joi","yup","ajv","class-validator","@trpc/server","graphql","apollo-server","@apollo/client","graphql-yoga","jest","vitest","mocha","playwright","@playwright/test","cypress","msw","webpack","vite","esbuild","rollup","turbo","nx","tsup","unbuild","pkgroll","tailwindcss","styled-components","@emotion/react","@chakra-ui/react","@mui/material","@mantine/core","next-auth","@auth/core","passport","jsonwebtoken","lucia-auth","@vercel/node","@netlify/functions","serverless","sst","fastapi","django","flask","starlette","tornado","aiohttp","sqlalchemy","alembic","pydantic","typer","click","pytest","black","ruff","mypy","pylint","celery","redis","pymongo","psycopg2","numpy","pandas","torch","tensorflow","scikit-learn","gin-gonic","gorilla/mux","go-chi/chi","labstack/echo","gofiber/fiber","gorm","sqlx","lib/pq","go-redis","testify","stretchr","grpc","protobuf","cobra","actix-web","axum","rocket","warp","tokio","serde","diesel","sqlx","sea-orm","clap","anyhow","thiserror","tracing","rails","sinatra","grape","hanami","roda","activerecord","pg","mysql2","redis","sidekiq","rspec","rubocop","pry","byebug","laravel","symfony","slim","guzzlehttp","illuminate","doctrine/orm","ramsey/uuid","phpunit","mockery","spring-boot","spring-framework","micronaut","quarkus","hibernate","jakarta.persistence","junit","mockito","testng","Microsoft.AspNetCore","EntityFramework","Newtonsoft","NUnit","xUnit","Moq","docker","typescript","kubernetes"]),Gt=new Set(["django","flask","fastapi","starlette","tornado","aiohttp","sqlalchemy","alembic","pydantic","celery","redis","pytest","numpy","pandas","scipy","scikit-learn","tensorflow","torch","transformers","langchain","requests","httpx","boto3"]),oi=new Set(["serde","tokio","axum","actix-web","rocket","warp","hyper","sqlx","diesel","sea-orm","clap","tracing","anyhow","thiserror","reqwest","tonic","prost"]),ri=new Set(["gin","echo","fiber","chi","mux","gorm","sqlx","cobra","viper","zap","testify","grpc","protobuf","wire"]),Ut={name:"dependencies",category:"dependencies",async detect(e){let t=gi(e),s=await e.readFile("package.json");if(s)try{let f=JSON.parse(s),p=f.dependencies||{},d=f.devDependencies||{},m={...p,...d},C=Object.keys(m).filter(P=>ne.has(P)).sort();return{direct_count:Object.keys(p).length,dev_count:Object.keys(d).length,lock_file:t,notable:C}}catch{}let n=await e.readFile("pyproject.toml");if(n){let f=ai(n);if(f){let p=Ae([...f.direct,...f.dev],Gt);return{direct_count:f.direct.length,dev_count:f.dev.length,lock_file:t,notable:p}}}let i=await e.readFile("requirements.txt");if(i){let f=ci(i),p=Ae(f,Gt);return{direct_count:f.length,dev_count:0,lock_file:t,notable:p}}let o=await e.readFile("Cargo.toml");if(o){let f=li(o),p=Ae([...f.direct,...f.dev],oi);return{direct_count:f.direct.length,dev_count:f.dev.length,lock_file:t,notable:p}}let r=await e.readFile("go.mod");if(r){let f=ui(r),p=f.map(m=>m.split("/").pop()),d=Ae(p,ri);return{direct_count:f.length,dev_count:0,lock_file:t,notable:d}}let a=await di(e);if(a.direct_count>0)return{...a,lock_file:t};let c=await pi(e);if(c.direct_count>0)return{...c,lock_file:t};let u=await fi(e);if(u.direct_count>0)return{...u,lock_file:t};let g=await mi(e);return g.direct_count>0?{...g,lock_file:t}:{direct_count:0,dev_count:0,lock_file:t,notable:[]}}}});async function yi(e){let t=await e.readFile("package.json");if(!t)return null;try{let s=JSON.parse(t),n={...s.dependencies||{},...s.devDependencies||{}};for(let[i,o]of Object.entries(bi))if(n[i])return o}catch{}return null}async function ki(e){let t={},s=await e.readFile(".env.example");s&&Ne(s,t,!1);let n=await e.readFile(".env");n&&Ne(n,t,!0);let i=await e.readFile(".env.sample");i&&Ne(i,t,!1);let o=await e.readFile(".env.template");return o&&Ne(o,t,!1),t}function Ne(e,t,s){let n=e.split(`
18
+ `),i="";for(let o of n){let r=o.trim();if(!r)continue;if(r.startsWith("#")){i+=(i?" ":"")+r.slice(1).trim();continue}let a=r.match(/^([A-Z_][A-Z0-9_]*)\s*=\s*(.*)$/);if(a){let[,c,u]=a,g=u==='""'||u==="''"||u==="";t[c]={description:i||void 0,required:s||g},i=""}}}var hi,bi,Wt,Kt=$(()=>{"use strict";hi=["tsconfig.json","jsconfig.json","tsup.config.ts","tsup.config.js","next.config.js","next.config.mjs","next.config.ts","vite.config.ts","vite.config.js","vite.config.mjs","webpack.config.js","webpack.config.ts","rollup.config.js","rollup.config.mjs","esbuild.config.js","esbuild.config.mjs","turbo.json","nx.json","tailwind.config.js","tailwind.config.ts","tailwind.config.mjs","postcss.config.js","postcss.config.mjs","postcss.config.ts","babel.config.js","babel.config.json",".babelrc","swc.config.json",".swcrc","jest.config.js","jest.config.ts","vitest.config.ts","vitest.config.js","vitest.config.mts","playwright.config.ts","playwright.config.js","cypress.config.ts","cypress.config.js",".prettierrc",".prettierrc.js",".prettierrc.json","prettier.config.js","prettier.config.mjs",".eslintrc.js",".eslintrc.json",".eslintrc.yml","eslint.config.js","eslint.config.mjs","eslint.config.ts","biome.json","biome.jsonc","dprint.json",".editorconfig","docker-compose.yml","docker-compose.yaml","compose.yml","compose.yaml","Dockerfile","fly.toml","render.yaml","vercel.json","netlify.toml","pyproject.toml","setup.cfg","setup.py","tox.ini","ruff.toml",".ruff.toml","go.mod","Cargo.toml","Gemfile","composer.json","Makefile","Taskfile.yml",".nvmrc",".node-version",".python-version",".ruby-version",".tool-versions"],bi={"launchdarkly-node-server-sdk":"launchdarkly","@unleash/proxy-client-react":"unleash",flagsmith:"flagsmith","@growthbook/growthbook-react":"growthbook"},Wt={name:"config",category:"config",async detect(e){let t=e.files.filter(o=>o.match(/^\.env(\..+)?$/)||o.match(/^\.env\./)),s=hi.filter(o=>e.fileExists(o)),n=await yi(e),i=await ki(e);return{env_files:t,config_files:s,feature_flags:n,env_vars:i}}}});async function wi(e){let t=await e.exec('git log --oneline -5 --format="%s" 2>/dev/null');return t?t.split(`
19
+ `).filter(Boolean):[]}async function vi(e){let t=await e.exec("git shortlog -sn --no-merges -5 2>/dev/null");return t?t.split(`
20
+ `).map(s=>s.replace(/^\s*\d+\s+/,"").trim()).filter(Boolean):[]}async function ji(e){return(await e.exec("git status --porcelain 2>/dev/null")).length>0}var zt,Vt=$(()=>{"use strict";zt={name:"git",category:"git",async detect(e){let[t,s,n]=await Promise.all([wi(e),vi(e),ji(e)]);return{recent_commits:t,last_committers:s,uncommitted_changes:n}}}});async function xi(e){if(e.glob("vitest.config.*").length>0)return"vitest";if(e.glob("jest.config.*").length>0)return"jest";if(e.fileExists(".mocharc.yml")||e.fileExists(".mocharc.json"))return"mocha";if(e.glob("playwright.config.*").length>0)return"playwright";if(e.glob("cypress.config.*").length>0)return"cypress";let t=await e.readFile("package.json");if(t)try{let s=JSON.parse(t),n={...s.dependencies||{},...s.devDependencies||{}},o=(s.scripts||{}).test||"";if(n.vitest||o.includes("vitest"))return"vitest";if(n.jest||o.includes("jest"))return"jest";if(n.mocha||o.includes("mocha"))return"mocha";if(n["@playwright/test"]||o.includes("playwright"))return"playwright";if(n.cypress)return"cypress";if(n.ava)return"ava";if(n.tap)return"tap"}catch{}if(e.fileExists("pytest.ini")||e.fileExists("pyproject.toml")||e.fileExists("setup.cfg")||e.fileExists("tox.ini")){let s=await e.readFile("pyproject.toml"),n=await e.readFile("setup.cfg"),i=await e.readFile("pytest.ini");if(s?.includes("pytest")||n?.includes("pytest")||i||e.files.some(o=>o.includes("test_")||o.includes("_test.py")))return"pytest";if(s?.includes("unittest")||n?.includes("unittest"))return"unittest";if(s?.includes("nose"))return"nose"}if(e.files.some(s=>s.endsWith("_test.go")))return"go test";if(e.files.some(s=>s.includes("/tests/")||s.startsWith("tests/")||s.endsWith("tests.rs")||s.match(/mod\s+tests/)))return"cargo test";if(e.fileExists("spec/spec_helper.rb")||e.fileExists(".rspec")||e.files.some(s=>s.includes("/spec/")&&s.endsWith("_spec.rb")))return"rspec";if(e.fileExists("test/minitest_helper.rb"))return"minitest";if(e.files.some(s=>s.endsWith("Test.java")||s.endsWith("Tests.java")))return"junit";if(e.fileExists("pom.xml")){let s=await e.readFile("pom.xml");if(s?.includes("junit")||s?.includes("testng"))return s?.includes("testng")?"testng":"junit"}if(e.fileExists("phpunit.xml")||e.fileExists("phpunit.xml.dist")||e.files.some(s=>s.includes("tests/")&&s.endsWith(".php")))return"phpunit";if(e.files.some(s=>s.endsWith("Test.cs")||s.endsWith("Tests.cs")))return"nunit";if(e.fileExists("build.sbt")){let s=await e.readFile("build.sbt");if(s?.includes("scalatest"))return"scalatest";if(s?.includes("specs2"))return"specs2"}return e.files.some(s=>s.endsWith("Tests.swift")||s.endsWith("XCTest.swift"))?"xctest":null}async function $i(e){if(e.fileExists("eslint.config.js")||e.fileExists("eslint.config.mjs")||e.fileExists("eslint.config.ts")||e.glob(".eslintrc*").length>0)return"eslint";if(e.fileExists("biome.json")||e.fileExists("biome.jsonc"))return"biome";if(e.fileExists("ruff.toml")||e.fileExists(".ruff.toml"))return"ruff";if(e.fileExists(".pylintrc")||e.fileExists("pylintrc"))return"pylint";if(e.fileExists(".flake8")||e.fileExists("setup.cfg")||e.fileExists(".flake8rc"))return"flake8";if(e.fileExists(".golangci.yml")||e.fileExists(".golangci.yaml")||e.fileExists(".golangci-lint.yml"))return"golangci-lint";if(e.fileExists("clippy.toml"))return"clippy";if(e.fileExists(".rubocop.yml")||e.fileExists(".rubocop.yaml"))return"rubocop";if(e.fileExists(".php_cs")||e.fileExists("phpstan.neon")||e.fileExists("phpunit.xml"))return"php-cs-fixer";if(e.fileExists("psalm.xml"))return"psalm";if(e.fileExists(".swiftlint.yml")||e.fileExists(".swiftlint.yaml"))return"swiftlint";if(e.fileExists(".kotlinlint.xml"))return"ktlint";if(e.fileExists("detekt.yml")||e.fileExists("detekt.yaml"))return"detekt";if(e.fileExists("checkstyle.xml"))return"checkstyle";if(e.fileExists("pmd.xml"))return"pmd";if(e.fileExists(".scalafix.conf"))return"scalafix";let t=await e.readFile("pyproject.toml");if(t){if(t.includes("ruff"))return"ruff";if(t.includes("pylint"))return"pylint";if(t.includes("flake8"))return"flake8";if(t.includes("mypy"))return"mypy";if(t.includes("black"))return"black"}let s=await e.readFile("package.json");if(s)try{let i=JSON.parse(s),o={...i.dependencies||{},...i.devDependencies||{}},a=(i.scripts||{}).lint||"";if(o.eslint||a.includes("eslint"))return"eslint";if(o["@biomejs/biome"]||a.includes("biome"))return"biome";if(o.oxlint||a.includes("oxlint"))return"oxlint";if(o.standard)return"standard";if(o.xo)return"xo";if(o["@typescript-eslint/eslint-plugin"])return"eslint";if(o.dprint)return"dprint"}catch{}return e.fileExists("golangci-lint.yml")||e.fileExists(".golangci.yml")?"golangci-lint":(await e.readFile("Cargo.toml"))?.includes("clippy")?"clippy":e.fileExists(".rubocop.yml")?"rubocop":e.fileExists("phpstan.neon")?"phpstan":e.fileExists("ecs.php")||e.fileExists("easy-coding-standard.yml")?"ecs":null}async function Ci(e){if(e.glob(".prettierrc*").length>0||e.fileExists("prettier.config.js")||e.fileExists("prettier.config.mjs")||e.fileExists("prettier.config.cjs")||e.fileExists("prettier.config.ts"))return"prettier";if(e.fileExists("biome.json")||e.fileExists("biome.jsonc"))return"biome";if(e.fileExists("ruff.toml")||e.fileExists(".ruff.toml"))return"ruff";if(e.fileExists("rustfmt.toml")||e.fileExists(".rustfmt.toml"))return"rustfmt";if(e.fileExists("dprint.json")||e.fileExists("dprint.jsonc"))return"dprint";if(e.fileExists(".editorconfig"))return"editorconfig";if(e.fileExists(".gofmt")||e.fileExists("gofmt.toml"))return"gofmt";if(e.fileExists(".scalafmt.conf"))return"scalafmt";if(e.fileExists(".black")||e.fileExists("pyproject.toml"))return"black";if(e.fileExists(".isort.cfg")||e.fileExists("pyproject.toml"))return"isort";if(e.fileExists(".swiftformat"))return"swiftformat";if(e.fileExists(".php-cs-fixer.php")||e.fileExists(".php-cs-fixer.dist.php"))return"php-cs-fixer";if(e.fileExists(".rubocop.yml"))return"rubocop";if(e.fileExists("prettier.config.ts")||e.fileExists(".prettierignore"))return"prettier";let t=await e.readFile("pyproject.toml");if(t){if(t.includes("black"))return"black";if(t.includes("isort"))return"isort";if(t.includes("autopep8"))return"autopep8";if(t.includes("yapf"))return"yapf"}let s=await e.readFile("package.json");if(s)try{let n=JSON.parse(s),i={...n.dependencies||{},...n.devDependencies||{}},o=n.scripts||{},r=(o.format||"")+(o.fmt||"");if(i.prettier||r.includes("prettier"))return"prettier";if(i["@biomejs/biome"]||r.includes("biome"))return"biome";if(i.dprint)return"dprint"}catch{}return e.fileExists(".gofmtrc")||e.fileExists("gofmt.toml")?"gofmt":e.fileExists("rustfmt.toml")?"rustfmt":e.fileExists(".rubocop.yml")?"rubocop":e.fileExists(".swiftformat")?"swiftformat":e.fileExists(".scalafmt.conf")?"scalafmt":null}function Ei(e){return e.files.some(t=>t.startsWith(".github/workflows/"))?"github-actions":e.fileExists(".gitlab-ci.yml")||e.fileExists(".gitlab-ci.yaml")?"gitlab-ci":e.fileExists("Jenkinsfile")||e.fileExists("Jenkinsfile")?"jenkins":e.files.some(t=>t.startsWith(".circleci/"))?"circleci":e.fileExists("bitbucket-pipelines.yml")?"bitbucket-pipelines":e.fileExists(".travis.yml")?"travis-ci":e.fileExists("azure-pipelines.yml")||e.fileExists("azure-pipelines.yaml")?"azure-pipelines":e.fileExists("buildspec.yml")?"aws-codebuild":e.fileExists("cloudbuild.yaml")||e.fileExists("cloudbuild.yml")?"google-cloud-build":e.fileExists(".drone.yml")?"drone-ci":e.fileExists("workflow.yml")?"gsuite-actions":e.fileExists("now.json")||e.fileExists(".vercelignore")?"vercel":e.fileExists("netlify.toml")?"netlify":e.fileExists(".github/workflows/ci.yml")||e.fileExists(".github/workflows/cd.yml")?"github-actions":e.fileExists("procfile")||e.fileExists("Procfile")?"heroku":e.fileExists("appveyor.yml")?"appveyor":e.fileExists("codeship-services.yml")||e.fileExists("codeship-steps.yml")?"codeship":e.fileExists("semantic.yml")?"semantic-release":e.fileExists(".rerun.yaml")||e.fileExists(".rerun.yml")?"rerun":e.fileExists("woodpecker.yml")?"woodpecker-ci":e.fileExists(".forgejo")?"forgejo":null}function Si(e){return!!(e.files.some(t=>t.startsWith(".husky/"))||e.fileExists(".pre-commit-config.yaml")||e.fileExists(".pre-commit-config.yml")||e.fileExists(".lintstagedrc")||e.fileExists("lint-staged.config.js")||e.fileExists("lint-staged.config.mjs")||e.fileExists("lint-staged.config.ts")||e.fileExists("lefthook.yml")||e.fileExists("lefthook.yaml")||e.fileExists("lefthook-local.yml")||e.fileExists(".git/hooks/pre-commit")||e.fileExists(".simple-git-hooks.cjs")||e.fileExists(".simple-git-hooks.js")||e.fileExists(".yorkielerc")||e.fileExists(".yorkie")||e.fileExists(".huskyrc")||e.fileExists(".huskyrc.json")||e.fileExists(".huskyrc.js")||e.fileExists(".pre-commit-hook.json"))}var Qt,Yt=$(()=>{"use strict";Qt={name:"quality",category:"quality",async detect(e){let[t,s,n]=await Promise.all([xi(e),$i(e),Ci(e)]);return{test_framework:t,linter:s,formatter:n,ci:Ei(e),pre_commit_hooks:Si(e)}}}});function Ri(e){return e.files.some(t=>t.match(/^(src\/)?app\/layout\.(tsx?|jsx?)$/))?"app-router":e.files.some(t=>t.match(/^(src\/)?pages\/_app\./))?"pages-router":e.files.some(t=>t.includes("/controllers/"))&&e.files.some(t=>t.includes("/models/"))?"mvc":e.files.some(t=>t.startsWith("src/features/"))?"feature-sliced":e.files.some(t=>t.startsWith("src/modules/"))?"modular":e.files.some(t=>t.includes("/services/"))&&e.files.some(t=>t.includes("/repositories/"))?"layered":e.files.some(t=>t.startsWith("src/routes/"))?"file-based-routing":e.files.some(t=>t.startsWith("src/commands/")||t.startsWith("cmd/"))?"command-based":e.files.some(t=>t.startsWith("src/detectors/")||t.startsWith("src/plugins/"))?"plugin-based":e.files.some(t=>t.includes("/domain/"))&&e.files.some(t=>t.includes("/infra/")||t.includes("/infrastructure/"))?"hexagonal":e.files.some(t=>t.includes("/services/"))&&e.files.some(t=>t.includes("/handlers/")||t.includes("/controllers/"))?"layered":e.files.some(t=>t.match(/^internal\/.+\/.+/))?"package-per-feature":null}async function _i(e){let t=await e.readFile("package.json");if(!t)return null;try{let s=JSON.parse(t),n={...s.dependencies||{},...s.devDependencies||{}},i=[];return n.zustand&&i.push("zustand"),(n["@reduxjs/toolkit"]||n.redux)&&i.push("redux"),n.mobx&&i.push("mobx"),n.jotai&&i.push("jotai"),n.recoil&&i.push("recoil"),n.pinia&&i.push("pinia"),n.vuex&&i.push("vuex"),n["@tanstack/react-query"]&&i.push("react-query"),n["@tanstack/vue-query"]&&i.push("vue-query"),n.swr&&i.push("swr"),i.length>0?i.join(" + "):null}catch{return null}}async function Pi(e){let t=await e.readFile("package.json"),s=[];if(t)try{let n=JSON.parse(t),i={...n.dependencies||{},...n.devDependencies||{}};(i["@trpc/server"]||i["@trpc/client"])&&s.push("trpc"),(i.graphql||i["@apollo/server"])&&s.push("graphql")}catch{}return e.glob("**/*.proto").length>0&&s.push("grpc"),e.files.some(n=>n.match(/\/api\/.*route\.(ts|js)$/))&&s.push("route-handlers"),e.files.some(n=>n.includes("/routes/")||n.includes("/controllers/"))&&s.push("rest"),e.files.some(n=>n.match(/\/actions?\.(ts|js)$/))&&s.push("server-actions"),s.length>0?s.join(" + "):null}function Di(e){let t={},s=new Set;for(let i of e.files){let o=i.match(/^src\/([^/]+)\//);o&&s.add(o[1])}for(let i of s){let o=Xt[i];o&&(t[`src/${i}/`]=o)}let n=new Set;for(let i of e.files){let o=i.match(/^([^/]+)\//);o&&!o[1].startsWith(".")&&o[1]!=="src"&&o[1]!=="node_modules"&&n.add(o[1])}for(let i of n){let o=Xt[i];o&&!t[`src/${i}/`]&&(t[`${i}/`]=o)}return t}var Xt,Zt,es=$(()=>{"use strict";Xt={app:"routes and pages",api:"API routes",pages:"page components",components:"reusable UI components",lib:"shared utilities",utils:"utility functions",helpers:"helper functions",hooks:"React hooks",services:"business logic / services",models:"data models",controllers:"request handlers",middleware:"middleware",routes:"routing",store:"state management",stores:"state stores",types:"type definitions",interfaces:"interface definitions",schemas:"validation schemas",config:"configuration",constants:"constants",assets:"static assets",styles:"stylesheets",tests:"test files",__tests__:"test files",test:"test files",spec:"test specifications",features:"feature modules",modules:"application modules",plugins:"plugin system",providers:"context providers",contexts:"React contexts",commands:"CLI commands",cmd:"CLI commands",cli:"CLI interface",detectors:"detection / analysis modules",scanners:"scanning modules",scanner:"scanning engine",integrations:"third-party integrations",adapters:"adapters / connectors",handlers:"event / request handlers",resolvers:"GraphQL resolvers",guards:"auth / route guards",pipes:"data transform pipes",decorators:"decorators",validators:"validation logic",migrations:"database migrations",seeds:"database seed data",fixtures:"test fixtures",mocks:"test mocks",stubs:"test stubs",github:"GitHub integration",git:"git integration",mcp:"MCP server / protocol",server:"HTTP / API server",client:"client-side code",core:"core business logic",domain:"domain logic",infra:"infrastructure",db:"database layer",database:"database layer",auth:"authentication / authorization",email:"email handling",notifications:"notification system",jobs:"background jobs / workers",workers:"background workers",queues:"job / message queues",events:"event system",shared:"shared / cross-cutting code",common:"common utilities",internal:"internal modules",pkg:"packages / library code",proto:"protobuf definitions",generated:"auto-generated code",scripts:"build / utility scripts",tools:"development tools",docs:"documentation"},Zt={name:"patterns",category:"patterns",async detect(e){return{architecture:Ri(e),state_management:await _i(e),api_style:await Pi(e),key_modules:Di(e)}}}});async function Oi(e){let t=["openapi.json","openapi.yaml","openapi.yml","swagger.json","swagger.yaml","swagger.yml","api-specs/openapi.json","api-specs/openapi.yaml","docs/openapi.json","docs/openapi.yaml","spec/openapi.json","spec/openapi.yaml","api/openapi.json","api/openapi.yaml"];for(let s of t)if(e.fileExists(s)){let n=await e.readFile(s);if(n)try{let i=JSON.parse(n);if(i.openapi||i.swagger)return{version:i.openapi||i.swagger,title:i.info?.title||null,file:s,type:i.openapi?"openapi":"swagger"}}catch{if(n.includes("openapi:")||n.includes("swagger:"))return{version:Ze(n,"openapi")||Ze(n,"swagger"),title:Ze(n,"title"),file:s,type:n.includes("openapi:")?"openapi":"swagger"}}}return null}async function Ai(e){let t=e.files.filter(i=>i.endsWith(".graphql")||i.endsWith(".gql")||i.includes("/graphql/")||i.includes("/schema/"));if(t.length===0)return null;let s=[],n=[];for(let i of t){let o=await e.readFile(i);o&&((o.includes("type Query")||o.includes("type Mutation")||o.includes("type Subscription"))&&s.push(i),(o.includes("Query:")||o.includes("Mutation:")||o.includes("resolver"))&&n.push(i))}return s.length===0&&n.length===0?null:{schema_files:s,resolver_files:n,total_files:t.length}}async function Ii(e){let t=e.files.filter(n=>n.endsWith(".proto"));if(t.length===0)return null;let s=[];for(let n of t){let i=await e.readFile(n);i&&i.includes("service ")&&s.push(n)}return{proto_files:t,service_definitions:s}}async function Ni(e){let t=e.files.filter(n=>n.includes("postman")&&(n.endsWith(".json")||n.endsWith(".json.backup")));if(t.length===0)return null;let s=[];for(let n of t){let i=await e.readFile(n);if(i)try{let o=JSON.parse(i);o.info?.schema?.includes("postman")&&s.push({file:n,name:o.info?.name||null})}catch{}}return s.length===0?null:{collections:s}}function Ze(e,t){let s=new RegExp(`^${t}:\\s*(.+)$`,"m"),n=e.match(s);return n?n[1].trim():null}var ts,ss=$(()=>{"use strict";ts={name:"api-docs",category:"config",async detect(e){let[t,s,n,i]=await Promise.all([Oi(e),Ai(e),Ii(e),Ni(e)]);return{openapi:t,graphql:s,grpc:n,postman:i}}}});var et,ns=$(()=>{"use strict";Ot();It();Ft();Lt();Ht();Jt();Kt();Vt();Yt();es();ss();et=[Dt,At,Nt,Mt,Tt,Ut,Wt,zt,Qt,Zt,ts]});import{execFile as is}from"child_process";async function me(e,t,s={}){return new Promise(n=>{let i=["api","graphql","-f",`query=${t}`,"-H","Accept: application/vnd.github.v3+json"];for(let[o,r]of Object.entries(s))i.push("-f",`${o}=${JSON.stringify(r)}`);is("gh",i,{cwd:e,timeout:3e4},(o,r,a)=>{if(o){n(null);return}try{let c=JSON.parse(r.trim());if(c.errors&&c.errors.length>0){n(null);return}n(c.data||null)}catch{n(null)}})})}function Hi(e){let t=[/github\.com[:/]([^/]+)\/(.+?)(\.git)?$/,/github\.com[:/]([^/]+)\/(.+)$/];for(let s of t){let n=e.match(s);if(n)return{owner:n[1],repo:n[2].replace(/\.git$/,"")}}return null}function Gi(e){let t=e.labels?.nodes||[],s=e.assignees?.nodes||[],n=e.milestone,i=e.reactions||{},o=e.comments,r=e.timelineItems;return{number:e.number,title:e.title,state:e.state?.toLowerCase()==="open"?"open":"closed",url:e.url||void 0,labels:t.map(a=>a.name),assignee:s[0]?.login||null,milestone:n?.title||null,created_at:e.createdAt,updated_at:e.updatedAt,comments_count:o?.totalCount||0,reactions:{thumbs_up:i.thumbsUp||0,thumbs_down:i.thumbsDown||0,laugh:i.laugh||0,hooray:i.hooray||0,confused:i.confused||0,heart:i.heart||0,rocket:i.rocket||0,eyes:i.eyes||0},timeline_events:r?.totalCount||0}}function Bi(e){let t=e.labels?.nodes||[],s=e.reviewRequests?.nodes||[],n=e.author,i=e.statusCheckRollup,o=e.comments,r;if(i?.state){let u=i.state.toLowerCase();u==="success"||u==="completed"?r="passing":u==="failure"||u==="error"?r="failing":r="pending"}let a=e.mergeable==="MERGEABLE",c=e.mergeable==="CONFLICTING";return{number:e.number,title:e.title,state:(e.state||"open").toLowerCase(),url:e.url||void 0,author:n?.login||"unknown",branch:e.headRefName||"",labels:t.map(u=>u.name),reviewers:s.map(u=>u.requestedReviewer?.login||"").filter(Boolean),created_at:e.createdAt,updated_at:e.updatedAt,checks_status:r,mergeable:a,merge_conflicts:c,additions:e.additions||0,deletions:e.deletions||0,comments_count:o?.totalCount||0,review_decision:e.review_decision?.toLowerCase()==="approved"?"approved":e.review_decision?.toLowerCase()==="changes_requested"?"changes_requested":e.review_decision?.toLowerCase()==="review_required"?"review_required":null}}async function os(e,t,s={}){let{includeIssues:n=!0,includePRs:i=!0,includeMilestones:o=!0,includeReleases:r=!0,includeProjects:a=!0,limit:c=50}=s,u=Hi(t);if(!u)return{};let{owner:g,repo:f}=u,p={};if(n)try{let d=await me(e,Fi,{owner:g,repo:f,limit:c});d?.repository?.issues?.nodes&&(p.issues=d.repository.issues.nodes.map(Gi))}catch{}if(i)try{let d=await me(e,qi,{owner:g,repo:f,limit:Math.min(c,30)});d?.repository?.pullRequests?.nodes&&(p.pull_requests=d.repository.pullRequests.nodes.map(Bi))}catch{}if(o)try{let d=await me(e,Mi,{owner:g,repo:f});d?.repository?.milestones?.nodes&&(p.milestones=d.repository.milestones.nodes.map(m=>{let C=m.issues?.nodes||[],P=m.closedIssues?.totalCount||0,R=m.issues?.totalCount||C.length,E=R-P;return{title:m.title,description:m.description||"",due_date:m.dueOn||null,progress:{open:E,closed:P,percent:R>0?Math.round(P/R*100):0},issues:C.map(F=>F.number)}}))}catch{}if(r)try{let d=await me(e,Li,{owner:g,repo:f,limit:10});d?.repository?.releases?.nodes&&(p.releases=d.repository.releases.nodes.map(m=>({tag_name:m.tagName,name:m.name||m.tagName,created_at:m.createdAt,url:m.url,author:m.author?.login||"unknown",prerelease:!!m.isPrerelease})))}catch{}if(a)try{let d=await me(e,Ti,{owner:g,repo:f});d?.repository?.projectsV2?.nodes&&(p.project_boards=d.repository.projectsV2.nodes.filter(m=>m!==null).map(m=>{let C=m.columns?.nodes||[],P=m.items?.totalCount||0;return{number:m.number,title:m.title,state:(m.state||"open").toLowerCase(),url:m.url,columns:C.map(R=>({name:R.name,cards_count:P}))}}))}catch{}return p}async function rs(e){return new Promise(t=>{is("gh",["--version"],{cwd:e,timeout:5e3},(s,n)=>{if(s){t(!1);return}let i=n.match(/gh version (\d+)\.(\d+)/);if(i){let o=parseInt(i[1],10),r=parseInt(i[2],10);t(o>2||o===2&&r>=0)}else t(!1)})})}var Fi,qi,Mi,Li,Ti,as=$(()=>{"use strict";Fi=`
21
+ query($owner: String!, $repo: String!, $limit: Int) {
22
+ repository(owner: $owner, name: $repo) {
23
+ issues(first: $limit, orderBy: {field: UPDATED_AT, direction: DESC}) {
24
+ nodes {
25
+ number
26
+ title
27
+ state
28
+ url
29
+ labels(first: 10) { nodes { name } }
30
+ assignees(first: 1) { nodes { login } }
31
+ milestone { title }
32
+ createdAt
33
+ updatedAt
34
+ comments { totalCount }
35
+ reactions {
36
+ thumbsUp: reactionCount(for: THUMBS_UP)
37
+ thumbsDown: reactionCount(for: THUMBS_DOWN)
38
+ laugh: reactionCount(for: LAUGH)
39
+ hooray: reactionCount(for: HOORAY)
40
+ confused: reactionCount(for: CONFUSED)
41
+ heart: reactionCount(for: HEART)
42
+ rocket: reactionCount(for: ROCKET)
43
+ eyes: reactionCount(for: EYES)
44
+ }
45
+ timelineItems(first: 1) { totalCount }
46
+ }
47
+ }
48
+ }
49
+ }
50
+ `,qi=`
51
+ query($owner: String!, $repo: String!, $limit: Int) {
52
+ repository(owner: $owner, name: $repo) {
53
+ pullRequests(first: $limit, orderBy: {field: UPDATED_AT, direction: DESC}) {
54
+ nodes {
55
+ number
56
+ title
57
+ state
58
+ url
59
+ author { login }
60
+ headRefName
61
+ labels(first: 10) { nodes { name } }
62
+ reviewRequests(first: 5) { nodes { requestedReviewer { ... on User { login } } } }
63
+ createdAt
64
+ updatedAt
65
+ additions
66
+ deletions
67
+ mergeable
68
+ comments { totalCount }
69
+ reviewDecision
70
+ statusCheckRollup {
71
+ state
72
+ }
73
+ }
74
+ }
75
+ }
76
+ }
77
+ `,Mi=`
78
+ query($owner: String!, $repo: String!) {
79
+ repository(owner: $owner, name: $repo) {
80
+ milestones(first: 20, orderBy: {field: DUE_DATE, direction: ASC}) {
81
+ nodes {
82
+ title
83
+ description
84
+ dueOn
85
+ issues(first: 100) {
86
+ totalCount
87
+ nodes { number }
88
+ }
89
+ closedIssues: issues(states: CLOSED) { totalCount }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ `,Li=`
95
+ query($owner: String!, $repo: String!, $limit: Int) {
96
+ repository(owner: $owner, name: $repo) {
97
+ releases(first: $limit, orderBy: {field: CREATED_AT, direction: DESC}) {
98
+ nodes {
99
+ tagName
100
+ name
101
+ url
102
+ createdAt
103
+ isPrerelease
104
+ author { login }
105
+ }
106
+ }
107
+ }
108
+ }
109
+ `,Ti=`
110
+ query($owner: String!, $repo: String!) {
111
+ repository(owner: $owner, name: $repo) {
112
+ projectsV2(first: 10) {
113
+ nodes {
114
+ number
115
+ title
116
+ state
117
+ url
118
+ columns: fieldNodes(first: 20) {
119
+ nodes {
120
+ ... on ProjectV2FieldCommon {
121
+ name
122
+ }
123
+ ... on ProjectV2SingleSelectField {
124
+ options {
125
+ name
126
+ }
127
+ }
128
+ }
129
+ }
130
+ items(first: 100) {
131
+ totalCount
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ `});import{execFile as cs}from"child_process";import{readdirSync as Ui,readFileSync as Ji,existsSync as Wi}from"fs";import{join as tt}from"path";async function Fe(e){if(!await ge(e,["--version"]))return null;let s=await Ki(e,"git remote get-url origin 2>/dev/null");if(!(!!s&&(s.includes("github.com")||s.includes("github."))))return{status:{synced_at:new Date().toISOString(),github_available:!1,issues:[],pull_requests:[],kanban:{backlog:[],in_progress:[],done:[]},priorities:[]},roadmap:{milestones:[]},decisions:{from_prs:[],from_adrs:[],manual:[]}};let i=await rs(e),o=[],r=[],a=[],c=[],u=[];if(i)try{let m=await os(e,s,{includeIssues:!0,includePRs:!0,includeMilestones:!0,includeReleases:!0,includeProjects:!0,limit:50});o=m.issues||[],r=m.pull_requests||[],a=m.milestones||[],c=m.releases||[],u=m.project_boards||[]}catch{}o.length===0&&(o=await zi(e)),r.length===0&&(r=await Qi(e)),a.length===0&&(a=await Xi(e));let[g]=await Promise.all([Zi(e)]),f=so(o),p=no(o),d=to(e);return{status:{synced_at:new Date().toISOString(),github_available:!0,issues:o,pull_requests:r,kanban:f,priorities:p,releases:c,project_boards:u},roadmap:{milestones:a},decisions:{from_prs:g,from_adrs:d,manual:[]}}}function ge(e,t){return new Promise(s=>{cs("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function Ki(e,t){return new Promise(s=>{cs("sh",["-c",t],{cwd:e,timeout:1e4},(n,i)=>{s(n?"":i.trim())})})}async function zi(e){let t=await ge(e,["issue","list","--limit","50","--state","all","--json","number,title,state,labels,assignees,milestone,createdAt,updatedAt"]);if(!t)return[];try{return JSON.parse(t).map(Vi)}catch{return[]}}function Vi(e){let t=e.labels||[],s=e.assignees||[],n=e.milestone;return{number:e.number,title:e.title,state:e.state?.toLowerCase()==="open"?"open":"closed",labels:t.map(i=>i.name),assignee:s[0]?.login||null,milestone:n?.title||null,created_at:e.createdAt,updated_at:e.updatedAt}}async function Qi(e){let t=await ge(e,["pr","list","--limit","30","--state","all","--json","number,title,state,author,headRefName,labels,reviewRequests,createdAt,updatedAt"]);if(!t)return[];try{return JSON.parse(t).map(Yi)}catch{return[]}}function Yi(e){let t=e.labels||[],s=e.reviewRequests||[],n=e.author;return{number:e.number,title:e.title,state:(e.state||"open").toLowerCase(),author:n?.login||"unknown",branch:e.headRefName||"",labels:t.map(i=>i.name),reviewers:s.map(i=>i.login||i.name||"").filter(Boolean),created_at:e.createdAt,updated_at:e.updatedAt}}async function Xi(e){let t=await ge(e,["api","repos/{owner}/{repo}/milestones","--jq",".[] | {title,description,due_on,open_issues,closed_issues}"]);if(!t)return[];try{return t.split(`
138
+ `).filter(Boolean).map(n=>{let i=JSON.parse(n),o=i.open_issues||0,r=i.closed_issues||0,a=o+r;return{title:i.title,description:i.description||"",due_date:i.due_on||null,progress:{open:o,closed:r,percent:a>0?Math.round(r/a*100):0},issues:[]}})}catch{return[]}}async function Zi(e){let t=await ge(e,["pr","list","--limit","20","--state","merged","--json","number,title,body,mergedAt,url"]);if(!t)return[];try{return JSON.parse(t).filter(n=>{let i=n.body||"";return i.toLowerCase().includes("decision")||i.toLowerCase().includes("why:")||i.toLowerCase().includes("rationale")||i.toLowerCase().includes("chose")||i.toLowerCase().includes("trade-off")}).map(n=>({title:n.title,summary:eo(n.body||""),date:n.mergedAt,source:`PR #${n.number}`,url:n.url}))}catch{return[]}}function eo(e){let t=e.split(`
139
+ `).filter(s=>s.trim());for(let s=0;s<t.length;s++)if(t[s].match(/^#+\s*(decision|why|rationale)/i))return t.slice(s+1,s+4).join(" ").trim().slice(0,200);return t[0]?.slice(0,200)||""}function to(e){let t=["docs/adr","docs/decisions","adr","decisions","docs/architecture/decisions"],s=[];for(let i of t){let o=tt(e,i);if(Wi(o))try{let r=Ui(o).filter(a=>a.endsWith(".md")).map(a=>tt(i,a));s.push(...r)}catch{}}let n=[];for(let i of s.slice(0,20))try{let a=Ji(tt(e,i),"utf-8").split(`
140
+ `).slice(0,5).find(c=>c.startsWith("#"))?.replace(/^#+\s*/,"")||i;n.push({title:a,summary:"",date:"",source:i})}catch{}return n}function so(e){let t=e.filter(o=>o.state==="open"),s=e.filter(o=>o.state==="closed"),n=t.filter(o=>o.assignee||o.labels.some(r=>r.toLowerCase().includes("progress")||r.toLowerCase().includes("doing")));return{backlog:t.filter(o=>!n.includes(o)),in_progress:n,done:s.slice(0,20)}}function no(e){let t=e.filter(n=>n.state==="open"),s=n=>{for(let i of n.labels){let o=i.toLowerCase();if(o.includes("p0")||o.includes("critical")||o.includes("urgent"))return 0;if(o==="vibekit"||o.includes("p1")||o.includes("high"))return 1;if(o.includes("p2")||o.includes("medium")||o==="arch")return 2;if(o.includes("p3")||o.includes("low"))return 3;if(o.includes("bug"))return 1;if(o.includes("feature"))return 2}return 4};return[...t].sort((n,i)=>s(n)-s(i))}var st=$(()=>{"use strict";as()});import{readFileSync as io,writeFileSync as oo,statSync as ro}from"fs";import{join as nt}from"path";function ds(e){try{let t=io(nt(e,ls),"utf-8"),s=JSON.parse(t);return s.cache_version!==us?null:s}catch{return null}}function ps(e,t,s){let n={cache_version:us,timestamp:new Date().toISOString(),file_count:t,file_mtimes:ms(e),manifest:s};try{oo(nt(e,ls),JSON.stringify(n),"utf-8")}catch{}}function fs(e,t,s){if(t.file_count!==s)return!1;let n=ms(e);for(let i of Object.keys({...t.file_mtimes,...n}))if((t.file_mtimes[i]??0)!==(n[i]??0))return!1;return!0}function ms(e){let t={};for(let s of ao)try{let n=ro(nt(e,s));t[s]=n.mtimeMs}catch{}return t}var ls,us,ao,gs=$(()=>{"use strict";ls=".codebase.cache.json",us=1,ao=["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","tsconfig.json","tsconfig.build.json","Cargo.toml","Cargo.lock","pyproject.toml","requirements.txt","poetry.lock","go.mod","go.sum","Makefile","Dockerfile","docker-compose.yml"]});async function z(e,t={}){let s=await Rt(e,{depth:t.depth});if(t.incremental){let r=ds(e);if(r&&fs(e,r,s.files.length))return r.manifest}let n=et;t.categories?.length&&(n=et.filter(r=>t.categories.includes(r.category)));let i=await Promise.allSettled(n.map(async r=>({category:r.category,data:await r.detect(s)}))),o={version:"1.0",generated_at:new Date().toISOString()};for(let r of i)r.status==="fulfilled"?o[r.value.category]=r.value.data:t.quiet||S(`Detector failed: ${r.reason}`);if(t.sync)try{let r=await Fe(e);r&&(o.status=r.status,o.roadmap=r.roadmap,o.decisions=r.decisions)}catch{t.quiet||S("GitHub sync failed (is `gh` CLI installed and authenticated?)")}return t.incremental&&ps(e,s.files.length,o),o}function qe(e,t){switch(e){case"project":{let s=t.name,n=t.description;return n?`${s} \u2014 ${n.slice(0,60)}`:s||"unknown"}case"repo":{let s=t.url,n=t.default_branch;return`${s?s.replace(/.*[:/]/,"").replace(/\.git$/,""):"local"}, ${n||"unknown branch"}`}case"structure":{let s=t.entry_points,n=t.tree,i=t.build_output,o=Object.keys(n||{}).filter(a=>a!=="./"),r=[];return s?.length&&r.push(`${s.length} entry points`),o.length&&r.push(`${o.length} top-level dirs`),i?.length&&r.push(`build: ${i.join(", ")}`),r.join(", ")||"empty"}case"stack":{let s=t.languages,n=t.frameworks,i=t.build_tool,o=[...s||[],...n||[]];return i&&o.push(i),o.join(", ")||"unknown"}case"commands":return Object.entries(t).filter(([,n])=>n).map(([n])=>n).join(", ")||"none detected";case"dependencies":{let s=t.direct_count,n=t.dev_count,i=t.lock_file,o=[];return s&&o.push(`${s} direct`),n&&o.push(`${n} dev`),!s&&!n&&o.push("0 deps"),i&&o.push(i),o.join(", ")}case"config":return`${t.env_files?.length||0} env files`;case"git":{let s=t.recent_commits,n=t.uncommitted_changes;return`${s?.length||0} recent commits${n?", uncommitted changes":""}`}case"quality":{let s=[];return t.test_framework&&s.push(t.test_framework),t.linter&&s.push(t.linter),t.ci&&s.push(t.ci),s.join(", ")||"none detected"}case"patterns":{let s=t.architecture,n=t.state_management;return[s,n].filter(Boolean).join(", ")||"unknown"}case"status":{let s=t.issues||[],n=t.pull_requests||[];return`${s.length} issues, ${n.length} PRs`}default:return JSON.stringify(t).slice(0,60)}}var he=$(()=>{"use strict";Pt();ns();st();I();gs()});import{resolve as co,join as lo}from"path";import{writeFile as uo}from"fs/promises";async function Me(e){U(e.quiet);let t=co(e.path);l(`Scanning ${t}...`);let s=await z(t,{depth:e.depth,categories:e.categories.length?e.categories:void 0,incremental:e.incremental,quiet:e.quiet,sync:e.sync});for(let[r,a]of Object.entries(s))r==="version"||r==="generated_at"||typeof a!="object"||a===null||h(`${po(r)} (${qe(r,a)})`);let n=lo(t,".codebase.json"),i=JSON.stringify(s,null,2);await uo(n,i,"utf-8");let o=(Buffer.byteLength(i)/1024).toFixed(1);l(`
141
+ Written: .codebase.json (${o} KB)`)}function po(e){return e.charAt(0).toUpperCase()+e.slice(1)}var it=$(()=>{"use strict";he();I()});import{readFileSync as ot,writeFileSync as hs,existsSync as rt}from"fs";import{join as Le}from"path";function ho(e){try{let t=ot(Le(e,".codebase.json"),"utf-8"),s=JSON.parse(t);return{name:s.project?.name||"Unknown",description:s.project?.description||null,languages:s.stack?.languages||[],frameworks:s.stack?.frameworks||[],commands:s.commands||{}}}catch{return null}}function bo(e){let t=ho(e);if(!t)return go;let s=[...t.languages,...t.frameworks].filter(Boolean),n=s.length?s.join(", "):"unknown",o=Object.entries(t.commands).filter(([,a])=>a).map(([a,c])=>`| \`${a}\` | \`${c}\` |`).join(`
142
+ `),r=o?`
143
+ ### Project Commands
144
+ | Task | Command |
145
+ |---|---|
146
+ ${o}
147
+ `:"";return`
148
+ ${be}
149
+ ## Project Context (auto-generated by codebase)
150
+
151
+ **${t.name}**${t.description?` \u2014 ${t.description}`:""}
152
+ **Stack:** ${n}
153
+ ${r}
154
+ **This project uses \`codebase\` for AI context. Run commands below instead of exploring files.**
155
+
156
+ ### Session Start
157
+ \`\`\`
158
+ npx codebase brief
159
+ \`\`\`
160
+ Returns: project identity, tech stack, commands, structure, current status, next task, blockers, decisions \u2014 everything you need in one call.
161
+
162
+ ### Commands (your interface \u2014 use these, don't read files)
163
+ | Command | What it returns |
164
+ |---|---|
165
+ | \`npx codebase brief\` | Full project briefing \u2014 **run this first** |
166
+ | \`npx codebase next\` | Highest-priority task + what's in progress |
167
+ | \`npx codebase status\` | Kanban board, priorities, milestones |
168
+ | \`npx codebase query <path>\` | Any data point (e.g. \`stack.languages\`, \`commands.test\`) |
169
+ | \`npx codebase issue create "title"\` | Track a bug, feature, or TODO |
170
+ | \`npx codebase issue close <n> --reason "why"\` | Close an issue after fixing it |
171
+
172
+ ### Rules
173
+ - **Never explore the codebase to discover stack/commands/structure** \u2014 it's already in \`brief\`
174
+ - **Check \`next\` before starting work** \u2014 don't duplicate in-progress tasks
175
+ - **Create issues for bugs/TODOs you find** \u2014 keep the project brain alive
176
+ - **Close issues when you fix them** \u2014 with a reason so the team knows why
177
+ ${ie}`}function bs(e,t){return rt(Le(e,t))}function ys(e,t){let s=Le(e,t),n=rt(s)?ot(s,"utf-8"):"";if(n.includes(be)){let i=n.indexOf(be),o=n.indexOf(ie);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ie.length),n=n.replace(/\n{3,}/g,`
178
+
179
+ `).trimEnd())}hs(s,n.trimEnd()+`
180
+ `+bo(e)+`
181
+ `,"utf-8")}function ks(e,t){let s=Le(e,t);if(!rt(s))return;let n=ot(s,"utf-8"),i=n.indexOf(be),o=n.indexOf(ie);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ie.length),n=n.replace(/\n{3,}/g,`
182
+
183
+ `).trim()+`
184
+ `,hs(s,n,"utf-8"))}var be,ie,fo,mo,go,ac,ws=$(()=>{"use strict";be="<!-- codebase:start -->",ie="<!-- codebase:end -->",fo="# codebase:start",mo="# codebase:end",go=`
185
+ ${be}
186
+ ## Project Context (auto-generated by codebase)
187
+
188
+ **This project uses \`codebase\` for AI context. Run commands below instead of exploring files.**
189
+
190
+ ### Session Start
191
+ \`\`\`
192
+ npx codebase brief
193
+ \`\`\`
194
+ Returns: project identity, tech stack, commands, structure, current status, next task, blockers, decisions \u2014 everything you need in one call.
195
+
196
+ ### Commands (your interface \u2014 use these, don't read files)
197
+ | Command | What it returns |
198
+ |---|---|
199
+ | \`npx codebase brief\` | Full project briefing \u2014 **run this first** |
200
+ | \`npx codebase next\` | Highest-priority task + what's in progress |
201
+ | \`npx codebase status\` | Kanban board, priorities, milestones |
202
+ | \`npx codebase query <path>\` | Any data point (e.g. \`stack.languages\`, \`commands.test\`) |
203
+ | \`npx codebase issue create "title"\` | Track a bug, feature, or TODO |
204
+ | \`npx codebase issue close <n> --reason "why"\` | Close an issue after fixing it |
205
+
206
+ ### Rules
207
+ - **Never explore the codebase to discover stack/commands/structure** \u2014 it's already in \`brief\`
208
+ - **Check \`next\` before starting work** \u2014 don't duplicate in-progress tasks
209
+ - **Create issues for bugs/TODOs you find** \u2014 keep the project brain alive
210
+ - **Close issues when you fix them** \u2014 with a reason so the team knows why
211
+ ${ie}`,ac=`
212
+ ${fo}
213
+ # Project Context (auto-generated by codebase)
214
+ #
215
+ # This project uses \`codebase\` for AI context. Run commands instead of exploring files.
216
+ #
217
+ # SESSION START: npx codebase brief
218
+ # \u2192 Returns project identity, stack, commands, status, next task, blockers, decisions
219
+ #
220
+ # COMMANDS (your interface):
221
+ # npx codebase brief \u2192 Full project briefing (run first)
222
+ # npx codebase next \u2192 Highest-priority task + in-progress
223
+ # npx codebase status \u2192 Kanban, priorities, milestones
224
+ # npx codebase query <path> \u2192 Any data (e.g. stack.languages)
225
+ # npx codebase issue create "title" \u2192 Track bugs/features/TODOs
226
+ # npx codebase issue close <n> --reason "why" \u2192 Close after fixing
227
+ #
228
+ # RULES:
229
+ # - Never explore codebase to discover stack/commands \u2014 it's in brief
230
+ # - Check next before starting work \u2014 don't duplicate in-progress tasks
231
+ # - Create issues for bugs/TODOs \u2014 keep the project brain alive
232
+ # - Close issues when fixed \u2014 with a reason
233
+ ${mo}`});var vs={};yt(vs,{claudeIntegration:()=>V});var V,ye=$(()=>{"use strict";ws();V={name:"claude",detect:e=>bs(e,"CLAUDE.md"),inject:e=>ys(e,"CLAUDE.md"),remove:e=>ks(e,"CLAUDE.md")}});import{readFileSync as yo,writeFileSync as ko,existsSync as wo}from"fs";import{join as vo}from"path";function oe(e){let t=vo(e,".gitignore"),s=wo(t)?yo(t,"utf-8"):"";if(s.includes(".codebase.json"))return;ko(t,s.trimEnd()+`
234
+ # AI context manifest
235
+ .codebase.json
236
+ .codebase.cache.json
237
+ `,"utf-8")}var Te=$(()=>{"use strict"});import{readFileSync as at,writeFileSync as we,existsSync as re,mkdirSync as $s,chmodSync as Cs,unlinkSync as mc}from"fs";import{join as ae}from"path";function ce(e,t=!1){if(!re(ae(e,".git")))return!1;let n=`npx --yes codebase scan-only --incremental --quiet${t?" --sync":""}`;return xs(e,"post-commit",n),xs(e,"post-checkout",n),jo(e),!0}function jo(e){let t=ae(e,".git","hooks"),s=ae(t,"pre-commit");re(t)||$s(t,{recursive:!0});let n=ae(e,"package.json");if(!re(n))return;let i=!1,o=!1,r=!1;try{let u=JSON.parse(at(n,"utf-8"));i=!!u.scripts?.check,o=!!u.scripts?.typecheck,r=!!u.scripts?.lint}catch{return}if(!i&&!o&&!r)return;let a;if(i)a="npm run check --silent";else{let u=[];o&&u.push("npm run typecheck --silent"),r&&u.push("npm run lint --silent"),a=u.join(" && ")}let c=`#!/bin/sh
238
+ ${js}
239
+ # Run typecheck + lint before every commit. Fix errors before committing.
240
+ if [ -f package.json ]; then
241
+ ${a} || {
242
+ echo ""
243
+ echo " Pre-commit check failed. Fix the errors above before committing."
244
+ echo " To skip (not recommended): git commit --no-verify"
245
+ echo ""
246
+ exit 1
247
+ }
248
+ fi
249
+ `;if(re(s)){let u=at(s,"utf-8");u.includes(js)||we(s,u.trimEnd()+`
250
+
251
+ `+c,"utf-8")}else we(s,c,"utf-8");Cs(s,493)}function xs(e,t,s){let n=ae(e,".git","hooks"),i=ae(n,t);if(re(n)||$s(n,{recursive:!0}),re(i)){let o=at(i,"utf-8");if(o.includes(ke)){let r=o.replace(new RegExp(`${ke}\\n.*`,"m"),`${ke}
252
+ ${s}`);we(i,r,"utf-8");return}we(i,o.trimEnd()+`
253
+
254
+ ${ke}
255
+ ${s}
256
+ `,"utf-8")}else we(i,`#!/bin/sh
257
+
258
+ ${ke}
259
+ ${s}
260
+ `,"utf-8");Cs(i,493)}var ke,js,He=$(()=>{"use strict";ke="# codebase-auto-update";js="# codebase-pre-commit"});var dt={};yt(dt,{installClaudeCommandsForFix:()=>Eo,installClaudeHooksForFix:()=>So,runSetup:()=>ut});import{resolve as xo,dirname as $o,join as A}from"path";import{writeFileSync as Q,existsSync as J,mkdirSync as Ge,readFileSync as ue,chmodSync as lt,readdirSync as Co,copyFileSync as Es}from"fs";import{execFile as le}from"child_process";async function ut(e){let t=xo(e.path);await Me({...e,sync:!0}),j("Claude Code Integration"),J(A(t,"CLAUDE.md"))||Q(A(t,"CLAUDE.md"),`# Project Rules
261
+ `,"utf-8"),V.inject(t),h("CLAUDE.md - added .codebase.json reference"),j("Git Hooks"),ce(t,!1)?(h("post-commit hook (auto-updates .codebase.json)"),h("pre-commit hook (runs typecheck + lint before every commit)"),Ro(t),h("commit-msg hook (blocks direct commits to main/master)")):y("Not a git repository - skipping hooks"),j("Claude Code Hooks"),Rs(t),j("Browser Automation"),await Po(),j("Claude Commands"),await Do()?Ss(t):(S("Claude Code CLI not detected \u2014 skipping slash commands"),S("Install Claude Code then re-run: codebase setup")),oe(t),_o(t,[".vibekit/daemon.lock",".vibekit/daemon.log",".vibekit/build.lock"]),h(".gitignore updated"),j("Vibekit Bootstrap");let i=A(t,".vibekit");J(i)?y(".vibekit/ already exists"):(Ge(i,{recursive:!0}),h(".vibekit/ directory created")),j("GitHub Labels"),await Oo()?(await Ao(t),await Io(t)):(S("gh CLI not authenticated \u2014 skipping label/issue setup"),S("Run: gh auth login then codebase setup")),j("Product Brief");let r=A(t,"docs");J(r)||Ge(r,{recursive:!0});let a=A(r,"PRODUCT.md");J(a)?y("docs/PRODUCT.md already exists \u2014 skipping (delete to regenerate)"):(No(t,a),h("docs/PRODUCT.md generated \u2014 review and fill in [INFERRED] sections")),l(`
262
+ Done! Your project is wired for AI + autonomous loop.`),l(`
263
+ 1. Review docs/PRODUCT.md and fill in any [INFERRED] sections`),l(" 2. /simulate \u2014 AI customer journeys find & fix bugs"),l(" 3. /build \u2014 implement architectural issues autonomously"),l(" 4. /launch \u2014 gate check, release, merge to main")}function Eo(e){Ss(e)}function Ss(e){let t=A($o(new URL(import.meta.url).pathname),"..","commands");if(!J(t)){S("Claude commands not found in package \u2014 skipping");return}let s=A(e,".claude","commands");Ge(s,{recursive:!0});let n=Co(t).filter(c=>c.endsWith(".md")),i=0,o=0,r=0;for(let c of n){let u=A(t,c),g=A(s,c);if(J(g)){let f=ue(u,"utf-8"),p=ue(g,"utf-8");f!==p?(Es(u,g),o++):r++}else Es(u,g),i++}let a=[];i>0&&a.push(`${i} new`),o>0&&a.push(`${o} updated`),r>0&&a.push(`${r} unchanged`),i>0||o>0?(h(`Claude commands installed \u2192 .claude/commands/ (${a.join(", ")})`),y("Available: /setup /simulate /build /launch /review"),y("Tip: commit .claude/commands/ to share these with your team")):y(`All ${r} Claude commands up to date`)}function So(e){Rs(e)}function Rs(e){let t=A(e,".claude","hooks");Ge(t,{recursive:!0});let s=A(t,"git-guard.sh");Q(s,`#!/bin/bash
264
+ # codebase git-guard \u2014 PreToolUse hook
265
+ # Reads Claude tool input JSON from stdin, enforces git safety rules.
266
+
267
+ INPUT=$(cat)
268
+ CMD=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('command',''))" 2>/dev/null || echo "")
269
+
270
+ if [ -z "$CMD" ]; then exit 0; fi
271
+
272
+ # \u2500\u2500 Rule 1: No commits to protected branches \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
273
+ if echo "$CMD" | grep -qE "^git commit|&& git commit| git commit"; then
274
+ BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
275
+ if [[ "$BRANCH" == "main" || "$BRANCH" == "master" || "$BRANCH" == "prod" || "$BRANCH" == "production" ]]; then
276
+ echo ""
277
+ echo " BLOCKED: Direct commits to '$BRANCH' are not allowed."
278
+ echo ""
279
+ echo " Branch naming convention:"
280
+ echo " feat/<slug> new features"
281
+ echo " fix/<slug> bug fixes"
282
+ echo " chore/<slug> maintenance"
283
+ echo " hotfix/<slug> urgent prod fixes"
284
+ echo " docs/<slug> documentation"
285
+ echo " test/<slug> test additions"
286
+ echo ""
287
+ echo " Switch to develop first:"
288
+ echo " git checkout develop && git pull origin develop"
289
+ echo " git checkout -b feat/<your-feature>"
290
+ echo ""
291
+ exit 2
292
+ fi
293
+ fi
294
+
295
+ # \u2500\u2500 Rule 2: No direct push to protected branches \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
296
+ if echo "$CMD" | grep -qE "git push.*(origin )?(main|master|prod|production)(s|$|"|')"; then
297
+ echo ""
298
+ echo " BLOCKED: Direct push to protected branch is not allowed."
299
+ echo " Use /launch to release to main."
300
+ echo ""
301
+ exit 2
302
+ fi
303
+
304
+ # \u2500\u2500 Rule 3: No force push ever \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
305
+ if echo "$CMD" | grep -qE "git push.*(--force|-f)( |$)"; then
306
+ echo ""
307
+ echo " BLOCKED: Force push is not allowed."
308
+ echo " If you need to undo a commit, use: git revert <sha>"
309
+ echo ""
310
+ exit 2
311
+ fi
312
+
313
+ # \u2500\u2500 Rule 4: Pull before commit if behind remote \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
314
+ if echo "$CMD" | grep -qE "^git commit|&& git commit| git commit"; then
315
+ BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "")
316
+ if [ -n "$BRANCH" ] && [ "$BRANCH" != "HEAD" ]; then
317
+ git fetch origin "$BRANCH" --quiet 2>/dev/null || true
318
+ BEHIND=$(git rev-list HEAD..origin/"$BRANCH" --count 2>/dev/null || echo "0")
319
+ if [[ "$BEHIND" -gt 0 ]]; then
320
+ echo ""
321
+ echo " BLOCKED: Branch '$BRANCH' is $BEHIND commit(s) behind origin/$BRANCH."
322
+ echo " Pull first: git pull origin $BRANCH"
323
+ echo ""
324
+ exit 2
325
+ fi
326
+ fi
327
+ fi
328
+
329
+ exit 0
330
+ `,"utf-8"),lt(s,493),h(".claude/hooks/git-guard.sh (PreToolUse \u2014 blocks unsafe git ops)");let i=A(t,"git-post.sh");Q(i,`#!/bin/bash
331
+ # codebase git-post \u2014 PostToolUse hook
332
+ # Reads Claude tool input JSON from stdin. Reminds to raise PR after branch push.
333
+
334
+ INPUT=$(cat)
335
+ CMD=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('command',''))" 2>/dev/null || echo "")
336
+
337
+ if [ -z "$CMD" ]; then exit 0; fi
338
+
339
+ # \u2500\u2500 Remind to raise PR after pushing a non-develop/main branch \u2500\u2500
340
+ if echo "$CMD" | grep -qE "git push origin [a-zA-Z0-9/_-]+"; then
341
+ PUSHED_BRANCH=$(echo "$CMD" | grep -oE "git push origin [a-zA-Z0-9/_-]+" | awk '{print $4}')
342
+ if [[ -n "$PUSHED_BRANCH" ]] && [[ "$PUSHED_BRANCH" != "main" ]] && [[ "$PUSHED_BRANCH" != "master" ]] && [[ "$PUSHED_BRANCH" != "develop" ]] && [[ "$PUSHED_BRANCH" != "prod" ]]; then
343
+ echo ""
344
+ echo " Branch '$PUSHED_BRANCH' pushed."
345
+ echo " Raise a PR to develop:"
346
+ echo " gh pr create --base develop --head $PUSHED_BRANCH --title 'feat: <description>' --body 'Closes #<N>'"
347
+ echo ""
348
+ fi
349
+ fi
350
+
351
+ exit 0
352
+ `,"utf-8"),lt(i,493),h(".claude/hooks/git-post.sh (PostToolUse \u2014 PR reminder after branch push)");let r=A(e,".claude","settings.json"),a={};if(J(r))try{a=JSON.parse(ue(r,"utf-8"))}catch{}let c=a.hooks??{},u="bash .claude/hooks/git-guard.sh",g="bash .claude/hooks/git-post.sh",f=c.PreToolUse??[];JSON.stringify(f).includes("git-guard")||f.push({matcher:"Bash",hooks:[{type:"command",command:u}]}),c.PreToolUse=f;let d=c.PostToolUse??[];JSON.stringify(d).includes("git-post")||d.push({matcher:"Bash",hooks:[{type:"command",command:g}]}),c.PostToolUse=d,a.hooks=c,Q(r,JSON.stringify(a,null,2)+`
353
+ `,"utf-8"),h(".claude/settings.json (PreToolUse + PostToolUse hooks registered)")}function Ro(e){let t=A(e,".git","hooks"),s=A(t,"commit-msg"),n="# codebase-branch-check",i=`#!/bin/sh
354
+ ${n}
355
+ BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
356
+ if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
357
+ echo ""
358
+ echo " Direct commits to $BRANCH are not allowed."
359
+ echo " Switch to develop: git checkout develop"
360
+ echo " Release via: codebase release"
361
+ echo ""
362
+ exit 1
363
+ fi
364
+ `;if(J(s)){let o=ue(s,"utf-8");o.includes(n)||Q(s,o.trimEnd()+`
365
+
366
+ `+i,"utf-8")}else Q(s,i,"utf-8");lt(s,493)}function _o(e,t){let s=A(e,".gitignore"),n=J(s)?ue(s,"utf-8"):"",i=t.filter(o=>!n.includes(o)).join(`
367
+ `);i&&Q(s,n.trimEnd()+`
368
+ `+i+`
369
+ `,"utf-8")}function Be(e,t){return new Promise(s=>{le("gh",t,{cwd:e,timeout:15e3},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function Po(){if(await new Promise(n=>{le("agent-browser",["--version"],{timeout:5e3},i=>n(!i))})){y("agent-browser already installed");return}if(l("Installing agent-browser..."),!await new Promise(n=>{le("npm",["install","-g","agent-browser"],{timeout:12e4},i=>n(!i))})){S("agent-browser install failed \u2014 run: npm install -g agent-browser");return}await new Promise(n=>{le("agent-browser",["install"],{timeout:3e5},i=>n(!i))})?h("agent-browser installed (Chrome for Testing downloaded)"):S("agent-browser installed but Chrome download failed \u2014 run: agent-browser install")}async function Do(){return new Promise(e=>{le("claude",["--version"],{timeout:5e3},t=>e(!t))})}async function Oo(){return new Promise(e=>{le("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function Ao(e){let{stdout:t}=await Be(e,["label","list","--limit","100","--json","name","--jq",".[].name"]),s=new Set(t.split(`
370
+ `).filter(Boolean)),n=0;for(let o of ct){if(s.has(o.name))continue;let{ok:r}=await Be(e,["label","create",o.name,"--color",o.color,"--description",o.description]);r&&n++}let i=ct.length-n;n>0?h(`${n} GitHub labels created (${i} already existed)`):y(`All ${ct.length} labels already exist`)}async function Io(e){let{stdout:t}=await Be(e,["issue","list","--search","Highlights Index","--state","all","--limit","1","--json","number","--jq",".[0].number // empty"]);if(t){y("Highlights Index issue already exists");return}let s=`# Product Highlights Index
371
+
372
+ Tracks positive signals from /simulate cycles. Updated automatically \u2014 do not edit manually.
373
+
374
+ ## Index
375
+ <!-- /simulate appends here -->`,{ok:n}=await Be(e,["issue","create","--title","Highlights Index","--label","highlight","--body",s]);n?h("Highlights Index issue created on GitHub"):S("Could not create Highlights Index issue")}function No(e,t){let s=A(e,".codebase.json"),n=null;if(J(s))try{n=JSON.parse(ue(s,"utf-8"))}catch{}let i=n?.project?.name??"[INFERRED: project name]",o=n?.project?.description??"[INFERRED: one-line description]",r=(n?.stack?.languages??[]).join(", ")||"[INFERRED]",a=(n?.stack?.frameworks??[]).join(", ")||"[INFERRED]",c=n?.commands?.dev??"[INFERRED]",u=n?.commands?.build??"[INFERRED]",g=n?.commands?.test??"[INFERRED]";Q(t,`# PRODUCT.md \u2014 ${i}
376
+
377
+ > Auto-generated by \`codebase setup\`. Fill in any [INFERRED] sections.
378
+
379
+ ## Summary
380
+
381
+ ${o}
382
+
383
+ ## ICP (Ideal Customer Profile)
384
+
385
+ - **Company size:** [INFERRED: e.g. 10\u2013500 employees]
386
+ - **Industry:** [INFERRED: e.g. SaaS, FinTech, DevTools]
387
+ - **Geography:** [INFERRED: e.g. North America, Europe]
388
+ - **Buyer role:** [INFERRED: e.g. CTO, Engineering Manager]
389
+
390
+ ## User Roles
391
+
392
+ | Role | Description | Primary Use Cases |
393
+ |------|-------------|------------------|
394
+ | [Role 1] | [INFERRED] | [INFERRED] |
395
+ | [Role 2] | [INFERRED] | [INFERRED] |
396
+
397
+ ## Pain Points
398
+
399
+ 1. [INFERRED: primary pain point]
400
+ 2. [INFERRED: secondary pain point]
401
+ 3. [INFERRED: tertiary pain point]
402
+
403
+ ## Competitive Context
404
+
405
+ - **Alternatives:** [INFERRED: what users do without this product]
406
+ - **Key differentiators:** [INFERRED: why we win]
407
+
408
+ ## Tech Stack (auto-detected)
409
+
410
+ - **Languages:** ${r}
411
+ - **Frameworks:** ${a}
412
+ - **Dev command:** \`${c}\`
413
+ - **Build command:** \`${u}\`
414
+ - **Test command:** \`${g}\`
415
+
416
+ ## Dev Credentials
417
+
418
+ - **Default seed creds:** \`{role}@dev.local\` / \`dev123456\`
419
+ - **Dev login path:** [INFERRED: e.g. /dev-login or /auth/login]
420
+
421
+ ## Known Constraints
422
+
423
+ - [INFERRED: e.g. multi-tenant, RBAC, GDPR]
424
+ `,"utf-8")}var ct,Ue=$(()=>{"use strict";it();ye();Te();He();I();ct=[{name:"bug",color:"d73a4a",description:"Something isn't working"},{name:"arch",color:"0075ca",description:"Architectural change needed"},{name:"sim",color:"e4e669",description:"Found by simulation"},{name:"carry",color:"ff6b35",description:"Bug surviving 2+ cycles"},{name:"cycle",color:"c5def5",description:"Simulation cycle summary"},{name:"critical",color:"b60205",description:"Critical severity"},{name:"high",color:"d93f0b",description:"High severity"},{name:"medium",color:"e99695",description:"Medium severity"},{name:"low",color:"fef2c0",description:"Low severity"},{name:"highlight",color:"0e8a16",description:"Positive product signal"},{name:"vibekit",color:"7057ff",description:"Queued for autonomous build"},{name:"performance",color:"ff8c00",description:"Performance issue"},{name:"review",color:"1d76db",description:"Found by code review"}]});I();var on={scan:{description:"Scan project and generate .codebase.json manifest",usage:"codebase scan [path] [options]",examples:[{command:"codebase scan",description:"Scan current directory"},{command:"codebase scan ./my-project",description:"Scan specific directory"},{command:"codebase scan --depth 6",description:"Include deeper directory structure"},{command:"codebase scan --categories stack,commands",description:"Scan only specific categories"}],options:[{flag:"--path <dir>",description:"Target project directory (default: current)"},{flag:"--depth <n>",description:"Directory tree depth (default: 4)"},{flag:"--categories <list>",description:"Comma-separated categories to scan"},{flag:"--incremental",description:"Only re-scan changed areas"},{flag:"--quiet",description:"Suppress stdout output"},{flag:"--sync",description:"Sync GitHub data (requires gh CLI)"}]},init:{description:"Initialize codebase with full setup (scan + AI tools + hooks)",usage:"codebase init [options]",examples:[{command:"codebase init",description:"One-time setup for current project"},{command:"codebase init --dry-run",description:"Preview changes without modifying files"},{command:"codebase init --sync",description:"Include GitHub data sync"}],options:[{flag:"--dry-run",description:"Preview changes without applying"},{flag:"--sync",description:"Sync GitHub data (requires gh CLI)"},{flag:"--quiet",description:"Suppress output"}],seeAlso:["scan","setup"]},setup:{description:"Wire .codebase.json into Claude Code and install slash commands",usage:"codebase setup [options]",examples:[{command:"codebase setup",description:"Configure Claude Code, git hooks, and slash commands"}],options:[{flag:"--dry-run",description:"Preview changes"}]},brief:{description:"Get comprehensive project briefing (AI-facing)",usage:"codebase brief",examples:[{command:"codebase brief",description:"Full project overview in one call"},{command:"codebase brief | jq '.stack'",description:"Extract specific section"}],seeAlso:["next","status"]},next:{description:"Show highest-priority task and what's in progress",usage:"codebase next",examples:[{command:"codebase next",description:"Show next task to work on"}],seeAlso:["brief","status"]},status:{description:"Show kanban board, priorities, and milestones",usage:"codebase status",examples:[{command:"codebase status",description:"Full project status"},{command:"codebase status --mine",description:"Show only my assigned tasks"}],options:[{flag:"--mine",description:"Show only your assigned items"}],seeAlso:["brief","next"]},query:{description:"Query specific field from manifest using dot-path",usage:"codebase query <path> [options]",examples:[{command:"codebase query stack.languages",description:'Get: ["typescript"]'},{command:"codebase query commands.test --raw | sh",description:"Run test command"},{command:"codebase query dependencies.notable",description:"List notable packages"}],options:[{flag:"--raw",description:"Plain text output (no JSON)"}]},issue:{description:"Manage GitHub issues",usage:"codebase issue <subcommand> [args]",examples:[{command:'codebase issue create "Fix auth bug"',description:"Create new issue"},{command:'codebase issue close 42 --reason "Fixed in PR #123"',description:"Close with reason"},{command:'codebase issue comment 42 --message "Fixed by refactoring auth flow"',description:"Add comment"},{command:"codebase issue list",description:"List all issues"},{command:"codebase issue list --mine",description:"List your issues"}],options:[{flag:"--message <text>",description:"Issue body (for create) or comment text"},{flag:"-m <text>",description:"Shorthand for --message"},{flag:"--reason <text>",description:"Close reason"}]},mcp:{description:"Start MCP server for AI tool integration",usage:"codebase mcp",examples:[{command:"codebase mcp",description:"Start stdio MCP server"}]},doctor:{description:"Diagnose setup and configuration issues",usage:"codebase doctor",examples:[{command:"codebase doctor",description:"Run health check"}],seeAlso:["fix"]},fix:{description:"Auto-repair issues found by doctor",usage:"codebase fix",examples:[{command:"codebase fix",description:"Auto-fix all issues"}],seeAlso:["doctor"]},release:{description:"Gate check \u2192 tag \u2192 merge develop\u2192main \u2192 GitHub release",usage:"codebase release [version] [options]",examples:[{command:"codebase release",description:"Auto-increment version and release"},{command:"codebase release v1.2.0",description:"Release with explicit version"},{command:"codebase release --dry-run",description:"Preview release without tagging"}],options:[{flag:"--dry-run",description:"Preview release notes without creating tag or merge"}],seeAlso:["doctor"]}};function vt(){console.log(`
425
+ ${v("codebase")} \u2014 One command. Every AI tool understands your project instantly.
426
+
427
+ ${v("QUICK START")}
428
+ ${k("npx codebase")} \u2190 Run this once. That's it.
429
+
430
+ ${v("AI INTERFACE")}
431
+ These are the commands your AI tools call:
432
+
433
+ ${k("codebase brief")} Full project briefing \u2014 run this first
434
+ ${k("codebase next")} What should I work on next?
435
+ ${k("codebase status")} Kanban board, priorities, milestones
436
+ ${k("codebase query <path>")} Query any field (e.g. ${G("stack.languages")})
437
+
438
+ ${v("AUTONOMOUS LOOP")}
439
+ After ${k("codebase setup")}, these slash commands are available in Claude Code:
440
+
441
+ ${k("/setup")} Bootstrap project \u2014 labels, milestone, PRODUCT.md
442
+ ${k("/simulate")} AI customer journeys (Playwright) + UX audit
443
+ ${k("/build")} Autonomous loop \u2014 build \u2192 test \u2192 simulate \u2192 repeat
444
+ ${k("/launch")} Gate check \u2192 tag \u2192 release \u2192 merge to main
445
+ ${k("/review")} Security, quality, deps, accessibility audit
446
+
447
+ ${v("HUMAN COMMANDS")}
448
+ ${k("codebase init")} Full setup (scan + AI tools + hooks)
449
+ ${k("codebase scan")} Generate/update .codebase.json
450
+ ${k("codebase setup")} Wire AI tools + install slash commands
451
+ ${k("codebase release")} Gate check \u2192 tag \u2192 develop\u2192main
452
+ ${k("codebase doctor")} Health check & diagnostics
453
+
454
+ ${v("OPTIONS")}
455
+ ${G("--help, -h")} Show this help or command-specific help
456
+ ${G("--version, -v")} Show version
457
+ ${G("--verbose")} Show detailed progress
458
+ ${G("--quiet")} Suppress output
459
+
460
+ ${v("EXAMPLES")}
461
+ ${k("npx codebase")} # One-time setup
462
+ ${k("codebase brief")} # Project overview
463
+ ${k("codebase next")} # Next task
464
+ ${k("codebase query commands.test --raw | sh")} # Run tests
465
+ ${k('codebase issue create "Fix bug"')} # Track work
466
+
467
+ ${v("GLOBAL OPTIONS")}
468
+ ${G("--path <dir>")} Target directory (default: current)
469
+ ${G("--verbose")} Show detailed output
470
+ ${G("--quiet")} Minimal output
471
+
472
+ ${v("LEARN MORE")}
473
+ Docs: ${_e("https://github.com/your-repo/codebase#readme","README.md")}
474
+ Issues: ${_e("https://github.com/your-repo/codebase/issues","Report a bug")}
475
+ Commands: ${k("codebase <command> --help")} Show command-specific help
476
+ `)}function jt(e){let t=on[e];t||(console.error(`
477
+ ${v("\u2717")} Unknown command: ${e}
478
+ `),console.log(` Run ${k("codebase --help")} to see all commands.
479
+ `),process.exit(1)),console.log(`
480
+ ${v(e)} \u2014 ${t.description}
481
+
482
+ ${v("USAGE")}
483
+ ${G(t.usage)}
484
+ ${t.examples.length>0?`
485
+ ${v("EXAMPLES")}
486
+ ${t.examples.map(s=>` ${k(s.command)}${wt(" # "+s.description)}`).join(`
487
+ `)}
488
+ `:""}${t.options?`
489
+ ${v("OPTIONS")}
490
+ ${t.options.map(s=>` ${G(s.flag.padEnd(25))} ${s.description}`).join(`
491
+ `)}
492
+ `:""}${t.seeAlso?`
493
+ ${v("SEE ALSO")}
494
+ ${t.seeAlso.map(s=>k(s)).join(", ")}
495
+ `:""}${v("MORE HELP")}
496
+ ${k("codebase --help")} Show all commands
497
+ ${_e("https://github.com/your-repo/codebase/docs","Full documentation")}
498
+ `)}var sa={E_NO_GIT:{message:"Not a git repository",suggestion:"Initialize git first: "+k("git init")},E_NO_PACKAGE_JSON:{message:"No package.json found",suggestion:"Initialize project: "+k("npm init")+" or "+k("pnpm init")},E_GH_NOT_AUTHENTICATED:{message:"GitHub CLI not authenticated",suggestion:"Run: "+k("gh auth login")},E_MANIFEST_NOT_FOUND:{message:".codebase.json not found",suggestion:"Run: "+k("codebase init")+" to generate it"},E_INVALID_PATH:{message:"Invalid directory path",suggestion:"Use absolute path or path relative to current directory"},E_PERMISSION_DENIED:{message:"Permission denied",suggestion:"Check file permissions or run with appropriate access"}};var rn={command:"scan",subcommand:"",positionals:[],path:process.cwd(),format:"text",depth:4,categories:[],incremental:!1,quiet:!1,raw:!1,verbose:!1,port:7432,tools:[],dryRun:!1,since:"",sync:!1,message:"",reason:"",examples:!1,helpCommand:!1},xt=new Set(["scan","setup","query","mcp","issue","status","init","scan-only","brief","next","doctor","fix","release"]);function $t(e){let t={...rn},s=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i.startsWith("-")&&xt.has(i)){if(t.command=i,e[n+1]==="--help"||e[n+1]==="-h")return t.helpCommand=!0,t;break}}for(let n=0;n<e.length;n++){let i=e[n];if((i==="--help"||i==="-h")&&!t.command&&(vt(),process.exit(0)),(i==="--version"||i==="-v")&&(console.log("codebase 0.1.0"),process.exit(0)),i.startsWith("--")){let o=i.slice(2);if(o==="quiet"||o==="q"){t.quiet=!0;continue}if(o==="raw"){t.raw=!0;continue}if(o==="verbose"||o==="V"){t.verbose=!0;continue}if(o==="incremental"){t.incremental=!0;continue}if(o==="dry-run"){t.dryRun=!0;continue}if(o==="sync"){t.sync=!0;continue}if(o==="examples"){t.examples=!0;continue}if(o==="mine"){s.push("mine");continue}let r=e[n+1];if(!r||r.startsWith("--"))continue;n++,o==="path"?t.path=r:o==="format"?t.format=r:o==="depth"?t.depth=parseInt(r,10)||4:o==="categories"?t.categories=r.split(",").map(a=>a.trim()):o==="port"?t.port=parseInt(r,10)||7432:o==="tools"?t.tools=r.split(",").map(a=>a.trim()):o==="since"?t.since=r:o==="message"||o==="m"?t.message=r:o==="reason"&&(t.reason=r);continue}s.push(i)}if(s.length>0&&xt.has(s[0])&&(t.command=s.shift()),s.length>0){let n=s[0];["install","uninstall","create","close","comment","list","map"].includes(n)&&(t.subcommand=s.shift())}return t.positionals=s,s.length>0&&/^[\/\.~]/.test(s[0])&&(t.path=s[0]),process.env.CODEBASE_OUTPUT&&(t.path=process.env.CODEBASE_OUTPUT),process.env.CODEBASE_PORT&&(t.port=parseInt(process.env.CODEBASE_PORT,10)||7432),process.env.CODEBASE_DEPTH&&(t.depth=parseInt(process.env.CODEBASE_DEPTH,10)||4),process.env.CODEBASE_QUIET==="true"&&(t.quiet=!0),t}function Ct(e){jt(e),process.exit(0)}I();it();Ue();he();import{resolve as qo,join as Je}from"path";import{existsSync as Ds,writeFileSync as Os,readFileSync as Mo}from"fs";import{execFile as Ps}from"child_process";import{writeFile as Lo}from"fs/promises";import{homedir as To}from"os";ye();var Fo=[V];function _s(e){return Fo.filter(t=>t.detect(e))}ye();Te();He();I();async function pt(e){U(e.quiet);let t=qo(e.path);j(`codebase \u2014 activating project intelligence
499
+ `);let s=await ve();s==="authenticated"?h("GitHub CLI \u2014 authenticated"):s==="not-authenticated"?(S("GitHub CLI installed but not logged in"),y("Run: gh auth login"),y("After login, re-run `npx codebase` for full GitHub integration\n")):(y("GitHub CLI not found \u2014 GitHub features disabled"),y(`To enable: brew install gh && gh auth login
500
+ `));let n=s==="authenticated";l(`Scanning ${t}...`);let i=await z(t,{depth:e.depth,categories:e.categories.length?e.categories:void 0,quiet:e.quiet,sync:n});for(let[d,m]of Object.entries(i))d==="version"||d==="generated_at"||typeof m!="object"||m===null||h(`${Ho(d)} (${qe(d,m)})`);let o=Je(t,".codebase.json"),r=JSON.stringify(i,null,2);await Lo(o,r,"utf-8");let a=(Buffer.byteLength(r)/1024).toFixed(1);l(`
501
+ Written: .codebase.json (${a} KB)`),j("AI Tool Integration");let c=_s(t),u=Go(),g=new Set(c.map(d=>d.name));for(let d of u)g.has(d.name)||(c.push(d),g.add(d.name));c.length===0?(y("No AI tool detected in project or system configs"),y("Creating CLAUDE.md as default (works with Claude Code, and readable by all tools)"),Os(Je(t,"CLAUDE.md"),`# Project Rules
502
+
503
+ `,"utf-8"),c=[V]):l(` Detected: ${c.map(d=>d.name).join(", ")}`);for(let d of c)d.inject(t),h(`${d.name} \u2014 instructions injected`);j("MCP Server (native AI tool access)");let f=ft(t,g);if(f.length){for(let d of f)h(`${d} \u2014 MCP server auto-configured`);y("AI tools can now call project_brief, get_next_task, create_issue, etc. natively")}else y("AI tools will read .codebase.json directly."),y("To enable MCP later, add to your tool's MCP config:"),l(' { "command": "npx", "args": ["codebase", "mcp"] }');if(j("Auto-Update Hooks"),ce(t,n)?(h("post-commit hook \u2014 manifest updates on every commit"),h("post-checkout hook \u2014 manifest updates on branch switch"),n&&h("hooks include GitHub sync \u2014 issues/PRs stay current")):y("Not a git repository \u2014 skipping hooks"),oe(t),h(".gitignore updated"),j(`Ready!
504
+ `),l(`Your project is now fully activated. Here's what happens automatically:
505
+ `),l(" On every commit \u2192 .codebase.json updates (code + GitHub data)"),l(" On branch switch \u2192 .codebase.json updates"),l(" When AI starts \u2192 reads .codebase.json or calls project_brief via MCP"),l(" AI knows \u2192 stack, commands, open issues, priorities, blockers, decisions"),l(` AI can \u2192 create issues, close issues, get next task, check blockers
506
+ `),n){let d=i.status?.issues?.filter(C=>C.state==="open").length||0,m=i.status?.pull_requests?.filter(C=>C.state==="open").length||0;(d||m)&&l(` GitHub synced: ${d} open issues, ${m} open PRs`)}l(`
507
+ You don't need to run this again. Everything stays alive.
508
+ `)}function Ho(e){return e.charAt(0).toUpperCase()+e.slice(1)}function ve(){return new Promise(e=>{Ps("sh",["-c","which gh 2>/dev/null"],{timeout:5e3},t=>{if(t){e("not-installed");return}Ps("sh",["-c","gh auth status 2>&1"],{timeout:1e4},(s,n,i)=>{let o=(n||"")+(i||"");!s&&o.includes("Logged in")?e("authenticated"):e("not-authenticated")})})})}function Go(){let e=To(),t=[];return Ds(Je(e,".claude"))&&t.push(V),t}function ft(e,t){let s=[],n={command:"npx",args:["codebase","mcp"],cwd:e};if(t.has("claude")||t.size===0){let i=Je(e,".mcp.json");Bo(i,"codebase",n)&&s.push("Claude Code (project .mcp.json)")}return s}function Bo(e,t,s){let n={};if(Ds(e)){try{n=JSON.parse(Mo(e,"utf-8"))}catch{n={}}let i=n.mcpServers;if(i&&i[t])return!1}return n.mcpServers||(n.mcpServers={}),n.mcpServers[t]=s,Os(e,JSON.stringify(n,null,2)+`
509
+ `,"utf-8"),!0}import{resolve as Uo,join as Jo}from"path";import{readFile as Wo}from"fs/promises";function We(e){let t=[],s=e.project?.name||"Unknown Project";t.push(`# PROJECT BRIEF: ${s}`),e.project?.description&&t.push(e.project.description),t.push(`
510
+ Generated: ${e.generated_at}
511
+ `),t.push("## Technical Overview");let n=[];if(e.repo?.url&&(n.push(`Repository: ${e.repo.url}`),n.push(`Default branch: ${e.repo.default_branch||"unknown"}`),e.repo.is_monorepo&&n.push(`Monorepo: yes (${e.repo.workspace_manager||"workspaces"})`)),e.stack){let o=[];e.stack.languages?.length&&o.push(`Languages: ${e.stack.languages.join(", ")}`),e.stack.frameworks?.length&&o.push(`Frameworks: ${e.stack.frameworks.join(", ")}`),e.stack.package_manager&&o.push(`Package manager: ${e.stack.package_manager}`),e.stack.database&&o.push(`Database: ${e.stack.database}`),e.stack.orm&&o.push(`ORM: ${e.stack.orm}`),e.stack.styling&&o.push(`Styling: ${e.stack.styling}`),e.stack.build_tool&&o.push(`Build tool: ${e.stack.build_tool}`),n.push(o.join(`
512
+ `))}if(e.patterns&&(e.patterns.architecture&&n.push(`Architecture: ${e.patterns.architecture}`),e.patterns.state_management&&n.push(`State management: ${e.patterns.state_management}`),e.patterns.api_style&&n.push(`API style: ${e.patterns.api_style}`)),t.push(n.join(`
513
+ `)),e.commands){let o=Object.entries(e.commands).filter(([,r])=>r);if(o.length){t.push(`
514
+ ## Commands`);for(let[r,a]of o)t.push(`- ${r}: \`${a}\``)}}if(e.structure&&(t.push(`
515
+ ## Key Paths`),e.structure.entry_points?.length&&t.push(`Entry points: ${e.structure.entry_points.join(", ")}`),e.patterns?.key_modules&&Object.keys(e.patterns.key_modules).length))for(let[o,r]of Object.entries(e.patterns.key_modules))t.push(`- ${o} \u2192 ${r}`);if(e.status&&e.status.github_available){let o=[],r=e.status.kanban?.in_progress||[];if(r.length){o.push(`
516
+ ### In Progress NOW`);for(let p of r){let d=p.assignee?` \u2192 @${p.assignee}`:"",m=p.mapped_files?.length?` (files: ${p.mapped_files.join(", ")})`:"";o.push(`- #${p.number}: ${p.title}${d}${m}`)}}let c=(e.status.priorities||[])[0];if(c){o.push(`
517
+ ### NEXT TASK (highest priority)`);let p=c.labels.length?` [${c.labels.join(", ")}]`:"";o.push(`#${c.number}: ${c.title}${p}`),c.mapped_files?.length&&o.push(`Start in: ${c.mapped_files.join(", ")}`)}let u=e.status.kanban?.backlog||[];if(u.length>0){o.push(`
518
+ ### Backlog (${u.length} items)`);for(let p of u.slice(0,5)){let d=p.labels.length?` [${p.labels.join(", ")}]`:"";o.push(`- #${p.number}: ${p.title}${d}`)}u.length>5&&o.push(` ... and ${u.length-5} more`)}let g=(e.status.issues||[]).filter(p=>p.state==="open"&&p.labels.some(d=>d.toLowerCase().includes("blocked")||d.toLowerCase().includes("blocker")));if(g.length){o.push(`
519
+ ### BLOCKERS`);for(let p of g)o.push(`- #${p.number}: ${p.title} [${p.labels.join(", ")}]`)}let f=(e.status.pull_requests||[]).filter(p=>p.state==="open");if(f.length){o.push(`
520
+ ### Open PRs (${f.length})`);for(let p of f.slice(0,5)){let d=p.reviewers.length?` \u2192 waiting on: ${p.reviewers.join(", ")}`:"";o.push(`- PR #${p.number}: ${p.title} (${p.branch})${d}`)}}o.length>0&&(t.push(`
521
+ ## CURRENT STATUS`),t.push(...o))}if(e.roadmap?.milestones?.length){t.push(`
522
+ ## Roadmap`);for(let o of e.roadmap.milestones){let r=o.due_date?` (due: ${o.due_date.split("T")[0]})`:"";t.push(`- ${o.title}: ${o.progress.percent}% complete (${o.progress.closed}/${o.progress.open+o.progress.closed} done)${r}`)}}let i=[...e.decisions?.from_prs||[],...e.decisions?.from_adrs||[],...e.decisions?.manual||[]];if(i.length){t.push(`
523
+ ## Recent Decisions`);for(let o of i.slice(0,5))t.push(`- ${o.title} (${o.source})`),o.summary&&t.push(` ${o.summary.slice(0,150)}`)}if(e.git&&(e.git.uncommitted_changes&&(t.push(`
524
+ ## WARNING`),t.push("There are uncommitted changes in the working directory.")),e.git.recent_commits?.length)){t.push(`
525
+ ## Recent Commits`);for(let o of e.git.recent_commits.slice(0,3))t.push(`- ${o}`)}return t.push(`
526
+ ## Available Commands`),t.push("Use these commands \u2014 don't explore files to find this information:"),t.push("- `npx codebase next` \u2014 highest-priority task + what's in progress"),t.push("- `npx codebase status` \u2014 kanban board, priorities, milestones"),t.push("- `npx codebase query <path>` \u2014 any data point (e.g. `commands.test`)"),t.push('- `npx codebase issue create "title"` \u2014 track bugs/features/TODOs'),t.push('- `npx codebase issue close <n> --reason "why"` \u2014 close after fixing'),t.push("- `npx codebase brief` \u2014 re-read this briefing after changes"),t.join(`
527
+ `)}I();async function As(e){let t=Uo(e.path),s=Jo(t,".codebase.json"),n;try{let r=await Wo(s,"utf-8");n=JSON.parse(r)}catch{w("No .codebase.json found (or it's corrupted). Run `npx codebase` first."),process.exit(1)}!e.quiet&&!n.status&&!n.roadmap&&S("GitHub data unavailable (gh not authenticated or --sync not used). Issues, PRs and milestones not included.");let i=n;e.categories.length>0&&(i=Ko(n,e.categories));let o=zo(i,e.format);process.stdout.write(o+`
528
+ `)}function Ko(e,t){let s={version:e.version,generated_at:e.generated_at,project:e.project},n={project:"project",repo:"repo",structure:"structure",stack:"stack",commands:"commands",dependencies:"dependencies",config:"config",git:"git",quality:"quality",patterns:"patterns",status:"status",roadmap:"roadmap",decisions:"decisions"};for(let i of t){let o=n[i.toLowerCase()];o&&e[o]&&(s[o]=e[o])}return s}function zo(e,t){return t==="json"?JSON.stringify(e,null,2):We(e)}I();import{resolve as Vo,join as Qo}from"path";import{readFile as Yo}from"fs/promises";async function Is(e){let t=Vo(e.path),s;try{let a=await Yo(Qo(t,".codebase.json"),"utf-8");s=JSON.parse(a)}catch{w("No .codebase.json found (or it's corrupted). Run `npx codebase` first."),process.exit(1)}let n=s.status;if(!n||!n.github_available){y("No GitHub data. Run `npx codebase` with `gh` CLI authenticated.");return}let i=n.kanban?.in_progress||[];if(i.length){l(v("IN PROGRESS (don't duplicate):"));for(let a of i){let c=a.assignee?` \u2192 @${a.assignee}`:"";l(` #${a.number}: ${a.title}${c}`)}l("")}let o=n.priorities?.[0];if(!o){l("No open tasks in the backlog. Create one:"),l(' codebase issue create "task title"');return}l(v("NEXT TASK:")),l(` #${o.number}: ${o.title}`),o.labels.length&&l(` Labels: ${o.labels.join(", ")}`),o.assignee&&l(` Assignee: @${o.assignee}`),o.milestone&&l(` Milestone: ${o.milestone}`),o.mapped_files?.length&&l(` Start in: ${o.mapped_files.join(", ")}`);let r=n.issues?.filter(a=>a.state==="open"&&a.labels.some(c=>c.toLowerCase().includes("blocked")||c.toLowerCase().includes("blocker")))||[];if(r.length){l(`
529
+ ${v("BLOCKERS:")}`);for(let a of r)l(` #${a.number}: ${a.title} [${a.labels.join(", ")}]`)}}import{resolve as Xo,join as Zo}from"path";import{readFile as er}from"fs/promises";function Ke(e,t){let s=t.split("."),n=e;for(let i of s){if(n==null||typeof n!="object")return;n=n[i]}return n}I();async function Ns(e){let t=Xo(e.path),s=Zo(t,".codebase.json"),n;try{let r=await er(s,"utf-8");n=JSON.parse(r)}catch{w("No .codebase.json found (or it's corrupted). Run `npx codebase` first."),process.exit(1)}let i=e.positionals[0];if(!i){process.stdout.write(JSON.stringify(n,null,2)+`
530
+ `);return}let o=Ke(n,i);o===void 0&&(w(`Path "${i}" not found in manifest.`),process.exit(1)),e.raw?typeof o=="string"?process.stdout.write(o+`
531
+ `):Array.isArray(o)?process.stdout.write(o.join(`
532
+ `)+`
533
+ `):process.stdout.write(JSON.stringify(o)+`
534
+ `):process.stdout.write(JSON.stringify(o,null,2)+`
535
+ `)}import{resolve as sr}from"path";I();import{execFile as tr}from"child_process";function je(e,t){return new Promise((s,n)=>{tr("gh",t,{cwd:e,timeout:3e4},(i,o,r)=>{i?n(new Error(r||i.message)):s(o.trim())})})}async function Fs(e,t,s,n){let i=s||`## Summary
536
+
537
+ ${t}
538
+
539
+ ## Steps to Reproduce
540
+
541
+ 1.
542
+
543
+ ## Expected
544
+
545
+
546
+
547
+ ## Actual
548
+
549
+ `,o=["issue","create","--title",t,"--body",i];n?.length&&o.push("--label",n.join(","));try{let r=await je(e,o);h(`Created issue: ${r}`)}catch(r){w(`Failed to create issue: ${r.message}`)}}async function qs(e,t,s){try{let n=["issue","close",t];s&&n.push("--comment",s),await je(e,n),h(`Closed issue #${t}`)}catch(n){w(`Failed to close issue: ${n.message}`)}}async function Ms(e,t){try{let s=["issue","list","--limit","30"];t==="mine"&&s.push("--assignee","@me");let n=await je(e,s);n?l(n):l("No issues found.")}catch(s){w(`Failed to list issues: ${s.message}`)}}async function Ls(e,t,s){try{await je(e,["issue","comment",t,"--body",s]),h(`Comment added to issue #${t}`)}catch(n){w(`Failed to comment on issue: ${n.message}`)}}async function Ts(e,t,s){try{let n=`**Mapped files:**
550
+ ${s.map(i=>`- \`${i}\``).join(`
551
+ `)}`;await je(e,["issue","comment",t,"--body",n]),h(`Mapped issue #${t} to ${s.length} files`)}catch(n){w(`Failed to map issue: ${n.message}`)}}I();async function Hs(e){let t=sr(e.path);switch(e.subcommand){case"create":{let s=e.positionals[0];s||(w('Usage: codebase issue create "Issue title" [--message "body"]'),process.exit(1)),await Fs(t,s,e.message||void 0);break}case"close":{let s=e.positionals[0];s||(w('Usage: codebase issue close <number> [--reason "reason"]'),process.exit(1)),await qs(t,s,e.reason||void 0);break}case"comment":{let s=e.positionals[0],n=e.message;(!s||!n)&&(w('Usage: codebase issue comment <number> --message "text"'),process.exit(1)),await Ls(t,s,n);break}case"list":{let s=e.positionals[0];await Ms(t,s);break}case"map":{let s=e.positionals[0],n=e.positionals.slice(1);(!s||n.length===0)&&(w("Usage: codebase issue map <number> <file1> <file2> ..."),process.exit(1)),await Ts(t,s,n);break}default:w("Usage: codebase issue create|close|comment|list|map"),process.exit(1)}}st();I();import{resolve as nr,join as ir}from"path";import{readFile as or}from"fs/promises";async function Gs(e){let t=nr(e.path),s=null;try{s=JSON.parse(await or(ir(t,".codebase.json"),"utf-8"))}catch{}if(!s?.status){y("Syncing from GitHub...");let o=await Fe(t);o||(w("Could not sync. Is `gh` CLI installed and authenticated?"),process.exit(1)),s&&(s.status=o.status,s.roadmap=o.roadmap,s.decisions=o.decisions)}let n=s?.status;if(!n){w("No status data available.");return}let i=e.positionals[0];(i==="kanban"||!i)&&rr(n),(i==="priorities"||!i)&&ar(n),i==="milestones"&&s?.roadmap&&cr(s.roadmap),i==="decisions"&&s?.decisions&&lr(s.decisions)}function rr(e){j("Kanban Board");let{kanban:t}=e;l(`
552
+ ${v("BACKLOG")} (${t.backlog.length})`);for(let s of t.backlog.slice(0,10))l(` #${s.number} ${s.title}`);l(`
553
+ ${v("IN PROGRESS")} (${t.in_progress.length})`);for(let s of t.in_progress.slice(0,10)){let n=s.assignee?` @${s.assignee}`:"";l(` #${s.number} ${s.title}${n}`)}l(`
554
+ ${v("DONE")} (${t.done.length} recent)`);for(let s of t.done.slice(0,5))l(` #${s.number} ${s.title}`)}function ar(e){j("Priority Queue");for(let t of e.priorities.slice(0,15)){let s=t.labels.length?` [${t.labels.join(", ")}]`:"",n=t.assignee?` \u2192 @${t.assignee}`:"";l(` #${t.number} ${t.title}${s}${n}`)}}function cr(e){j("Milestones");for(let t of e.milestones){let s=ur(t.progress.percent),n=t.due_date?` (due: ${t.due_date.split("T")[0]})`:"";l(`
555
+ ${v(t.title)} ${s} ${t.progress.percent}%${n}`),l(` ${t.progress.closed}/${t.progress.open+t.progress.closed} issues closed`)}}function lr(e){j("Decisions");let t=[...e.from_prs.map(s=>({...s,type:"PR"})),...e.from_adrs.map(s=>({...s,type:"ADR"})),...e.manual.map(s=>({...s,type:"Manual"}))].sort((s,n)=>(n.date||"").localeCompare(s.date||""));for(let s of t.slice(0,15))l(` [${s.type}] ${s.title}`),s.summary&&l(` ${s.summary.slice(0,100)}`)}function ur(e){let t=Math.round(e/5),s=20-t;return`[${"\u2588".repeat(t)}${"\u2591".repeat(s)}]`}import{resolve as $r}from"path";import{createInterface as dr}from"readline";import{readFile as pr,writeFile as fr}from"fs/promises";import{existsSync as mr,readdirSync as gr}from"fs";import{join as mt}from"path";import{execFile as hr}from"child_process";he();var br=[{name:"project_brief",description:"CALL THIS FIRST at the start of every session. Returns a complete project briefing: what the project is, tech stack, current priorities, open issues, blockers, what to work on next, and recent decisions. This is your single source of truth \u2014 call it before doing anything else.",inputSchema:{type:"object",properties:{}}},{name:"get_codebase",description:"Get structured project data. Use 'category' to get a specific section: repo, structure, stack, commands, dependencies, config, git, quality, patterns, status, roadmap, decisions. Without category returns everything.",inputSchema:{type:"object",properties:{category:{type:"string",description:"Section to retrieve: repo, structure, stack, commands, dependencies, config, git, quality, patterns, status, roadmap, decisions"}}}},{name:"query_codebase",description:"Query a specific field using dot-path notation. Examples: 'stack.languages', 'commands.test', 'status.kanban.in_progress', 'roadmap.milestones'.",inputSchema:{type:"object",properties:{path:{type:"string",description:"Dot-path query, e.g. 'stack.languages', 'commands.test', 'status.priorities'"}},required:["path"]}},{name:"get_next_task",description:"Get the highest-priority task you should work on next. Returns the top open issue ranked by priority labels (P0 > P1 > bugs > features), including mapped files so you know where to start coding.",inputSchema:{type:"object",properties:{}}},{name:"get_blockers",description:"Get all current blockers \u2014 issues labeled as blocked, PRs waiting for review, and dependency issues. Shows what's preventing progress.",inputSchema:{type:"object",properties:{}}},{name:"create_issue",description:"Create a new GitHub issue. Use this when you discover a bug, identify needed work, or the user asks to track something. Returns the issue URL.",inputSchema:{type:"object",properties:{title:{type:"string",description:"Issue title"},body:{type:"string",description:"Issue body/description (markdown)"},labels:{type:"array",items:{type:"string"},description:"Labels to apply: bug, feature, enhancement, P0, P1, P2, etc."}},required:["title"]}},{name:"close_issue",description:"Close a GitHub issue after fixing it. Add a comment explaining what was done.",inputSchema:{type:"object",properties:{number:{type:"number",description:"Issue number to close"},comment:{type:"string",description:"Comment explaining resolution"}},required:["number"]}},{name:"list_commands",description:"List installed Claude Code slash commands in this project. Returns names and descriptions of available /setup, /simulate, /build, /launch, /review commands.",inputSchema:{type:"object",properties:{}}},{name:"rescan_project",description:"Rescan the project to refresh the manifest after making changes. Call this after major refactors, dependency updates, or when your cached data feels stale.",inputSchema:{type:"object",properties:{sync:{type:"boolean",description:"Also refresh GitHub data (issues, PRs, milestones). Default: false."}}}}];async function Us(e){let t=dr({input:process.stdin,terminal:!1});for await(let s of t){if(!s.trim())continue;let n;try{n=JSON.parse(s)}catch{Bs({jsonrpc:"2.0",id:0,error:{code:-32700,message:"Parse error"}});continue}let i=await yr(n,e);i&&Bs(i)}}async function yr(e,t){switch(e.method){case"initialize":return q(e.id,{protocolVersion:"2024-11-05",serverInfo:{name:"codebase",version:"0.1.0"},capabilities:{tools:{}}});case"notifications/initialized":return null;case"tools/list":return q(e.id,{tools:br});case"tools/call":return kr(e,t);default:return{jsonrpc:"2.0",id:e.id,error:{code:-32601,message:`Method not found: ${e.method}`}}}}async function kr(e,t){let s=e.params||{},n=s.name,i=s.arguments||{};try{switch(n){case"project_brief":{let o=await xe(t,!0),r=We(o);return q(e.id,{content:[{type:"text",text:r}]})}case"get_codebase":{let o=await xe(t),r=i.category;if(r){let a=o[r];return q(e.id,{content:[{type:"text",text:JSON.stringify(a??null,null,2)}]})}return q(e.id,{content:[{type:"text",text:JSON.stringify(o,null,2)}]})}case"query_codebase":{let o=await xe(t),r=i.path,a=Ke(o,r);return q(e.id,{content:[{type:"text",text:JSON.stringify(a??null,null,2)}]})}case"get_next_task":{let o=await xe(t,!0),r=wr(o);return q(e.id,{content:[{type:"text",text:r}]})}case"get_blockers":{let o=await xe(t,!0),r=vr(o);return q(e.id,{content:[{type:"text",text:r}]})}case"create_issue":{let o=await jr(t,i);return q(e.id,{content:[{type:"text",text:o}]})}case"close_issue":{let o=await xr(t,i);return q(e.id,{content:[{type:"text",text:o}]})}case"list_commands":{let o=mt(t,".claude","commands");if(!mr(o))return q(e.id,{content:[{type:"text",text:"No slash commands installed. Run: codebase setup"}]});let r=gr(o).filter(c=>c.endsWith(".md")),a=r.map(c=>"/"+c.replace(/\.md$/,"")).join(", ");return q(e.id,{content:[{type:"text",text:`Installed commands (${r.length}): ${a}
556
+
557
+ Loop: /simulate \u2192 /build \u2192 /launch`}]})}case"rescan_project":{let o=i.sync===!0,r=await z(t,{quiet:!0,sync:o});return await fr(mt(t,".codebase.json"),JSON.stringify(r,null,2),"utf-8"),q(e.id,{content:[{type:"text",text:`Project rescanned. Manifest updated at ${r.generated_at}`}]})}default:return{jsonrpc:"2.0",id:e.id,error:{code:-32602,message:`Unknown tool: ${n}`}}}}catch(o){return q(e.id,{content:[{type:"text",text:`Error: ${o.message}`}],isError:!0})}}async function xe(e,t=!1){try{let s=await pr(mt(e,".codebase.json"),"utf-8");return JSON.parse(s)}catch{return await z(e,{quiet:!0,sync:t})}}function wr(e){if(!e.status?.priorities?.length)return"No open issues found. The project has no tracked tasks. You can create issues with the create_issue tool when you identify work to do.";let t=e.status.priorities[0],s=t.labels.length?` [${t.labels.join(", ")}]`:"",n=t.assignee?` (assigned to @${t.assignee})`:"",i=t.mapped_files?.length?`
558
+ Start in: ${t.mapped_files.join(", ")}`:"",o=`NEXT TASK: #${t.number} \u2014 ${t.title}${s}${n}${i}`,r=e.status.priorities.slice(1,4);if(r.length){o+=`
559
+
560
+ Up next in queue:`;for(let a of r)o+=`
561
+ #${a.number} ${a.title} [${a.labels.join(", ")||"no labels"}]`}return o}function vr(e){let t=[];if(e.status?.issues){let s=e.status.issues.filter(n=>n.state==="open"&&n.labels.some(i=>i.toLowerCase().includes("blocked")||i.toLowerCase().includes("blocker")));if(s.length){t.push("BLOCKED ISSUES:");for(let n of s)t.push(` #${n.number} ${n.title} [${n.labels.join(", ")}]`)}}if(e.status?.pull_requests){let s=e.status.pull_requests.filter(n=>n.state==="open"&&n.reviewers.length>0);if(s.length){t.push(`
562
+ PRs WAITING FOR REVIEW:`);for(let n of s)t.push(` #${n.number} ${n.title} \u2192 reviewers: ${n.reviewers.join(", ")}`)}}return e.git?.uncommitted_changes&&t.push(`
563
+ WARNING: Uncommitted changes detected. Consider committing before starting new work.`),t.length===0?"No blockers found. All clear to proceed with the next task.":t.join(`
564
+ `)}function gt(e,t){return new Promise((s,n)=>{hr("gh",t,{cwd:e,timeout:3e4},(i,o,r)=>{i?n(new Error(r||i.message)):s(o.trim())})})}async function jr(e,t){let s=t.title,n=t.body||s,i=t.labels,o=["issue","create","--title",s,"--body",n];return i?.length&&o.push("--label",i.join(",")),`Issue created: ${await gt(e,o)}`}async function xr(e,t){let s=t.number,n=t.comment;return n&&await gt(e,["issue","comment",String(s),"--body",n]),await gt(e,["issue","close",String(s)]),`Issue #${s} closed.`}function q(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Bs(e){process.stdout.write(JSON.stringify(e)+`
565
+ `)}async function Js(e){let t=$r(e.path);await Us(t)}import{resolve as Cr,join as O}from"path";import{existsSync as N,readFileSync as W,statSync as Ws,readdirSync as Er}from"fs";I();var Sr="# codebase-auto-update";async function zs(e){U(e.quiet);let t=Cr(e.path),s=[];j(`codebase doctor
566
+ `);let n=O(t,".codebase.json"),i=null;if(N(n))try{let b=W(n,"utf-8");i=JSON.parse(b);let _=Ws(n),x=(_.size/1024).toFixed(1),L=Date.now()-_.mtimeMs,Se=Ar(L);s.push({label:"Manifest",ok:!0,detail:`.codebase.json (${x} KB, ${Se})`})}catch{s.push({label:"Manifest",ok:!1,detail:"Corrupted \u2014 run `codebase fix`"})}else s.push({label:"Manifest",ok:!1,detail:"Missing \u2014 run `codebase fix`"});if(i){let b=i.generated_at?new Date(i.generated_at).getTime():0,_=(Date.now()-b)/(1e3*60*60),x=!1;if(N(O(t,"src")))try{Ws(O(t,"src")).mtimeMs>b&&(x=!0)}catch{}x?s.push({label:"Freshness",ok:!1,detail:`Stale (${Math.round(_)} hours old)`}):s.push({label:"Freshness",ok:!0,detail:"Up to date"});let L=["project","repo","structure","stack","commands","dependencies","config","git","quality","patterns"],Se=L.filter(Re=>Re in i);if(Se.length===L.length)s.push({label:"Detectors",ok:!0,detail:"10/10 categories present"});else{let Re=L.filter(tn=>!Se.includes(tn));s.push({label:"Detectors",ok:!1,detail:`Missing: ${Re.join(", ")}`})}}let o=await ve(),r=o==="authenticated";if(o==="authenticated"?s.push({label:"GitHub CLI",ok:!0,detail:"Authenticated"}):o==="not-authenticated"?s.push({label:"GitHub CLI",ok:!1,detail:"Not authenticated \u2014 run `gh auth login`"}):s.push({label:"GitHub CLI",ok:!1,detail:"Not installed \u2014 brew install gh"}),i){let b=i.repo?.url,_=i.status?.github_available,x=b?.includes("github.com");x&&_===!1?s.push({label:"GitHub Sync",ok:!1,detail:"Repo has GitHub remote but github_available is false"}):!x&&_===!0?s.push({label:"GitHub Sync",ok:!1,detail:"No GitHub remote but github_available is true"}):s.push({label:"GitHub Sync",ok:!0,detail:"Consistent"})}let a=Rr(t);s.push({label:"Claude Code",ok:a,detail:a?"CLAUDE.md injected":"CLAUDE.md injection missing \u2014 run `codebase fix`"});let c=_r(t);if(s.push({label:"MCP",ok:c,detail:c?".mcp.json configured":".mcp.json missing \u2014 run `codebase fix`"}),N(O(t,".git"))){let b=Ks(t,"post-commit"),_=Ks(t,"post-checkout"),x=Or(t);if(b&&_){let L=r&&x?" (with --sync)":"";s.push({label:"Git Hooks",ok:!0,detail:`post-commit + post-checkout${L}`})}else{let L=[];b||L.push("post-commit"),_||L.push("post-checkout"),s.push({label:"Git Hooks",ok:!1,detail:`${L.join(" + ")} missing`})}r&&b&&!x&&s.push({label:"Hook Sync",ok:!1,detail:"Missing --sync flag"})}else s.push({label:"Git Hooks",ok:!0,detail:"Not a git repo \u2014 skipped"});if(N(O(t,".git"))&&(Pr(t)?s.push({label:"Branch Hook",ok:!0,detail:"commit-msg blocks direct commits to main/master"}):s.push({label:"Branch Hook",ok:!1,detail:"commit-msg hook missing \u2014 run `codebase fix`"})),N(O(t,".git"))){let b=Dr(t);(()=>{try{let x=JSON.parse(W(O(t,"package.json"),"utf-8"));return!!(x.scripts?.check||x.scripts?.typecheck||x.scripts?.lint)}catch{return!1}})()?b?s.push({label:"Pre-commit",ok:!0,detail:"Runs lint + typecheck before every commit"}):s.push({label:"Pre-commit",ok:!1,detail:"pre-commit hook missing \u2014 run `codebase fix`"}):s.push({label:"Pre-commit",ok:!0,detail:"No lint/typecheck scripts \u2014 skipped"})}let u=O(t,".claude","commands");if(N(u)){let b=Er(u).filter(_=>_.endsWith(".md"));s.push({label:"Claude Commands",ok:b.length>0,detail:`${b.length} commands in .claude/commands/`})}else s.push({label:"Claude Commands",ok:!1,detail:".claude/commands/ missing \u2014 run `codebase setup`"});let g=O(t,".claude","hooks","git-guard.sh"),f=O(t,".claude","hooks","git-post.sh"),p=O(t,".claude","settings.json"),d=N(g)&&N(f),m=(()=>{if(!N(p))return!1;try{let b=JSON.parse(W(p,"utf-8")),_=JSON.stringify(b.hooks?.PreToolUse??""),x=JSON.stringify(b.hooks?.PostToolUse??"");return _.includes("git-guard")&&x.includes("git-post")}catch{return!1}})();if(d&&m)s.push({label:"Claude Hooks",ok:!0,detail:"git-guard + git-post wired in settings.json"});else{let b=[];d||b.push("hook scripts"),m||b.push("settings.json wiring"),s.push({label:"Claude Hooks",ok:!1,detail:`Missing: ${b.join(", ")} \u2014 run \`codebase setup\``})}let C=O(t,".gitignore");N(C)?W(C,"utf-8").includes(".codebase.json")?s.push({label:"Gitignore",ok:!0,detail:".codebase.json in .gitignore"}):s.push({label:"Gitignore",ok:!1,detail:".codebase.json not in .gitignore"}):s.push({label:"Gitignore",ok:!1,detail:".gitignore missing"});let P=!!process.env.NO_COLOR,R=P?"":"\x1B[32m",E=P?"":"\x1B[31m",F=P?"":"\x1B[0m",M=s.filter(b=>!b.ok);for(let b of s){let _=b.ok?`${R}\u2713${F}`:`${E}\u2717${F}`,x=(b.label.startsWith(" ")," "),L=b.label.startsWith(" ")?18:16;l(`${x}${b.label.trimStart().padEnd(L)} ${_} ${b.detail}`)}l(""),M.length===0?l(" All checks passed. Your project is healthy."):l(` ${M.length} issue${M.length>1?"s":""} found. Run \`codebase fix\` to repair.`),l(""),M.length>0&&process.exit(1)}function Rr(e){let t=O(e,"CLAUDE.md");return N(t)?W(t,"utf-8").includes("<!-- codebase:start -->"):!1}function _r(e){let t=O(e,".mcp.json");if(!N(t))return!1;try{return!!JSON.parse(W(t,"utf-8")).mcpServers?.codebase}catch{return!1}}function Ks(e,t){let s=O(e,".git","hooks",t);return N(s)?W(s,"utf-8").includes(Sr):!1}function Pr(e){let t=O(e,".git","hooks","commit-msg");return N(t)?W(t,"utf-8").includes("codebase-branch-check"):!1}function Dr(e){let t=O(e,".git","hooks","pre-commit");return N(t)?W(t,"utf-8").includes("codebase-pre-commit"):!1}function Or(e){let t=O(e,".git","hooks","post-commit");return N(t)?W(t,"utf-8").includes("--sync"):!1}function Ar(e){let t=Math.floor(e/1e3);if(t<60)return`${t} sec ago`;let s=Math.floor(t/60);if(s<60)return`${s} min ago`;let n=Math.floor(s/60);if(n<24)return`${n} hr ago`;let i=Math.floor(n/24);return`${i} day${i>1?"s":""} ago`}he();import{resolve as Ir,join as T}from"path";import{existsSync as H,readFileSync as Y}from"fs";import{writeFile as Nr}from"fs/promises";He();Te();I();var Fr="# codebase-auto-update",Qs=!!process.env.NO_COLOR,qr=Qs?"":"\x1B[32m",Mr=Qs?"":"\x1B[0m";function ee(e){console.log(` ${qr}\u2713${Mr} ${e}`)}async function Ys(e){U(e.quiet);let t=Ir(e.path),s=0;j(`codebase fix
567
+ `);let n=await ve(),i=n==="authenticated";n==="not-installed"?(y("GitHub CLI not installed \u2014 install with: brew install gh"),y(`(Cannot auto-fix \u2014 requires manual installation)
568
+ `)):n==="not-authenticated"&&(y("GitHub CLI not authenticated \u2014 run: gh auth login"),y(`(Cannot auto-fix \u2014 requires manual login)
569
+ `));let o=T(t,".codebase.json"),r=!1;if(!H(o))r=!0;else try{let E=Y(o,"utf-8");JSON.parse(E)}catch{r=!0}if(!r&&H(o))try{let E=Y(o,"utf-8"),F=JSON.parse(E),M=F.generated_at?new Date(F.generated_at).getTime():0;if(H(T(t,"src"))){let{statSync:b}=await import("fs");b(T(t,"src")).mtimeMs>M&&(r=!0)}}catch{r=!0}if(r){let E=await z(t,{depth:e.depth,quiet:!0,sync:i}),F=JSON.stringify(E,null,2);await Nr(o,F,"utf-8");let M=(Buffer.byteLength(F)/1024).toFixed(1);ee(`Re-scanned project \u2192 .codebase.json (${M} KB)`),s++}let{claudeIntegration:a}=await Promise.resolve().then(()=>(ye(),vs));Lr(t)||(a.inject(t),ee("Re-injected Claude Code instructions into CLAUDE.md"),s++);let u=ft(t,new Set(["claude"]));for(let E of u)ee(`Added MCP entry to ${E}`),s++;if(H(T(t,".git"))){let E=Vs(t,"post-commit"),F=Vs(t,"post-checkout"),M=Tr(t),b=Hr(t);if(!E||!F||i&&!M||!b){ce(t,i);let x=[];E||x.push("post-commit"),F||x.push("post-checkout"),i&&!M&&x.push("--sync flag"),b||x.push("pre-commit"),ee(`Installed ${x.join(" + ")} hook${x.length>1?"s":""}`),s++}}let g=T(t,".gitignore");(H(g)?Y(g,"utf-8"):"").includes(".codebase.json")||(oe(t),ee("Added .codebase.json to .gitignore"),s++);let p=T(t,".claude","commands");if(!H(p)){let{installClaudeCommandsForFix:E}=await Promise.resolve().then(()=>(Ue(),dt));E(t),ee("Installed Claude commands \u2192 .claude/commands/"),s++}let d=T(t,".claude","hooks","git-guard.sh"),m=T(t,".claude","hooks","git-post.sh"),C=T(t,".claude","settings.json"),P=H(d)&&H(m),R=(()=>{if(!H(C))return!1;try{let E=JSON.parse(Y(C,"utf-8")),F=JSON.stringify(E.hooks?.PreToolUse??""),M=JSON.stringify(E.hooks?.PostToolUse??"");return F.includes("git-guard")&&M.includes("git-post")}catch{return!1}})();if(!P||!R){let{installClaudeHooksForFix:E}=await Promise.resolve().then(()=>(Ue(),dt));E(t),ee("Installed Claude Code hooks \u2192 .claude/hooks/ + settings.json"),s++}l(""),s===0?l(" Nothing to fix. Your project is healthy."):l(` Fixed ${s} issue${s>1?"s":""}. Run \`codebase doctor\` to verify.`),l("")}function Lr(e){let t=T(e,"CLAUDE.md");return H(t)?Y(t,"utf-8").includes("<!-- codebase:start -->"):!1}function Vs(e,t){let s=T(e,".git","hooks",t);return H(s)?Y(s,"utf-8").includes(Fr):!1}function Tr(e){let t=T(e,".git","hooks","post-commit");return H(t)?Y(t,"utf-8").includes("--sync"):!1}function Hr(e){let t=T(e,".git","hooks","pre-commit");return H(t)?Y(t,"utf-8").includes("codebase-pre-commit"):!1}I();import{resolve as Gr,join as ze}from"path";import{execFile as Ce}from"child_process";import{existsSync as Xs,readFileSync as bt,writeFileSync as Br}from"fs";async function Zs(e){let t=Gr(e.path),s=e.dryRun,n=e.positionals[0]??null;j(`codebase release${s?" (dry run)":""}`),await Ur()||(w("gh CLI not authenticated. Run: gh auth login"),process.exit(1)),await $e(t,"git remote get-url origin 2>/dev/null")||(w("No git remote. Run: git remote add origin <url>"),process.exit(1)),l(`
570
+ Checking launch gates...`);let[r,a]=await Promise.all([ht(t,["bug","critical"]),ht(t,["bug","high"])]);(r>0||a>0)&&(w("Gate 1a FAILED \u2014 open blocking bugs:"),r>0&&l(` Critical: ${r}`),a>0&&l(` High: ${a}`),l(`
571
+ Fix: run /simulate, or close with wontfix label`),process.exit(1)),h("Gate 1a \u2014 no critical/high bugs");let c=Jr(t);if(c){let R=await Wr(t,c);R.ok||(w("Gate 1b FAILED \u2014 test suite has failures"),l(R.output.split(`
572
+ `).slice(-10).join(`
573
+ `)),l(`
574
+ Fix: run /review to repair failing tests`),process.exit(1)),h(`Gate 1b \u2014 tests pass (${c})`)}else S("Gate 1b \u2014 no test runner detected (skipping)");let u=await Kr(t);u!==null&&u<7&&(w(`Gate 1c FAILED \u2014 world-class score ${u}/10 (minimum 7.0)`),l(" Fix: run /simulate to improve UX score"),process.exit(1)),u!==null?h(`Gate 1c \u2014 world-class score ${u}/10`):S("Gate 1c \u2014 no simulation data yet (run /simulate first)");let g=await ht(t,["carry"]);g>0?S(`Gate 2 \u2014 ${g} carry bug(s) will appear in release notes`):h("Gate 2 \u2014 no carry bugs");let f=await $e(t,"git status --short");f&&(w("Gate 3 FAILED \u2014 uncommitted changes"),l(f),process.exit(1)),await $e(t,"git fetch origin develop 2>/dev/null || true"),await $e(t,"git log HEAD..origin/develop --oneline 2>/dev/null")&&(w("Gate 3 FAILED \u2014 branch is behind origin/develop"),l(" Fix: git pull origin develop"),process.exit(1)),h("Gate 3 \u2014 branch clean and current"),l(`
575
+ All gates passed.`);let d=n??await zr(t);l(`
576
+ Release version: ${d}`);let m=await Vr(t,d,g);if(s){l(`
577
+ --- DRY RUN \u2014 release notes preview ---`),l(m),l("--- DRY RUN \u2014 no tag, no merge, no GitHub release created ---");return}await te(t,["tag","-a",d,"-m",`Release ${d}`]),await te(t,["push","origin",d]),h(`Tagged ${d}`),await te(t,["checkout","main"]),await te(t,["pull","origin","main"]),await te(t,["merge","develop","--no-ff","-m",`Release ${d}`]),await te(t,["push","origin","main"]),await te(t,["checkout","develop"]),h("Merged develop \u2192 main");let{ok:C,stdout:P}=await K(t,["release","create",d,"--title",d,"--notes",m,"--target","develop"]);C?h(`GitHub release: ${P}`):S("Could not create GitHub release \u2014 tag and merge succeeded"),await Qr(t),l(`
578
+ codebase release ${d} complete.`),l("develop \u2192 main merged. Tag pushed. Ready.")}function $e(e,t){return new Promise(s=>{Ce("sh",["-c",t],{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function te(e,t){return new Promise((s,n)=>{Ce("git",t,{cwd:e,timeout:3e4},(i,o,r)=>{i?n(new Error(r||i.message)):s()})})}function K(e,t){return new Promise(s=>{Ce("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function Ur(){return new Promise(e=>{Ce("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function ht(e,t){let{stdout:s}=await K(e,["issue","list","--label",t.join(","),"--state","open","--limit","100","--json","number","--jq","length"]);return parseInt(s,10)||0}function Jr(e){try{let t=JSON.parse(bt(ze(e,"package.json"),"utf-8"));if(t.devDependencies?.vitest||t.dependencies?.vitest)return"npx vitest run";if(t.devDependencies?.jest||t.dependencies?.jest)return"npx jest";if(t.scripts?.test)return"npm test"}catch{}if(Xs(ze(e,"pyproject.toml")))try{if(bt(ze(e,"pyproject.toml"),"utf-8").includes("pytest"))return"uv run pytest"}catch{}return null}function Wr(e,t){return new Promise(s=>{Ce("sh",["-c",t],{cwd:e,timeout:12e4},(n,i,o)=>{s({ok:!n,output:i+o})})})}async function Kr(e){let{stdout:t}=await K(e,["issue","list","--label","cycle","--state","all","--limit","1","--json","body","--jq",".[0].body // empty"]);if(!t)return null;let s=t.match(/[Ww]orld[- ]class[^0-9]*([0-9]+(?:\.[0-9]+)?)\/10/);return s?parseFloat(s[1]):null}async function zr(e){let t=await $e(e,"git describe --tags --abbrev=0 2>/dev/null");if(!t)return"v0.1.0";let s=t.match(/^v?(\d+)\.(\d+)\.(\d+)$/);return s?`v${s[1]}.${s[2]}.${parseInt(s[3],10)+1}`:"v0.1.0"}async function Vr(e,t,s){let n=new Date().toISOString().split("T")[0],[i,o,r,a]=await Promise.all([K(e,["issue","list","--label","arch","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),K(e,["issue","list","--label","bug,sim","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),K(e,["issue","list","--label","carry","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),K(e,["issue","list","--label","arch","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"'])]),c=`# Release ${t} \u2014 ${n}
579
+
580
+ `;return i.stdout&&(c+=`## What's New
581
+
582
+ ${i.stdout}
583
+
584
+ `),o.stdout&&(c+=`## Bug Fixes
585
+
586
+ ${o.stdout}
587
+
588
+ `),(r.stdout||a.stdout)&&(c+=`## Known Issues
589
+
590
+ `,r.stdout&&(c+=`### Carry Bugs (${s})
591
+ ${r.stdout}
592
+
593
+ `),a.stdout&&(c+=`### Pending Architecture
594
+ ${a.stdout}
595
+
596
+ `)),c}async function Qr(e){let t=ze(e,".vibekit","milestone.env");if(!Xs(t))return;let s=bt(t,"utf-8"),n=s.match(/MILESTONE_NUMBER=(\d+)/),i=s.match(/MILESTONE_TITLE=(v[\d.]+)/);if(!n||!i)return;let{stdout:o}=await K(e,["repo","view","--json","nameWithOwner","--jq",".nameWithOwner"]);if(!o)return;await K(e,["api",`repos/${o}/milestones/${n[1]}`,"-X","PATCH","-f","state=closed"]),y(`Milestone ${i[1]} closed`);let r=i[1].match(/^v(\d+)\.(\d+)$/);if(!r)return;let a=`v${r[1]}.${parseInt(r[2],10)+1}`,{stdout:c}=await K(e,["api",`repos/${o}/milestones`,"-X","POST","-f",`title=${a}`,"-f","state=open","-f","description=Next release cycle \u2014 managed by vibekit","--jq",".number"]);c&&(Br(t,`MILESTONE_NUMBER=${c}
597
+ MILESTONE_TITLE=${a}
598
+ `,"utf-8"),h(`Next milestone created: ${a}`))}var X=$t(process.argv.slice(2));U(X.quiet);kt(X.verbose);X.helpCommand&&X.command&&Ct(X.command);var Yr={scan:pt,init:pt,brief:As,next:Is,setup:ut,query:Ns,issue:Hs,status:Gs,mcp:Js,doctor:zs,fix:Ys,release:Zs,"scan-only":Me},en=Yr[X.command];en||(console.error(`
599
+ Unknown command: ${X.command}
600
+ `),console.log(` Run ${Ve("codebase --help")} to see all commands.
601
+ `),process.exit(1));en(X).catch(e=>{console.error(`
602
+ ${Xr("\u2717")} Error: ${e.message}
603
+ `);let t=e.message.toLowerCase();t.includes("not a git repository")?console.log(` ${Ee("\u2192")} Initialize git first: ${Ve("git init")}
604
+ `):t.includes("permission denied")?console.log(` ${Ee("\u2192")} Check file permissions or run with appropriate access
605
+ `):t.includes("no such file")?console.log(` ${Ee("\u2192")} Check that the path is correct
606
+ `):t.includes("github")&&(console.log(` ${Ee("\u2192")} Ensure GitHub CLI is installed: ${Ve("gh --version")}
607
+ `),console.log(` ${Ee("\u2192")} Authenticate: ${Ve("gh auth login")}
608
+ `)),process.exit(1)});function Xr(e){return`\x1B[31m${e}\x1B[0m`}function Ee(e){return`\x1B[36m${e}\x1B[0m`}function Ve(e){return`\x1B[1m${e}\x1B[0m`}