codebase-ai 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +43 -43
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
- var pn=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var xt=(e,t)=>{for(var s in t)pn(e,s,{get:t[s],enumerable:!0})};function J(e){ee=e}function Ct(e){fn=e}function l(e){ee||console.log(e)}function h(e){ee||console.log(` ${O.green}[\u2713]${O.reset} ${e}`)}function w(e){console.error(` ${O.red}[\u2717]${O.reset} ${e}`)}function R(e){ee||console.log(` ${O.yellow}[!]${O.reset} ${e}`)}function y(e){ee||console.log(` ${O.cyan}[i]${O.reset} ${e}`)}function Et(e){ee||console.log(`${O.dim}${e}${O.reset}`)}function $(e){return`${O.bold}${e}${O.reset}`}function j(e){ee||console.log(`
2
+ var pn=Object.defineProperty;var C=(e,t)=>()=>(e&&(t=e(e=0)),t);var xt=(e,t)=>{for(var s in t)pn(e,s,{get:t[s],enumerable:!0})};function J(e){ee=e}function Ct(e){fn=e}function l(e){ee||console.log(e)}function h(e){ee||console.log(` ${O.green}[\u2713]${O.reset} ${e}`)}function w(e){console.error(` ${O.red}[\u2717]${O.reset} ${e}`)}function S(e){ee||console.log(` ${O.yellow}[!]${O.reset} ${e}`)}function y(e){ee||console.log(` ${O.cyan}[i]${O.reset} ${e}`)}function Et(e){ee||console.log(`${O.dim}${e}${O.reset}`)}function $(e){return`${O.bold}${e}${O.reset}`}function j(e){ee||console.log(`
3
3
  ${O.bold}${e}${O.reset}`)}function Oe(e,t){return process.stdout.isTTY&&!B?`\x1B]8;;${t}\x1B\\${e}\x1B]8;;\x1B\\`:`${e} (${t})`}function U(e){return`${O.dim}${e}${O.reset}`}function k(e){return`${O.cyan}${e}${O.reset}`}var B,O,ee,fn,N=C(()=>{"use strict";B=!!process.env.NO_COLOR,O={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"},ee=!1,fn=!1});function Nt(e,t){let s=On(t);return e.filter(n=>s.test(n))}function On(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(st).join("|")+")",s=i+1}else t+=st(n),s++}else t+=st(n),s++}return t+="$",new RegExp(t)}function st(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var Ft=C(()=>{"use strict"});import{readdir as An,readFile as In}from"fs/promises";import{existsSync as Nn}from"fs";import{join as nt,relative as Fn}from"path";import{execFile as qn}from"child_process";async function qt(e,t={}){let s=new Set([...Mn,...t.ignore??[]]),n=await Mt(e,e,s,t.depth??10),i=new Set(n);return{root:e,files:n,async readFile(o){try{return await In(nt(e,o),"utf-8")}catch{return""}},fileExists(o){return i.has(o)?!0:Nn(nt(e,o))},glob(o){return Nt(n,o)},async exec(o){return new Promise(r=>{qn("sh",["-c",o],{cwd:e,timeout:1e4},(a,c)=>{r(a?"":c.trim())})})}}}async function Mt(e,t,s,n,i=0){if(i>n)return[];let o=[];try{let r=await An(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=nt(t,a.name),u=Fn(e,c);if(a.isDirectory()){o.push(u+"/");let g=await Mt(e,c,s,n,i+1);o.push(...g)}else o.push(u)}}catch{}return o}var Mn,Lt=C(()=>{"use strict";Ft();Mn=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 Ln(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 Tn(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
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 Tt,Ht=C(()=>{"use strict";Tt={name:"project",category:"project",async detect(e){let[t,s,n]=await Promise.all([Ln(e),Tn(e),Hn(e)]);return{name:t,description:s||n||null}}}});async function Gn(e){return await e.exec("git remote get-url origin 2>/dev/null")||null}async function Un(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 Bn(e){let t=await e.exec("git branch -a --sort=-committerdate --format='%(refname:short)' 2>/dev/null");return t?t.split(`
5
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 Jn(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 Wn(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 Gt,Ut=C(()=>{"use strict";Gt={name:"repo",category:"repo",async detect(e){let[t,s,n,i,o]=await Promise.all([Gn(e),Un(e),Bn(e),Jn(e),Wn(e)]);return{url:t,default_branch:s,is_monorepo:i,workspace_manager:i?o:null,active_branches:n}}}});import{existsSync as Kn}from"fs";import{join as zn}from"path";function Yn(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 Vn,Qn,Bt,Jt=C(()=>{"use strict";Vn=["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"],Qn=["dist","build",".next","out","target","bin","obj",".output",".nuxt",".svelte-kit",".vercel"],Bt={name:"structure",category:"structure",async detect(e){let t=Vn.filter(i=>e.fileExists(i)),s=Qn.filter(i=>Kn(zn(e.root,i))),n=Yn(e.files,4);return{entry_points:t,build_output:s,tree:n}}}});function ii(e){let t={};for(let s of e.files){if(s.endsWith("/"))continue;let n="."+s.split(".").pop(),i=Xn[n];i&&(t[i]=(t[i]||0)+1)}return Object.entries(t).sort((s,n)=>n[1]-s[1]).map(([s])=>s)}async function oi(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 ri(e){let t=[];for(let[n,i]of Object.entries(e)){let o=Zn[n];if(o){let r=i.replace(/^[\^~>=<]+/,"").split(".").slice(0,2).join(".");t.push(`${o}@${r}`)}}let s=ai(e);return t.push(...s),[...new Set(t)]}function ai(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 ci(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 it(e,t){for(let s of Object.keys(e))if(t[s])return t[s];return null}function li(e,t){let s=new Set;for(let n of Object.keys(e))t[n]&&s.add(t[n]);return[...s]}async function ui(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 di(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 pi(e,r);a&&!t.includes(a)&&t.push(a)}let n=await fi(e);for(let r of n)t.includes(r)||t.push(r);let i=await mi(e);for(let r of i)t.includes(r)||t.push(r);let o=await gi(e);for(let r of o)t.includes(r)||t.push(r);return t}async function pi(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 fi(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 mi(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 gi(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 hi(e){let t=await e.readFile("pyproject.toml"),s=await e.readFile("requirements.txt"),n=await e.readFile("setup.py"),i=t+`
6
6
  `+s+`
7
- `+n;if(i.includes("fastapi")){let o=oe(s,"fastapi")||oe(t,"fastapi");return o?`fastapi@${o}`:"fastapi"}if(i.includes("django")){let o=oe(s,"django")||oe(t,"django"),r=[];o&&r.push(o);let a=await bi(e);a.length>0&&r.push(`apps: ${a.join(", ")}`);let c=await yi(e);return c&&r.push(c),r.length>0?`django@${r.join(" ")}`:o?`django@${o}`:"django"}if(i.includes("flask")){let o=oe(s,"flask")||oe(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 bi(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 yi(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 ki(e){let t=await e.readFile("go.mod");if(!t)return null;let s=[];if(t.includes("github.com/gin-gonic/gin")){let n=me(t,"github.com/gin-gonic/gin");s.push(n?`gin@${n}`:"gin")}if(t.includes("github.com/gofiber/fiber")){let n=me(t,"github.com/gofiber/fiber");s.push(n?`fiber@${n}`:"fiber")}if(t.includes("github.com/labstack/echo")){let n=me(t,"github.com/labstack/echo");s.push(n?`echo@${n}`:"echo")}if(t.includes("github.com/gorilla/mux")){let n=me(t,"github.com/gorilla/mux");s.push(n?`gorilla/mux@${n}`:"gorilla/mux")}if(t.includes("go-chi/chi")){let n=me(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 wi(e){let t=await e.readFile("Cargo.toml");if(!t)return null;let s=[];if(t.includes("actix-web")){let n=Ne(t,"actix-web");s.push(n?`actix-web@${n}`:"actix-web")}if(t.includes("axum")){let n=Ne(t,"axum");s.push(n?`axum@${n}`:"axum")}if(t.includes("rocket")){let n=Ne(t,"rocket");s.push(n?`rocket@${n}`:"rocket")}if(t.includes("warp")&&s.push("warp"),t.includes("tokio")){let n=Ne(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 vi(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=t+`
7
+ `+n;if(i.includes("fastapi")){let o=re(s,"fastapi")||re(t,"fastapi");return o?`fastapi@${o}`:"fastapi"}if(i.includes("django")){let o=re(s,"django")||re(t,"django"),r=[];o&&r.push(o);let a=await bi(e);a.length>0&&r.push(`apps: ${a.join(", ")}`);let c=await yi(e);return c&&r.push(c),r.length>0?`django@${r.join(" ")}`:o?`django@${o}`:"django"}if(i.includes("flask")){let o=re(s,"flask")||re(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 bi(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 yi(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 ki(e){let t=await e.readFile("go.mod");if(!t)return null;let s=[];if(t.includes("github.com/gin-gonic/gin")){let n=me(t,"github.com/gin-gonic/gin");s.push(n?`gin@${n}`:"gin")}if(t.includes("github.com/gofiber/fiber")){let n=me(t,"github.com/gofiber/fiber");s.push(n?`fiber@${n}`:"fiber")}if(t.includes("github.com/labstack/echo")){let n=me(t,"github.com/labstack/echo");s.push(n?`echo@${n}`:"echo")}if(t.includes("github.com/gorilla/mux")){let n=me(t,"github.com/gorilla/mux");s.push(n?`gorilla/mux@${n}`:"gorilla/mux")}if(t.includes("go-chi/chi")){let n=me(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 wi(e){let t=await e.readFile("Cargo.toml");if(!t)return null;let s=[];if(t.includes("actix-web")){let n=Ne(t,"actix-web");s.push(n?`actix-web@${n}`:"actix-web")}if(t.includes("axum")){let n=Ne(t,"axum");s.push(n?`axum@${n}`:"axum")}if(t.includes("rocket")){let n=Ne(t,"rocket");s.push(n?`rocket@${n}`:"rocket")}if(t.includes("warp")&&s.push("warp"),t.includes("tokio")){let n=Ne(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 vi(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=t+`
8
8
  `+s+`
9
9
  `+n;if(i.includes("spring-boot")){let o=Fe(t,"spring-boot-starter-parent")||qe(s,"org.springframework.boot");return o?`spring boot@${o}`:"spring boot"}if(i.includes("spring-framework")||i.includes("spring-core")){let o=Fe(t,"spring-framework")||qe(s,"org.springframework");return o?`spring@${o}`:"spring"}if(i.includes("micronaut")){let o=Fe(t,"micronaut")||qe(s,"io.micronaut");return o?`micronaut@${o}`:"micronaut"}if(i.includes("quarkus")){let o=Fe(t,"quarkus")||qe(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 $i(e){let t=await e.readFile("Gemfile"),s=await e.readFile(".gemspec"),n=t+`
10
- `+s;if(n.includes("rails")){let i=Wt(n,"rails"),o=[];i&&o.push(i);let r=await ji(e);return r.length>0&&o.push(r.join(", ")),o.length>0?`rails@${o.join(" ")}`:`rails@${i||"unknown"}`}if(n.includes("sinatra")){let i=Wt(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 ji(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 xi(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 Ci(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=Ei(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 oe(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 me(e,t){let s=new RegExp(`${t}\\s+v([\\d.]+)`),n=e.match(s);return n?n[1]:null}function Ne(e,t){let s=new RegExp(`${t}\\s*=\\s*"([\\d.]+)"`),n=e.match(s);return n?n[1]:null}function Fe(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 qe(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 Wt(e,t){let s=new RegExp(`gem\\s+['"]${t}['"][^,]*,\\s*['"]~?>?\\s*([\\d.]+)['"]`),n=e.match(s);return n?n[1]:null}function Ei(e,t){let s=new RegExp(`<PackageReference\\s+Include="${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}"[^>]*Version="([\\d.]+)"`),n=e.match(s);return n?n[1]:null}var Xn,Zn,ei,ti,si,ni,Kt,zt=C(()=>{"use strict";Xn={".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"},Zn={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"},ei={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"},ti={prisma:"prisma","@prisma/client":"prisma","drizzle-orm":"drizzle",typeorm:"typeorm",sequelize:"sequelize","@mikro-orm/core":"mikro-orm",knex:"knex",mongoose:"mongoose"},si={tailwindcss:"tailwindcss","styled-components":"styled-components","@emotion/react":"emotion",sass:"sass","@chakra-ui/react":"chakra-ui","@mui/material":"material-ui","@mantine/core":"mantine"},ni={vite:"vite",webpack:"webpack",esbuild:"esbuild",tsup:"tsup",rollup:"rollup",parcel:"parcel",turbopack:"turbopack",unbuild:"unbuild",pkgroll:"pkgroll","@swc/core":"swc",snowpack:"snowpack"},Kt={name:"stack",category:"stack",async detect(e){let t=ii(e),s=await oi(e),n=ri(s),i=ci(e,s),o=li(s,ei),r=it(s,ti),a=it(s,si),c=it(s,ni);if(r==="prisma"){let _=await ui(e);_&&!o.includes(_)&&o.unshift(_)}let u=await di(e);for(let _ of u)o.includes(_)||o.push(_);let[g,f,p,d,m,E,D]=await Promise.all([hi(e),ki(e),wi(e),vi(e),$i(e),xi(e),Ci(e)]);return g&&n.push(g),f&&n.push(f),p&&n.push(p),d&&n.push(d),m&&n.push(m),E&&n.push(E),D&&n.push(D),{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 he();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:ge(n,["dev","start","serve"],i),build:ge(n,["build","compile"],i),test:ge(n,["test","test:unit","test:run"],i),lint:ge(n,["lint","lint:check"],i),format:ge(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 he()}}function ge(e,t,s){for(let n of t)if(e[n])return`${s} ${n}`;return null}async function Ri(e){let t=await e.readFile("Makefile");if(!t)return he();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 _i(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?he():e.files.some(s=>s.endsWith(".sh"))?{dev:null,build:null,test:null,lint:"shellcheck *.sh",format:"shfmt -w *.sh"}:he()}function he(){return{dev:null,build:null,test:null,lint:null,format:null}}var Vt,Qt=C(()=>{"use strict";Vt={name:"commands",category:"commands",async detect(e){let t=await Si(e);if(Object.values(t).some(Boolean))return t;let s=await Ri(e);return Object.values(s).some(Boolean)?s:await _i(e)}}});function Me(e,t){return e.filter(s=>t.has(s)).sort()}function Oi(e){let t=[],s=[],n=e.match(/\[project\]\s[\s\S]*?dependencies\s*=\s*\[([\s\S]*?)\]/);n&&t.push(...Xt(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(...Xt(c[1]))}let o=e.match(/\[tool\.poetry\.dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);if(o){let a=Le(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(...Le(r[1])),t.length===0&&s.length===0?null:{direct:t,dev:s}}function Xt(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 Le(e){let t=[];for(let s of e.split(`
10
+ `+s;if(n.includes("rails")){let i=Wt(n,"rails"),o=[];i&&o.push(i);let r=await ji(e);return r.length>0&&o.push(r.join(", ")),o.length>0?`rails@${o.join(" ")}`:`rails@${i||"unknown"}`}if(n.includes("sinatra")){let i=Wt(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 ji(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 xi(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 Ci(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=Ei(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 re(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 me(e,t){let s=new RegExp(`${t}\\s+v([\\d.]+)`),n=e.match(s);return n?n[1]:null}function Ne(e,t){let s=new RegExp(`${t}\\s*=\\s*"([\\d.]+)"`),n=e.match(s);return n?n[1]:null}function Fe(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 qe(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 Wt(e,t){let s=new RegExp(`gem\\s+['"]${t}['"][^,]*,\\s*['"]~?>?\\s*([\\d.]+)['"]`),n=e.match(s);return n?n[1]:null}function Ei(e,t){let s=new RegExp(`<PackageReference\\s+Include="${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}"[^>]*Version="([\\d.]+)"`),n=e.match(s);return n?n[1]:null}var Xn,Zn,ei,ti,si,ni,Kt,zt=C(()=>{"use strict";Xn={".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"},Zn={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"},ei={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"},ti={prisma:"prisma","@prisma/client":"prisma","drizzle-orm":"drizzle",typeorm:"typeorm",sequelize:"sequelize","@mikro-orm/core":"mikro-orm",knex:"knex",mongoose:"mongoose"},si={tailwindcss:"tailwindcss","styled-components":"styled-components","@emotion/react":"emotion",sass:"sass","@chakra-ui/react":"chakra-ui","@mui/material":"material-ui","@mantine/core":"mantine"},ni={vite:"vite",webpack:"webpack",esbuild:"esbuild",tsup:"tsup",rollup:"rollup",parcel:"parcel",turbopack:"turbopack",unbuild:"unbuild",pkgroll:"pkgroll","@swc/core":"swc",snowpack:"snowpack"},Kt={name:"stack",category:"stack",async detect(e){let t=ii(e),s=await oi(e),n=ri(s),i=ci(e,s),o=li(s,ei),r=it(s,ti),a=it(s,si),c=it(s,ni);if(r==="prisma"){let P=await ui(e);P&&!o.includes(P)&&o.unshift(P)}let u=await di(e);for(let P of u)o.includes(P)||o.push(P);let[g,m,p,d,f,E,_]=await Promise.all([hi(e),ki(e),wi(e),vi(e),$i(e),xi(e),Ci(e)]);return g&&n.push(g),m&&n.push(m),p&&n.push(p),d&&n.push(d),f&&n.push(f),E&&n.push(E),_&&n.push(_),{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 he();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:ge(n,["dev","start","serve"],i),build:ge(n,["build","compile"],i),test:ge(n,["test","test:unit","test:run"],i),lint:ge(n,["lint","lint:check"],i),format:ge(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 he()}}function ge(e,t,s){for(let n of t)if(e[n])return`${s} ${n}`;return null}async function Ri(e){let t=await e.readFile("Makefile");if(!t)return he();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 _i(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(m=>m.includes("pytest")||m.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(m=>m.includes("main.py")||m.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?he():e.files.some(s=>s.endsWith(".sh"))?{dev:null,build:null,test:null,lint:"shellcheck *.sh",format:"shfmt -w *.sh"}:he()}function he(){return{dev:null,build:null,test:null,lint:null,format:null}}var Vt,Qt=C(()=>{"use strict";Vt={name:"commands",category:"commands",async detect(e){let t=await Si(e);if(Object.values(t).some(Boolean))return t;let s=await Ri(e);return Object.values(s).some(Boolean)?s:await _i(e)}}});function Me(e,t){return e.filter(s=>t.has(s)).sort()}function Oi(e){let t=[],s=[],n=e.match(/\[project\]\s[\s\S]*?dependencies\s*=\s*\[([\s\S]*?)\]/);n&&t.push(...Xt(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(...Xt(c[1]))}let o=e.match(/\[tool\.poetry\.dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);if(o){let a=Le(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(...Le(r[1])),t.length===0&&s.length===0?null:{direct:t,dev:s}}function Xt(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 Le(e){let t=[];for(let s of e.split(`
12
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 Ai(e){let t=[];for(let s of e.split(`
13
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 Ii(e){let t=[],s=[],n=e.match(/\[dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);n&&t.push(...Le(n[1]));let i=e.match(/\[dev-dependencies\]\s*\n([\s\S]*?)(?=\n\[|$)/);return i&&s.push(...Le(i[1])),{direct:t,dev:s}}function Ni(e){let t=[],s=e.matchAll(/require\s*\(([\s\S]*?)\)/g);for(let i of s)for(let o of i[1].split(`
14
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 Fi(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]),re.has(o[1])&&n.push(o[1]))}return{direct_count:s.length,dev_count:0,notable:[...new Set(n)].sort()}}async function qi(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=>re.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 Mi(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=(t||"")+`
15
+ `)){let o=i.match(/gem\s+["']([^"']+)["']/);o&&(s.push(o[1]),ae.has(o[1])&&n.push(o[1]))}return{direct_count:s.length,dev_count:0,notable:[...new Set(n)].sort()}}async function qi(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=>ae.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 Mi(e){let t=await e.readFile("pom.xml"),s=await e.readFile("build.gradle"),n=await e.readFile("build.gradle.kts"),i=(t||"")+`
16
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]),re.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),re.has(g)&&r.push(g))}return{direct_count:[...new Set(o)].length,dev_count:0,notable:[...new Set(r)].sort()}}async function Li(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();re.has(c)&&n.push(a[1])}}return{direct_count:[...new Set(s)].length,dev_count:0,notable:[...new Set(n)].sort()}}function Ti(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 re,Yt,Pi,Di,Zt,es=C(()=>{"use strict";re=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"]),Yt=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"]),Pi=new Set(["serde","tokio","axum","actix-web","rocket","warp","hyper","sqlx","diesel","sea-orm","clap","tracing","anyhow","thiserror","reqwest","tonic","prost"]),Di=new Set(["gin","echo","fiber","chi","mux","gorm","sqlx","cobra","viper","zap","testify","grpc","protobuf","wire"]),Zt={name:"dependencies",category:"dependencies",async detect(e){let t=Ti(e),s=await e.readFile("package.json");if(s)try{let f=JSON.parse(s),p=f.dependencies||{},d=f.devDependencies||{},m={...p,...d},E=Object.keys(m).filter(D=>re.has(D)).sort();return{direct_count:Object.keys(p).length,dev_count:Object.keys(d).length,lock_file:t,notable:E}}catch{}let n=await e.readFile("pyproject.toml");if(n){let f=Oi(n);if(f){let p=Me([...f.direct,...f.dev],Yt);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=Ai(i),p=Me(f,Yt);return{direct_count:f.length,dev_count:0,lock_file:t,notable:p}}let o=await e.readFile("Cargo.toml");if(o){let f=Ii(o),p=Me([...f.direct,...f.dev],Pi);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=Ni(r),p=f.map(m=>m.split("/").pop()),d=Me(p,Di);return{direct_count:f.length,dev_count:0,lock_file:t,notable:d}}let a=await Fi(e);if(a.direct_count>0)return{...a,lock_file:t};let c=await qi(e);if(c.direct_count>0)return{...c,lock_file:t};let u=await Mi(e);if(u.direct_count>0)return{...u,lock_file:t};let g=await Li(e);return g.direct_count>0?{...g,lock_file:t}:{direct_count:0,dev_count:0,lock_file:t,notable:[]}}}});async function Ui(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(Gi))if(n[i])return o}catch{}return null}async function Bi(e){let t={},s=await e.readFile(".env.example");s&&Te(s,t,!1);let n=await e.readFile(".env");n&&Te(n,t,!0);let i=await e.readFile(".env.sample");i&&Te(i,t,!1);let o=await e.readFile(".env.template");return o&&Te(o,t,!1),t}function Te(e,t,s){let n=e.split(`
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]),ae.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),ae.has(g)&&r.push(g))}return{direct_count:[...new Set(o)].length,dev_count:0,notable:[...new Set(r)].sort()}}async function Li(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();ae.has(c)&&n.push(a[1])}}return{direct_count:[...new Set(s)].length,dev_count:0,notable:[...new Set(n)].sort()}}function Ti(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 ae,Yt,Pi,Di,Zt,es=C(()=>{"use strict";ae=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"]),Yt=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"]),Pi=new Set(["serde","tokio","axum","actix-web","rocket","warp","hyper","sqlx","diesel","sea-orm","clap","tracing","anyhow","thiserror","reqwest","tonic","prost"]),Di=new Set(["gin","echo","fiber","chi","mux","gorm","sqlx","cobra","viper","zap","testify","grpc","protobuf","wire"]),Zt={name:"dependencies",category:"dependencies",async detect(e){let t=Ti(e),s=await e.readFile("package.json");if(s)try{let m=JSON.parse(s),p=m.dependencies||{},d=m.devDependencies||{},f={...p,...d},E=Object.keys(f).filter(_=>ae.has(_)).sort();return{direct_count:Object.keys(p).length,dev_count:Object.keys(d).length,lock_file:t,notable:E}}catch{}let n=await e.readFile("pyproject.toml");if(n){let m=Oi(n);if(m){let p=Me([...m.direct,...m.dev],Yt);return{direct_count:m.direct.length,dev_count:m.dev.length,lock_file:t,notable:p}}}let i=await e.readFile("requirements.txt");if(i){let m=Ai(i),p=Me(m,Yt);return{direct_count:m.length,dev_count:0,lock_file:t,notable:p}}let o=await e.readFile("Cargo.toml");if(o){let m=Ii(o),p=Me([...m.direct,...m.dev],Pi);return{direct_count:m.direct.length,dev_count:m.dev.length,lock_file:t,notable:p}}let r=await e.readFile("go.mod");if(r){let m=Ni(r),p=m.map(f=>f.split("/").pop()),d=Me(p,Di);return{direct_count:m.length,dev_count:0,lock_file:t,notable:d}}let a=await Fi(e);if(a.direct_count>0)return{...a,lock_file:t};let c=await qi(e);if(c.direct_count>0)return{...c,lock_file:t};let u=await Mi(e);if(u.direct_count>0)return{...u,lock_file:t};let g=await Li(e);return g.direct_count>0?{...g,lock_file:t}:{direct_count:0,dev_count:0,lock_file:t,notable:[]}}}});async function Ui(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(Gi))if(n[i])return o}catch{}return null}async function Bi(e){let t={},s=await e.readFile(".env.example");s&&Te(s,t,!1);let n=await e.readFile(".env");n&&Te(n,t,!0);let i=await e.readFile(".env.sample");i&&Te(i,t,!1);let o=await e.readFile(".env.template");return o&&Te(o,t,!1),t}function Te(e,t,s){let n=e.split(`
18
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,Gi,ts,ss=C(()=>{"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"],Gi={"launchdarkly-node-server-sdk":"launchdarkly","@unleash/proxy-client-react":"unleash",flagsmith:"flagsmith","@growthbook/growthbook-react":"growthbook"},ts={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 Ui(e),i=await Bi(e);return{env_files:t,config_files:s,feature_flags:n,env_vars:i}}}});async function Ji(e){let t=await e.exec('git log --oneline -5 --format="%s" 2>/dev/null');return t?t.split(`
19
19
  `).filter(Boolean):[]}async function Wi(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 Ki(e){return(await e.exec("git status --porcelain 2>/dev/null")).length>0}var ns,is=C(()=>{"use strict";ns={name:"git",category:"git",async detect(e){let[t,s,n]=await Promise.all([Ji(e),Wi(e),Ki(e)]);return{recent_commits:t,last_committers:s,uncommitted_changes:n}}}});async function zi(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 Vi(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 Qi(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 Yi(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 Xi(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 os,rs=C(()=>{"use strict";os={name:"quality",category:"quality",async detect(e){let[t,s,n]=await Promise.all([zi(e),Vi(e),Qi(e)]);return{test_framework:t,linter:s,formatter:n,ci:Yi(e),pre_commit_hooks:Xi(e)}}}});function Zi(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 eo(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 to(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 so(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=as[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=as[i];o&&!t[`src/${i}/`]&&(t[`${i}/`]=o)}return t}var as,cs,ls=C(()=>{"use strict";as={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"},cs={name:"patterns",category:"patterns",async detect(e){return{architecture:Zi(e),state_management:await eo(e),api_style:await to(e),key_modules:so(e)}}}});async function no(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:ot(n,"openapi")||ot(n,"swagger"),title:ot(n,"title"),file:s,type:n.includes("openapi:")?"openapi":"swagger"}}}return null}async function io(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 oo(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 ro(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 ot(e,t){let s=new RegExp(`^${t}:\\s*(.+)$`,"m"),n=e.match(s);return n?n[1].trim():null}var us,ds=C(()=>{"use strict";us={name:"api-docs",category:"config",async detect(e){let[t,s,n,i]=await Promise.all([no(e),io(e),oo(e),ro(e)]);return{openapi:t,graphql:s,grpc:n,postman:i}}}});var rt,ps=C(()=>{"use strict";Ht();Ut();Jt();zt();Qt();es();ss();is();rs();ls();ds();rt=[Tt,Gt,Bt,Kt,Vt,Zt,ts,ns,os,cs,us]});import{execFile as fs}from"child_process";async function be(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)}`);fs("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 fo(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 mo(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 go(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 ms(e,t,s={}){let{includeIssues:n=!0,includePRs:i=!0,includeMilestones:o=!0,includeReleases:r=!0,includeProjects:a=!0,limit:c=50}=s,u=fo(t);if(!u)return{};let{owner:g,repo:f}=u,p={};if(n)try{let d=await be(e,ao,{owner:g,repo:f,limit:c});d?.repository?.issues?.nodes&&(p.issues=d.repository.issues.nodes.map(mo))}catch{}if(i)try{let d=await be(e,co,{owner:g,repo:f,limit:Math.min(c,30)});d?.repository?.pullRequests?.nodes&&(p.pull_requests=d.repository.pullRequests.nodes.map(go))}catch{}if(o)try{let d=await be(e,lo,{owner:g,repo:f});d?.repository?.milestones?.nodes&&(p.milestones=d.repository.milestones.nodes.map(m=>{let E=m.issues?.nodes||[],D=m.closedIssues?.totalCount||0,_=m.issues?.totalCount||E.length,S=_-D;return{title:m.title,description:m.description||"",due_date:m.dueOn||null,progress:{open:S,closed:D,percent:_>0?Math.round(D/_*100):0},issues:E.map(q=>q.number)}}))}catch{}if(r)try{let d=await be(e,uo,{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 be(e,po,{owner:g,repo:f});d?.repository?.projectsV2?.nodes&&(p.project_boards=d.repository.projectsV2.nodes.filter(m=>m!==null).map(m=>{let E=m.columns?.nodes||[],D=m.items?.totalCount||0;return{number:m.number,title:m.title,state:(m.state||"open").toLowerCase(),url:m.url,columns:E.map(_=>({name:_.name,cards_count:D}))}}))}catch{}return p}async function gs(e){return new Promise(t=>{fs("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 ao,co,lo,uo,po,hs=C(()=>{"use strict";ao=`
20
+ `).map(s=>s.replace(/^\s*\d+\s+/,"").trim()).filter(Boolean):[]}async function Ki(e){return(await e.exec("git status --porcelain 2>/dev/null")).length>0}var ns,is=C(()=>{"use strict";ns={name:"git",category:"git",async detect(e){let[t,s,n]=await Promise.all([Ji(e),Wi(e),Ki(e)]);return{recent_commits:t,last_committers:s,uncommitted_changes:n}}}});async function zi(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 Vi(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 Qi(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 Yi(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 Xi(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 os,rs=C(()=>{"use strict";os={name:"quality",category:"quality",async detect(e){let[t,s,n]=await Promise.all([zi(e),Vi(e),Qi(e)]);return{test_framework:t,linter:s,formatter:n,ci:Yi(e),pre_commit_hooks:Xi(e)}}}});function Zi(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 eo(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 to(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 so(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=as[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=as[i];o&&!t[`src/${i}/`]&&(t[`${i}/`]=o)}return t}var as,cs,ls=C(()=>{"use strict";as={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"},cs={name:"patterns",category:"patterns",async detect(e){return{architecture:Zi(e),state_management:await eo(e),api_style:await to(e),key_modules:so(e)}}}});async function no(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:ot(n,"openapi")||ot(n,"swagger"),title:ot(n,"title"),file:s,type:n.includes("openapi:")?"openapi":"swagger"}}}return null}async function io(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 oo(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 ro(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 ot(e,t){let s=new RegExp(`^${t}:\\s*(.+)$`,"m"),n=e.match(s);return n?n[1].trim():null}var us,ds=C(()=>{"use strict";us={name:"api-docs",category:"config",async detect(e){let[t,s,n,i]=await Promise.all([no(e),io(e),oo(e),ro(e)]);return{openapi:t,graphql:s,grpc:n,postman:i}}}});var rt,ps=C(()=>{"use strict";Ht();Ut();Jt();zt();Qt();es();ss();is();rs();ls();ds();rt=[Tt,Gt,Bt,Kt,Vt,Zt,ts,ns,os,cs,us]});import{execFile as fs}from"child_process";async function be(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)}`);fs("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 fo(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 mo(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 go(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 ms(e,t,s={}){let{includeIssues:n=!0,includePRs:i=!0,includeMilestones:o=!0,includeReleases:r=!0,includeProjects:a=!0,limit:c=50}=s,u=fo(t);if(!u)return{};let{owner:g,repo:m}=u,p={};if(n)try{let d=await be(e,ao,{owner:g,repo:m,limit:c});d?.repository?.issues?.nodes&&(p.issues=d.repository.issues.nodes.map(mo))}catch{}if(i)try{let d=await be(e,co,{owner:g,repo:m,limit:Math.min(c,30)});d?.repository?.pullRequests?.nodes&&(p.pull_requests=d.repository.pullRequests.nodes.map(go))}catch{}if(o)try{let d=await be(e,lo,{owner:g,repo:m});d?.repository?.milestones?.nodes&&(p.milestones=d.repository.milestones.nodes.map(f=>{let E=f.issues?.nodes||[],_=f.closedIssues?.totalCount||0,P=f.issues?.totalCount||E.length,R=P-_;return{title:f.title,description:f.description||"",due_date:f.dueOn||null,progress:{open:R,closed:_,percent:P>0?Math.round(_/P*100):0},issues:E.map(q=>q.number)}}))}catch{}if(r)try{let d=await be(e,uo,{owner:g,repo:m,limit:10});d?.repository?.releases?.nodes&&(p.releases=d.repository.releases.nodes.map(f=>({tag_name:f.tagName,name:f.name||f.tagName,created_at:f.createdAt,url:f.url,author:f.author?.login||"unknown",prerelease:!!f.isPrerelease})))}catch{}if(a)try{let d=await be(e,po,{owner:g,repo:m});d?.repository?.projectsV2?.nodes&&(p.project_boards=d.repository.projectsV2.nodes.filter(f=>f!==null).map(f=>{let E=f.columns?.nodes||[],_=f.items?.totalCount||0;return{number:f.number,title:f.title,state:(f.state||"open").toLowerCase(),url:f.url,columns:E.map(P=>({name:P.name,cards_count:_}))}}))}catch{}return p}async function gs(e){return new Promise(t=>{fs("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 ao,co,lo,uo,po,hs=C(()=>{"use strict";ao=`
21
21
  query($owner: String!, $repo: String!, $limit: Int) {
22
22
  repository(owner: $owner, name: $repo) {
23
23
  issues(first: $limit, orderBy: {field: UPDATED_AT, direction: DESC}) {
@@ -134,10 +134,10 @@ query($owner: String!, $repo: String!) {
134
134
  }
135
135
  }
136
136
  }
137
- `});import{execFile as bs}from"child_process";import{readdirSync as ho,readFileSync as bo,existsSync as yo}from"fs";import{join as at}from"path";async function He(e){if(!await ye(e,["--version"]))return null;let s=await ko(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 gs(e),o=[],r=[],a=[],c=[],u=[];if(i)try{let m=await ms(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 wo(e)),r.length===0&&(r=await $o(e)),a.length===0&&(a=await xo(e));let[g]=await Promise.all([Co(e)]),f=Ro(o),p=_o(o),d=So(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 ye(e,t){return new Promise(s=>{bs("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function ko(e,t){return new Promise(s=>{bs("sh",["-c",t],{cwd:e,timeout:1e4},(n,i)=>{s(n?"":i.trim())})})}async function wo(e){let t=await ye(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(vo)}catch{return[]}}function vo(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 $o(e){let t=await ye(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(jo)}catch{return[]}}function jo(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 xo(e){let t=await ye(e,["api","repos/{owner}/{repo}/milestones","--jq",".[] | {title,description,due_on,open_issues,closed_issues}"]);if(!t)return[];try{return t.split(`
137
+ `});import{execFile as bs}from"child_process";import{readdirSync as ho,readFileSync as bo,existsSync as yo}from"fs";import{join as at}from"path";async function He(e){if(!await ye(e,["--version"]))return null;let s=await ko(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 gs(e),o=[],r=[],a=[],c=[],u=[];if(i)try{let f=await ms(e,s,{includeIssues:!0,includePRs:!0,includeMilestones:!0,includeReleases:!0,includeProjects:!0,limit:50});o=f.issues||[],r=f.pull_requests||[],a=f.milestones||[],c=f.releases||[],u=f.project_boards||[]}catch{}o.length===0&&(o=await wo(e)),r.length===0&&(r=await $o(e)),a.length===0&&(a=await xo(e));let[g]=await Promise.all([Co(e)]),m=Ro(o),p=_o(o),d=So(e);return{status:{synced_at:new Date().toISOString(),github_available:!0,issues:o,pull_requests:r,kanban:m,priorities:p,releases:c,project_boards:u},roadmap:{milestones:a},decisions:{from_prs:g,from_adrs:d,manual:[]}}}function ye(e,t){return new Promise(s=>{bs("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function ko(e,t){return new Promise(s=>{bs("sh",["-c",t],{cwd:e,timeout:1e4},(n,i)=>{s(n?"":i.trim())})})}async function wo(e){let t=await ye(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(vo)}catch{return[]}}function vo(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 $o(e){let t=await ye(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(jo)}catch{return[]}}function jo(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 xo(e){let t=await ye(e,["api","repos/{owner}/{repo}/milestones","--jq",".[] | {title,description,due_on,open_issues,closed_issues}"]);if(!t)return[];try{return t.split(`
138
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 Co(e){let t=await ye(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
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 So(e){let t=["docs/adr","docs/decisions","adr","decisions","docs/architecture/decisions"],s=[];for(let i of t){let o=at(e,i);if(yo(o))try{let r=ho(o).filter(a=>a.endsWith(".md")).map(a=>at(i,a));s.push(...r)}catch{}}let n=[];for(let i of s.slice(0,20))try{let a=bo(at(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 Ro(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 _o(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 ct=C(()=>{"use strict";hs()});import{readFileSync as Po,writeFileSync as Do,statSync as Oo}from"fs";import{join as lt}from"path";function ws(e){try{let t=Po(lt(e,ys),"utf-8"),s=JSON.parse(t);return s.cache_version!==ks?null:s}catch{return null}}function vs(e,t,s){let n={cache_version:ks,timestamp:new Date().toISOString(),file_count:t,file_mtimes:js(e),manifest:s};try{Do(lt(e,ys),JSON.stringify(n),"utf-8")}catch{}}function $s(e,t,s){if(t.file_count!==s)return!1;let n=js(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 js(e){let t={};for(let s of Ao)try{let n=Oo(lt(e,s));t[s]=n.mtimeMs}catch{}return t}var ys,ks,Ao,xs=C(()=>{"use strict";ys=".codebase.cache.json",ks=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 V(e,t={}){let s=await qt(e,{depth:t.depth});if(t.incremental){let r=ws(e);if(r&&$s(e,r,s.files.length))return r.manifest}let n=rt;t.categories?.length&&(n=rt.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||R(`Detector failed: ${r.reason}`);if(t.sync)try{let r=await He(e);r&&(o.status=r.status,o.roadmap=r.roadmap,o.decisions=r.decisions)}catch{t.quiet||R("GitHub sync failed (is `gh` CLI installed and authenticated?)")}return t.incremental&&vs(e,s.files.length,o),o}function Ge(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 ke=C(()=>{"use strict";Lt();ps();ct();N();xs()});import{resolve as Io,join as No}from"path";import{writeFile as Fo}from"fs/promises";async function Ue(e){J(e.quiet);let t=Io(e.path);l(`Scanning ${t}...`);let s=await V(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(`${qo(r)} (${Ge(r,a)})`);let n=No(t,".codebase.json"),i=JSON.stringify(s,null,2);await Fo(n,i,"utf-8");let o=(Buffer.byteLength(i)/1024).toFixed(1);l(`
140
+ `).slice(0,5).find(c=>c.startsWith("#"))?.replace(/^#+\s*/,"")||i;n.push({title:a,summary:"",date:"",source:i})}catch{}return n}function Ro(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 _o(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 ct=C(()=>{"use strict";hs()});import{readFileSync as Po,writeFileSync as Do,statSync as Oo}from"fs";import{join as lt}from"path";function ws(e){try{let t=Po(lt(e,ys),"utf-8"),s=JSON.parse(t);return s.cache_version!==ks?null:s}catch{return null}}function vs(e,t,s){let n={cache_version:ks,timestamp:new Date().toISOString(),file_count:t,file_mtimes:js(e),manifest:s};try{Do(lt(e,ys),JSON.stringify(n),"utf-8")}catch{}}function $s(e,t,s){if(t.file_count!==s)return!1;let n=js(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 js(e){let t={};for(let s of Ao)try{let n=Oo(lt(e,s));t[s]=n.mtimeMs}catch{}return t}var ys,ks,Ao,xs=C(()=>{"use strict";ys=".codebase.cache.json",ks=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 V(e,t={}){let s=await qt(e,{depth:t.depth});if(t.incremental){let r=ws(e);if(r&&$s(e,r,s.files.length))return r.manifest}let n=rt;t.categories?.length&&(n=rt.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 He(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&&vs(e,s.files.length,o),o}function Ge(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 ke=C(()=>{"use strict";Lt();ps();ct();N();xs()});import{resolve as Io,join as No}from"path";import{writeFile as Fo}from"fs/promises";async function Ue(e){J(e.quiet);let t=Io(e.path);l(`Scanning ${t}...`);let s=await V(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(`${qo(r)} (${Ge(r,a)})`);let n=No(t,".codebase.json"),i=JSON.stringify(s,null,2);await Fo(n,i,"utf-8");let o=(Buffer.byteLength(i)/1024).toFixed(1);l(`
141
141
  Written: .codebase.json (${o} KB)`)}function qo(e){return e.charAt(0).toUpperCase()+e.slice(1)}var ut=C(()=>{"use strict";ke();N()});import{readFileSync as dt,writeFileSync as Cs,existsSync as pt}from"fs";import{join as Be}from"path";function Ho(e){try{let t=dt(Be(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 Go(e){let t=Ho(e);if(!t)return To;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
142
  `),r=o?`
143
143
  ### Project Commands
@@ -185,14 +185,14 @@ Returns: project identity, tech stack, commands, structure, current status, next
185
185
 
186
186
  ### Browser Automation (agent-browser)
187
187
  Commands: \`open <url>\`, \`snapshot -i\` (\u2192 \`@e1\`/\`@e2\` refs), \`click @e1\`, \`fill @e2 "text"\`, \`screenshot\`, \`auth save/login <profile>\`, \`state save/load <name>\`.
188
- ${ae}`}function Es(e,t){return pt(Be(e,t))}function Ss(e,t){let s=Be(e,t),n=pt(s)?dt(s,"utf-8"):"";if(n.includes(we)){let i=n.indexOf(we),o=n.indexOf(ae);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ae.length),n=n.replace(/\n{3,}/g,`
188
+ ${ce}`}function Es(e,t){return pt(Be(e,t))}function Ss(e,t){let s=Be(e,t),n=pt(s)?dt(s,"utf-8"):"";if(n.includes(we)){let i=n.indexOf(we),o=n.indexOf(ce);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ce.length),n=n.replace(/\n{3,}/g,`
189
189
 
190
190
  `).trimEnd())}Cs(s,n.trimEnd()+`
191
191
  `+Go(e)+`
192
- `,"utf-8")}function Rs(e,t){let s=Be(e,t);if(!pt(s))return;let n=dt(s,"utf-8"),i=n.indexOf(we),o=n.indexOf(ae);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ae.length),n=n.replace(/\n{3,}/g,`
192
+ `,"utf-8")}function Rs(e,t){let s=Be(e,t);if(!pt(s))return;let n=dt(s,"utf-8"),i=n.indexOf(we),o=n.indexOf(ce);i!==-1&&o!==-1&&(n=n.slice(0,i)+n.slice(o+ce.length),n=n.replace(/\n{3,}/g,`
193
193
 
194
194
  `).trim()+`
195
- `,Cs(s,n,"utf-8"))}var we,ae,Mo,Lo,To,Lc,_s=C(()=>{"use strict";we="<!-- codebase:start -->",ae="<!-- codebase:end -->",Mo="# codebase:start",Lo="# codebase:end",To=`
195
+ `,Cs(s,n,"utf-8"))}var we,ce,Mo,Lo,To,Lc,_s=C(()=>{"use strict";we="<!-- codebase:start -->",ce="<!-- codebase:end -->",Mo="# codebase:start",Lo="# codebase:end",To=`
196
196
  ${we}
197
197
  ## Project Context (auto-generated by codebase)
198
198
 
@@ -230,7 +230,7 @@ Returns: project identity, tech stack, commands, structure, current status, next
230
230
 
231
231
  ### Browser Automation (agent-browser)
232
232
  Commands: \`open <url>\`, \`snapshot -i\` (\u2192 \`@e1\`/\`@e2\` refs), \`click @e1\`, \`fill @e2 "text"\`, \`screenshot\`, \`auth save/login <profile>\`, \`state save/load <name>\`.
233
- ${ae}`,Lc=`
233
+ ${ce}`,Lc=`
234
234
  ${Mo}
235
235
  # Project Context (auto-generated by codebase)
236
236
  #
@@ -252,11 +252,11 @@ ${Mo}
252
252
  # - Check next before starting work \u2014 don't duplicate in-progress tasks
253
253
  # - Create issues for bugs/TODOs \u2014 keep the project brain alive
254
254
  # - Close issues when fixed \u2014 with a reason
255
- ${Lo}`});var Ps={};xt(Ps,{claudeIntegration:()=>Q});var Q,ve=C(()=>{"use strict";_s();Q={name:"claude",detect:e=>Es(e,"CLAUDE.md"),inject:e=>Ss(e,"CLAUDE.md"),remove:e=>Rs(e,"CLAUDE.md")}});import{readFileSync as Uo,writeFileSync as Bo,existsSync as Jo}from"fs";import{join as Wo}from"path";function ce(e){let t=Wo(e,".gitignore"),s=Jo(t)?Uo(t,"utf-8"):"";if(s.includes(".codebase.json"))return;Bo(t,s.trimEnd()+`
255
+ ${Lo}`});var Ps={};xt(Ps,{claudeIntegration:()=>Q});var Q,ve=C(()=>{"use strict";_s();Q={name:"claude",detect:e=>Es(e,"CLAUDE.md"),inject:e=>Ss(e,"CLAUDE.md"),remove:e=>Rs(e,"CLAUDE.md")}});import{readFileSync as Uo,writeFileSync as Bo,existsSync as Jo}from"fs";import{join as Wo}from"path";function le(e){let t=Wo(e,".gitignore"),s=Jo(t)?Uo(t,"utf-8"):"";if(s.includes(".codebase.json"))return;Bo(t,s.trimEnd()+`
256
256
  # AI context manifest
257
257
  .codebase.json
258
258
  .codebase.cache.json
259
- `,"utf-8")}var Je=C(()=>{"use strict"});import{readFileSync as ft,writeFileSync as je,existsSync as le,mkdirSync as As,chmodSync as Is,unlinkSync as Wc}from"fs";import{join as ue}from"path";function de(e,t=!1){if(!le(ue(e,".git")))return!1;let n=`npx --yes codebase scan-only --incremental --quiet${t?" --sync":""}`;return Os(e,"post-commit",n),Os(e,"post-checkout",n),Ko(e),!0}function Ko(e){let t=ue(e,".git","hooks"),s=ue(t,"pre-commit");le(t)||As(t,{recursive:!0});let n=ue(e,"package.json");if(!le(n))return;let i=!1,o=!1,r=!1;try{let u=JSON.parse(ft(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
259
+ `,"utf-8")}var Je=C(()=>{"use strict"});import{readFileSync as ft,writeFileSync as je,existsSync as ue,mkdirSync as As,chmodSync as Is,unlinkSync as Wc}from"fs";import{join as de}from"path";function pe(e,t=!1){if(!ue(de(e,".git")))return!1;let n=`npx --yes codebase scan-only --incremental --quiet${t?" --sync":""}`;return Os(e,"post-commit",n),Os(e,"post-checkout",n),Ko(e),!0}function Ko(e){let t=de(e,".git","hooks"),s=de(t,"pre-commit");ue(t)||As(t,{recursive:!0});let n=de(e,"package.json");if(!ue(n))return;let i=!1,o=!1,r=!1;try{let u=JSON.parse(ft(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
260
260
  ${Ds}
261
261
  # Run typecheck + lint before every commit. Fix errors before committing.
262
262
  if [ -f package.json ]; then
@@ -268,9 +268,9 @@ if [ -f package.json ]; then
268
268
  exit 1
269
269
  }
270
270
  fi
271
- `;if(le(s)){let u=ft(s,"utf-8");u.includes(Ds)||je(s,u.trimEnd()+`
271
+ `;if(ue(s)){let u=ft(s,"utf-8");u.includes(Ds)||je(s,u.trimEnd()+`
272
272
 
273
- `+c,"utf-8")}else je(s,c,"utf-8");Is(s,493)}function Os(e,t,s){let n=ue(e,".git","hooks"),i=ue(n,t);if(le(n)||As(n,{recursive:!0}),le(i)){let o=ft(i,"utf-8");if(o.includes($e)){let r=o.replace(new RegExp(`${$e}\\n.*`,"m"),`${$e}
273
+ `+c,"utf-8")}else je(s,c,"utf-8");Is(s,493)}function Os(e,t,s){let n=de(e,".git","hooks"),i=de(n,t);if(ue(n)||As(n,{recursive:!0}),ue(i)){let o=ft(i,"utf-8");if(o.includes($e)){let r=o.replace(new RegExp(`${$e}\\n.*`,"m"),`${$e}
274
274
  ${s}`);je(i,r,"utf-8");return}je(i,o.trimEnd()+`
275
275
 
276
276
  ${$e}
@@ -279,10 +279,10 @@ ${s}
279
279
 
280
280
  ${$e}
281
281
  ${s}
282
- `,"utf-8");Is(i,493)}var $e,Ds,We=C(()=>{"use strict";$e="# codebase-auto-update";Ds="# codebase-pre-commit"});var bt={};xt(bt,{installClaudeCommandsForFix:()=>Yo,installClaudeHooksForFix:()=>Xo,runSetup:()=>ht});import{resolve as zo,dirname as Vo,join as I}from"path";import{writeFileSync as Y,existsSync as W,mkdirSync as Ke,readFileSync as fe,chmodSync as gt,readdirSync as Qo,copyFileSync as Ns}from"fs";import{execFile as pe}from"child_process";async function ht(e){let t=zo(e.path);await Ue({...e,sync:!0}),j("Claude Code Integration"),W(I(t,"CLAUDE.md"))||Y(I(t,"CLAUDE.md"),`# Project Rules
283
- `,"utf-8"),Q.inject(t),h("CLAUDE.md - added .codebase.json reference"),j("Git Hooks"),de(t,!1)?(h("post-commit hook (auto-updates .codebase.json)"),h("pre-commit hook (runs typecheck + lint before every commit)"),Zo(t),h("commit-msg hook (blocks direct commits to main/master)")):y("Not a git repository - skipping hooks"),j("Claude Code Hooks"),qs(t),j("Browser Automation"),await tr(),j("Claude Commands"),await sr()?Fs(t):(R("Claude Code CLI not detected \u2014 skipping slash commands"),R("Install Claude Code then re-run: codebase setup")),ce(t),er(t,[".vibekit/daemon.lock",".vibekit/daemon.log",".vibekit/build.lock",".vibekit/milestone.env",".mcp.json"]),h(".gitignore updated"),j("Vibekit Bootstrap");let i=I(t,".vibekit");W(i)?y(".vibekit/ already exists"):(Ke(i,{recursive:!0}),h(".vibekit/ directory created")),j("GitHub Labels"),await nr()?(await ir(t),await or(t)):(R("gh CLI not authenticated \u2014 skipping label/issue setup"),R("Run: gh auth login then codebase setup")),j("Product Brief");let r=I(t,"docs");W(r)||Ke(r,{recursive:!0});let a=I(r,"PRODUCT.md");W(a)?y("docs/PRODUCT.md already exists \u2014 skipping (delete to regenerate)"):(rr(t,a),h("docs/PRODUCT.md generated \u2014 review and fill in [INFERRED] sections")),l(`
282
+ `,"utf-8");Is(i,493)}var $e,Ds,We=C(()=>{"use strict";$e="# codebase-auto-update";Ds="# codebase-pre-commit"});var bt={};xt(bt,{installClaudeCommandsForFix:()=>Yo,installClaudeHooksForFix:()=>Xo,runSetup:()=>ht});import{resolve as zo,dirname as Vo,join as A}from"path";import{writeFileSync as Y,existsSync as W,mkdirSync as Ke,readFileSync as fe,chmodSync as gt,readdirSync as Qo,copyFileSync as Ns}from"fs";import{execFile as se}from"child_process";async function ht(e){let t=zo(e.path);await Ue({...e,sync:!0}),j("Claude Code Integration"),W(A(t,"CLAUDE.md"))||Y(A(t,"CLAUDE.md"),`# Project Rules
283
+ `,"utf-8"),Q.inject(t),h("CLAUDE.md - added .codebase.json reference"),j("Git Hooks"),pe(t,!1)?(h("post-commit hook (auto-updates .codebase.json)"),h("pre-commit hook (runs typecheck + lint before every commit)"),Zo(t),h("commit-msg hook (blocks direct commits to main/master)")):y("Not a git repository - skipping hooks"),j("Claude Code Hooks"),qs(t),j("Browser Automation"),await tr(),j("Claude Commands"),await sr()?Fs(t):(S("Claude Code CLI not detected \u2014 skipping slash commands"),S("Install Claude Code then re-run: codebase setup")),le(t),er(t,[".vibekit/daemon.lock",".vibekit/daemon.log",".vibekit/build.lock",".vibekit/milestone.env",".mcp.json"]),h(".gitignore updated"),j("Vibekit Bootstrap");let i=A(t,".vibekit");W(i)?y(".vibekit/ already exists"):(Ke(i,{recursive:!0}),h(".vibekit/ directory created")),j("GitHub Labels"),await nr()?(await ir(t),await or(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");W(r)||Ke(r,{recursive:!0});let a=A(r,"PRODUCT.md");W(a)?y("docs/PRODUCT.md already exists \u2014 skipping (delete to regenerate)"):(rr(t,a),h("docs/PRODUCT.md generated \u2014 review and fill in [INFERRED] sections")),l(`
284
284
  Done! Your project is wired for AI + autonomous loop.`),l(`
285
- 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 Yo(e){Fs(e)}function Fs(e){let t=I(Vo(new URL(import.meta.url).pathname),"..","commands");if(!W(t)){R("Claude commands not found in package \u2014 skipping");return}let s=I(e,".claude","commands");Ke(s,{recursive:!0});let n=Qo(t).filter(c=>c.endsWith(".md")),i=0,o=0,r=0;for(let c of n){let u=I(t,c),g=I(s,c);if(W(g)){let f=fe(u,"utf-8"),p=fe(g,"utf-8");f!==p?(Ns(u,g),o++):r++}else Ns(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 Xo(e){qs(e)}function qs(e){let t=I(e,".claude","hooks");Ke(t,{recursive:!0});let s=I(t,"git-guard.sh");Y(s,`#!/bin/bash
285
+ 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 Yo(e){Fs(e)}function Fs(e){let t=A(Vo(new URL(import.meta.url).pathname),"..","commands");if(!W(t)){S("Claude commands not found in package \u2014 skipping");return}let s=Qo(t).filter(r=>r.endsWith(".md")),n=[{dir:A(e,".claude","commands"),label:".claude/commands/"},{dir:A(process.env.HOME??"~",".claude","commands"),label:"~/.claude/commands/"}],i=0,o=0;for(let{dir:r,label:a}of n){Ke(r,{recursive:!0});let c=0,u=0,g=0;for(let p of s){let d=A(t,p),f=A(r,p);if(W(f)){let E=fe(d,"utf-8"),_=fe(f,"utf-8");E!==_?(Ns(d,f),u++):g++}else Ns(d,f),c++}let m=[];c>0&&m.push(`${c} new`),u>0&&m.push(`${u} updated`),g>0&&m.push(`${g} unchanged`),c>0||u>0?h(`Claude commands \u2192 ${a} (${m.join(", ")})`):y(`Claude commands up to date \u2192 ${a}`),i+=c,o+=u}(i>0||o>0)&&(y("Available: /setup /simulate /build /launch /review"),y("Tip: commit .claude/commands/ to share these with your team"))}function Xo(e){qs(e)}function qs(e){let t=A(e,".claude","hooks");Ke(t,{recursive:!0});let s=A(t,"git-guard.sh");Y(s,`#!/bin/bash
286
286
  # codebase git-guard \u2014 PreToolUse hook
287
287
  # Reads Claude tool input JSON from stdin, enforces git safety rules.
288
288
 
@@ -349,7 +349,7 @@ if echo "$CMD" | grep -qE "^git commit|&& git commit| git commit"; then
349
349
  fi
350
350
 
351
351
  exit 0
352
- `,"utf-8"),gt(s,493),h(".claude/hooks/git-guard.sh (PreToolUse \u2014 blocks unsafe git ops)");let i=I(t,"git-post.sh");Y(i,`#!/bin/bash
352
+ `,"utf-8"),gt(s,493),h(".claude/hooks/git-guard.sh (PreToolUse \u2014 blocks unsafe git ops)");let i=A(t,"git-post.sh");Y(i,`#!/bin/bash
353
353
  # codebase git-post \u2014 PostToolUse hook
354
354
  # Reads Claude tool input JSON from stdin. Reminds to raise PR after branch push.
355
355
 
@@ -371,8 +371,8 @@ if echo "$CMD" | grep -qE "git push origin [a-zA-Z0-9/_-]+"; then
371
371
  fi
372
372
 
373
373
  exit 0
374
- `,"utf-8"),gt(i,493),h(".claude/hooks/git-post.sh (PostToolUse \u2014 PR reminder after branch push)");let r=I(e,".claude","settings.json"),a={};if(W(r))try{a=JSON.parse(fe(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,Y(r,JSON.stringify(a,null,2)+`
375
- `,"utf-8"),h(".claude/settings.json (PreToolUse + PostToolUse hooks registered)")}function Zo(e){let t=I(e,".git","hooks"),s=I(t,"commit-msg"),n="# codebase-branch-check",i=`#!/bin/sh
374
+ `,"utf-8"),gt(i,493),h(".claude/hooks/git-post.sh (PostToolUse \u2014 PR reminder after branch push)");let r=A(e,".claude","settings.json"),a={};if(W(r))try{a=JSON.parse(fe(r,"utf-8"))}catch{}let c=a.hooks??{},u="bash .claude/hooks/git-guard.sh",g="bash .claude/hooks/git-post.sh",m=c.PreToolUse??[];JSON.stringify(m).includes("git-guard")||m.push({matcher:"Bash",hooks:[{type:"command",command:u}]}),c.PreToolUse=m;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,Y(r,JSON.stringify(a,null,2)+`
375
+ `,"utf-8"),h(".claude/settings.json (PreToolUse + PostToolUse hooks registered)")}function Zo(e){let t=A(e,".git","hooks"),s=A(t,"commit-msg"),n="# codebase-branch-check",i=`#!/bin/sh
376
376
  ${n}
377
377
  BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
378
378
  if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
@@ -385,16 +385,16 @@ if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
385
385
  fi
386
386
  `;if(W(s)){let o=fe(s,"utf-8");o.includes(n)||Y(s,o.trimEnd()+`
387
387
 
388
- `+i,"utf-8")}else Y(s,i,"utf-8");gt(s,493)}function er(e,t){let s=I(e,".gitignore"),n=W(s)?fe(s,"utf-8"):"",i=t.filter(o=>!n.includes(o)).join(`
388
+ `+i,"utf-8")}else Y(s,i,"utf-8");gt(s,493)}function er(e,t){let s=A(e,".gitignore"),n=W(s)?fe(s,"utf-8"):"",i=t.filter(o=>!n.includes(o)).join(`
389
389
  `);i&&Y(s,n.trimEnd()+`
390
390
  `+i+`
391
- `,"utf-8")}function ze(e,t){return new Promise(s=>{pe("gh",t,{cwd:e,timeout:15e3},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function tr(){if(await new Promise(n=>{pe("agent-browser",["--version"],{timeout:5e3},i=>n(!i))})){y("agent-browser already installed");return}if(l("Installing agent-browser..."),!await new Promise(n=>{pe("npm",["install","-g","agent-browser"],{timeout:12e4},i=>n(!i))})){R("agent-browser install failed \u2014 run: npm install -g agent-browser");return}await new Promise(n=>{pe("agent-browser",["install"],{timeout:3e5},i=>n(!i))})?h("agent-browser installed (Chrome for Testing downloaded)"):R("agent-browser installed but Chrome download failed \u2014 run: agent-browser install")}async function sr(){return new Promise(e=>{pe("claude",["--version"],{timeout:5e3},t=>e(!t))})}async function nr(){return new Promise(e=>{pe("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function ir(e){let{stdout:t}=await ze(e,["label","list","--limit","100","--json","name","--jq",".[].name"]),s=new Set(t.split(`
391
+ `,"utf-8")}function ze(e,t){return new Promise(s=>{se("gh",t,{cwd:e,timeout:15e3},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function tr(){if(await new Promise(i=>{se("agent-browser",["--version"],{timeout:5e3},o=>i(!o))})){y("agent-browser already installed");return}if(l("Installing agent-browser..."),!await new Promise(i=>{se("npm",["install","-g","agent-browser"],{timeout:12e4},o=>i(!o))})){S("agent-browser install failed \u2014 run: npm install -g agent-browser");return}await new Promise(i=>{se("agent-browser",["install"],{timeout:3e5},o=>i(!o))})?h("agent-browser installed (Chrome for Testing downloaded)"):S("agent-browser installed but Chrome download failed \u2014 run: agent-browser install"),await new Promise(i=>{se("agent-browser",["--version"],{timeout:5e3},o=>i(!o))})||S("agent-browser validation failed \u2014 it may not be on PATH. Try: npm install -g agent-browser")}async function sr(){return new Promise(e=>{se("claude",["--version"],{timeout:5e3},t=>e(!t))})}async function nr(){return new Promise(e=>{se("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function ir(e){let{stdout:t}=await ze(e,["label","list","--limit","100","--json","name","--jq",".[].name"]),s=new Set(t.split(`
392
392
  `).filter(Boolean)),n=0;for(let o of mt){if(s.has(o.name))continue;let{ok:r}=await ze(e,["label","create",o.name,"--color",o.color,"--description",o.description]);r&&n++}let i=mt.length-n;n>0?h(`${n} GitHub labels created (${i} already existed)`):y(`All ${mt.length} labels already exist`)}async function or(e){let{stdout:t}=await ze(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
393
393
 
394
394
  Tracks positive signals from /simulate cycles. Updated automatically \u2014 do not edit manually.
395
395
 
396
396
  ## Index
397
- <!-- /simulate appends here -->`,{ok:n}=await ze(e,["issue","create","--title","Highlights Index","--label","highlight","--body",s]);n?h("Highlights Index issue created on GitHub"):R("Could not create Highlights Index issue")}function rr(e,t){let s=I(e,".codebase.json"),n=null;if(W(s))try{n=JSON.parse(fe(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]";Y(t,`# PRODUCT.md \u2014 ${i}
397
+ <!-- /simulate appends here -->`,{ok:n}=await ze(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 rr(e,t){let s=A(e,".codebase.json"),n=null;if(W(s))try{n=JSON.parse(fe(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]";Y(t,`# PRODUCT.md \u2014 ${i}
398
398
 
399
399
  > Auto-generated by \`codebase setup\`. Fill in any [INFERRED] sections.
400
400
 
@@ -517,7 +517,7 @@ ${$("SEE ALSO")}
517
517
  `:""}${$("MORE HELP")}
518
518
  ${k("codebase --help")} Show all commands
519
519
  ${Oe("https://github.com/your-repo/codebase/docs","Full documentation")}
520
- `)}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 gn={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},_t=new Set(["scan","setup","query","mcp","issue","status","init","scan-only","brief","next","doctor","fix","release"]);function Pt(e){let t={...gn},s=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i.startsWith("-")&&_t.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&&(St(),process.exit(0)),(i==="--version"||i==="-v")&&(console.log("codebase 0.1.3"),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&&_t.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 Dt(e){Rt(e),process.exit(0)}N();import{get as hn}from"https";import{readFileSync as Ie,writeFileSync as bn,mkdirSync as yn}from"fs";import{homedir as kn}from"os";import{join as tt,dirname as wn}from"path";import{fileURLToPath as vn}from"url";import{execSync as Ae,spawnSync as $n}from"child_process";var Ot=tt(kn(),".codebase"),At=tt(Ot,"update-check.json"),jn=1440*60*1e3,te="codebase-ai",ie=!!process.env.NO_COLOR,v={yellow:ie?"":"\x1B[33m",cyan:ie?"":"\x1B[36m",green:ie?"":"\x1B[32m",bold:ie?"":"\x1B[1m",dim:ie?"":"\x1B[2m",reset:ie?"":"\x1B[0m"};function xn(){try{let e=wn(vn(import.meta.url)),t=Ie(tt(e,"../../package.json"),"utf8");return JSON.parse(t).version}catch{return"0.0.0"}}function Cn(e,t){let s=u=>u.replace(/^v/,"").split(".").map(Number),[n,i,o]=s(e),[r,a,c]=s(t);return n!==r?n>r:i!==a?i>a:o>c}function En(){try{return JSON.parse(Ie(At,"utf8"))}catch{return null}}function Sn(e){try{yn(Ot,{recursive:!0}),bn(At,JSON.stringify({version:e,checkedAt:Date.now()}))}catch{}}function Rn(){return new Promise((e,t)=>{let s=hn(`https://registry.npmjs.org/${te}/latest`,{headers:{accept:"application/json"}},n=>{let i="";n.on("data",o=>i+=o.toString()),n.on("end",()=>{try{e(JSON.parse(i).version)}catch{t(new Error("parse error"))}})});s.on("error",t),s.setTimeout(3e3,()=>{s.destroy(),t(new Error("timeout"))})})}function _n(){try{let e=Ae("npm root -g 2>/dev/null",{encoding:"utf8"}).trim();if(e&&Ie(`${e}/${te}/package.json`,"utf8"))return`npm install -g ${te}@latest`}catch{}try{Ae("pnpm --version 2>/dev/null",{encoding:"utf8"});let e=Ae("pnpm root -g 2>/dev/null",{encoding:"utf8"}).trim();if(e&&Ie(`${e}/${te}/package.json`,"utf8"))return`pnpm add -g ${te}@latest`}catch{}try{return Ae("yarn --version 2>/dev/null",{encoding:"utf8"}),`yarn global add ${te}@latest`}catch{}return`npm install -g ${te}@latest`}function Pn(e){let[t,...s]=e.split(" ");return $n(t,s,{stdio:"inherit"}).status===0}function Dn(){return new Promise(e=>{let t=process.stdin,s=t.isTTY;s&&t.setRawMode(!0),t.resume(),t.setEncoding("utf8");let n=i=>{s&&t.setRawMode(!1),t.pause(),t.removeListener("data",n),e(i)};t.on("data",n),setTimeout(()=>{s&&t.setRawMode(!1),t.pause(),t.removeListener("data",n),e("n")},1e4)})}async function It(){if(process.env.CI||process.env.NO_UPDATE_CHECK||!process.stdout.isTTY||!process.stdin.isTTY)return;let e=xn(),t=En(),s;if(t&&Date.now()-t.checkedAt<jn)s=t.version;else try{s=await Rn(),Sn(s)}catch{return}if(!Cn(s,e))return;let n=_n();console.log(`
520
+ `)}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 gn={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},_t=new Set(["scan","setup","query","mcp","issue","status","init","scan-only","brief","next","doctor","fix","release"]);function Pt(e){let t={...gn},s=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i.startsWith("-")&&_t.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&&(St(),process.exit(0)),(i==="--version"||i==="-v")&&(console.log("codebase 0.1.4"),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&&_t.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 Dt(e){Rt(e),process.exit(0)}N();import{get as hn}from"https";import{readFileSync as Ie,writeFileSync as bn,mkdirSync as yn}from"fs";import{homedir as kn}from"os";import{join as tt,dirname as wn}from"path";import{fileURLToPath as vn}from"url";import{execSync as Ae,spawnSync as $n}from"child_process";var Ot=tt(kn(),".codebase"),At=tt(Ot,"update-check.json"),jn=1440*60*1e3,te="codebase-ai",oe=!!process.env.NO_COLOR,v={yellow:oe?"":"\x1B[33m",cyan:oe?"":"\x1B[36m",green:oe?"":"\x1B[32m",bold:oe?"":"\x1B[1m",dim:oe?"":"\x1B[2m",reset:oe?"":"\x1B[0m"};function xn(){try{let e=wn(vn(import.meta.url)),t=Ie(tt(e,"../../package.json"),"utf8");return JSON.parse(t).version}catch{return"0.0.0"}}function Cn(e,t){let s=u=>u.replace(/^v/,"").split(".").map(Number),[n,i,o]=s(e),[r,a,c]=s(t);return n!==r?n>r:i!==a?i>a:o>c}function En(){try{return JSON.parse(Ie(At,"utf8"))}catch{return null}}function Sn(e){try{yn(Ot,{recursive:!0}),bn(At,JSON.stringify({version:e,checkedAt:Date.now()}))}catch{}}function Rn(){return new Promise((e,t)=>{let s=hn(`https://registry.npmjs.org/${te}/latest`,{headers:{accept:"application/json"}},n=>{let i="";n.on("data",o=>i+=o.toString()),n.on("end",()=>{try{e(JSON.parse(i).version)}catch{t(new Error("parse error"))}})});s.on("error",t),s.setTimeout(3e3,()=>{s.destroy(),t(new Error("timeout"))})})}function _n(){try{let e=Ae("npm root -g 2>/dev/null",{encoding:"utf8"}).trim();if(e&&Ie(`${e}/${te}/package.json`,"utf8"))return`npm install -g ${te}@latest`}catch{}try{Ae("pnpm --version 2>/dev/null",{encoding:"utf8"});let e=Ae("pnpm root -g 2>/dev/null",{encoding:"utf8"}).trim();if(e&&Ie(`${e}/${te}/package.json`,"utf8"))return`pnpm add -g ${te}@latest`}catch{}try{return Ae("yarn --version 2>/dev/null",{encoding:"utf8"}),`yarn global add ${te}@latest`}catch{}return`npm install -g ${te}@latest`}function Pn(e){let[t,...s]=e.split(" ");return $n(t,s,{stdio:"inherit"}).status===0}function Dn(){return new Promise(e=>{let t=process.stdin,s=t.isTTY;s&&t.setRawMode(!0),t.resume(),t.setEncoding("utf8");let n=i=>{s&&t.setRawMode(!1),t.pause(),t.removeListener("data",n),e(i)};t.on("data",n),setTimeout(()=>{s&&t.setRawMode(!1),t.pause(),t.removeListener("data",n),e("n")},1e4)})}async function It(){if(process.env.CI||process.env.NO_UPDATE_CHECK||!process.stdout.isTTY||!process.stdin.isTTY)return;let e=xn(),t=En(),s;if(t&&Date.now()-t.checkedAt<jn)s=t.version;else try{s=await Rn(),Sn(s)}catch{return}if(!Cn(s,e))return;let n=_n();console.log(`
521
521
  ${v.yellow}\u250C\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510${v.reset}`),console.log(` ${v.yellow}\u2502${v.reset} ${v.bold}Update available${v.reset} ${v.dim}${e}${v.reset} ${v.yellow}\u2192${v.reset} ${v.bold}${v.cyan}${s}${v.reset}`),console.log(` ${v.yellow}\u2502${v.reset} Press ${v.bold}Y${v.reset} to update now, any other key to skip`),console.log(` ${v.yellow}\u2514\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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518${v.reset}`),process.stdout.write(`
522
522
  > `);let o=(await Dn()).toLowerCase()==="y";if(console.log(o?"Updating\u2026":`Skipped.
523
523
  `),!o)return;console.log(`
@@ -527,14 +527,14 @@ ${$("SEE ALSO")}
527
527
  `:`
528
528
  ${v.yellow}!${v.reset} Update failed. Run manually: ${v.bold}${n}${v.reset}
529
529
  `),process.exit(0)}ut();Ve();ke();import{resolve as cr,join as Qe}from"path";import{existsSync as Ts,writeFileSync as Hs,readFileSync as lr}from"fs";import{execFile as Ls}from"child_process";import{writeFile as ur}from"fs/promises";import{homedir as dr}from"os";ve();var ar=[Q];function Ms(e){return ar.filter(t=>t.detect(e))}ve();Je();We();N();async function yt(e){J(e.quiet);let t=cr(e.path);j(`codebase \u2014 activating project intelligence
530
- `);let s=await xe();s==="authenticated"?h("GitHub CLI \u2014 authenticated"):s==="not-authenticated"?(R("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
531
- `));let n=s==="authenticated";l(`Scanning ${t}...`);let i=await V(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(`${pr(d)} (${Ge(d,m)})`);let o=Qe(t,".codebase.json"),r=JSON.stringify(i,null,2);await ur(o,r,"utf-8");let a=(Buffer.byteLength(r)/1024).toFixed(1);l(`
530
+ `);let s=await xe();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
531
+ `));let n=s==="authenticated";l(`Scanning ${t}...`);let i=await V(t,{depth:e.depth,categories:e.categories.length?e.categories:void 0,quiet:e.quiet,sync:n});for(let[d,f]of Object.entries(i))d==="version"||d==="generated_at"||typeof f!="object"||f===null||h(`${pr(d)} (${Ge(d,f)})`);let o=Qe(t,".codebase.json"),r=JSON.stringify(i,null,2);await ur(o,r,"utf-8");let a=(Buffer.byteLength(r)/1024).toFixed(1);l(`
532
532
  Written: .codebase.json (${a} KB)`),j("AI Tool Integration");let c=Ms(t),u=fr(),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)"),Hs(Qe(t,"CLAUDE.md"),`# Project Rules
533
533
 
534
- `,"utf-8"),c=[Q]):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=kt(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"),de(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"),ce(t),h(".gitignore updated"),j(`Ready!
534
+ `,"utf-8"),c=[Q]):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 m=kt(t,g);if(m.length){for(let d of m)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"),pe(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"),le(t),h(".gitignore updated"),j(`Ready!
535
535
  `),l(`Your project is now fully activated. Here's what happens automatically:
536
536
  `),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
537
- `),n){let d=i.status?.issues?.filter(E=>E.state==="open").length||0,m=i.status?.pull_requests?.filter(E=>E.state==="open").length||0;(d||m)&&l(` GitHub synced: ${d} open issues, ${m} open PRs`)}l(`
537
+ `),n){let d=i.status?.issues?.filter(E=>E.state==="open").length||0,f=i.status?.pull_requests?.filter(E=>E.state==="open").length||0;(d||f)&&l(` GitHub synced: ${d} open issues, ${f} open PRs`)}l(`
538
538
  You don't need to run this again. Everything stays alive.
539
539
  `)}function pr(e){return e.charAt(0).toUpperCase()+e.slice(1)}function xe(){return new Promise(e=>{Ls("sh",["-c","which gh 2>/dev/null"],{timeout:5e3},t=>{if(t){e("not-installed");return}Ls("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 fr(){let e=dr(),t=[];return Ts(Qe(e,".claude"))&&t.push(Q),t}function kt(e,t){let s=[],n={command:"npx",args:["codebase","mcp"],cwd:e};if(t.has("claude")||t.size===0){let i=Qe(e,".mcp.json");mr(i,"codebase",n)&&s.push("Claude Code (project .mcp.json)")}return s}function mr(e,t,s){let n={};if(Ts(e)){try{n=JSON.parse(lr(e,"utf-8"))}catch{n={}}let i=n.mcpServers;if(i&&i[t])return!1}return n.mcpServers||(n.mcpServers={}),n.mcpServers[t]=s,Hs(e,JSON.stringify(n,null,2)+`
540
540
  `,"utf-8"),!0}import{resolve as gr,join as hr}from"path";import{readFile as br}from"fs/promises";function Ye(e){let t=[],s=e.project?.name||"Unknown Project";t.push(`# PROJECT BRIEF: ${s}`),e.project?.description&&t.push(e.project.description),t.push(`
@@ -544,18 +544,18 @@ Generated: ${e.generated_at}
544
544
  `)),e.commands){let o=Object.entries(e.commands).filter(([,r])=>r);if(o.length){t.push(`
545
545
  ## Commands`);for(let[r,a]of o)t.push(`- ${r}: \`${a}\``)}}if(e.structure&&(t.push(`
546
546
  ## 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(`
547
- ### 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(`
547
+ ### In Progress NOW`);for(let p of r){let d=p.assignee?` \u2192 @${p.assignee}`:"",f=p.mapped_files?.length?` (files: ${p.mapped_files.join(", ")})`:"";o.push(`- #${p.number}: ${p.title}${d}${f}`)}}let c=(e.status.priorities||[])[0];if(c){o.push(`
548
548
  ### 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(`
549
549
  ### 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(`
550
- ### 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(`
551
- ### 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(`
550
+ ### BLOCKERS`);for(let p of g)o.push(`- #${p.number}: ${p.title} [${p.labels.join(", ")}]`)}let m=(e.status.pull_requests||[]).filter(p=>p.state==="open");if(m.length){o.push(`
551
+ ### Open PRs (${m.length})`);for(let p of m.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(`
552
552
  ## CURRENT STATUS`),t.push(...o))}if(e.roadmap?.milestones?.length){t.push(`
553
553
  ## 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(`
554
554
  ## 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(`
555
555
  ## WARNING`),t.push("There are uncommitted changes in the working directory.")),e.git.recent_commits?.length)){t.push(`
556
556
  ## Recent Commits`);for(let o of e.git.recent_commits.slice(0,3))t.push(`- ${o}`)}return t.push(`
557
557
  ## 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(`
558
- `)}N();async function Gs(e){let t=gr(e.path),s=hr(t,".codebase.json"),n;try{let r=await br(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&&R("GitHub data unavailable (gh not authenticated or --sync not used). Issues, PRs and milestones not included.");let i=n;e.categories.length>0&&(i=yr(n,e.categories));let o=kr(i,e.format);process.stdout.write(o+`
558
+ `)}N();async function Gs(e){let t=gr(e.path),s=hr(t,".codebase.json"),n;try{let r=await br(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=yr(n,e.categories));let o=kr(i,e.format);process.stdout.write(o+`
559
559
  `)}function yr(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 kr(e,t){return t==="json"?JSON.stringify(e,null,2):Ye(e)}N();import{resolve as wr,join as vr}from"path";import{readFile as $r}from"fs/promises";async function Us(e){let t=wr(e.path),s;try{let a=await $r(vr(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($("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($("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(`
560
560
  ${$("BLOCKERS:")}`);for(let a of r)l(` #${a.number}: ${a.title} [${a.labels.join(", ")}]`)}}import{resolve as jr,join as xr}from"path";import{readFile as Cr}from"fs/promises";function Xe(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}N();async function Bs(e){let t=jr(e.path),s=xr(t,".codebase.json"),n;try{let r=await Cr(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)+`
561
561
  `);return}let o=Xe(n,i);o===void 0&&(w(`Path "${i}" not found in manifest.`),process.exit(1)),e.raw?typeof o=="string"?process.stdout.write(o+`
@@ -593,20 +593,20 @@ Up next in queue:`;for(let a of r)o+=`
593
593
  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(`
594
594
  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(`
595
595
  `)}function vt(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 Kr(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 vt(e,o)}`}async function zr(e,t){let s=t.number,n=t.comment;return n&&await vt(e,["issue","comment",String(s),"--body",n]),await vt(e,["issue","close",String(s)]),`Issue #${s} closed.`}function M(e,t){return{jsonrpc:"2.0",id:e,result:t}}function Xs(e){process.stdout.write(JSON.stringify(e)+`
596
- `)}async function en(e){let t=Vr(e.path);await Zs(t)}import{resolve as Qr,join as A}from"path";import{existsSync as F,readFileSync as K,statSync as tn,readdirSync as Yr}from"fs";N();var Xr="# codebase-auto-update";async function nn(e){J(e.quiet);let t=Qr(e.path),s=[];j(`codebase doctor
597
- `);let n=A(t,".codebase.json"),i=null;if(F(n))try{let b=K(n,"utf-8");i=JSON.parse(b);let P=tn(n),x=(P.size/1024).toFixed(1),T=Date.now()-P.mtimeMs,Pe=ia(T);s.push({label:"Manifest",ok:!0,detail:`.codebase.json (${x} KB, ${Pe})`})}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,P=(Date.now()-b)/(1e3*60*60),x=!1;if(F(A(t,"src")))try{tn(A(t,"src")).mtimeMs>b&&(x=!0)}catch{}x?s.push({label:"Freshness",ok:!1,detail:`Stale (${Math.round(P)} hours old)`}):s.push({label:"Freshness",ok:!0,detail:"Up to date"});let T=["project","repo","structure","stack","commands","dependencies","config","git","quality","patterns"],Pe=T.filter(De=>De in i);if(Pe.length===T.length)s.push({label:"Detectors",ok:!0,detail:"10/10 categories present"});else{let De=T.filter(dn=>!Pe.includes(dn));s.push({label:"Detectors",ok:!1,detail:`Missing: ${De.join(", ")}`})}}let o=await xe(),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,P=i.status?.github_available,x=b?.includes("github.com");x&&P===!1?s.push({label:"GitHub Sync",ok:!1,detail:"Repo has GitHub remote but github_available is false"}):!x&&P===!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=Zr(t);s.push({label:"Claude Code",ok:a,detail:a?"CLAUDE.md injected":"CLAUDE.md injection missing \u2014 run `codebase fix`"});let c=ea(t);if(s.push({label:"MCP",ok:c,detail:c?".mcp.json configured":".mcp.json missing \u2014 run `codebase fix`"}),F(A(t,".git"))){let b=sn(t,"post-commit"),P=sn(t,"post-checkout"),x=na(t);if(b&&P){let T=r&&x?" (with --sync)":"";s.push({label:"Git Hooks",ok:!0,detail:`post-commit + post-checkout${T}`})}else{let T=[];b||T.push("post-commit"),P||T.push("post-checkout"),s.push({label:"Git Hooks",ok:!1,detail:`${T.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(F(A(t,".git"))&&(ta(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`"})),F(A(t,".git"))){let b=sa(t);(()=>{try{let x=JSON.parse(K(A(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=A(t,".claude","commands");if(F(u)){let b=Yr(u).filter(P=>P.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=A(t,".claude","hooks","git-guard.sh"),f=A(t,".claude","hooks","git-post.sh"),p=A(t,".claude","settings.json"),d=F(g)&&F(f),m=(()=>{if(!F(p))return!1;try{let b=JSON.parse(K(p,"utf-8")),P=JSON.stringify(b.hooks?.PreToolUse??""),x=JSON.stringify(b.hooks?.PostToolUse??"");return P.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 E=A(t,".gitignore");F(E)?K(E,"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 D=!!process.env.NO_COLOR,_=D?"":"\x1B[32m",S=D?"":"\x1B[31m",q=D?"":"\x1B[0m",L=s.filter(b=>!b.ok);for(let b of s){let P=b.ok?`${_}\u2713${q}`:`${S}\u2717${q}`,x=(b.label.startsWith(" ")," "),T=b.label.startsWith(" ")?18:16;l(`${x}${b.label.trimStart().padEnd(T)} ${P} ${b.detail}`)}l(""),L.length===0?l(" All checks passed. Your project is healthy."):l(` ${L.length} issue${L.length>1?"s":""} found. Run \`codebase fix\` to repair.`),l(""),L.length>0&&process.exit(1)}function Zr(e){let t=A(e,"CLAUDE.md");return F(t)?K(t,"utf-8").includes("<!-- codebase:start -->"):!1}function ea(e){let t=A(e,".mcp.json");if(!F(t))return!1;try{return!!JSON.parse(K(t,"utf-8")).mcpServers?.codebase}catch{return!1}}function sn(e,t){let s=A(e,".git","hooks",t);return F(s)?K(s,"utf-8").includes(Xr):!1}function ta(e){let t=A(e,".git","hooks","commit-msg");return F(t)?K(t,"utf-8").includes("codebase-branch-check"):!1}function sa(e){let t=A(e,".git","hooks","pre-commit");return F(t)?K(t,"utf-8").includes("codebase-pre-commit"):!1}function na(e){let t=A(e,".git","hooks","post-commit");return F(t)?K(t,"utf-8").includes("--sync"):!1}function ia(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`}ke();import{resolve as oa,join as H}from"path";import{existsSync as G,readFileSync as X}from"fs";import{writeFile as ra}from"fs/promises";We();Je();N();var aa="# codebase-auto-update",rn=!!process.env.NO_COLOR,ca=rn?"":"\x1B[32m",la=rn?"":"\x1B[0m";function se(e){console.log(` ${ca}\u2713${la} ${e}`)}async function an(e){J(e.quiet);let t=oa(e.path),s=0;j(`codebase fix
596
+ `)}async function en(e){let t=Vr(e.path);await Zs(t)}import{resolve as Qr,join as I}from"path";import{existsSync as F,readFileSync as K,statSync as tn,readdirSync as Yr}from"fs";N();var Xr="# codebase-auto-update";async function nn(e){J(e.quiet);let t=Qr(e.path),s=[];j(`codebase doctor
597
+ `);let n=I(t,".codebase.json"),i=null;if(F(n))try{let b=K(n,"utf-8");i=JSON.parse(b);let D=tn(n),x=(D.size/1024).toFixed(1),T=Date.now()-D.mtimeMs,Pe=ia(T);s.push({label:"Manifest",ok:!0,detail:`.codebase.json (${x} KB, ${Pe})`})}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,D=(Date.now()-b)/(1e3*60*60),x=!1;if(F(I(t,"src")))try{tn(I(t,"src")).mtimeMs>b&&(x=!0)}catch{}x?s.push({label:"Freshness",ok:!1,detail:`Stale (${Math.round(D)} hours old)`}):s.push({label:"Freshness",ok:!0,detail:"Up to date"});let T=["project","repo","structure","stack","commands","dependencies","config","git","quality","patterns"],Pe=T.filter(De=>De in i);if(Pe.length===T.length)s.push({label:"Detectors",ok:!0,detail:"10/10 categories present"});else{let De=T.filter(dn=>!Pe.includes(dn));s.push({label:"Detectors",ok:!1,detail:`Missing: ${De.join(", ")}`})}}let o=await xe(),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,D=i.status?.github_available,x=b?.includes("github.com");x&&D===!1?s.push({label:"GitHub Sync",ok:!1,detail:"Repo has GitHub remote but github_available is false"}):!x&&D===!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=Zr(t);s.push({label:"Claude Code",ok:a,detail:a?"CLAUDE.md injected":"CLAUDE.md injection missing \u2014 run `codebase fix`"});let c=ea(t);if(s.push({label:"MCP",ok:c,detail:c?".mcp.json configured":".mcp.json missing \u2014 run `codebase fix`"}),F(I(t,".git"))){let b=sn(t,"post-commit"),D=sn(t,"post-checkout"),x=na(t);if(b&&D){let T=r&&x?" (with --sync)":"";s.push({label:"Git Hooks",ok:!0,detail:`post-commit + post-checkout${T}`})}else{let T=[];b||T.push("post-commit"),D||T.push("post-checkout"),s.push({label:"Git Hooks",ok:!1,detail:`${T.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(F(I(t,".git"))&&(ta(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`"})),F(I(t,".git"))){let b=sa(t);(()=>{try{let x=JSON.parse(K(I(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=I(t,".claude","commands");if(F(u)){let b=Yr(u).filter(D=>D.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=I(t,".claude","hooks","git-guard.sh"),m=I(t,".claude","hooks","git-post.sh"),p=I(t,".claude","settings.json"),d=F(g)&&F(m),f=(()=>{if(!F(p))return!1;try{let b=JSON.parse(K(p,"utf-8")),D=JSON.stringify(b.hooks?.PreToolUse??""),x=JSON.stringify(b.hooks?.PostToolUse??"");return D.includes("git-guard")&&x.includes("git-post")}catch{return!1}})();if(d&&f)s.push({label:"Claude Hooks",ok:!0,detail:"git-guard + git-post wired in settings.json"});else{let b=[];d||b.push("hook scripts"),f||b.push("settings.json wiring"),s.push({label:"Claude Hooks",ok:!1,detail:`Missing: ${b.join(", ")} \u2014 run \`codebase setup\``})}let E=I(t,".gitignore");F(E)?K(E,"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 _=!!process.env.NO_COLOR,P=_?"":"\x1B[32m",R=_?"":"\x1B[31m",q=_?"":"\x1B[0m",L=s.filter(b=>!b.ok);for(let b of s){let D=b.ok?`${P}\u2713${q}`:`${R}\u2717${q}`,x=(b.label.startsWith(" ")," "),T=b.label.startsWith(" ")?18:16;l(`${x}${b.label.trimStart().padEnd(T)} ${D} ${b.detail}`)}l(""),L.length===0?l(" All checks passed. Your project is healthy."):l(` ${L.length} issue${L.length>1?"s":""} found. Run \`codebase fix\` to repair.`),l(""),L.length>0&&process.exit(1)}function Zr(e){let t=I(e,"CLAUDE.md");return F(t)?K(t,"utf-8").includes("<!-- codebase:start -->"):!1}function ea(e){let t=I(e,".mcp.json");if(!F(t))return!1;try{return!!JSON.parse(K(t,"utf-8")).mcpServers?.codebase}catch{return!1}}function sn(e,t){let s=I(e,".git","hooks",t);return F(s)?K(s,"utf-8").includes(Xr):!1}function ta(e){let t=I(e,".git","hooks","commit-msg");return F(t)?K(t,"utf-8").includes("codebase-branch-check"):!1}function sa(e){let t=I(e,".git","hooks","pre-commit");return F(t)?K(t,"utf-8").includes("codebase-pre-commit"):!1}function na(e){let t=I(e,".git","hooks","post-commit");return F(t)?K(t,"utf-8").includes("--sync"):!1}function ia(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`}ke();import{resolve as oa,join as H}from"path";import{existsSync as G,readFileSync as X}from"fs";import{writeFile as ra}from"fs/promises";We();Je();N();var aa="# codebase-auto-update",rn=!!process.env.NO_COLOR,ca=rn?"":"\x1B[32m",la=rn?"":"\x1B[0m";function ne(e){console.log(` ${ca}\u2713${la} ${e}`)}async function an(e){J(e.quiet);let t=oa(e.path),s=0;j(`codebase fix
598
598
  `);let n=await xe(),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)
599
599
  `)):n==="not-authenticated"&&(y("GitHub CLI not authenticated \u2014 run: gh auth login"),y(`(Cannot auto-fix \u2014 requires manual login)
600
- `));let o=H(t,".codebase.json"),r=!1;if(!G(o))r=!0;else try{let S=X(o,"utf-8");JSON.parse(S)}catch{r=!0}if(!r&&G(o))try{let S=X(o,"utf-8"),q=JSON.parse(S),L=q.generated_at?new Date(q.generated_at).getTime():0;if(G(H(t,"src"))){let{statSync:b}=await import("fs");b(H(t,"src")).mtimeMs>L&&(r=!0)}}catch{r=!0}if(r){let S=await V(t,{depth:e.depth,quiet:!0,sync:i}),q=JSON.stringify(S,null,2);await ra(o,q,"utf-8");let L=(Buffer.byteLength(q)/1024).toFixed(1);se(`Re-scanned project \u2192 .codebase.json (${L} KB)`),s++}let{claudeIntegration:a}=await Promise.resolve().then(()=>(ve(),Ps));ua(t)||(a.inject(t),se("Re-injected Claude Code instructions into CLAUDE.md"),s++);let u=kt(t,new Set(["claude"]));for(let S of u)se(`Added MCP entry to ${S}`),s++;if(G(H(t,".git"))){let S=on(t,"post-commit"),q=on(t,"post-checkout"),L=da(t),b=pa(t);if(!S||!q||i&&!L||!b){de(t,i);let x=[];S||x.push("post-commit"),q||x.push("post-checkout"),i&&!L&&x.push("--sync flag"),b||x.push("pre-commit"),se(`Installed ${x.join(" + ")} hook${x.length>1?"s":""}`),s++}}let g=H(t,".gitignore");(G(g)?X(g,"utf-8"):"").includes(".codebase.json")||(ce(t),se("Added .codebase.json to .gitignore"),s++);let p=H(t,".claude","commands");if(!G(p)){let{installClaudeCommandsForFix:S}=await Promise.resolve().then(()=>(Ve(),bt));S(t),se("Installed Claude commands \u2192 .claude/commands/"),s++}let d=H(t,".claude","hooks","git-guard.sh"),m=H(t,".claude","hooks","git-post.sh"),E=H(t,".claude","settings.json"),D=G(d)&&G(m),_=(()=>{if(!G(E))return!1;try{let S=JSON.parse(X(E,"utf-8")),q=JSON.stringify(S.hooks?.PreToolUse??""),L=JSON.stringify(S.hooks?.PostToolUse??"");return q.includes("git-guard")&&L.includes("git-post")}catch{return!1}})();if(!D||!_){let{installClaudeHooksForFix:S}=await Promise.resolve().then(()=>(Ve(),bt));S(t),se("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 ua(e){let t=H(e,"CLAUDE.md");return G(t)?X(t,"utf-8").includes("<!-- codebase:start -->"):!1}function on(e,t){let s=H(e,".git","hooks",t);return G(s)?X(s,"utf-8").includes(aa):!1}function da(e){let t=H(e,".git","hooks","post-commit");return G(t)?X(t,"utf-8").includes("--sync"):!1}function pa(e){let t=H(e,".git","hooks","pre-commit");return G(t)?X(t,"utf-8").includes("codebase-pre-commit"):!1}N();import{resolve as fa,join as Ze}from"path";import{execFile as Re}from"child_process";import{existsSync as cn,readFileSync as jt,writeFileSync as ma}from"fs";async function ln(e){let t=fa(e.path),s=e.dryRun,n=e.positionals[0]??null;j(`codebase release${s?" (dry run)":""}`),await ga()||(w("gh CLI not authenticated. Run: gh auth login"),process.exit(1)),await Se(t,"git remote get-url origin 2>/dev/null")||(w("No git remote. Run: git remote add origin <url>"),process.exit(1)),l(`
600
+ `));let o=H(t,".codebase.json"),r=!1;if(!G(o))r=!0;else try{let R=X(o,"utf-8");JSON.parse(R)}catch{r=!0}if(!r&&G(o))try{let R=X(o,"utf-8"),q=JSON.parse(R),L=q.generated_at?new Date(q.generated_at).getTime():0;if(G(H(t,"src"))){let{statSync:b}=await import("fs");b(H(t,"src")).mtimeMs>L&&(r=!0)}}catch{r=!0}if(r){let R=await V(t,{depth:e.depth,quiet:!0,sync:i}),q=JSON.stringify(R,null,2);await ra(o,q,"utf-8");let L=(Buffer.byteLength(q)/1024).toFixed(1);ne(`Re-scanned project \u2192 .codebase.json (${L} KB)`),s++}let{claudeIntegration:a}=await Promise.resolve().then(()=>(ve(),Ps));ua(t)||(a.inject(t),ne("Re-injected Claude Code instructions into CLAUDE.md"),s++);let u=kt(t,new Set(["claude"]));for(let R of u)ne(`Added MCP entry to ${R}`),s++;if(G(H(t,".git"))){let R=on(t,"post-commit"),q=on(t,"post-checkout"),L=da(t),b=pa(t);if(!R||!q||i&&!L||!b){pe(t,i);let x=[];R||x.push("post-commit"),q||x.push("post-checkout"),i&&!L&&x.push("--sync flag"),b||x.push("pre-commit"),ne(`Installed ${x.join(" + ")} hook${x.length>1?"s":""}`),s++}}let g=H(t,".gitignore");(G(g)?X(g,"utf-8"):"").includes(".codebase.json")||(le(t),ne("Added .codebase.json to .gitignore"),s++);let p=H(t,".claude","commands");if(!G(p)){let{installClaudeCommandsForFix:R}=await Promise.resolve().then(()=>(Ve(),bt));R(t),ne("Installed Claude commands \u2192 .claude/commands/"),s++}let d=H(t,".claude","hooks","git-guard.sh"),f=H(t,".claude","hooks","git-post.sh"),E=H(t,".claude","settings.json"),_=G(d)&&G(f),P=(()=>{if(!G(E))return!1;try{let R=JSON.parse(X(E,"utf-8")),q=JSON.stringify(R.hooks?.PreToolUse??""),L=JSON.stringify(R.hooks?.PostToolUse??"");return q.includes("git-guard")&&L.includes("git-post")}catch{return!1}})();if(!_||!P){let{installClaudeHooksForFix:R}=await Promise.resolve().then(()=>(Ve(),bt));R(t),ne("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 ua(e){let t=H(e,"CLAUDE.md");return G(t)?X(t,"utf-8").includes("<!-- codebase:start -->"):!1}function on(e,t){let s=H(e,".git","hooks",t);return G(s)?X(s,"utf-8").includes(aa):!1}function da(e){let t=H(e,".git","hooks","post-commit");return G(t)?X(t,"utf-8").includes("--sync"):!1}function pa(e){let t=H(e,".git","hooks","pre-commit");return G(t)?X(t,"utf-8").includes("codebase-pre-commit"):!1}N();import{resolve as fa,join as Ze}from"path";import{execFile as Re}from"child_process";import{existsSync as cn,readFileSync as jt,writeFileSync as ma}from"fs";async function ln(e){let t=fa(e.path),s=e.dryRun,n=e.positionals[0]??null;j(`codebase release${s?" (dry run)":""}`),await ga()||(w("gh CLI not authenticated. Run: gh auth login"),process.exit(1)),await Se(t,"git remote get-url origin 2>/dev/null")||(w("No git remote. Run: git remote add origin <url>"),process.exit(1)),l(`
601
601
  Checking launch gates...`);let[r,a]=await Promise.all([$t(t,["bug","critical"]),$t(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(`
602
- Fix: run /simulate, or close with wontfix label`),process.exit(1)),h("Gate 1a \u2014 no critical/high bugs");let c=ha(t);if(c){let _=await ba(t,c);_.ok||(w("Gate 1b FAILED \u2014 test suite has failures"),l(_.output.split(`
602
+ Fix: run /simulate, or close with wontfix label`),process.exit(1)),h("Gate 1a \u2014 no critical/high bugs");let c=ha(t);if(c){let P=await ba(t,c);P.ok||(w("Gate 1b FAILED \u2014 test suite has failures"),l(P.output.split(`
603
603
  `).slice(-10).join(`
604
604
  `)),l(`
605
- Fix: run /review to repair failing tests`),process.exit(1)),h(`Gate 1b \u2014 tests pass (${c})`)}else R("Gate 1b \u2014 no test runner detected (skipping)");let u=await ya(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`):R("Gate 1c \u2014 no simulation data yet (run /simulate first)");let g=await $t(t,["carry"]);g>0?R(`Gate 2 \u2014 ${g} carry bug(s) will appear in release notes`):h("Gate 2 \u2014 no carry bugs");let f=await Se(t,"git status --short");f&&(w("Gate 3 FAILED \u2014 uncommitted changes"),l(f),process.exit(1)),await Se(t,"git fetch origin develop 2>/dev/null || true"),await Se(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(`
605
+ 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 ya(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 $t(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 m=await Se(t,"git status --short");m&&(w("Gate 3 FAILED \u2014 uncommitted changes"),l(m),process.exit(1)),await Se(t,"git fetch origin develop 2>/dev/null || true"),await Se(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(`
606
606
  All gates passed.`);let d=n??await ka(t);l(`
607
- Release version: ${d}`);let m=await wa(t,d,g);if(s){l(`
608
- --- DRY RUN \u2014 release notes preview ---`),l(m),l("--- DRY RUN \u2014 no tag, no merge, no GitHub release created ---");return}await ne(t,["tag","-a",d,"-m",`Release ${d}`]),await ne(t,["push","origin",d]),h(`Tagged ${d}`),await ne(t,["checkout","main"]),await ne(t,["pull","origin","main"]),await ne(t,["merge","develop","--no-ff","-m",`Release ${d}`]),await ne(t,["push","origin","main"]),await ne(t,["checkout","develop"]),h("Merged develop \u2192 main");let{ok:E,stdout:D}=await z(t,["release","create",d,"--title",d,"--notes",m,"--target","develop"]);E?h(`GitHub release: ${D}`):R("Could not create GitHub release \u2014 tag and merge succeeded"),await va(t),l(`
609
- codebase release ${d} complete.`),l("develop \u2192 main merged. Tag pushed. Ready.")}function Se(e,t){return new Promise(s=>{Re("sh",["-c",t],{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function ne(e,t){return new Promise((s,n)=>{Re("git",t,{cwd:e,timeout:3e4},(i,o,r)=>{i?n(new Error(r||i.message)):s()})})}function z(e,t){return new Promise(s=>{Re("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function ga(){return new Promise(e=>{Re("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function $t(e,t){let{stdout:s}=await z(e,["issue","list","--label",t.join(","),"--state","open","--limit","100","--json","number","--jq","length"]);return parseInt(s,10)||0}function ha(e){try{let t=JSON.parse(jt(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(cn(Ze(e,"pyproject.toml")))try{if(jt(Ze(e,"pyproject.toml"),"utf-8").includes("pytest"))return"uv run pytest"}catch{}return null}function ba(e,t){return new Promise(s=>{Re("sh",["-c",t],{cwd:e,timeout:12e4},(n,i,o)=>{s({ok:!n,output:i+o})})})}async function ya(e){let{stdout:t}=await z(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 ka(e){let t=await Se(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 wa(e,t,s){let n=new Date().toISOString().split("T")[0],[i,o,r,a]=await Promise.all([z(e,["issue","list","--label","arch","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","bug,sim","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","carry","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","arch","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"'])]),c=`# Release ${t} \u2014 ${n}
607
+ Release version: ${d}`);let f=await wa(t,d,g);if(s){l(`
608
+ --- DRY RUN \u2014 release notes preview ---`),l(f),l("--- DRY RUN \u2014 no tag, no merge, no GitHub release created ---");return}await ie(t,["tag","-a",d,"-m",`Release ${d}`]),await ie(t,["push","origin",d]),h(`Tagged ${d}`),await ie(t,["checkout","main"]),await ie(t,["pull","origin","main"]),await ie(t,["merge","develop","--no-ff","-m",`Release ${d}`]),await ie(t,["push","origin","main"]),await ie(t,["checkout","develop"]),h("Merged develop \u2192 main");let{ok:E,stdout:_}=await z(t,["release","create",d,"--title",d,"--notes",f,"--target","develop"]);E?h(`GitHub release: ${_}`):S("Could not create GitHub release \u2014 tag and merge succeeded"),await va(t),l(`
609
+ codebase release ${d} complete.`),l("develop \u2192 main merged. Tag pushed. Ready.")}function Se(e,t){return new Promise(s=>{Re("sh",["-c",t],{cwd:e,timeout:3e4},(n,i)=>{s(n?"":i.trim())})})}function ie(e,t){return new Promise((s,n)=>{Re("git",t,{cwd:e,timeout:3e4},(i,o,r)=>{i?n(new Error(r||i.message)):s()})})}function z(e,t){return new Promise(s=>{Re("gh",t,{cwd:e,timeout:3e4},(n,i)=>{s({ok:!n,stdout:(i||"").trim()})})})}async function ga(){return new Promise(e=>{Re("gh",["auth","status"],{timeout:5e3},t=>e(!t))})}async function $t(e,t){let{stdout:s}=await z(e,["issue","list","--label",t.join(","),"--state","open","--limit","100","--json","number","--jq","length"]);return parseInt(s,10)||0}function ha(e){try{let t=JSON.parse(jt(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(cn(Ze(e,"pyproject.toml")))try{if(jt(Ze(e,"pyproject.toml"),"utf-8").includes("pytest"))return"uv run pytest"}catch{}return null}function ba(e,t){return new Promise(s=>{Re("sh",["-c",t],{cwd:e,timeout:12e4},(n,i,o)=>{s({ok:!n,output:i+o})})})}async function ya(e){let{stdout:t}=await z(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 ka(e){let t=await Se(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 wa(e,t,s){let n=new Date().toISOString().split("T")[0],[i,o,r,a]=await Promise.all([z(e,["issue","list","--label","arch","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","bug,sim","--state","closed","--limit","50","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","carry","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"']),z(e,["issue","list","--label","arch","--state","open","--limit","20","--json","number,title","--jq",'.[] | "- #(.number) (.title)"'])]),c=`# Release ${t} \u2014 ${n}
610
610
 
611
611
  `;return i.stdout&&(c+=`## What's New
612
612
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codebase-ai",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "One command. Every AI tool understands your project instantly.",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/ZySec-AI/codebase",