prjct-cli 3.82.0 → 3.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1242,7 +1242,7 @@ CREATE TABLE velocity_sprints (
1242
1242
  name TEXT NOT NULL,
1243
1243
  applied_at TEXT NOT NULL
1244
1244
  )
1245
- `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(o=>o.version)),s=ya.filter(o=>!r.has(o.version));if(s.length!==0){if(n&&r.size>0)try{let o=`${n}.pre-migrate.bak`;Ao.existsSync(o)&&Ao.rmSync(o,{force:!0}),e.prepare("VACUUM INTO ?").run(o)}catch(o){console.warn(`prjct: pre-migration backup failed (continuing): ${o?.message??o}`)}for(let o of s)Qu(e,()=>{o.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(o.version,o.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},S=new Ea,k=S});function aE(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Zu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:aE(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:aE(r.host),repoSlug:s}}catch{return{}}}async function W0(t){try{let{stdout:e}=await z("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function G0(t){try{let{stdout:e}=await z("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function fr(t){return typeof t=="string"&&t.length>0?t:void 0}function cE(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function X0(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function lE(t){let e=S.getDoc(t,"project")||{},n=fr(e.repoPath),{provider:r,repoSlug:s}=n?Zu(await W0(n)||""):{},o=n?await G0(n):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return X0({provider:r,repoSlug:s,currentBranch:fr(e.currentBranch),defaultBranch:o,stack:fr(e.stack),techStack:i&&i.length>0?i:void 0,version:fr(e.version),commitCount:cE(e.commitCount),fileCount:cE(e.fileCount),lastCommit:fr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:fr(e.cliVersion),syncedAt:fr(e.lastSync)})}var ed=h(()=>{"use strict";O();ne();a(aE,"providerForHost");a(Zu,"parseRemote");a(W0,"gitRemoteUrl");a(G0,"gitDefaultBranch");a(fr,"str");a(cE,"num");a(X0,"compact");a(lE,"buildProjectMeta")});import q0 from"node:crypto";function J0(t,e=V0){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=q0.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function K0(t){let e=await z("git",["remote","get-url","origin"],{cwd:t}).then(({stdout:s})=>s.trim()||null).catch(()=>null);if(!e)return null;let{provider:n,repoSlug:r}=Zu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function uE(t){let e=await K0(t);return e?J0(e):null}var V0,dE=h(()=>{"use strict";ne();ed();V0="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(J0,"uuidv5");a(K0,"repoKey");a(uE,"deriveProjectId")});var pE={};A(pE,{PACKAGE_ROOT:()=>Bn,VERSION:()=>nt,getPackageRoot:()=>nd,getVersion:()=>wa,resetPackageRoot:()=>Y0});import td from"node:fs";import ka from"node:path";function nd(){if(Nt.packageRoot)return Nt.packageRoot;let t=a((e,n)=>{if(n>=5)return null;let r=ka.join(e,"package.json");if(td.existsSync(r))try{if(JSON.parse(td.readFileSync(r,"utf-8")).name==="prjct-cli")return e}catch{}return t(ka.dirname(e),n+1)},"findPackageRoot");return Nt.packageRoot=t(__dirname,0)??ka.join(__dirname,"..","..",".."),Nt.packageRoot}function wa(){if(Nt.version)return Nt.version;let t="3.82.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return Nt.version=t,Nt.version;try{let e=ka.join(nd(),"package.json"),n=JSON.parse(td.readFileSync(e,"utf-8"));return Nt.version=n.version,Nt.version}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",P(e)),"0.0.0"}}function Y0(t){Nt.packageRoot=t,Nt.version=null}var Nt,nt,Bn,Tn=h(()=>{"use strict";ae();Nt={version:null,packageRoot:null};a(nd,"getPackageRoot");a(wa,"getVersion");a(Y0,"resetPackageRoot");nt=wa(),Bn=nd()});async function Sa(t){try{let{stdout:e}=await J(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function z0(){let t=await Sa("gh api user --jq .login");if(t.success&&t.output)return t.output;let e=await Sa("git config --global github.user");return e.success&&e.output?e.output:null}async function Q0(){let t=await Sa("git config user.name");return t.success&&t.output?t.output:null}async function Z0(){let t=await Sa("git config user.email");return t.success&&t.output?t.output:null}async function ys(){let[t,e,n]=await Promise.all([z0(),Q0(),Z0()]);return{github:t,email:n,name:e||t||"Unknown"}}var Ta=h(()=>{"use strict";ne();a(Sa,"execCommand");a(z0,"detectGitHubUsername");a(Q0,"detectGitName");a(Z0,"detectGitEmail");a(ys,"detect")});var ba={};A(ba,{worktreeService:()=>eP});import sd from"node:fs/promises";import en from"node:path";var mE,od,eP,va=h(()=>{"use strict";ne();oe();mE=".worktrees",od=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),o=en.join(s,mE,n),i=r.branch||`feat/${n}`;await sd.mkdir(en.join(s,mE),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await J(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await J("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s=n?await J("git rev-parse --abbrev-ref HEAD",{cwd:e}).then(({stdout:o})=>o.trim()).catch(()=>{}):void 0;if(await J(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await J(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await J("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await J("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await J("git rev-parse --git-dir",{cwd:e}),s=en.resolve(e,n.trim()),o=en.resolve(e,r.trim());if(s!==o){let{stdout:i}=await J("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await J("git rev-parse HEAD",{cwd:e}),{stdout:l}=await J("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=en.basename(u);return{path:u,branch:i.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await J("git worktree list --porcelain",{cwd:e}),s=r.split(`
1245
+ `);let r=new Set(e.prepare("SELECT version FROM _migrations").all().map(o=>o.version)),s=ya.filter(o=>!r.has(o.version));if(s.length!==0){if(n&&r.size>0)try{let o=`${n}.pre-migrate.bak`;Ao.existsSync(o)&&Ao.rmSync(o,{force:!0}),e.prepare("VACUUM INTO ?").run(o)}catch(o){console.warn(`prjct: pre-migration backup failed (continuing): ${o?.message??o}`)}for(let o of s)Qu(e,()=>{o.up(e),e.prepare("INSERT INTO _migrations (version, name, applied_at) VALUES (?, ?, ?)").run(o.version,o.name,new Date().toISOString())})}}getMigrations(e){return this.getDb(e).prepare("SELECT * FROM _migrations ORDER BY version").all()}getSchemaVersion(e){return this.getDb(e).prepare("SELECT MAX(version) as version FROM _migrations").get()?.version??0}},S=new Ea,k=S});function aE(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Zu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:aE(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:aE(r.host),repoSlug:s}}catch{return{}}}async function W0(t){try{let{stdout:e}=await z("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function G0(t){try{let{stdout:e}=await z("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function fr(t){return typeof t=="string"&&t.length>0?t:void 0}function cE(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function X0(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function lE(t){let e=S.getDoc(t,"project")||{},n=fr(e.repoPath),{provider:r,repoSlug:s}=n?Zu(await W0(n)||""):{},o=n?await G0(n):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return X0({provider:r,repoSlug:s,currentBranch:fr(e.currentBranch),defaultBranch:o,stack:fr(e.stack),techStack:i&&i.length>0?i:void 0,version:fr(e.version),commitCount:cE(e.commitCount),fileCount:cE(e.fileCount),lastCommit:fr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:fr(e.cliVersion),syncedAt:fr(e.lastSync)})}var ed=h(()=>{"use strict";O();ne();a(aE,"providerForHost");a(Zu,"parseRemote");a(W0,"gitRemoteUrl");a(G0,"gitDefaultBranch");a(fr,"str");a(cE,"num");a(X0,"compact");a(lE,"buildProjectMeta")});import q0 from"node:crypto";function J0(t,e=V0){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=q0.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let o=s.toString("hex");return`${o.slice(0,8)}-${o.slice(8,12)}-${o.slice(12,16)}-${o.slice(16,20)}-${o.slice(20,32)}`}async function K0(t){let e=await z("git",["remote","get-url","origin"],{cwd:t}).then(({stdout:s})=>s.trim()||null).catch(()=>null);if(!e)return null;let{provider:n,repoSlug:r}=Zu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function uE(t){let e=await K0(t);return e?J0(e):null}var V0,dE=h(()=>{"use strict";ne();ed();V0="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(J0,"uuidv5");a(K0,"repoKey");a(uE,"deriveProjectId")});var pE={};A(pE,{PACKAGE_ROOT:()=>Bn,VERSION:()=>nt,getPackageRoot:()=>nd,getVersion:()=>wa,resetPackageRoot:()=>Y0});import td from"node:fs";import ka from"node:path";function nd(){if(Nt.packageRoot)return Nt.packageRoot;let t=a((e,n)=>{if(n>=5)return null;let r=ka.join(e,"package.json");if(td.existsSync(r))try{if(JSON.parse(td.readFileSync(r,"utf-8")).name==="prjct-cli")return e}catch{}return t(ka.dirname(e),n+1)},"findPackageRoot");return Nt.packageRoot=t(__dirname,0)??ka.join(__dirname,"..","..",".."),Nt.packageRoot}function wa(){if(Nt.version)return Nt.version;let t="3.83.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return Nt.version=t,Nt.version;try{let e=ka.join(nd(),"package.json"),n=JSON.parse(td.readFileSync(e,"utf-8"));return Nt.version=n.version,Nt.version}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",P(e)),"0.0.0"}}function Y0(t){Nt.packageRoot=t,Nt.version=null}var Nt,nt,Bn,Tn=h(()=>{"use strict";ae();Nt={version:null,packageRoot:null};a(nd,"getPackageRoot");a(wa,"getVersion");a(Y0,"resetPackageRoot");nt=wa(),Bn=nd()});async function Sa(t){try{let{stdout:e}=await J(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function z0(){let t=await Sa("gh api user --jq .login");if(t.success&&t.output)return t.output;let e=await Sa("git config --global github.user");return e.success&&e.output?e.output:null}async function Q0(){let t=await Sa("git config user.name");return t.success&&t.output?t.output:null}async function Z0(){let t=await Sa("git config user.email");return t.success&&t.output?t.output:null}async function ys(){let[t,e,n]=await Promise.all([z0(),Q0(),Z0()]);return{github:t,email:n,name:e||t||"Unknown"}}var Ta=h(()=>{"use strict";ne();a(Sa,"execCommand");a(z0,"detectGitHubUsername");a(Q0,"detectGitName");a(Z0,"detectGitEmail");a(ys,"detect")});var ba={};A(ba,{worktreeService:()=>eP});import sd from"node:fs/promises";import en from"node:path";var mE,od,eP,va=h(()=>{"use strict";ne();oe();mE=".worktrees",od=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),o=en.join(s,mE,n),i=r.branch||`feat/${n}`;await sd.mkdir(en.join(s,mE),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await J(`git worktree add "${o}" -b "${i}"${c}`,{cwd:s});let{stdout:l}=await J("git rev-parse HEAD",{cwd:o});return{path:o,branch:i,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s=n?await J("git rev-parse --abbrev-ref HEAD",{cwd:e}).then(({stdout:o})=>o.trim()).catch(()=>{}):void 0;if(await J(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await J(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await J("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await J("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await J("git rev-parse --git-dir",{cwd:e}),s=en.resolve(e,n.trim()),o=en.resolve(e,r.trim());if(s!==o){let{stdout:i}=await J("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await J("git rev-parse HEAD",{cwd:e}),{stdout:l}=await J("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=en.basename(u);return{path:u,branch:i.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await J("git worktree list --porcelain",{cwd:e}),s=r.split(`
1246
1246
  `)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await J("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=en.join(n,".env");await M(r)&&await sd.copyFile(r,en.join(e,".env"));let s=en.join(n,".prjct"),o=en.join(e,".prjct");await M(s)&&!await M(o)&&await sd.symlink(s,o,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await J("git worktree prune",{cwd:s});for(let o of n)o.isMain||await M(o.path)||r.push(o.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
1247
1247
 
1248
1248
  `);for(let o of s){if(!o.trim())continue;let i=o.trim().split(`
@@ -1728,8 +1728,8 @@ ${o}`}function aH(t,e){let n=a(o=>{let i=o.indexOf(Fg);if(i<0)return o;let c=o.s
1728
1728
  `);await ct.writeFile(o,l,"utf-8"),n.agentFilesRepaired.push($g)}catch(l){n.errors.push({file:$g,reason:l instanceof Error?l.message:String(l)})}if(n.agentFilesRepaired.length===0)return;xi(e,Zv)===null&&(await eo(t,`Repaired crew instruction files that still told agents to write plans/reports to disk (${n.agentFilesRepaired.join(", ")}). Refreshed from current prjct templates. Product law: plans + work data ONLY in project SQLite via prjct plan / prjct spec / prjct remember / prjct crew record-run \u2014 physical files are not traceable.`,{"migration:v3.77":"1",topic:"crew-disk-write-repair"}),Xr(e,Zv,Date.now()))}async function pH(t,e,n){let r=lt.join(t,".prjct");if(!await Ug(r))return;let s=await ct.readdir(r).catch(()=>[]);for(let i of s){if(o_.includes(i))continue;let c=lt.join(r,i);try{let l=await ct.stat(c);if(l.isDirectory()){let u=await Wg(c);for(let d of u){let p=lt.relative(t,d);await Bg(t,e,d,p)&&(n.ghostFilesIngested+=1)}}else if(l.isFile()){let u=lt.relative(t,c);i!=="CHECKPOINTS.md"&&i!=="team.json"&&await Bg(t,e,c,u)&&(n.ghostFilesIngested+=1)}await ct.rm(c,{recursive:!0,force:!0}),n.clientPrjctJunkPurged.includes(i)||n.clientPrjctJunkPurged.push(i)}catch(l){n.errors.push({file:`.prjct/${i}`,reason:l instanceof Error?l.message:String(l)})}}if(n.clientPrjctJunkPurged.length===0)return;xi(e,ml)===null&&n.ghostDirsPurged.length===0&&(await eo(t,`Client .prjct/ cleaned to config-only. Removed: ${n.clientPrjctJunkPurged.join(", ")}. Durable state is SQLite only (prjct crew checkpoints / prjct team / prjct remember).`,{"migration:v3.79":"1",topic:"client-prjct-config-only"}),Xr(e,ml,Date.now()))}async function mH(t,e){let n={checkpointsMigrated:!1,checkpointsHandEditWarned:!1,teamMigrated:!1,teamHandEditWarned:!1,ghostDirsPurged:[],agentFilesRepaired:[],ghostFilesIngested:0,clientPrjctJunkPurged:[],errors:[]};return await cH(t,e,n).catch(r=>{n.errors.push({file:dl,reason:r instanceof Error?r.message:String(r)})}),await lH(t,e,n).catch(r=>{n.errors.push({file:pl,reason:r instanceof Error?r.message:String(r)})}),await uH(t,e,n).catch(r=>{n.errors.push({file:".prjct/*/",reason:r instanceof Error?r.message:String(r)})}),await pH(t,e,n).catch(r=>{n.errors.push({file:".prjct/",reason:r instanceof Error?r.message:String(r)})}),await dH(t,e,n).catch(r=>{n.errors.push({file:".claude/agents/*",reason:r instanceof Error?r.message:String(r)})}),n}var dl,pl,jg,Mg,ml,Zv,r_,s_,tH,nH,ul,$g,rH,Fg,e_,Hg,t_,sH,o_,c_=h(()=>{"use strict";wr();Fn();Yv();O();Qv();jt();Og();dl=".prjct/CHECKPOINTS.md",pl=".prjct/team.json",jg="migration:v2.19.8:last-flagged-checkpoints",Mg="migration:v2.19.8:last-flagged-team",ml="migration:v3.77:last-ghost-purge-warn",Zv="migration:v3.77:last-agent-repair-warn",r_=["sessions","audits","deploy"],s_=[/\.prjct\/sessions\/<task/i,/\.prjct\/sessions\/\$\{/i,/->\s*`?\.prjct\/sessions\//i,/write(?:s|n)?\s+(?:a\s+)?(?:plan|report|results?|verdict|findings?)[^\n]{0,120}\.prjct\/sessions\//i,/write(?:s|n)?\s+its\s+results[^\n]{0,80}\.prjct\/sessions\//i,/Session artifacts at `?\.prjct\/sessions\//i,/Implementer report at `?\.prjct\/sessions\//i,/Reviewer verdict at `?\.prjct\/sessions\//i,/\.prjct\/audits\//i,/\.prjct\/deploy\//i,/SESSION_ROOT\s*=/i,/Write under `?SESSION_ROOT/i,/~\/\.prjct-cli\/projects\/[^\s`]+\/sessions\//i,/sessions\/<task-slug>\/\{?plan/i],tH=[".prjct/sessions/<task",".prjct/audits/",".prjct/deploy/"],nH=Lg.map(t=>({destRelative:`.claude/agents/${t.name}.md`,templateKey:`crew/roles/${t.name}.md`})),ul="CLAUDE.md",$g="CREW.md",rH="crew/leader-mode.md",Fg="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",e_="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",Hg="<!-- prjct:crew:end -->",t_="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",sH="<!-- prjct:checkpoints:end -->",o_=["prjct.config.json"];a(i_,"statMtimeMs");a(_i,"tryReadFile");a(Ug,"pathExists");a(xi,"readFlag");a(Xr,"writeFlag");a(eo,"captureInboxWarning");a(Zs,"containsForbiddenWriteInstruction");a(oH,"stampCrewModelPolicy");a(iH,"spliceCheckpoints");a(aH,"replaceCrewSnippet");a(n_,"sanitizeCheckpointsContent");a(cH,"sweepCheckpoints");a(lH,"sweepTeamJson");a(Wg,"listFilesRecursive");a(Bg,"ingestGhostFileToSql");a(uH,"purgeWorktreeGhostDirs");a(dH,"repairCrewDiskWriteInstructions");a(pH,"enforcePrjctConfigOnly");a(mH,"legacyCrewSweep")});var f_={};A(f_,{FILE_INVENTORY_DOC_KEY:()=>Gg,buildFileInventory:()=>p_,formatInventorySummary:()=>qg,inventoryExtensions:()=>fl,inventoryPathWeight:()=>Xg,languagesFromExtensions:()=>m_,loadFileInventory:()=>gl,pathMatchesInventory:()=>Ri,refreshFileInventory:()=>fH,saveFileInventory:()=>g_});import qr from"node:path";async function p_(t,e={}){let r=(await At(t,{skipDotfiles:!0,maxFiles:e.maxFiles??5e4})).filter(i=>{if(u_.test(i))return!1;let c=qr.basename(i);if(l_.test(c))return!1;let l=qr.extname(c).toLowerCase();return!!(l&&l!=="."&&!d_.has(l))}),s=r.reduce((i,c)=>{let l=qr.extname(qr.basename(c)).toLowerCase();return i[l]=(i[l]??0)+1,i},Object.create(null)),o=m_(s);return{extensions:s,languages:o,fileCount:r.length,builtAt:new Date().toISOString(),projectHint:qr.basename(t)}}function m_(t){let e=new Set,n=Object.entries(t).sort((r,s)=>s[1]-r[1]);for(let[r]of n){let s=gH[r];s&&e.add(s)}return[...e]}function g_(t,e){S.setDoc(t,Gg,e)}function gl(t){try{return S.getDoc(t,Gg)}catch{return null}}async function fH(t,e){let n=await p_(e);return g_(t,n),n}function fl(t){let e=gl(t);return e?.extensions?new Set(Object.keys(e.extensions).map(n=>n.toLowerCase())):new Set}function Ri(t,e,n={}){let r=e.replace(/^\.\//,"").replace(/\\/g,"/").trim();if(!r||u_.test(r))return!1;let s=r.split("/").pop()??r;if(l_.test(s))return!1;let o=qr.extname(s).toLowerCase();return o?!d_.has(o):r.includes("/")}function Xg(t,e){let n=e.replace(/^\.\//,"").replace(/\\/g,"/").trim(),r=n.split("/").pop()??n,s=qr.extname(r).toLowerCase();if(!s)return .7;let o=fl(t);return o.size===0||o.has(s)?1:.45}function qg(t){if(!t||Object.keys(t.extensions).length===0)return"File inventory: empty \u2014 run `prjct sync` to discover languages/extensions.";let e=Object.entries(t.extensions).sort((r,s)=>s[1]-r[1]).slice(0,12).map(([r,s])=>`${r}\xD7${s}`).join(" "),n=t.languages.length>0?t.languages.join(", "):"unknown";return`File inventory: ${t.fileCount} files \xB7 langs: ${n} \xB7 ${e}`}var Gg,l_,u_,d_,gH,Vg=h(()=>{"use strict";O();oe();Gg="file-inventory",l_=/^(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|composer\.lock|Cargo\.lock|poetry\.lock|CHANGELOG(\.md)?|LICENSE(\.md)?|\.DS_Store)$/i,u_=/(^|\/)(node_modules|dist|build|\.git|coverage|\.next|target|vendor)(\/|$)/i,d_=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".woff",".woff2",".ttf",".eot",".mp4",".mp3",".zip",".gz",".tar",".wasm",".exe",".dll",".so",".dylib",".bin",".pdf",".ico"]),gH={".ts":"TypeScript",".tsx":"TypeScript",".js":"JavaScript",".jsx":"JavaScript",".mjs":"JavaScript",".cjs":"JavaScript",".vue":"Vue",".svelte":"Svelte",".py":"Python",".go":"Go",".rs":"Rust",".java":"Java",".kt":"Kotlin",".kts":"Kotlin",".swift":"Swift",".rb":"Ruby",".php":"PHP",".cs":"C#",".fs":"F#",".cpp":"C++",".cc":"C++",".c":"C",".h":"C/C++",".hpp":"C++",".m":"Objective-C",".mm":"Objective-C++",".scala":"Scala",".clj":"Clojure",".ex":"Elixir",".exs":"Elixir",".erl":"Erlang",".hs":"Haskell",".lua":"Lua",".r":"R",".dart":"Dart",".sql":"SQL",".graphql":"GraphQL",".gql":"GraphQL",".proto":"Protobuf",".md":"Markdown",".mdx":"MDX",".json":"JSON",".yml":"YAML",".yaml":"YAML",".toml":"TOML",".css":"CSS",".scss":"SCSS",".sass":"Sass",".less":"Less",".html":"HTML",".htm":"HTML",".sh":"Shell",".bash":"Shell",".zsh":"Shell",".ps1":"PowerShell",".swiftui":"Swift"};a(p_,"buildFileInventory");a(m_,"languagesFromExtensions");a(g_,"saveFileInventory");a(gl,"loadFileInventory");a(fH,"refreshFileInventory");a(fl,"inventoryExtensions");a(Ri,"pathMatchesInventory");a(Xg,"inventoryPathWeight");a(qg,"formatInventorySummary")});function h_(t){let e=Cn(t);if(!Ye(t))return{ready:!1,builtAt:e?.builtAt??null,symbols:0,edges:0,files:0,languages:[],kinds:[],routes:[],hotspots:[],entryCandidates:[],packages:[],note:"No symbol index. Run `prjct sync` or `prjct code reindex`."};let r=sr(t),s=new Map,o=new Map,i=new Map,c=[],l=[];for(let f of r){s.set(f.kind,(s.get(f.kind)??0)+1),o.set(f.file,(o.get(f.file)??0)+1);let w=f.file.includes(".")?f.file.slice(f.file.lastIndexOf(".")):"(none)";i.set(w,(i.get(w)??0)+1),f.kind==="route"&&c.push({name:f.name,file:f.file,line:f.startLine}),f.exported&&hH.test(f.name)&&(f.kind==="function"||f.kind==="class")&&!/__tests__|\.test\.|\.spec\.|fixtures?\//i.test(f.file)&&l.push({name:f.name,file:f.file,kind:f.kind})}let u=[...o.keys()],d=[],p=Bm(t),m=u.length>400?u.slice(0,400):u;for(let f of m){let w=p.get(f)??0;w>0&&d.push({file:f,fanIn:w,symbolCount:o.get(f)??0})}d.sort((f,w)=>w.fanIn-f.fanIn);let g=new Set,y=it(t);if(y)for(let f of Object.keys(y.forward).slice(0,2e3)){let w=f.includes("/")?f.slice(0,f.indexOf("/")):f;w&&!w.startsWith(".")&&g.add(w)}for(let f of u.slice(0,2e3)){let w=f.includes("/")?f.slice(0,f.indexOf("/")):".";w&&w!=="."&&g.add(w)}if(l.length<8)for(let f of r){if(l.length>=12)break;f.exported&&f.kind==="class"&&!l.some(w=>w.file===f.file)&&l.push({name:f.name,file:f.file,kind:f.kind})}return{ready:!0,builtAt:e?.builtAt??null,symbols:e?.symbolCount??r.length,edges:e?.edgeCount??0,files:e?.fileCount??o.size,languages:[...i.entries()].map(([f,w])=>({ext:f,count:w})).sort((f,w)=>w.count-f.count).slice(0,12),kinds:[...s.entries()].map(([f,w])=>({kind:f,count:w})).sort((f,w)=>w.count-f.count),routes:c.slice(0,30),hotspots:d.slice(0,15),entryCandidates:l.slice(0,15),packages:[...g].sort().slice(0,40),note:"Structural only (symbol + import graphs). Narrative architecture lives in prjct analysis / memory decisions."}}var hH,y_=h(()=>{"use strict";nr();cn();hH=/^(main|index|app|server|cli|handler|router|bootstrap|init|start|run|default)$/i;a(h_,"buildArchitectureSnapshot")});function k_(t,e){let n=[];if(!t)return{hasChanges:!0,items:[{field:"Project style",type:"added",after:e.summary}],summary:{added:1,removed:0,changed:0},beforeCommit:null,afterCommit:e.commitHash};let r=t.payload,s=e.payload;r.stack.ecosystem!==s.stack.ecosystem&&n.push({field:"Ecosystem",type:"changed",before:r.stack.ecosystem,after:s.stack.ecosystem}),(r.stack.packageManager??"")!==(s.stack.packageManager??"")&&n.push({field:"Package manager",type:"changed",before:r.stack.packageManager??"(none)",after:s.stack.packageManager??"(none)"}),Jg("Languages",r.stack.languages,s.stack.languages,n),Jg("Frameworks",r.stack.frameworks,s.stack.frameworks,n),Jg("Key libraries",r.stack.keyLibraries,s.stack.keyLibraries,n),r.stack.hasTests!==s.stack.hasTests&&n.push({field:"Has tests",type:"changed",before:String(r.stack.hasTests),after:String(s.stack.hasTests)}),Kg("Pattern",r.patterns.map(l=>[l.key,l.name]),s.patterns.map(l=>[l.key,l.name]),n),Kg("Anti-pattern",r.antiPatterns.map(l=>[l.key,l.issue]),s.antiPatterns.map(l=>[l.key,l.issue]),n),Kg("Convention",r.conventions.map(l=>[l.key,l.rule]),s.conventions.map(l=>[l.key,l.rule]),n),r.structural.symbols!==s.structural.symbols&&(r.structural.symbols>0||s.structural.symbols>0)&&n.push({field:"Symbols",type:"changed",before:String(r.structural.symbols),after:String(s.structural.symbols)}),r.structural.files!==s.structural.files&&n.push({field:"Files",type:"changed",before:String(r.structural.files),after:String(s.structural.files)});let o=n.filter(l=>l.type==="added").length,i=n.filter(l=>l.type==="removed").length,c=n.filter(l=>l.type==="changed").length;return{hasChanges:n.length>0,items:n,summary:{added:o,removed:i,changed:c},beforeCommit:t.commitHash,afterCommit:e.commitHash}}function w_(t){if(!t.hasChanges)return`## Project evolution
1729
1729
 
1730
1730
  No style changes since last sync.`;let e=["## Project evolution (this sync)"];(t.beforeCommit||t.afterCommit)&&e.push(`> \`${E_(t.beforeCommit)}\` \u2192 \`${E_(t.afterCommit)}\``),e.push(""),e.push(`+${t.summary.added} \xB7 \u2212${t.summary.removed} \xB7 ~${t.summary.changed}`),e.push("");for(let n of t.items.slice(0,20)){let r=n.type==="added"?"+":n.type==="removed"?"\u2212":"~";n.type==="changed"?e.push(`- ${r} **${n.field}**: ${n.before} \u2192 ${n.after}`):n.type==="added"?e.push(`- ${r} **${n.field}**: ${n.after}`):e.push(`- ${r} **${n.field}**: ${n.before}`)}return e.join(`
1731
- `)}function E_(t){return t?t.length>7?t.slice(0,7):t:"(none)"}function Jg(t,e,n,r){let s=new Set(e.map(i=>i.toLowerCase())),o=new Set(n.map(i=>i.toLowerCase()));for(let i of n)s.has(i.toLowerCase())||r.push({field:t,type:"added",after:i});for(let i of e)o.has(i.toLowerCase())||r.push({field:t,type:"removed",before:i})}function Kg(t,e,n,r){let s=new Map(e),o=new Map(n);for(let[i,c]of o)s.has(i)?s.get(i)!==c&&r.push({field:t,type:"changed",before:s.get(i),after:c}):r.push({field:t,type:"added",after:c});for(let[i,c]of s)o.has(i)||r.push({field:t,type:"removed",before:c})}var S_=h(()=>{"use strict";a(k_,"generateProjectStyleDiff");a(w_,"formatProjectStyleDiffMd");a(E_,"short");a(Jg,"diffStringArray");a(Kg,"diffKeyed")});function to(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"item"}function or(t){return t?!!(t.architecture?.style&&t.architecture.style!=="unknown"||(t.patterns?.length??0)>0||(t.conventions?.length??0)>0||(t.antiPatterns?.length??0)>0||(t.stack?.frameworks?.length??0)>0||(t.stack?.languages?.length??0)>0):!1}function Yg(t){return!or(t)}function EH(t){let e=wH(t),n=SH(t.commands),r=or(t.llmAnalysis)?t.llmAnalysis:null,s=vH(r?.conventions?.map(l=>({key:to(l.category?`${l.category}-${l.rule}`:l.rule),rule:l.rule,category:l.category}))??[],t.memoryConventions?.map(l=>({key:to(l.category?`${l.category}-${l.rule}`:l.rule),rule:l.rule,category:l.category}))??[]),o=_H(r?.patterns?.map(l=>({key:to(l.name),name:l.name,description:l.description,locations:l.locations,category:l.category}))??[],t.memoryPatterns?.map(l=>({key:to(l.name),name:l.name,description:l.description}))??[]),i=xH(r?.antiPatterns?.map(l=>({key:to(l.issue),issue:l.issue,suggestion:l.suggestion,severity:l.severity}))??[],t.memoryAntiPatterns?.map(l=>({key:to(l.issue),issue:l.issue,suggestion:l.suggestion}))??[]);if(r?.stack?.languages?.length)for(let l of r.stack.languages)e.languages.includes(l)||e.languages.push(l);if(r?.stack?.frameworks?.length)for(let l of r.stack.frameworks)e.frameworks.includes(l)||e.frameworks.push(l);r?.stack?.packageManager&&!e.packageManager&&(e.packageManager=r.stack.packageManager);let c={symbols:t.structural?.symbols??0,files:t.structural?.files??t.stats.fileCount??0,packages:t.structural?.packages??[]};return{payloadVersion:1,stack:e,commands:n,conventions:s,patterns:o,antiPatterns:i,structural:c,metrics:{...t.metrics??{}}}}function v_(t){let e=EH(t),n=t.capturedAt??x();return{id:t.id??`style_${n.replace(/[^0-9]/g,"").slice(0,14)}_${Math.random().toString(36).slice(2,8)}`,capturedAt:n,commitHash:t.commitHash??null,source:t.source??"sync-mechanical",patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,conventionCount:e.conventions.length,frameworkCount:e.stack.frameworks.length,symbolCount:e.structural.symbols,fileCount:e.structural.files,summary:kH(e),payload:e}}function kH(t){let e=[t.stack.ecosystem!=="unknown"?t.stack.ecosystem:null,t.stack.languages.slice(0,2).join("+")||null,t.stack.frameworks.slice(0,3).join(", ")||null].filter(Boolean);return`${e.length>0?e.join(" \xB7 "):"stack unknown"}; ${t.patterns.length} patterns, ${t.antiPatterns.length} anti-patterns, ${t.conventions.length} conventions; ${t.structural.files} files`+(t.structural.symbols>0?`, ${t.structural.symbols} symbols`:"")}function wH(t){let e=T_([...t.stack.frameworks??[],...t.stats.frameworks??[]]),n=T_([...t.stats.languages??[]]),r=TH(t.packageDeps??{}),s=t.packageDeps??{};for(let i of r)["Hono","Express","Fastify","React","Next.js","Vue","NestJS"].includes(i)&&!e.includes(i)&&e.push(i);let o=t.stack.hasTesting===!0||!!(s.vitest||s.jest||s.mocha||s["bun-types"]||s["@types/bun"]||r.includes("Vitest")||r.includes("Jest"))||!!(t.commands?.test&&/test/i.test(t.commands.test));return{ecosystem:t.stats.ecosystem||"unknown",languages:n,frameworks:e,packageManager:t.packageManager??void 0,keyLibraries:r,hasTests:o,hasDocker:t.stack.hasDocker===!0}}function SH(t){return t?{test:t.test,lint:t.lint,build:t.build,dev:t.dev,install:t.install,format:t.format}:{}}function TH(t){let e=[];for(let n of yH)t[n]&&e.push(bH(n));return e.slice(0,16)}function bH(t){return{hono:"Hono",express:"Express",fastify:"Fastify",react:"React",next:"Next.js",vue:"Vue",vitest:"Vitest",jest:"Jest",typescript:"TypeScript",zod:"Zod","better-sqlite3":"better-sqlite3","@modelcontextprotocol/sdk":"MCP SDK",biome:"Biome",lefthook:"Lefthook","drizzle-orm":"Drizzle",prisma:"Prisma","@prisma/client":"Prisma"}[t]??t}function vH(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function _H(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function xH(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function T_(t){let e=[],n=new Set;for(let r of t){let s=r.trim();if(!s)continue;let o=s.toLowerCase();n.has(o)||(n.add(o),e.push(s))}return e}function hl(t,e={}){if(!t)return null;let n=e.maxConventions??5,r=e.maxPatterns??4,s=e.maxAnti??3,o=t.payload,i=["## How this repo works (project style)",""],c=[o.stack.ecosystem!=="unknown"?o.stack.ecosystem:null,o.stack.languages.join(", ")||null,o.stack.frameworks.join(", ")||null,o.stack.keyLibraries.slice(0,6).join(", ")||null].filter(Boolean);if(c.length>0&&i.push(`**Stack:** ${c.join(" \xB7 ")}`),o.conventions.length>0){i.push("","**Conventions (match):**");for(let l of o.conventions.slice(0,n))i.push(`- ${l.rule}`)}if(o.patterns.length>0){i.push("","**Patterns (match):**");for(let l of o.patterns.slice(0,r))i.push(`- **${l.name}** \u2014 ${b_(l.description,120)}`)}if(o.antiPatterns.length>0){i.push("","**Anti-patterns (avoid):**");for(let l of o.antiPatterns.slice(0,s))i.push(`- ${l.issue}${l.suggestion?` \u2192 ${b_(l.suggestion,80)}`:""}`)}return o.conventions.length===0&&o.patterns.length===0&&o.antiPatterns.length===0&&i.push("","_No durable house patterns yet \u2014 open a neighbor file and match local idiom. Prefer `prjct sync` + structured analysis-save-llm JSON to enrich._"),i.push("",`_${t.summary}_`),i.join(`
1732
- `)}function b_(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}var yH,yl=h(()=>{"use strict";te();yH=["zod","better-sqlite3","@modelcontextprotocol/sdk","chalk","chokidar","commander","express","fastify","hono","react","next","vue","vitest","jest","typescript","biome","lefthook","drizzle-orm","prisma","@prisma/client"];a(to,"stableStyleKey");a(or,"isRichLlmAnalysis");a(Yg,"isThinLlmAnalysis");a(EH,"buildProjectStylePayload");a(v_,"buildProjectStyleSnapshot");a(kH,"buildStyleSummary");a(wH,"buildStack");a(SH,"buildCommands");a(TH,"collectKeyLibraries");a(bH,"displayLibName");a(vH,"mergeConventions");a(_H,"mergePatterns");a(xH,"mergeAntiPatterns");a(T_,"unique");a(hl,"formatProjectStyleDigest");a(b_,"truncate")});var Qg={};A(Qg,{bridgeStyleToMemory:()=>I_,formatProjectStyleForSync:()=>MH,getActiveProjectStyle:()=>Ci,getProjectEvolution:()=>C_,persistProjectStyleSnapshot:()=>A_,recomputeProjectStyle:()=>AH,renderProjectEvolution:()=>CH});import El from"node:fs/promises";import kl from"node:path";function R_(t){let e=(()=>{try{return JSON.parse(t.payload_json)}catch{return RH()}})();return{id:t.id,capturedAt:t.captured_at,commitHash:t.commit_hash,source:t.source||"sync-mechanical",patternCount:t.pattern_count,antiPatternCount:t.anti_pattern_count,conventionCount:t.convention_count,frameworkCount:t.framework_count,symbolCount:t.symbol_count,fileCount:t.file_count,summary:t.summary,payload:e}}function RH(){return{payloadVersion:1,stack:{ecosystem:"unknown",languages:[],frameworks:[],keyLibraries:[],hasTests:!1,hasDocker:!1},commands:{},conventions:[],patterns:[],antiPatterns:[],structural:{symbols:0,files:0,packages:[]},metrics:{}}}function Ci(t){try{let e=S.get(t,"SELECT * FROM project_style_snapshots WHERE is_active = 1 ORDER BY captured_at DESC LIMIT 1");return e?R_(e):null}catch{return null}}function C_(t,e=12){try{return S.query(t,"SELECT * FROM project_style_snapshots ORDER BY captured_at DESC LIMIT ?",e).map(R_)}catch{return[]}}function CH(t,e=6){let n=C_(t,e);if(n.length===0)return null;let r=["## Project evolution"];if(n.length>=2){let s=n[0],o=n[n.length-1],i=s.patternCount-o.patternCount,c=s.conventionCount-o.conventionCount,l=s.fileCount-o.fileCount;r.push(`Over ${n.length} snapshots: patterns ${zg(i)}, conventions ${zg(c)}, files ${zg(l)}.`)}for(let s of n)r.push(`- ${s.capturedAt.slice(0,10)} \u2014 ${s.summary}`);return r.join(`
1731
+ `)}function E_(t){return t?t.length>7?t.slice(0,7):t:"(none)"}function Jg(t,e,n,r){let s=new Set(e.map(i=>i.toLowerCase())),o=new Set(n.map(i=>i.toLowerCase()));for(let i of n)s.has(i.toLowerCase())||r.push({field:t,type:"added",after:i});for(let i of e)o.has(i.toLowerCase())||r.push({field:t,type:"removed",before:i})}function Kg(t,e,n,r){let s=new Map(e),o=new Map(n);for(let[i,c]of o)s.has(i)?s.get(i)!==c&&r.push({field:t,type:"changed",before:s.get(i),after:c}):r.push({field:t,type:"added",after:c});for(let[i,c]of s)o.has(i)||r.push({field:t,type:"removed",before:c})}var S_=h(()=>{"use strict";a(k_,"generateProjectStyleDiff");a(w_,"formatProjectStyleDiffMd");a(E_,"short");a(Jg,"diffStringArray");a(Kg,"diffKeyed")});function to(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,64)||"item"}function or(t){return t?!!(t.architecture?.style&&t.architecture.style!=="unknown"||(t.patterns?.length??0)>0||(t.conventions?.length??0)>0||(t.antiPatterns?.length??0)>0||(t.stack?.frameworks?.length??0)>0||(t.stack?.languages?.length??0)>0):!1}function Yg(t){return!or(t)}function EH(t){let e=wH(t),n=SH(t.commands),r=or(t.llmAnalysis)?t.llmAnalysis:null,s=vH(r?.conventions?.map(l=>({key:to(l.category?`${l.category}-${l.rule}`:l.rule),rule:l.rule,category:l.category}))??[],t.memoryConventions?.map(l=>({key:to(l.category?`${l.category}-${l.rule}`:l.rule),rule:l.rule,category:l.category}))??[]),o=_H(r?.patterns?.map(l=>({key:to(l.name),name:l.name,description:l.description,locations:l.locations,category:l.category}))??[],t.memoryPatterns?.map(l=>({key:to(l.name),name:l.name,description:l.description}))??[]),i=xH(r?.antiPatterns?.map(l=>({key:to(l.issue),issue:l.issue,suggestion:l.suggestion,severity:l.severity}))??[],t.memoryAntiPatterns?.map(l=>({key:to(l.issue),issue:l.issue,suggestion:l.suggestion}))??[]);if(r?.stack?.languages?.length)for(let l of r.stack.languages)e.languages.includes(l)||e.languages.push(l);if(r?.stack?.frameworks?.length)for(let l of r.stack.frameworks)e.frameworks.includes(l)||e.frameworks.push(l);r?.stack?.packageManager&&!e.packageManager&&(e.packageManager=r.stack.packageManager);let c={symbols:t.structural?.symbols??0,files:t.structural?.files??t.stats.fileCount??0,packages:t.structural?.packages??[]};return{payloadVersion:1,stack:e,commands:n,conventions:s,patterns:o,antiPatterns:i,structural:c,metrics:{...t.metrics??{}}}}function v_(t){let e=EH(t),n=t.capturedAt??x();return{id:t.id??`style_${n.replace(/[^0-9]/g,"").slice(0,14)}_${Math.random().toString(36).slice(2,8)}`,capturedAt:n,commitHash:t.commitHash??null,source:t.source??"sync-mechanical",patternCount:e.patterns.length,antiPatternCount:e.antiPatterns.length,conventionCount:e.conventions.length,frameworkCount:e.stack.frameworks.length,symbolCount:e.structural.symbols,fileCount:e.structural.files,summary:kH(e),payload:e}}function kH(t){let e=[t.stack.ecosystem!=="unknown"?t.stack.ecosystem:null,t.stack.languages.slice(0,2).join("+")||null,t.stack.frameworks.slice(0,3).join(", ")||null].filter(Boolean);return`${e.length>0?e.join(" \xB7 "):"stack unknown"}; ${t.patterns.length} patterns, ${t.antiPatterns.length} anti-patterns, ${t.conventions.length} conventions; ${t.structural.files} files`+(t.structural.symbols>0?`, ${t.structural.symbols} symbols`:"")}function wH(t){let e=T_([...t.stack.frameworks??[],...t.stats.frameworks??[]]),n=T_([...t.stats.languages??[]]),r=TH(t.packageDeps??{}),s=t.packageDeps??{};for(let i of r)["Hono","Express","Fastify","React","Next.js","Vue","NestJS"].includes(i)&&!e.includes(i)&&e.push(i);let o=t.stack.hasTesting===!0||!!(s.vitest||s.jest||s.mocha||s["bun-types"]||s["@types/bun"]||r.includes("Vitest")||r.includes("Jest"))||!!(t.commands?.test&&/test/i.test(t.commands.test));return{ecosystem:t.stats.ecosystem||"unknown",languages:n,frameworks:e,packageManager:t.packageManager??void 0,keyLibraries:r,hasTests:o,hasDocker:t.stack.hasDocker===!0}}function SH(t){return t?{test:t.test,lint:t.lint,build:t.build,dev:t.dev,install:t.install,format:t.format}:{}}function TH(t){let e=new Set;for(let n of yH)t[n]&&e.add(bH(n));return[...e].slice(0,16)}function bH(t){return{hono:"Hono",express:"Express",fastify:"Fastify",react:"React",next:"Next.js",vue:"Vue",vitest:"Vitest",jest:"Jest",typescript:"TypeScript",zod:"Zod","better-sqlite3":"better-sqlite3","@modelcontextprotocol/sdk":"MCP SDK","@modelcontextprotocol/client":"MCP SDK","@modelcontextprotocol/server":"MCP SDK",biome:"Biome",lefthook:"Lefthook","drizzle-orm":"Drizzle",prisma:"Prisma","@prisma/client":"Prisma"}[t]??t}function vH(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function _H(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function xH(t,e){let n=new Map;for(let r of[...t,...e])n.has(r.key)||n.set(r.key,r);return[...n.values()].slice(0,40)}function T_(t){let e=[],n=new Set;for(let r of t){let s=r.trim();if(!s)continue;let o=s.toLowerCase();n.has(o)||(n.add(o),e.push(s))}return e}function hl(t,e={}){if(!t)return null;let n=e.maxConventions??5,r=e.maxPatterns??4,s=e.maxAnti??3,o=t.payload,i=["## How this repo works (project style)",""],c=[o.stack.ecosystem!=="unknown"?o.stack.ecosystem:null,o.stack.languages.join(", ")||null,o.stack.frameworks.join(", ")||null,o.stack.keyLibraries.slice(0,6).join(", ")||null].filter(Boolean);if(c.length>0&&i.push(`**Stack:** ${c.join(" \xB7 ")}`),o.conventions.length>0){i.push("","**Conventions (match):**");for(let l of o.conventions.slice(0,n))i.push(`- ${l.rule}`)}if(o.patterns.length>0){i.push("","**Patterns (match):**");for(let l of o.patterns.slice(0,r))i.push(`- **${l.name}** \u2014 ${b_(l.description,120)}`)}if(o.antiPatterns.length>0){i.push("","**Anti-patterns (avoid):**");for(let l of o.antiPatterns.slice(0,s))i.push(`- ${l.issue}${l.suggestion?` \u2192 ${b_(l.suggestion,80)}`:""}`)}return o.conventions.length===0&&o.patterns.length===0&&o.antiPatterns.length===0&&i.push("","_No durable house patterns yet \u2014 open a neighbor file and match local idiom. Prefer `prjct sync` + structured analysis-save-llm JSON to enrich._"),i.push("",`_${t.summary}_`),i.join(`
1732
+ `)}function b_(t,e){let n=t.replace(/\s+/g," ").trim();return n.length>e?`${n.slice(0,e-1)}\u2026`:n}var yH,yl=h(()=>{"use strict";te();yH=["zod","better-sqlite3","@modelcontextprotocol/sdk","@modelcontextprotocol/client","@modelcontextprotocol/server","chalk","chokidar","commander","express","fastify","hono","react","next","vue","vitest","jest","typescript","biome","lefthook","drizzle-orm","prisma","@prisma/client"];a(to,"stableStyleKey");a(or,"isRichLlmAnalysis");a(Yg,"isThinLlmAnalysis");a(EH,"buildProjectStylePayload");a(v_,"buildProjectStyleSnapshot");a(kH,"buildStyleSummary");a(wH,"buildStack");a(SH,"buildCommands");a(TH,"collectKeyLibraries");a(bH,"displayLibName");a(vH,"mergeConventions");a(_H,"mergePatterns");a(xH,"mergeAntiPatterns");a(T_,"unique");a(hl,"formatProjectStyleDigest");a(b_,"truncate")});var Qg={};A(Qg,{bridgeStyleToMemory:()=>I_,formatProjectStyleForSync:()=>MH,getActiveProjectStyle:()=>Ci,getProjectEvolution:()=>C_,persistProjectStyleSnapshot:()=>A_,recomputeProjectStyle:()=>AH,renderProjectEvolution:()=>CH});import El from"node:fs/promises";import kl from"node:path";function R_(t){let e=(()=>{try{return JSON.parse(t.payload_json)}catch{return RH()}})();return{id:t.id,capturedAt:t.captured_at,commitHash:t.commit_hash,source:t.source||"sync-mechanical",patternCount:t.pattern_count,antiPatternCount:t.anti_pattern_count,conventionCount:t.convention_count,frameworkCount:t.framework_count,symbolCount:t.symbol_count,fileCount:t.file_count,summary:t.summary,payload:e}}function RH(){return{payloadVersion:1,stack:{ecosystem:"unknown",languages:[],frameworks:[],keyLibraries:[],hasTests:!1,hasDocker:!1},commands:{},conventions:[],patterns:[],antiPatterns:[],structural:{symbols:0,files:0,packages:[]},metrics:{}}}function Ci(t){try{let e=S.get(t,"SELECT * FROM project_style_snapshots WHERE is_active = 1 ORDER BY captured_at DESC LIMIT 1");return e?R_(e):null}catch{return null}}function C_(t,e=12){try{return S.query(t,"SELECT * FROM project_style_snapshots ORDER BY captured_at DESC LIMIT ?",e).map(R_)}catch{return[]}}function CH(t,e=6){let n=C_(t,e);if(n.length===0)return null;let r=["## Project evolution"];if(n.length>=2){let s=n[0],o=n[n.length-1],i=s.patternCount-o.patternCount,c=s.conventionCount-o.conventionCount,l=s.fileCount-o.fileCount;r.push(`Over ${n.length} snapshots: patterns ${zg(i)}, conventions ${zg(c)}, files ${zg(l)}.`)}for(let s of n)r.push(`- ${s.capturedAt.slice(0,10)} \u2014 ${s.summary}`);return r.join(`
1733
1733
  `)}function zg(t){return t>=0?`+${t}`:`${t}`}function A_(t,e){S.transaction(t,n=>{n.prepare("UPDATE project_style_snapshots SET is_active = 0 WHERE is_active = 1").run(),n.prepare(`INSERT INTO project_style_snapshots (
1734
1734
  id, captured_at, commit_hash, source,
1735
1735
  pattern_count, anti_pattern_count, convention_count, framework_count,