prjct-cli 1.30.0 → 1.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/bin/prjct-core.mjs +13 -13
- package/dist/daemon/entry.mjs +12 -12
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.30.1] - 2026-02-12
|
|
4
|
+
|
|
5
|
+
### Bug Fixes
|
|
6
|
+
|
|
7
|
+
- guard analysis array accesses against undefined (n.push crash) (#178)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## [1.30.1] - 2026-02-11
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- current work
|
|
14
|
+
|
|
3
15
|
## [1.30.0] - 2026-02-12
|
|
4
16
|
|
|
5
17
|
### Features
|
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -419,7 +419,7 @@ Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
|
419
419
|
|
|
420
420
|
${r}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Cn.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function jP(s,e){let t=wg(e),n=new Map;for(let[p,g]of Object.entries(AP)){if(p==="general"||!t.includes(p))continue;let f=0;for(let k of g)s.match(new RegExp(k,"gi"))&&(f+=k.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Jd;let r=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=r[0][0],i=r[0][1],a=r.slice(1,3).map(([p])=>p),c=r.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=DP(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function wg(s){let e=[];return s.domains.hasFrontend&&e.push("frontend"),s.domains.hasBackend&&e.push("backend"),s.domains.hasDatabase&&e.push("database"),s.domains.hasTesting&&e.push("testing"),s.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function DP(s){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[s]||e.general}var xP,AP,Fl,RP,kg,Sg=y(()=>{"use strict";Ir();Lo();N();xP=3600*1e3;l(gg,"hashDescription");l(fg,"loadCache");l(Ol,"saveCache");l(TP,"lookupCache");l(EP,"lookupPatterns");l(IP,"classifyWithLLM");AP={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(jP,"classifyWithHeuristic");l(wg,"buildAvailableDomains");l(DP,"getFilePatterns");Fl=class{static{l(this,"DomainClassifier")}async classify(e,t,n,r){let o=gg(e),i=await fg(n),a=TP(i,o,t);if(a)return{classification:a,source:"cache"};let c=EP(i,o);if(c)return{classification:c,source:"history"};let u=await IP(e,r);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await Ol(n,i),{classification:u,source:"llm"};let d=jP(e,r);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await Ol(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let r=gg(e),o=await fg(n);o.confirmedPatterns.some(i=>i.descriptionHash===r)||(o.confirmedPatterns.push({descriptionHash:r,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await Ol(n,o))}},RP=new Fl,kg=RP});import{exec as $P}from"node:child_process";import to from"node:fs/promises";import MP from"node:os";import ns from"node:path";import{promisify as OP}from"node:util";var bg,Cg,_l,FP,zi,Nl=y(()=>{"use strict";jl();qe();Se();xs();Bt();Li();Dl();Gi();N();Zn();Sg();In();bg=OP($P),Cg=["database","backend","frontend","testing","devops"],_l=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let r=await R.getProjectId(n),o=I.getGlobalProjectPath(r),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,r,i),u=await this.loadAgents(a,r),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(r),this.loadVelocityContext(r)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((H,ee)=>{if(H.status==="fulfilled")return H.value;g.push(p[ee]),console.warn(`Context tool "${p[ee]}" failed: ${w(H.reason)}`)}),[k,b,D]=f,v={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},$=this.shouldFragment(a,t),F=null;return $&&e==="task"&&(F=await this.createSubtasks(t,a,u,r)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:$,subtasks:F,project:{id:r,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:k,sealedAnalysis:b??null,velocityContext:D??null,contextDegradation:v}}async gatherRealContext(e,t){try{let[n,r,o]=await Promise.all([this.getGitState(t),es(e,t,{maxFiles:10,minScore:.15}),Qr(t,{commits:10,maxFiles:10})]),i=r.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await $n(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
421
421
|
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:r.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([bg("git branch --show-current",{cwd:e}),bg("git status --porcelain",{cwd:e})]),r=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
422
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await bt.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=_i(t,Pn);return n.sprints.length===0?null:cg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ns.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let r=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await kg.classify(e,t,r,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=ns.join(e,"agents");return(await to.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),r=ns.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=ns.join(r,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ai(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(r=>r.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ns.join(MP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let r=Array.from(n.keys()).map(async i=>{let a=ns.join(t,`${i}.md`),c=ns.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(r)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],r=t.toLowerCase();for(let i of n)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,r){let o=[...t].sort((a,c)=>{let u=Cg.indexOf(a),d=Cg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},FP=new _l,zi=FP});function _P(s,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[s]||{title:"Confirmation Required",message:`Execute ${s}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Ll,NP,_e,Pg=y(()=>{"use strict";Lt();le();un();un();l(_P,"generateApprovalPrompt");Ll=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return yc.includes(e)}isDestructive(e){return wc.includes(e)}isToolAllowedInPlanning(e){return Vo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Vo.includes(n)):t}startPlanning(e,t,n){let r={id:ge(),projectId:e,command:t,params:n,status:oe.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[oe.GATHERING,oe.ANALYZING,oe.PROPOSING,oe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===oe.APPROVED?n.approvedAt=C():t===oe.EXECUTING?n.executionStartedAt=C():(t===oe.COMPLETED||t===oe.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=oe.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=oe.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==oe.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=oe.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=oe.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==oe.APPROVED?null:(t.status=oe.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==oe.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==oe.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=oe.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let r={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),r}generateApprovalPrompt(e,t){return _P(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[oe.GATHERING]:"\u{1F50D}",[oe.ANALYZING]:"\u{1F9E0}",[oe.PROPOSING]:"\u{1F4DD}",[oe.PENDING_APPROVAL]:"\u23F3",[oe.APPROVED]:"\u2705",[oe.EXECUTING]:"\u26A1",[oe.COMPLETED]:"\u{1F389}",[oe.REJECTED]:"\u274C",[oe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===oe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
|
|
422
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:r,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await bt.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await gt.getAll(e);if(t.length===0)return null;let n=_i(t,Pn);return n.sprints.length===0?null:cg(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=ns.join(e,"analysis","repo-analysis.json"),n=await to.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return P(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let r=I.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(r),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await L.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await kg.classify(e,t,r,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=ns.join(e,"agents");return(await to.readdir(t)).filter(r=>r.endsWith(".md")).map(r=>r.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=I.getGlobalProjectPath(t),r=ns.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=ns.join(r,u);try{let m=await to.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=ai(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(r=>r.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=ns.join(MP.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let r=Array.from(n.keys()).map(async i=>{let a=ns.join(t,`${i}.md`),c=ns.join(t,i,"SKILL.md");try{let u=await to.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await to.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(r)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],r=t.toLowerCase();for(let i of n)if(r.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,r){let o=[...t].sort((a,c)=>{let u=Cg.indexOf(a),d=Cg.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await L.createSubtasks(r,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let r={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${r} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},FP=new _l,zi=FP});function _P(s,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[s]||{title:"Confirmation Required",message:`Execute ${s}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var Ll,NP,_e,Pg=y(()=>{"use strict";Lt();le();un();un();l(_P,"generateApprovalPrompt");Ll=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return yc.includes(e)}isDestructive(e){return wc.includes(e)}isToolAllowedInPlanning(e){return Vo.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>Vo.includes(n)):t}startPlanning(e,t,n){let r={id:ge(),projectId:e,command:t,params:n,status:oe.GATHERING,startedAt:C(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,r),r}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[oe.GATHERING,oe.ANALYZING,oe.PROPOSING,oe.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:C()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===oe.APPROVED?n.approvedAt=C():t===oe.EXECUTING?n.executionStartedAt=C():(t===oe.COMPLETED||t===oe.ABORTED)&&(n.completedAt=C()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=oe.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=oe.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==oe.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=oe.APPROVED,n.approvedAt=C(),n.steps=(n.proposedPlan?.steps||[]).map((r,o)=>({index:o,description:typeof r=="string"?r:r.description||"",status:"pending",tool:typeof r=="string"?void 0:r.tool,args:typeof r=="string"?void 0:r.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=oe.REJECTED,n.userFeedback=t,n.completedAt=C(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==oe.APPROVED?null:(t.status=oe.EXECUTING,t.executionStartedAt=C(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==oe.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==oe.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=C(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=oe.COMPLETED,t.completedAt=C();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(r=>r.status==="completed").length,failedSteps:t.steps.filter(r=>r.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=oe.ABORTED,n.completedAt=C(),n.abortReason=t;let r={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),r}generateApprovalPrompt(e,t){return _P(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let r=[`${{[oe.GATHERING]:"\u{1F50D}",[oe.ANALYZING]:"\u{1F9E0}",[oe.PROPOSING]:"\u{1F4DD}",[oe.PENDING_APPROVAL]:"\u23F3",[oe.APPROVED]:"\u2705",[oe.EXECUTING]:"\u26A1",[oe.COMPLETED]:"\u{1F389}",[oe.REJECTED]:"\u274C",[oe.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===oe.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);r.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return r.join(`
|
|
423
423
|
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),r=Math.floor(n/1e3),o=Math.floor(r/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${r%60}s`:`${r}s`}},NP=new Ll,_e=NP});function LP(s){let e=s.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Wi[t]?Wi[t]:Wi[e]?Wi[e]:e}function Bi(s){let e=new Set,t=[];for(let n of s){let r=LP(n);e.has(r)||(e.add(r),t.push(n))}return t}var Wi,Ul=y(()=>{"use strict";Wi={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(LP,"normalizeFrameworkName");l(Bi,"deduplicateTechStack")});import{z as Ne}from"zod";function vg(s){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
424
424
|
`);let t=[];s.language&&t.push(s.language),s.framework&&t.push(s.framework);let n=s.techStack??[];t.push(...n);let r=s.analysisLanguages??[],o=s.analysisFrameworks??[];t.push(...r,...o);let i=Bi(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),s.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${s.analysisPackageManager}`),s.domains){let c=Object.entries(s.domains).filter(([,u])=>!u).map(([u])=>UP[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=s.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${s.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),s.fileCount&&e.push(`
|
|
425
425
|
Context: ${s.fileCount} files in project.`),e.join(`
|
|
@@ -445,17 +445,17 @@ ${j}
|
|
|
445
445
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
446
446
|
`),d.push(`**Primary Domain**: ${u.primaryDomain}
|
|
447
447
|
`),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
448
|
-
`),S){if(S.languages
|
|
449
|
-
`),S.frameworks
|
|
448
|
+
`),S){if(S.languages?.length>0&&d.push(`**Languages**: ${S.languages.join(", ")}
|
|
449
|
+
`),S.frameworks?.length>0&&d.push(`**Frameworks**: ${S.frameworks.join(", ")}
|
|
450
450
|
`),S.packageManager&&d.push(`**Package Manager**: ${S.packageManager}
|
|
451
451
|
`),S.sourceDir&&d.push(`**Source Dir**: ${S.sourceDir}
|
|
452
452
|
`),S.testDir&&d.push(`**Test Dir**: ${S.testDir}
|
|
453
453
|
`),d.push(`**Files Analyzed**: ${S.fileCount}
|
|
454
454
|
`),d.push(`**Analysis Status**: ${S.status}${S.commitHash?` (commit: ${S.commitHash.slice(0,8)})`:""}
|
|
455
|
-
`),S.patterns
|
|
455
|
+
`),S.patterns?.length>0){d.push(`
|
|
456
456
|
### Code Patterns (Follow These)
|
|
457
457
|
`);for(let j of S.patterns)d.push(`- **${j.name}**: ${j.description}${j.location?` (${j.location})`:""}
|
|
458
|
-
`)}if(S.antiPatterns
|
|
458
|
+
`)}if(S.antiPatterns?.length>0){d.push(`
|
|
459
459
|
### Anti-Patterns (Avoid These)
|
|
460
460
|
`);for(let j of S.antiPatterns)d.push(`- **${j.issue}** in \`${j.file}\` \u2014 ${j.suggestion}
|
|
461
461
|
`)}}d.push(`
|
|
@@ -823,10 +823,10 @@ Status: Draft
|
|
|
823
823
|
|
|
824
824
|
${e.join(`
|
|
825
825
|
`)}
|
|
826
|
-
`:""}function Yv(s){let e=[];return s.patterns
|
|
826
|
+
`:""}function Yv(s){let e=[];return s.patterns?.length>0&&e.push(`
|
|
827
827
|
### Code Patterns (Follow These)
|
|
828
828
|
|
|
829
|
-
${oo(s.patterns)}`),s.antiPatterns
|
|
829
|
+
${oo(s.patterns)}`),s.antiPatterns?.length>0&&e.push(`
|
|
830
830
|
### Anti-Patterns (Avoid These)
|
|
831
831
|
|
|
832
832
|
${io(s.antiPatterns)}`),e.push(kf(s)),e.join(`
|
|
@@ -903,11 +903,11 @@ Load from \`~/.prjct-cli/projects/${s.projectId}/agents/\`:
|
|
|
903
903
|
|
|
904
904
|
**Workflow**: ${s.agents.workflow.join(", ")}
|
|
905
905
|
**Domain**: ${s.agents.domain.join(", ")||"none"}
|
|
906
|
-
`}function Qv(s,e){let t=s.sources||cs(),n=[];if(n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`),n.push(""),n.push($t(t.languages)),n.push("## Tech Stack"),s.languages.length>0&&n.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- Frameworks: ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${s.commands.install}\``),n.push(`- Dev: \`${s.commands.dev}\``),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),s.analysis){s.analysis.patterns
|
|
907
|
-
`)}function Zv(s,e){let t=s.sources||cs(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${s.name}, a ${s.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${s.projectType}`),n.push(`- Stack: ${s.frameworks.join(", ")||s.ecosystem}`),n.push(""),s.analysis?(s.analysis.patterns
|
|
908
|
-
`)}function ex(s,e){let t=s.sources||cs(),n=[];return n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${s.name}`),n.push(""),n.push(`${s.projectType} project using ${s.ecosystem}.`),n.push(""),n.push($t(t.languages)),n.push("## Stack"),n.push(`- ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(s.commands.install),n.push("# Dev"),n.push(s.commands.dev),n.push("# Test"),n.push(s.commands.test),n.push("# Build"),n.push(s.commands.build),n.push("```"),n.push(""),s.analysis?(s.analysis.patterns
|
|
906
|
+
`}function Qv(s,e){let t=s.sources||cs(),n=[];if(n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`),n.push(""),n.push($t(t.languages)),n.push("## Tech Stack"),s.languages.length>0&&n.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- Frameworks: ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Install: \`${s.commands.install}\``),n.push(`- Dev: \`${s.commands.dev}\``),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.push(""),s.analysis){s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)),n.push(""));let r=kf(s.analysis);r&&(n.push(r.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
907
|
+
`)}function Zv(s,e){let t=s.sources||cs(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${s.name}, a ${s.ecosystem} project.`),n.push(""),n.push($t(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${s.projectType}`),n.push(`- Stack: ${s.frameworks.join(", ")||s.ecosystem}`),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns,5)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(io(s.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push($t(t.commands)),n.push("## Commands"),n.push(`- Test: \`${s.commands.test}\``),n.push(`- Build: \`${s.commands.build}\``),n.join(`
|
|
908
|
+
`)}function ex(s,e){let t=s.sources||cs(),n=[];return n.push("---"),n.push(`description: prjct context for ${s.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${s.name}`),n.push(""),n.push(`${s.projectType} project using ${s.ecosystem}.`),n.push(""),n.push($t(t.languages)),n.push("## Stack"),n.push(`- ${s.languages.join(", ")}`),s.frameworks.length>0&&n.push(`- ${s.frameworks.join(", ")}`),n.push(""),n.push($t(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(s.commands.install),n.push("# Dev"),n.push(s.commands.dev),n.push("# Test"),n.push(s.commands.test),n.push("# Build"),n.push(s.commands.build),n.push("```"),n.push(""),s.analysis?(s.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(oo(s.analysis.patterns)),n.push("")),s.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(io(s.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
909
909
|
`)}function tx(s,e){let t=[`You are working on ${s.name}, a ${s.projectType} ${s.ecosystem} project.`,"",`Stack: ${s.languages.join(", ")}${s.frameworks.length>0?` with ${s.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${s.commands.install}`,`- Dev: ${s.commands.dev}`,`- Test: ${s.commands.test}`,`- Build: ${s.commands.build}`];if(s.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of s.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(s.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of s.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}s.analysis||t.push("","Run `p. sync` to populate project intelligence.");let r={systemMessage:t.join(`
|
|
910
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${s.commands.test}`}]};return JSON.stringify(r,null,2)}function nx(s,e){let t=[];return t.push(`# ${s.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),s.languages.length>0&&t.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&t.push(`- Frameworks: ${s.frameworks.join(", ")}`),s.analysis?.packageManager&&t.push(`- Package Manager: ${s.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${s.commands.install}\` |`),t.push(`| Dev | \`${s.commands.dev}\` |`),t.push(`| Test | \`${s.commands.test}\` |`),t.push(`| Build | \`${s.commands.build}\` |`),t.push(""),(s.analysis?.sourceDir||s.analysis?.testDir)&&(t.push("## Project Structure"),s.analysis.sourceDir&&t.push(`- Source: \`${s.analysis.sourceDir}/\``),s.analysis.testDir&&t.push(`- Tests: \`${s.analysis.testDir}/\``),t.push("")),s.analysis?(s.analysis.patterns
|
|
910
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${s.commands.test}`}]};return JSON.stringify(r,null,2)}function nx(s,e){let t=[];return t.push(`# ${s.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),s.languages.length>0&&t.push(`- Languages: ${s.languages.join(", ")}`),s.frameworks.length>0&&t.push(`- Frameworks: ${s.frameworks.join(", ")}`),s.analysis?.packageManager&&t.push(`- Package Manager: ${s.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${s.commands.install}\` |`),t.push(`| Dev | \`${s.commands.dev}\` |`),t.push(`| Test | \`${s.commands.test}\` |`),t.push(`| Build | \`${s.commands.build}\` |`),t.push(""),(s.analysis?.sourceDir||s.analysis?.testDir)&&(t.push("## Project Structure"),s.analysis.sourceDir&&t.push(`- Source: \`${s.analysis.sourceDir}/\``),s.analysis.testDir&&t.push(`- Tests: \`${s.analysis.testDir}/\``),t.push("")),s.analysis?(s.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(oo(s.analysis.patterns)),t.push("")),s.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(io(s.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
|
|
911
911
|
`)}function Sf(s){return{claude:Xv,cursor:Qv,copilot:Zv,windsurf:ex,continue:tx,codex:nx}[s]||null}var cu=y(()=>{"use strict";au();l(oo,"formatPatterns");l(io,"formatAntiPatterns");l(kf,"formatStructure");l(Yv,"formatAnalysisForClaude");l(Xv,"formatForClaude");l(Qv,"formatForCursor");l(Zv,"formatForCopilot");l(ex,"formatForWindsurf");l(tx,"formatForContinue");l(nx,"formatForCodex");l(Sf,"getFormatter")});import{exec as sx}from"node:child_process";import rx from"node:os";import Gs from"node:path";import{promisify as ox}from"node:util";function bf(s){return oa[s]||null}async function ra(s){try{return await ix(`which ${s}`),!0}catch{return!1}}async function ia(s=process.cwd()){let e=[];return await ra("claude")&&e.push("claude"),(await ra("cursor")||await x(Gs.join(s,".cursor")))&&e.push("cursor"),await x(Gs.join(s,".github"))&&e.push("copilot"),(await ra("windsurf")||await x(Gs.join(s,".windsurf")))&&e.push("windsurf"),(await x(Gs.join(s,".continue"))||await x(Gs.join(rx.homedir(),".continue")))&&e.push("continue"),(await ra("codex")||await x(Gs.join(s,".agents")))&&e.push("codex"),e}async function Cf(s,e=process.cwd()){if(s==="auto"){let t=await ia(e);return t.length>0?t:["claude"]}return s==="all"?ax:s.filter(t=>oa[t])}var ix,oa,ao,ax,lu=y(()=>{"use strict";ve();ix=ox(sx),oa={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},ao=["claude"],ax=Object.keys(oa);l(bf,"getAIToolConfig");l(ra,"commandExists");l(ia,"detectInstalledTools");l(Cf,"resolveToolIds")});import uu from"node:fs/promises";import du from"node:path";async function Pf(s,e,t,n=ao){let r=[];for(let o of n){let i=bf(o);if(!i){r.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await cx(s,i,e,t);r.push(a)}return r}async function cx(s,e,t,n){let r=Sf(e.id);if(!r)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=r(s,e),i;e.outputPath==="repo"?i=du.join(n,e.outputFile):i=du.join(t,"context",e.outputFile),await uu.mkdir(du.dirname(i),{recursive:!0});try{let a=await uu.readFile(i,"utf-8"),c=Vc(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=Bc(o,a)}catch{}return await uu.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var vf=y(()=>{"use strict";N();Jc();cu();lu();l(Pf,"generateAIToolContexts");l(cx,"generateForTool")});var xf=y(()=>{"use strict";cu();vf();lu()});import co from"node:fs/promises";import lo from"node:path";var pu,Tf,mu,Ef,If=y(()=>{"use strict";N();pu=".prjct/.prjct-state.md",Tf=".prjct-state.md",mu=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=lo.join(e,pu);await co.mkdir(lo.dirname(n),{recursive:!0});let r=this.toMarkdown(t);await co.writeFile(n,r,"utf-8");try{let o=lo.join(e,Tf);await co.unlink(o)}catch(o){if(!P(o))throw o}}async remove(e){for(let t of[pu,Tf])try{await co.unlink(lo.join(e,t))}catch(n){if(!P(n))throw n}}async exists(e){let t=lo.join(e,pu);try{return await co.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let r=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(r/o*100);t.push(`**Progress**: ${r}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
912
912
|
`)}},Ef=new mu});import gu from"node:fs/promises";import lx from"node:os";import Af from"node:path";function fu(){return Af.join(lx.homedir(),".prjct-cli","skills",ux)}function dx(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function uo(){try{let s=await gu.readFile(fu(),"utf-8");return JSON.parse(s)}catch{return dx()}}async function hu(s){let e=fu();await gu.mkdir(Af.dirname(e),{recursive:!0}),s.generatedAt=new Date().toISOString(),await gu.writeFile(e,JSON.stringify(s,null,2),"utf-8")}async function px(s){let e=await uo();e.skills[s.name]=s,await hu(e)}async function mx(s){let e=await uo();return s in e.skills?(delete e.skills[s],await hu(e),!0):!1}async function gx(s){return(await uo()).skills[s]||null}async function fx(){return(await uo()).skills}function hx(){return fu()}var ux,po,jf=y(()=>{"use strict";ux=".skill-lock.json";l(fu,"getLockFilePath");l(dx,"createEmptyLockFile");l(uo,"read");l(hu,"write");l(px,"addEntry");l(mx,"removeEntry");l(gx,"getEntry");l(fx,"getAll");l(hx,"getPath");po={read:uo,write:hu,addEntry:px,removeEntry:mx,getEntry:gx,getAll:fx,getPath:hx}});import{exec as yx}from"node:child_process";import gn from"node:fs/promises";import wu from"node:os";import it from"node:path";import{promisify as wx}from"node:util";import{glob as Df}from"glob";function $f(s){if(s.startsWith("./")||s.startsWith("/")||s.startsWith("~")){let n=s.startsWith("~")?it.join(wu.homedir(),s.slice(1)):it.resolve(s);return{type:"local",localPath:n,url:n}}let e=s.indexOf("@");if(e>0){let n=s.slice(0,e),r=s.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:r,url:`https://github.com/${o}/${i}`}}let t=s.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${s}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Mf(s){let e=[];try{let r=it.join(s,"SKILL.md");await gn.access(r);let o=it.basename(s);e.push({name:o,filePath:r})}catch{}let t=await Df("*/SKILL.md",{cwd:s,absolute:!0});for(let r of t){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}let n=await Df("skills/*/SKILL.md",{cwd:s,absolute:!0});for(let r of n){let o=it.basename(it.dirname(r));e.some(i=>i.name===o)||e.push({name:o,filePath:r})}return e}function kx(s,e,t){let n=new Date().toISOString(),r=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&r.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=s.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
913
913
|
${r.join(`
|
|
@@ -959,7 +959,7 @@ Domain specialist for ${s} tasks.
|
|
|
959
959
|
You are the ${s} expert for this project. Apply best practices for the detected stack.
|
|
960
960
|
`}function Uf(s,e,t){let n=[];for(let o of s)o.skill&&n.push({agent:o.name,skill:o.skill});let r={projectId:e,syncedAt:C(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return Mt.writeFile(Pt.join(t,"config","skills.json"),JSON.stringify(r,null,2),"utf-8").catch(o=>{U.debug("Failed to write skills.json",{error:re(o)})}),n}async function Hf(s){let e=[];try{let t=Pt.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await Mt.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of s){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=Pt.join(vx.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=Pt.join(a,d,"SKILL.md"),p=Pt.join(a,`${d}.md`),g=!1;try{await Mt.access(m),g=!0}catch{try{await Mt.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),k;f.length===3?k=`${f[0]}/${f[1]}@${f[2]}`:k=c;let b=await Of.install(k);b.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),U.info(`Installed skill: ${d} for agent: ${u}`)):b.errors.length>0?(e.push({name:d,agent:u,status:"error"}),U.debug(`Failed to install skill ${d}`,{errors:b.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),U.debug(`Skill install error for ${d}`,{error:re(f)})}}}catch(t){U.debug("Skill auto-installation failed (non-critical)",{error:re(t)})}return e}var Gf=y(()=>{"use strict";In();ln();le();Gn();Ff();l(_f,"generateAgents");l(Nf,"loadExistingAgents");l(Lf,"resolveTemplateIncludes");l(xx,"generateWorkflowAgent");l(Tx,"generateDomainAgent");l(Ex,"injectFeedbackSection");l(Ix,"generateMinimalWorkflowAgent");l(Ax,"generateMinimalDomainAgent");l(Uf,"configureSkills");l(Hf,"autoInstallSkills")});import zf from"node:fs/promises";import Wf from"node:path";var aa,Bf=y(()=>{"use strict";aa=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(r=>e[r])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(r=>e[r])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Wf.join(this.projectPath,"package.json"),t=await zf.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await zf.access(Wf.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as jx}from"node:child_process";import Vf from"node:fs/promises";import Su from"node:path";import{promisify as Dx}from"node:util";async function Jf(s){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await ls("git branch --show-current",{cwd:s});e.branch=t.trim()||"main";let{stdout:n}=await ls("git rev-list --count HEAD",{cwd:s});e.commits=parseInt(n.trim(),10)||0;let{stdout:r}=await ls("git shortlog -sn --all | wc -l",{cwd:s});e.contributors=parseInt(r.trim(),10)||0;let{stdout:o}=await ls("git status --porcelain",{cwd:s}),i=o.trim().split(`
|
|
961
961
|
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await ls('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:s});e.recentCommits=a.split(`
|
|
962
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ls('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function rn(s,e){try{return await Vf.access(Su.join(s,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:re(t)}),!1}}async function qf(s){let e={fileCount:0,version:"0.0.0",name:Su.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ls('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:s,error:re(t)}),e.fileCount=0}try{let t=Su.join(s,"package.json"),n=JSON.parse(await Vf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:s,error:re(t)})}return await rn(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(s,"requirements.txt")||await rn(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Kf(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rn(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rn(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rn(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rn(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Yf(s,e){let t=cs(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Xf(s){return new aa(s).detect()}var ls,Qf=y(()=>{"use strict";ln();au();Gn();Bf();ls=Dx(jx);l(Jf,"analyzeGit");l(rn,"fileExists");l(qf,"gatherStats");l(Kf,"detectCommands");l(Yf,"buildSources");l(Xf,"detectStack")});import{exec as Rx}from"node:child_process";import bu from"node:fs/promises";import ca from"node:path";import{promisify as $x}from"node:util";var Mx,Cu,Pu,Zf,eh=y(()=>{"use strict";Bt();N();Mx=$x(Rx),Cu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=ca.join(s,r);try{await bu.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=ca.basename(s);try{await L.read(n)}catch(r){P(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=ca.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await bu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bu.readFile(ca.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cu.contextFilesExist(t),Cu.jsonFilesValid(t),Cu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Mx(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Zf=new Pu});import la from"node:fs/promises";import ua from"node:path";var da,us,vu=y(()=>{"use strict";Ms();sf();df();gf();wf();su();ln();An();qe();Se();Ti();vn();ye();jr();Wr();Ii();Dr();Rr();Mr();xf();le();Gn();kl();Sl();If();ol();Gf();Qf();eh();da=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let o=(await ia(e)).filter(i=>!ao.includes(i));r=[...ao,...o]}else t.aiTools[0]==="auto"?(r=await ia(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Cf("all",e):r=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let _=await Ei(this.projectId);_>0&&U.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){U.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([Jf(this.projectPath),qf(this.projectPath),Kf(this.projectPath),Xf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&mf(this.projectId))try{let{diff:_,currentHashes:ms}=await iu(this.projectPath,this.projectId),ko=_.added.length+_.modified.length+_.deleted.length;if(ko===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let $a=lf(_,this.projectId);f=uf($a.allAffected);let Ry=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=$a.allAffected.some(Ln=>{let $y=Ln.substring(Ln.lastIndexOf("."));return Ry.has($y)}),g=$a.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:ko,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ou(this.projectId,ms)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await iu(this.projectPath,this.projectId);ou(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([nf(this.projectPath,this.projectId),cf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId)])}catch(_){U.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await _f(this.globalPath,u,a,k):await Nf(this.globalPath),D=Uf(b,this.projectId,this.globalPath),v=g?await Hf(b):[],$=Yf(a,c),F=[],H;try{let _=await bt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(H={patterns:_.patterns,antiPatterns:_.antiPatterns,packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:$,analysis:H},S=await Pf(ee,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Ve;try{let _=await R.readConfig(this.projectPath);Ve=await Zf.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){U.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:v,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ve,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>la.mkdir(ua.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=M.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};M.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await L.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=C(),r.lastUpdated=C(),r.context={...r.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,r);try{await Ef.generate(this.projectPath,r)}catch(o){U.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){M.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=ua.join(this.globalPath,m),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ua.join(this.globalPath,"agents",`${m.name}.md`),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:re(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let r=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await bt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:r??void 0})}catch(r){U.debug("Failed to save draft analysis (non-critical)",{error:re(r)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,n=await wl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Nm.getFeatureOutcomes(this.projectId);r.length>0&&await wl.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ua.join(__dirname,"..","..","package.json");return JSON.parse(await la.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:re(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},us=new da});var On=y(()=>{"use strict";cm();gm();fm();km();bm();nl();Pm();ol();vm();xm();Qg();Zg();vu()});import fn from"chalk";function th(s){return Math.ceil(s.length/Ox)}function nh(s){let e=s.split(`
|
|
962
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await ls('git log --oneline --since="1 week ago" | wc -l',{cwd:s});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){U.debug("Git analysis failed (not a git repo?)",{error:re(t)})}return e}async function rn(s,e){try{return await Vf.access(Su.join(s,e)),!0}catch(t){return U.debug("File not found",{filename:e,error:re(t)}),!1}}async function qf(s){let e={fileCount:0,version:"0.0.0",name:Su.basename(s),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await ls('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:s});e.fileCount=parseInt(t.trim(),10)||0}catch(t){U.debug("File count failed",{path:s,error:re(t)}),e.fileCount=0}try{let t=Su.join(s,"package.json"),n=JSON.parse(await Vf.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let r={...n.dependencies,...n.devDependencies};(r.react||r["react-dom"])&&e.frameworks.push("React"),r.next&&e.frameworks.push("Next.js"),r.vue&&e.frameworks.push("Vue"),r.express&&e.frameworks.push("Express"),r.hono&&e.frameworks.push("Hono"),r["@angular/core"]&&e.frameworks.push("Angular"),r.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await rn(s,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){U.debug("No package.json found",{path:s,error:re(t)})}return await rn(s,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await rn(s,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await rn(s,"requirements.txt")||await rn(s,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Kf(s){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await rn(s,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await rn(s,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await rn(s,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await rn(s,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await rn(s,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Yf(s,e){let t=cs(),r={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[s.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(r),t.name=o(r),t.version=o(r),t.languages=o(r),t.frameworks=o(r),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Xf(s){return new aa(s).detect()}var ls,Qf=y(()=>{"use strict";ln();au();Gn();Bf();ls=Dx(jx);l(Jf,"analyzeGit");l(rn,"fileExists");l(qf,"gatherStats");l(Kf,"detectCommands");l(Yf,"buildSources");l(Xf,"detectStack")});import{exec as Rx}from"node:child_process";import bu from"node:fs/promises";import ca from"node:path";import{promisify as $x}from"node:util";var Mx,Cu,Pu,Zf,eh=y(()=>{"use strict";Bt();N();Mx=$x(Rx),Cu={async contextFilesExist(s){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let r of t){let o=ca.join(s,r);try{await bu.access(o)}catch{n.push(r)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(s){let e=Date.now(),t=[],n=ca.basename(s);try{await L.read(n)}catch(r){P(r)||t.push(`state: ${w(r)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(s){let e=Date.now(),t=ca.join(s,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],r=[];try{let o=await bu.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await bu.readFile(ca.join(t,i),"utf-8");for(let c of n)if(c.test(a)){r.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!P(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:r.length===0,output:r.length===0?"No sensitive patterns found":void 0,error:r.length>0?r.join("; "):void 0,durationMs:Date.now()-e}}},Pu=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let r=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Cu.contextFilesExist(t),Cu.jsonFilesValid(t),Cu.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(k=>k.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-r,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),r=e.command||(e.script?`sh ${e.script}`:null);if(!r)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await Mx(r,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Zf=new Pu});import la from"node:fs/promises";import ua from"node:path";var da,us,vu=y(()=>{"use strict";Ms();sf();df();gf();wf();su();ln();An();qe();Se();Ti();vn();ye();jr();Wr();Ii();Dr();Rr();Mr();xf();le();Gn();kl();Sl();If();ol();Gf();Qf();eh();da=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),r;if(!t.aiTools||t.aiTools.length===0){let o=(await ia(e)).filter(i=>!ao.includes(i));r=[...ao,...o]}else t.aiTools[0]==="auto"?(r=await ia(e),r.length===0&&(r=["claude"])):t.aiTools[0]==="all"?r=await Cf("all",e):r=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=I.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Br(this.projectId);try{let _=await Ei(this.projectId);_>0&&U.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){U.debug("Legacy JSON sweep failed (non-critical)",{error:re(_)})}let[i,a,c,u]=await Promise.all([Jf(this.projectPath),qf(this.projectPath),Kf(this.projectPath),Xf(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&mf(this.projectId))try{let{diff:_,currentHashes:ms}=await iu(this.projectPath,this.projectId),ko=_.added.length+_.modified.length+_.deleted.length;if(ko===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let $a=lf(_,this.projectId);f=uf($a.allAffected);let Ry=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=$a.allAffected.some(Ln=>{let $y=Ln.substring(Ln.lastIndexOf("."));return Ry.has($y)}),g=$a.directlyChanged.some(Ln=>Ln==="package.json"||Ln==="tsconfig.json"||Ln.includes("Dockerfile")||Ln.includes("docker-compose")),m={isIncremental:!0,filesChanged:ko,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}ou(this.projectId,ms)}catch(_){U.debug("Incremental detection failed, falling back to full sync",{error:re(_)})}else try{let{currentHashes:_}=await iu(this.projectPath,this.projectId);ou(this.projectId,_)}catch(_){U.debug("Hash computation failed (non-critical)",{error:re(_)})}if(p)try{await Promise.all([nf(this.projectPath,this.projectId),cf(this.projectPath,this.projectId),yf(this.projectPath,this.projectId)])}catch(_){U.debug("File ranking index build failed (non-critical)",{error:re(_)})}let k;if(g)try{let _=await L.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(k=_)}catch{}let b=g?await _f(this.globalPath,u,a,k):await Nf(this.globalPath),D=Uf(b,this.projectId,this.globalPath),v=g?await Hf(b):[],$=Yf(a,c),F=[],H;try{let _=await bt.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(H={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let ee={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:b.filter(_=>_.type==="workflow").map(_=>_.name),domain:b.filter(_=>_.type==="domain").map(_=>_.name)},sources:$,analysis:H},S=await Pf(ee,this.globalPath,this.projectPath,r);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let j=Date.now()-n,te=await this.recordSyncMetrics(a,F,b,j);await this.archiveStaleData(),await this.autoLearnFromHistory(),await Ee.installGlobalConfig(),await Ee.syncCommands();let Ve;try{let _=await R.readConfig(this.projectPath);Ve=await Zf.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){U.debug("Verification failed (non-critical)",{error:re(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:b,skills:D,skillsInstalled:v,contextFiles:F,aiTools:S.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:te,verification:Ve,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:re(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>la.mkdir(ua.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=M.getDoc(this.projectId,"project")||{},r={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||C(),lastSync:C(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};M.setDoc(this.projectId,"project",r)}async updateStateJson(e,t){let r={...await L.read(this.projectId)};r.projectId=this.projectId,r.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},r.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},r.projectType=e.projectType,r.metrics={totalFiles:e.fileCount},r.lastSync=C(),r.lastUpdated=C(),r.context={...r.context||{},lastSession:C(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await L.write(this.projectId,r);try{await Ef.generate(this.projectPath,r)}catch(o){U.debug("Local state generation failed (optional)",{error:re(o)})}}async logToMemory(e,t){M.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,r){let i=0;for(let m of t)try{let p=ua.join(this.globalPath,m),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Context file not found for metrics",{file:m,error:re(p)})}for(let m of n)try{let p=ua.join(this.globalPath,"agents",`${m.name}.md`),g=await la.readFile(p,"utf-8");i+=g.length}catch(p){U.debug("Agent file not found for metrics",{agent:m.name,error:re(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await dn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:r,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){U.debug("Failed to record sync metrics",{error:re(m)})}return{duration:r,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let r=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await L.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await bt.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:C(),status:"draft",commitHash:r??void 0})}catch(r){U.debug("Failed to save draft analysis (non-critical)",{error:re(r)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,r,o]=await Promise.all([pt.archiveOldShipped(this.projectId).catch(()=>0),Qe.markDormantIdeas(this.projectId).catch(()=>0),xe.removeStaleCompleted(this.projectId).catch(()=>0),L.archiveStalePausedTasks(this.projectId).catch(()=>[]),mt.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+r.length+o;if(i>0){U.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:r.length,memoryCapped:o,total:i});let a=kt.getStats(this.projectId);U.debug("Archive stats",a)}}catch(e){U.debug("Archival failed (non-critical)",{error:re(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await L.getTaskHistory(this.projectId);if(e.length===0)return;let t=new qn,n=await wl.learnFromTaskHistory(this.projectId,e,t);try{let r=await Nm.getFeatureOutcomes(this.projectId);r.length>0&&await wl.learnFromOutcomes(this.projectId,r,t)}catch{}n.memoriesInjected>0&&U.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){U.debug("Auto-learning failed (non-critical)",{error:re(e)})}}async getCliVersion(){try{let e=ua.join(__dirname,"..","..","package.json");return JSON.parse(await la.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return U.debug("Failed to read CLI version",{error:re(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},us=new da});var On=y(()=>{"use strict";cm();gm();fm();km();bm();nl();Pm();ol();vm();xm();Qg();Zg();vu()});import fn from"chalk";function th(s){return Math.ceil(s.length/Ox)}function nh(s){let e=s.split(`
|
|
963
963
|
`),t=[],n=null;for(let r=0;r<e.length;r++){let o=e[r],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=r-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:r,endLine:r}):n&&(n.content+=`
|
|
964
964
|
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function xu(s){return s.includes("<!-- prjct:preserve")}function sh(s,e){let t=nh(s),n=nh(e),r={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:th(s),tokensAfter:th(e),tokenDelta:0};r.tokenDelta=r.tokensAfter-r.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)xu(a.content)&&r.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
965
965
|
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(xu(u.content)||(r.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|
|
@@ -1415,7 +1415,7 @@ if [ -f "$CONFIG" ]; then
|
|
|
1415
1415
|
fi
|
|
1416
1416
|
fi
|
|
1417
1417
|
echo "prjct"
|
|
1418
|
-
`;await J.writeFile(r,k,{mode:493})}await Py(t,r),await Cy(e,t)}catch(s){P(s)||U.warn(`Status line warning: ${w(s)}`)}}async function HE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"mcp.json");await x(s)||await J.mkdir(s,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await x(e)){let n=await J.readFile(e,"utf-8"),r=JSON.parse(n);if(r.mcpServers?.context7)return;r.mcpServers=r.mcpServers||{},r.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(r,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(s){U.warn(`Context7 MCP setup warning: ${w(s)}`)}}async function Da(s,e){if(!await x(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=Z.join(s,n),o=Z.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function Py(s,e){try{if(await x(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await x(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function GE(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var zE,Iy=y(()=>{"use strict";In();vi();ye();N();un();ve();Gn();dt();Je();An();tc();l(OE,"installAICLI");l(vy,"run");l(FE,"installGeminiRouter");l(_E,"installGeminiGlobalConfig");l(xy,"installAntigravitySkill");l(NE,"needsAntigravityInstallation");l(Ty,"installCodexSkill");l(LE,"migrateProjectsCliVersion");l(Cy,"ensureStatusLineSettings");l(UE,"installStatusLine");l(HE,"installContext7MCP");l(Da,"installStatusLineModules");l(Py,"ensureStatusLineSymlink");l(GE,"showResults");zE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");zE&&vy().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});var Ay=Ly((kq,WE)=>{WE.exports={name:"prjct-cli",version:"1.30.
|
|
1418
|
+
`;await J.writeFile(r,k,{mode:493})}await Py(t,r),await Cy(e,t)}catch(s){P(s)||U.warn(`Status line warning: ${w(s)}`)}}async function HE(){try{let s=Z.join(Nn.homedir(),".claude"),e=Z.join(s,"mcp.json");await x(s)||await J.mkdir(s,{recursive:!0});let t={mcpServers:{context7:{command:"npx",args:["-y","@upstash/context7-mcp@latest"]}}};if(await x(e)){let n=await J.readFile(e,"utf-8"),r=JSON.parse(n);if(r.mcpServers?.context7)return;r.mcpServers=r.mcpServers||{},r.mcpServers.context7=t.mcpServers.context7,await J.writeFile(e,JSON.stringify(r,null,2),"utf-8")}else await J.writeFile(e,JSON.stringify(t,null,2),"utf-8")}catch(s){U.warn(`Context7 MCP setup warning: ${w(s)}`)}}async function Da(s,e){if(!await x(s))return;let t=await J.readdir(s);for(let n of t)if(n.endsWith(".sh")){let r=Z.join(s,n),o=Z.join(e,n);await J.copyFile(r,o),await J.chmod(o,493)}}async function Py(s,e){try{if(await x(s)){if((await J.lstat(s)).isSymbolicLink()&&await J.readlink(s)===e)return;await J.unlink(s)}await J.symlink(e,s)}catch{try{await x(e)&&(await J.copyFile(e,s),await J.chmod(s,493))}catch(n){P(n)||U.warn(`Symlink fallback warning: ${n.message}`)}}}function GE(s,e){if(console.log(""),s.cliInstalled?console.log(` ${me.green("\u2713")} ${e.displayName} CLI installed`):console.log(` ${me.green("\u2713")} ${e.displayName} CLI found`),s.commandsAdded+s.commandsUpdated>0){let n=[];s.commandsAdded>0&&n.push(`${s.commandsAdded} new`),s.commandsUpdated>0&&n.push(`${s.commandsUpdated} updated`),console.log(` ${me.green("\u2713")} Commands synced (${n.join(", ")})`)}else console.log(` ${me.green("\u2713")} Commands up to date`);s.configAction==="created"?console.log(` ${me.green("\u2713")} Global config created (${e.contextFile})`):s.configAction==="updated"?console.log(` ${me.green("\u2713")} Global config updated (${e.contextFile})`):s.configAction==="appended"&&console.log(` ${me.green("\u2713")} Global config merged (${e.contextFile})`),console.log("")}var zE,Iy=y(()=>{"use strict";In();vi();ye();N();un();ve();Gn();dt();Je();An();tc();l(OE,"installAICLI");l(vy,"run");l(FE,"installGeminiRouter");l(_E,"installGeminiGlobalConfig");l(xy,"installAntigravitySkill");l(NE,"needsAntigravityInstallation");l(Ty,"installCodexSkill");l(LE,"migrateProjectsCliVersion");l(Cy,"ensureStatusLineSettings");l(UE,"installStatusLine");l(HE,"installContext7MCP");l(Da,"installStatusLineModules");l(Py,"ensureStatusLineSymlink");l(GE,"showResults");zE=process.argv[1]?.includes("setup.ts")||process.argv[1]?.includes("setup.js");zE&&vy().catch(s=>{console.error("Setup error:",s.message),process.exit(1)})});var Ay=Ly((kq,WE)=>{WE.exports={name:"prjct-cli",version:"1.30.1",description:"Context layer for AI agents. Project context for Claude Code, Gemini CLI, and more.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},scripts:{build:"node scripts/build.js","build:node":"node scripts/build.js",release:"node scripts/release.js","release:patch":"node scripts/release.js patch","release:minor":"node scripts/release.js minor","release:major":"node scripts/release.js major",postinstall:"node scripts/postinstall.js",prepare:"lefthook install","update-commands":`bun -e "const installer = require('./core/infrastructure/command-installer'); installer.syncCommands().then(r => console.log('Commands updated:', r)).catch(e => console.error('Error:', e.message))"`,"install-global":"./scripts/install.sh",update:"./scripts/update.sh",test:"bun test","test:watch":"bun test --watch","test:coverage":"bun test --coverage",typecheck:"tsc --noEmit -p core/tsconfig.json","typecheck:watch":"tsc --noEmit -p core/tsconfig.json --watch",validate:"bun scripts/validate-commands.js",lint:"biome lint .","lint:fix":"biome lint --write .","lint:meta":"bun core/cli/lint-meta-commentary.ts",format:"biome format --write .","format:check":"biome format .",check:"biome check .","check:fix":"biome check --write ."},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@hono/node-server":"^1.13.7","@linear/sdk":"^29.0.0","better-sqlite3":"^12.6.2",chalk:"^4.1.2",chokidar:"^5.0.0","date-fns":"^4.1.0",glob:"^13.0.1",hono:"^4.11.3","jsonc-parser":"^3.3.1",prompts:"^2.4.2",zod:"^3.24.1"},devDependencies:{"@biomejs/biome":"^2.3.13","@types/better-sqlite3":"^7.6.13","@types/bun":"latest","@types/chokidar":"^2.1.7","@types/prompts":"^2.4.9",esbuild:"^0.25.0",lefthook:"^2.1.0",typescript:"^5.9.3"},repository:{type:"git",url:"git+https://github.com/jlopezlira/prjct-cli.git"},bugs:{url:"https://github.com/jlopezlira/prjct-cli/issues"},homepage:"https://prjct.app",packageManager:"bun@1.2.23",engines:{node:">=18.0.0",bun:">=1.0.0"},files:["assets/","bin/prjct","dist/","scripts/postinstall.js","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js",trustedDependencies:["chalk","prompts"]}});var QE={};import jy from"node:os";import Ra from"node:path";import $e from"chalk";async function BE(){let[s,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(s)){let t=await Promise.resolve().then(()=>Uy(Ay()));await YE(t.version),process.exit(0)}["-h","--help",void 0].includes(s)&&(XE(),process.exit(0)),h.start();try{let t=z.getByName(s);if(!t){let d=JE(s),m=d?`Did you mean 'prjct ${d}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";h.failWithHint(Bn("UNKNOWN_COMMAND",{message:`Unknown command: ${s}`,hint:m})),h.end(),process.exit(1)}if(t.deprecated){let d=t.replacedBy?`Use 'prjct ${t.replacedBy}' instead`:"Run 'prjct --help' to see available commands";h.failWithHint({message:`Command '${s}' is deprecated`,hint:d}),h.end(),process.exit(1)}t.implemented||(h.failWithHint({message:`Command '${s}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),h.end(),process.exit(1));let{parsedArgs:n,options:r}=KE(t,e),o=VE(t,n);o&&(h.failWithHint(o),h.end(),process.exit(1));let i=null,a=Date.now();try{i=await R.getProjectId(process.cwd()),i&&(await Tn.expireIfStale(i),await Tn.touch(i))}catch{}let c=new yn,u;if(s==="design"){let d=n.join(" ");u=await c.design(d,r)}else if(s==="analyze")u=await c.analyze(r);else if(s==="cleanup")u=await c.cleanup(r);else if(s==="setup")u=await c.setup(r);else if(s==="update")u=await c.update(r);else{let d=n.join(" ")||null,m=r.md===!0,g={task:l(f=>c.task(f,process.cwd(),{md:m}),"task"),done:l(()=>c.done(process.cwd(),{md:m}),"done"),next:l(()=>c.next(process.cwd(),{md:m}),"next"),pause:l(f=>c.pause(f||"",process.cwd(),{md:m}),"pause"),resume:l(f=>c.resume(f,process.cwd(),{md:m}),"resume"),init:l(f=>c.init(f),"init"),bug:l(f=>c.bug(f||"",process.cwd(),{md:m}),"bug"),idea:l(f=>c.idea(f||"",process.cwd(),{md:m}),"idea"),spec:l(f=>c.spec(f),"spec"),ship:l(f=>c.ship(f,process.cwd(),{md:m}),"ship"),dash:l(f=>c.dash(f||"default",process.cwd(),{md:m}),"dash"),stats:l(()=>c.stats(process.cwd(),{json:r.json===!0,export:r.export===!0}),"stats"),status:l(()=>c.status(process.cwd(),{json:r.json===!0,md:m}),"status"),help:l(f=>c.help(f||""),"help"),perf:l(f=>c.perf(f||"7"),"perf"),velocity:l(f=>c.velocity(f||"0"),"velocity"),recover:l(()=>c.recover(),"recover"),undo:l(()=>c.undo(),"undo"),redo:l(()=>c.redo(),"redo"),history:l(()=>c.history(),"history"),sync:l(()=>c.sync(process.cwd(),{aiTools:r.agents?String(r.agents).split(","):void 0,preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:m,package:r.package?String(r.package):void 0,full:r.full===!0}),"sync"),seal:l(()=>c.seal(process.cwd(),{json:r.json===!0}),"seal"),verify:l(()=>c.verify(process.cwd(),{json:r.json===!0,semantic:r.semantic===!0}),"verify"),start:l(()=>c.start(),"start"),context:l(f=>c.context(f),"context")}[s];if(g)u=await g(d);else throw new Error(`Command '${s}' has no handler`)}if(i){let d=Date.now()-a;try{await Tn.trackCommand(i,s,d)}catch{}try{await Vn.recordTiming(i,"command_duration",d,{command:s});let m=globalThis.__perfStartNs;if(m){let p=Number(process.hrtime.bigint()-m)/1e6;await Vn.recordTiming(i,"startup_time",p)}await Vn.recordMemory(i,{command:s})}catch{}}u?.message&&console.log(u.message),h.end(),process.exit(u?.success?0:1)}catch(t){console.error("Error:",w(t)),process.env.DEBUG&&console.error(Co(t)),h.end(),process.exit(1)}}function VE(s,e){if(!s.params)return null;let t=s.params.match(/<[^>]+>/g);if(!t||t.length===0)return null;if(e.length<t.length){let n=t.map(o=>o.slice(1,-1)).join(", "),r=s.usage.terminal||`prjct ${s.name} ${s.params}`;return Bn("MISSING_PARAM",{message:`Missing required parameter: ${n}`,hint:`Usage: ${r}`})}return null}function JE(s){let e=z.getAll().map(r=>r.name),t=null,n=1/0;for(let r of e){let o=qE(s.toLowerCase(),r.toLowerCase());o<n&&(n=o,t=r)}return n<=2?t:null}function qE(s,e){let t=s.length,n=e.length,r=Array.from({length:t+1},()=>Array(n+1).fill(0));for(let o=0;o<=t;o++)r[o][0]=o;for(let o=0;o<=n;o++)r[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=n;i++)r[o][i]=s[o-1]===e[i-1]?r[o-1][i-1]:1+Math.min(r[o-1][i],r[o][i-1],r[o-1][i-1]);return r[t][n]}function KE(s,e){let t=[],n={};for(let r=0;r<e.length;r++){let o=e[r];if(o.startsWith("--")){let i=o.slice(2);r+1<e.length&&!e[r+1].startsWith("--")?n[i]=e[++r]:n[i]=!0}else t.push(o)}return{parsedArgs:t,options:n}}async function YE(s){let e=await cn(),t=Ra.join(jy.homedir(),".claude","commands","p.md"),n=Ra.join(jy.homedir(),".gemini","commands","p.toml"),[r,o,i,a]=await Promise.all([x(t),x(n),x(Ra.join(process.cwd(),".cursor","commands","sync.md")),x(Ra.join(process.cwd(),".cursor"))]),c=await Ss();if(console.log(`
|
|
1419
1419
|
${$e.cyan("p/")} prjct v${s}
|
|
1420
1420
|
${$e.dim("Context layer for AI coding agents")}
|
|
1421
1421
|
|
package/dist/daemon/entry.mjs
CHANGED
|
@@ -412,7 +412,7 @@ Stack: ${e.stack?.language||"unknown"} / ${e.stack?.framework||"unknown"}
|
|
|
412
412
|
|
|
413
413
|
${s}`;try{let i=await fetch("https://api.anthropic.com/v1/messages",{method:"POST",headers:{"Content-Type":"application/json","x-api-key":t,"anthropic-version":"2023-06-01"},body:JSON.stringify({model:"claude-haiku-4-5-20251001",max_tokens:200,messages:[{role:"user",content:o}]})});if(!i.ok)return null;let c=(await i.json()).content?.[0]?.text;if(!c)return null;let u=JSON.parse(c),d=Yt.safeParse(u);return d.success?d.data:{primaryDomain:n.includes(u.primaryDomain)?u.primaryDomain:"general",secondaryDomains:(u.secondaryDomains||[]).filter(m=>n.includes(m)),confidence:Math.min(1,Math.max(0,u.confidence||.5)),filePatterns:Array.isArray(u.filePatterns)?u.filePatterns:[],relevantAgents:Array.isArray(u.relevantAgents)?u.relevantAgents:[]}}catch{return null}}function fk(r,e){let t=dp(e),n=new Map;for(let[p,g]of Object.entries(gk)){if(p==="general"||!t.includes(p))continue;let f=0;for(let S of g)r.match(new RegExp(S,"gi"))&&(f+=S.source.includes("\\s")?3:1);f>0&&n.set(p,f)}if(n.size===0)return Zl;let s=Array.from(n.entries()).sort((p,g)=>g[1]-p[1]),o=s[0][0],i=s[0][1],a=s.slice(1,3).map(([p])=>p),c=s.reduce((p,[,g])=>p+g,0),u=Math.min(.85,i/c+.2),d=hk(o),m=e.agents.filter(p=>p===o||p.includes(o)||o.includes(p.replace(".md","")));return{primaryDomain:o,secondaryDomains:a,confidence:u,filePatterns:d,relevantAgents:m}}function dp(r){let e=[];return r.domains.hasFrontend&&e.push("frontend"),r.domains.hasBackend&&e.push("backend"),r.domains.hasDatabase&&e.push("database"),r.domains.hasTesting&&e.push("testing"),r.domains.hasDocker&&e.push("devops"),e.push("docs","uxui","general"),e}function hk(r){let e={frontend:["src/components/**","src/pages/**","src/hooks/**","**/*.tsx","**/*.jsx"],backend:["src/api/**","src/routes/**","src/services/**","src/handlers/**"],database:["src/models/**","src/schemas/**","**/*.sql","prisma/**"],devops:[".github/**","docker/**","deploy/**","infra/**","**/*.yml","**/*.yaml"],testing:["**/*.test.*","**/*.spec.*","tests/**","__tests__/**","e2e/**"],docs:["docs/**","**/*.md","**/*.mdx"],uxui:["src/components/**","src/styles/**","**/*.css"],general:["**/*.ts","**/*.js"]};return e[r]||e.general}var uk,gk,lc,yk,pp,mp=y(()=>{"use strict";Fs();Ir();O();uk=3600*1e3;l(ap,"hashDescription");l(cp,"loadCache");l(cc,"saveCache");l(dk,"lookupCache");l(pk,"lookupPatterns");l(mk,"classifyWithLLM");gk={frontend:[/\bui\b/i,/\bcomponents?\b/i,/\breact\b/i,/\bvue\b/i,/\bangular\b/i,/\bsvelte\b/i,/\bnext\.?js\b/i,/\bnuxt\b/i,/\bcss\b/i,/\bscss\b/i,/\bstyles?\b/i,/\bbuttons?\b/i,/\bforms?\b/i,/\bmodals?\b/i,/\blayout\b/i,/\bresponsive\b/i,/\banimation\b/i,/\bdom\b/i,/\bhtml\b/i,/\bfrontend\b/i,/\bclient[- ]side\b/i,/\bbrowser\b/i,/\bjsx\b/i,/\btsx\b/i,/\bhooks?\b/i,/\bredux\b/i,/\bzustand\b/i,/\btailwind\b/i,/\bdashboard\b/i,/\bpage\b/i,/\bnavigation\b/i,/\bsidebar\b/i,/\bheader\b/i,/\bfooter\b/i,/\bwidget\b/i,/\btooltip\b/i,/\bdropdown\b/i,/\bcarousel\b/i,/\bprofile\s+page\b/i,/\bdisplay\b/i],backend:[/\bapi\b/i,/\bendpoints?\b/i,/\bserver\b/i,/\broutes?\b/i,/\bhandlers?\b/i,/\bcontrollers?\b/i,/\bservices?\b/i,/\bmiddleware\b/i,/\bauth\b/i,/\bauthentication\b/i,/\bauthorization\b/i,/\bjwt\b/i,/\boauth\b/i,/\brest\b/i,/\bgraphql\b/i,/\btrpc\b/i,/\bexpress\b/i,/\bfastify\b/i,/\bhono\b/i,/\bnest\.?js\b/i,/\bvalidation\b/i,/\bbusiness\s+logic\b/i,/\bcron\b/i,/\bwebhook\b/i,/\bworker\b/i,/\bqueue\b/i,/\bcache\b/i],database:[/\bdatabase\b/i,/\bdb\b/i,/\bsql\b/i,/\bquery\b/i,/\btables?\b/i,/\bschema\b/i,/\bmigrations?\b/i,/\bpostgres\b/i,/\bmysql\b/i,/\bsqlite\b/i,/\bmongo\b/i,/\bredis\b/i,/\bprisma\b/i,/\bdrizzle\b/i,/\borm\b/i,/\bentity\b/i,/\brepository\b/i,/\bdata\s+layer\b/i,/\bpersist\b/i,/\bindex(?:es|ing)?\b/i,/\bconnection\s+pool\b/i],devops:[/\bdocker\b/i,/\bkubernetes\b/i,/\bk8s\b/i,/\bci\b/i,/\bcd\b/i,/\bpipeline\b/i,/\bdeploy\b/i,/\bgithub\s+actions\b/i,/\bvercel\b/i,/\baws\b/i,/\bgcp\b/i,/\bazure\b/i,/\bterraform\b/i,/\bnginx\b/i,/\bcaddy\b/i,/\binfrastructure\b/i,/\bmonitoring\b/i,/\blogging\b/i,/\bcontainer\b/i,/\bhelm\b/i],testing:[/\btests?\b/i,/\bspec\b/i,/\bunit\s+tests?\b/i,/\bintegration\s+tests?\b/i,/\be2e\b/i,/\bjest\b/i,/\bvitest\b/i,/\bplaywright\b/i,/\bcypress\b/i,/\bmocha\b/i,/\bmocks?\b/i,/\bstubs?\b/i,/\bfixtures?\b/i,/\bcoverage\b/i,/\bassertions?\b/i],docs:[/\bdocument(?:ation)?\b/i,/\bdocs\b/i,/\breadme\b/i,/\bchangelog\b/i,/\bjsdoc\b/i,/\btutorial\b/i,/\bguide\b/i,/\bmarkdown\b/i],uxui:[/\bdesign\b/i,/\bux\b/i,/\buser\s+experience\b/i,/\baccessibility\b/i,/\ba11y\b/i,/\bwcag\b/i,/\bfigma\b/i,/\bprototype\b/i,/\bwireframe\b/i,/\busability\b/i],general:[]};l(fk,"classifyWithHeuristic");l(dp,"buildAvailableDomains");l(hk,"getFilePatterns");lc=class{static{l(this,"DomainClassifier")}async classify(e,t,n,s){let o=ap(e),i=await cp(n),a=dk(i,o,t);if(a)return{classification:a,source:"cache"};let c=pk(i,o);if(c)return{classification:c,source:"history"};let u=await mk(e,s);if(u)return i.entries[o]={classification:u,classifiedAt:new Date().toISOString(),source:"llm",descriptionHash:o,projectId:t},await cc(n,i),{classification:u,source:"llm"};let d=fk(e,s);return i.entries[o]={classification:d,classifiedAt:new Date().toISOString(),source:"heuristic",descriptionHash:o,projectId:t},await cc(n,i),{classification:d,source:"heuristic"}}async confirmClassification(e,t,n){let s=ap(e),o=await cp(n);o.confirmedPatterns.some(i=>i.descriptionHash===s)||(o.confirmedPatterns.push({descriptionHash:s,classification:t,confirmedAt:new Date().toISOString(),taskDescription:e}),await cc(n,o))}},yk=new lc,pp=yk});import{exec as wk}from"node:child_process";import tr from"node:fs/promises";import Sk from"node:os";import vn from"node:path";import{promisify as kk}from"node:util";var gp,fp,uc,bk,jo,dc=y(()=>{"use strict";sc();st();le();Hn();Mt();rc();Qd();ip();O();xn();mp();qn();gp=kk(wk),fp=["database","backend","frontend","testing","devops"],uc=class{static{l(this,"OrchestratorExecutor")}async execute(e,t,n){let s=await R.getProjectId(n),o=E.getGlobalProjectPath(s),i=await this.loadRepoAnalysis(o),{domains:a,primary:c}=await this.detectDomains(t,s,i),u=await this.loadAgents(a,s),d=await this.loadSkills(u),m=await Promise.allSettled([this.gatherRealContext(t,n),this.loadSealedAnalysis(s),this.loadVelocityContext(s)]),p=["realContext","sealedAnalysis","velocity"],g=[],f=m.map((we,Ue)=>{if(we.status==="fulfilled")return we.value;g.push(p[Ue]),console.warn(`Context tool "${p[Ue]}" failed: ${w(we.reason)}`)}),[S,P,I]=f,j={level:g.length===0?"full":g.length>=2?"minimal":"partial",failedTools:g},V=this.shouldFragment(a,t),de=null;return V&&e==="task"&&(de=await this.createSubtasks(t,a,u,s)),{detectedDomains:a,primaryDomain:c,agents:u,skills:d,requiresFragmentation:V,subtasks:de,project:{id:s,ecosystem:i?.ecosystem||"unknown",conventions:i?.conventions||[]},realContext:S,sealedAnalysis:P??null,velocityContext:I??null,contextDegradation:j}}async gatherRealContext(e,t){try{let[n,s,o]=await Promise.all([this.getGitState(t),Do(e,t,{maxFiles:10,minScore:.15}),Xd(t,{commits:10,maxFiles:10})]),i=s.files.slice(0,3),a=await Promise.all(i.map(async c=>{try{let u=await op(c.path,t);if(u.signatures.length===0)return null;let d=u.signatures.map(m=>`${m.exported?"export ":""}${m.type} ${m.name}: ${m.signature}`).join(`
|
|
414
414
|
`);return{path:c.path,content:d}}catch{return null}}));return{gitBranch:n.branch,gitStatus:n.status,relevantFiles:s.files.map(c=>({path:c.path,score:Math.round(c.score*100),reason:c.reasons.join(", ")})),recentFiles:o.hotFiles.slice(0,5).map(c=>({path:c.path,lastChanged:c.lastChanged,changes:c.changes})),signatures:a.filter(c=>c!==null)}}catch{return}}async getGitState(e){try{let[t,n]=await Promise.all([gp("git branch --show-current",{cwd:e}),gp("git status --porcelain",{cwd:e})]),s=t.stdout.trim()||"main",o=n.stdout.trim().split(`
|
|
415
|
-
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await it.getActive(e);return t?{languages:t.languages,frameworks:t.frameworks,packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount,patterns:t.patterns,antiPatterns:t.antiPatterns,status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await Ye.getAll(e);if(t.length===0)return null;let n=Ao(t,Xt);return n.sprints.length===0?null:Yd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=vn.join(e,"analysis","repo-analysis.json"),n=await tr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await pp.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=vn.join(e,"agents");return(await tr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=vn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=vn.join(s,u);try{let m=await tr.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=Nr(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=vn.join(Sk.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=vn.join(t,`${i}.md`),c=vn.join(t,i,"SKILL.md");try{let u=await tr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await tr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=fp.indexOf(a),d=fp.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await F.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},bk=new uc,jo=bk});function Pk(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var pc,Ck,Ce,hp=y(()=>{"use strict";kt();se();Zt();Zt();l(Pk,"generateApprovalPrompt");pc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ha.includes(e)}isDestructive(e){return ya.includes(e)}isToolAllowedInPlanning(e){return no.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>no.includes(n)):t}startPlanning(e,t,n){let s={id:re(),projectId:e,command:t,params:n,status:Y.GATHERING,startedAt:k(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Y.GATHERING,Y.ANALYZING,Y.PROPOSING,Y.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:k()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Y.APPROVED?n.approvedAt=k():t===Y.EXECUTING?n.executionStartedAt=k():(t===Y.COMPLETED||t===Y.ABORTED)&&(n.completedAt=k()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Y.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Y.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==Y.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Y.APPROVED,n.approvedAt=k(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Y.REJECTED,n.userFeedback=t,n.completedAt=k(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Y.APPROVED?null:(t.status=Y.EXECUTING,t.executionStartedAt=k(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Y.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==Y.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=k(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Y.COMPLETED,t.completedAt=k();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Y.ABORTED,n.completedAt=k(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Pk(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Y.GATHERING]:"\u{1F50D}",[Y.ANALYZING]:"\u{1F9E0}",[Y.PROPOSING]:"\u{1F4DD}",[Y.PENDING_APPROVAL]:"\u23F3",[Y.APPROVED]:"\u2705",[Y.EXECUTING]:"\u26A1",[Y.COMPLETED]:"\u{1F389}",[Y.REJECTED]:"\u274C",[Y.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Y.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
415
|
+
`).filter(Boolean),i=0,a=0,c=0;for(let m of o){let p=m.substring(0,2);p.startsWith("??")?a++:p[0]!==" "&&p[0]!=="?"?c++:i++}let u=[];c>0&&u.push(`${c} staged`),i>0&&u.push(`${i} modified`),a>0&&u.push(`${a} untracked`);let d=u.length>0?u.join(", "):"clean";return{branch:s,status:d}}catch{return{branch:"unknown",status:"git unavailable"}}}async loadSealedAnalysis(e){try{let t=await it.getActive(e);return t?{languages:t.languages??[],frameworks:t.frameworks??[],packageManager:t.packageManager,sourceDir:t.sourceDir,testDir:t.testDir,fileCount:t.fileCount??0,patterns:t.patterns??[],antiPatterns:t.antiPatterns??[],status:t.status??"draft",commitHash:t.commitHash}:null}catch{return null}}async loadVelocityContext(e){try{let t=await Ye.getAll(e);if(t.length===0)return null;let n=Ao(t,Xt);return n.sprints.length===0?null:Yd(n)}catch{return null}}async loadRepoAnalysis(e){try{let t=vn.join(e,"analysis","repo-analysis.json"),n=await tr.readFile(t,"utf-8");return JSON.parse(n)}catch(t){return C(t)||console.warn("Failed to load repo-analysis.json:",w(t)),null}}async detectDomains(e,t,n){let s=E.getGlobalProjectPath(t),o=await this.getAvailableAgentNames(s),i={hasFrontend:!1,hasBackend:!0,hasDatabase:!1,hasTesting:!1,hasDocker:!1};try{let m=await F.read(t);m.domains&&(i=m.domains)}catch{}let a={domains:i,agents:o,stack:n?{language:n.ecosystem}:void 0},{classification:c}=await pp.classify(e,t,s,a),d=[c.primaryDomain,...c.secondaryDomains||[]].filter(m=>o.some(p=>p===m||p.includes(m)||m.includes(p.replace(".md",""))));return d.length===0?{domains:["general"],primary:"general"}:{domains:d,primary:d[0]}}async getAvailableAgentNames(e){try{let t=vn.join(e,"agents");return(await tr.readdir(t)).filter(s=>s.endsWith(".md")).map(s=>s.replace(".md",""))}catch{return[]}}async loadAgents(e,t){let n=E.getGlobalProjectPath(t),s=vn.join(n,"agents"),o=e.map(async a=>{let c=[`${a}.md`,`${a}-agent.md`,`prjct-${a}.md`];for(let u of c){let d=vn.join(s,u);try{let m=await tr.readFile(d,"utf-8"),{frontmatter:p,body:g}=this.parseAgentFile(m);return{name:u.replace(".md",""),domain:a,content:g,skills:p.skills||[],filePath:d,effort:p.effort,model:p.model}}catch{}}return null});return(await Promise.all(o)).filter(a=>a!==null)}parseAgentFile(e){let t=Nr(e),n={...t.frontmatter};return typeof n.skills=="string"&&(n.skills=n.skills.split(",").map(s=>s.trim())),{frontmatter:n,body:t.content}}async loadSkills(e){let t=vn.join(Sk.homedir(),".claude","skills"),n=new Map;for(let i of e)for(let a of i.skills){let c=n.get(a)||[];c.push(i.name),n.set(a,c)}let s=Array.from(n.keys()).map(async i=>{let a=vn.join(t,`${i}.md`),c=vn.join(t,i,"SKILL.md");try{let u=await tr.readFile(c,"utf-8");return{name:i,content:u,filePath:c}}catch{try{let u=await tr.readFile(a,"utf-8");return{name:i,content:u,filePath:a}}catch{let u=n.get(i)||[];return console.warn(`\u26A0 Skill "${i}" not installed (needed by: ${u.join(", ")}). Run \`prjct sync\` to auto-install.`),null}}});return(await Promise.all(s)).filter(i=>i!==null)}shouldFragment(e,t){if(e.length>=3)return!0;let n=["full stack","fullstack","end to end","e2e","complete feature","from database to ui","across layers"],s=t.toLowerCase();for(let i of n)if(s.includes(i))return!0;return t.split(/\s+/).length>30&&e.length>=2}async createSubtasks(e,t,n,s){let o=[...t].sort((a,c)=>{let u=fp.indexOf(a),d=fp.indexOf(c);return(u===-1?99:u)-(d===-1?99:d)}),i=o.map((a,c)=>{let u=n.find(p=>p.domain===a),d=u?`${u.name}.md`:`${a}.md`,m=o.slice(0,c).map((p,g)=>`subtask-${g+1}`);return{id:`subtask-${c+1}`,description:this.generateSubtaskDescription(e,a),domain:a,agent:d,status:c===0?"in_progress":"pending",dependsOn:m,order:c+1}});return await F.createSubtasks(s,i.map(a=>({id:a.id,description:a.description,domain:a.domain,agent:a.agent,dependsOn:a.dependsOn}))),i}generateSubtaskDescription(e,t){let s={database:"Set up data layer: schema, models, migrations",backend:"Implement API: routes, controllers, services, validation",frontend:"Build UI: components, forms, state management",testing:"Write tests: unit, integration, e2e",devops:"Configure deployment: CI/CD, environment, containers",uxui:"Design user experience: flows, accessibility, styling"}[t]||`Handle ${t} aspects`;return`[${t.toUpperCase()}] ${s} for: ${e.substring(0,80)}${e.length>80?"...":""}`}},bk=new uc,jo=bk});function Pk(r,e){return{ship:{title:"Ship Confirmation",message:"Ready to commit and push changes?",details:[`Branch: ${e.branch||"current"}`,`Files: ${e.changedFiles?.length||0} changed`,`Commit: "${e.commitMessage||"No message"}"`],options:[{key:"y",label:"Yes, ship it",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"e",label:"Edit message",action:"edit"}]},cleanup:{title:"Cleanup Confirmation",message:"This will delete files/code. Continue?",details:[`Files to delete: ${e.filesToDelete?.length||0}`,`Code to remove: ${e.linesOfCode||0} lines`],options:[{key:"y",label:"Yes, cleanup",action:"approve"},{key:"n",label:"No, cancel",action:"reject"},{key:"l",label:"List files first",action:"list"}]},git:{title:"Git Operation Confirmation",message:`Execute: ${e.operation||"git operation"}?`,details:e.warnings||[],options:[{key:"y",label:"Yes, execute",action:"approve"},{key:"n",label:"No, cancel",action:"reject"}]}}[r]||{title:"Confirmation Required",message:`Execute ${r}?`,options:[{key:"y",label:"Yes",action:"approve"},{key:"n",label:"No",action:"reject"}]}}var pc,Ck,Ce,hp=y(()=>{"use strict";kt();se();Zt();Zt();l(Pk,"generateApprovalPrompt");pc=class{static{l(this,"PlanMode")}activePlans;constructor(){this.activePlans=new Map}requiresPlanning(e){return ha.includes(e)}isDestructive(e){return ya.includes(e)}isToolAllowedInPlanning(e){return no.includes(e)}getAllowedTools(e,t){return e?t.filter(n=>no.includes(n)):t}startPlanning(e,t,n){let s={id:re(),projectId:e,command:t,params:n,status:Y.GATHERING,startedAt:k(),gatheredInfo:[],analysis:null,proposedPlan:null,userFeedback:null,approvedAt:null,executionStartedAt:null,completedAt:null,steps:[],currentStep:0};return this.activePlans.set(e,s),s}getActivePlan(e){return this.activePlans.get(e)||null}isInPlanningMode(e){let t=this.getActivePlan(e);return t?[Y.GATHERING,Y.ANALYZING,Y.PROPOSING,Y.PENDING_APPROVAL].includes(t.status):!1}recordGatheredInfo(e,t){let n=this.getActivePlan(e);n&&n.gatheredInfo.push({...t,gatheredAt:k()})}updateStatus(e,t){let n=this.getActivePlan(e);n&&(n.status=t,t===Y.APPROVED?n.approvedAt=k():t===Y.EXECUTING?n.executionStartedAt=k():(t===Y.COMPLETED||t===Y.ABORTED)&&(n.completedAt=k()))}setAnalysis(e,t){let n=this.getActivePlan(e);n&&(n.analysis=t,n.status=Y.ANALYZING)}proposePlan(e,t){let n=this.getActivePlan(e);return n?(n.proposedPlan=t,n.status=Y.PENDING_APPROVAL,this.formatPlanForApproval(n)):null}formatPlanForApproval(e){let t=e.proposedPlan;return{summary:t?.summary||`Plan for: ${e.command}`,approach:t?.approach,steps:t?.steps||[],risks:t?.risks||[],alternatives:t?.alternatives||[],estimatedTime:t?.estimatedTime,affectedFiles:t?.affectedFiles||[],requiresConfirmation:!0,planId:e.id}}approvePlan(e,t=null){let n=this.getActivePlan(e);return!n||n.status!==Y.PENDING_APPROVAL?null:(n.userFeedback=t,n.status=Y.APPROVED,n.approvedAt=k(),n.steps=(n.proposedPlan?.steps||[]).map((s,o)=>({index:o,description:typeof s=="string"?s:s.description||"",status:"pending",tool:typeof s=="string"?void 0:s.tool,args:typeof s=="string"?void 0:s.args})),{approved:!0,planId:n.id,steps:n.steps,message:`Plan approved. ${n.steps.length} steps to execute.`})}rejectPlan(e,t=null){let n=this.getActivePlan(e);return n?(n.status=Y.REJECTED,n.userFeedback=t,n.completedAt=k(),this.activePlans.delete(e),{rejected:!0,planId:n.id,reason:t,message:"Plan rejected. No changes made."}):null}startExecution(e){let t=this.getActivePlan(e);return!t||t.status!==Y.APPROVED?null:(t.status=Y.EXECUTING,t.executionStartedAt=k(),t.currentStep=0,this.getNextStep(e))}getNextStep(e){let t=this.getActivePlan(e);if(!t||t.status!==Y.EXECUTING)return null;let n=t.steps[t.currentStep];return n?{stepNumber:t.currentStep+1,totalSteps:t.steps.length,step:n,progress:Math.round(t.currentStep/t.steps.length*100)}:(this.completePlan(e),null)}completeStep(e,t={success:!0}){let n=this.getActivePlan(e);return!n||n.status!==Y.EXECUTING?null:(n.steps[n.currentStep].status="completed",n.steps[n.currentStep].result=t,n.steps[n.currentStep].completedAt=k(),n.currentStep++,this.getNextStep(e))}failStep(e,t){let n=this.getActivePlan(e);return n?(n.steps[n.currentStep].status="failed",n.steps[n.currentStep].error=t,{failed:!0,step:n.currentStep+1,error:t,options:["retry","skip","abort"]}):null}completePlan(e){let t=this.getActivePlan(e);if(!t)return null;t.status=Y.COMPLETED,t.completedAt=k();let n={planId:t.id,command:t.command,totalSteps:t.steps.length,completedSteps:t.steps.filter(s=>s.status==="completed").length,failedSteps:t.steps.filter(s=>s.status==="failed").length,duration:this._calculateDuration(t.executionStartedAt,t.completedAt)};return this.activePlans.delete(e),n}abortPlan(e,t="User requested"){let n=this.getActivePlan(e);if(!n)return null;n.status=Y.ABORTED,n.completedAt=k(),n.abortReason=t;let s={aborted:!0,planId:n.id,reason:t,completedSteps:n.steps.filter(o=>o.status==="completed").length,totalSteps:n.steps.length};return this.activePlans.delete(e),s}generateApprovalPrompt(e,t){return Pk(e,t)}formatStatus(e){let t=this.getActivePlan(e);if(!t)return"No active plan";let s=[`${{[Y.GATHERING]:"\u{1F50D}",[Y.ANALYZING]:"\u{1F9E0}",[Y.PROPOSING]:"\u{1F4DD}",[Y.PENDING_APPROVAL]:"\u23F3",[Y.APPROVED]:"\u2705",[Y.EXECUTING]:"\u26A1",[Y.COMPLETED]:"\u{1F389}",[Y.REJECTED]:"\u274C",[Y.ABORTED]:"\u{1F6D1}"}[t.status]||"\u{1F4CB}"} Plan: ${t.command}`,`Status: ${t.status}`];if(t.status===Y.EXECUTING){let o=Math.round(t.currentStep/t.steps.length*100);s.push(`Progress: ${t.currentStep}/${t.steps.length} (${o}%)`)}return s.join(`
|
|
416
416
|
`)}_calculateDuration(e,t){if(!e||!t)return null;let n=new Date(t).getTime()-new Date(e).getTime(),s=Math.floor(n/1e3),o=Math.floor(s/60),i=Math.floor(o/60);return i>0?`${i}h ${o%60}m`:o>0?`${o}m ${s%60}s`:`${s}s`}},Ck=new pc,Ce=Ck});function xk(r){let e=r.trim().toLowerCase(),t=e.replace(/[.\s-]/g,"");return Ro[t]?Ro[t]:Ro[e]?Ro[e]:e}function $o(r){let e=new Set,t=[];for(let n of r){let s=xk(n);e.has(s)||(e.add(s),t.push(n))}return t}var Ro,mc=y(()=>{"use strict";Ro={nextjs:"next.js",nuxtjs:"nuxt.js",expressjs:"express",fastifyjs:"fastify","react.js":"react","vue.js":"vue","svelte.js":"svelte","angular.js":"angular",angularjs:"angular","node.js":"node",nodejs:"node",ts:"typescript",js:"javascript",pg:"postgres",postgresql:"postgres",mongo:"mongodb"};l(xk,"normalizeFrameworkName");l($o,"deduplicateTechStack")});import{z as xe}from"zod";function yp(r){let e=[];e.push(`## CONSTRAINTS (Read Before Acting)
|
|
417
417
|
`);let t=[];r.language&&t.push(r.language),r.framework&&t.push(r.framework);let n=r.techStack??[];t.push(...n);let s=r.analysisLanguages??[],o=r.analysisFrameworks??[];t.push(...s,...o);let i=$o(t);if(i.length>0&&e.push(`AVAILABLE in this project: ${i.join(", ")}`),r.analysisPackageManager&&e.push(`PACKAGE MANAGER: ${r.analysisPackageManager}`),r.domains){let c=Object.entries(r.domains).filter(([,u])=>!u).map(([u])=>vk[u]).filter(Boolean);c.length>0&&e.push(`NOT PRESENT: ${c.join(", ")}`)}let a=r.availableAgents??[];return a.length>0&&e.push(`AGENTS: ${a.join(", ")}`),e.push(""),e.push(`SCOPE: Only files in \`${r.projectPath}\` are accessible.`),e.push("RULE: Use ONLY file paths explicitly shown in context. Do NOT infer or guess paths."),e.push("RULE: NEVER assume a library is available. Check package.json/imports first."),e.push("RULE: If previous context contradicts this section, trust this section."),e.push("RULE: Read files BEFORE modifying. Never assume code structure."),r.fileCount&&e.push(`
|
|
418
418
|
Context: ${r.fileCount} files in project.`),e.join(`
|
|
@@ -438,17 +438,17 @@ ${A}
|
|
|
438
438
|
`),d.push(`**Ecosystem**: ${u.project.ecosystem}
|
|
439
439
|
`),d.push(`**Primary Domain**: ${u.primaryDomain}
|
|
440
440
|
`),d.push(`**Domains**: ${u.detectedDomains.join(", ")}
|
|
441
|
-
`),b){if(b.languages
|
|
442
|
-
`),b.frameworks
|
|
441
|
+
`),b){if(b.languages?.length>0&&d.push(`**Languages**: ${b.languages.join(", ")}
|
|
442
|
+
`),b.frameworks?.length>0&&d.push(`**Frameworks**: ${b.frameworks.join(", ")}
|
|
443
443
|
`),b.packageManager&&d.push(`**Package Manager**: ${b.packageManager}
|
|
444
444
|
`),b.sourceDir&&d.push(`**Source Dir**: ${b.sourceDir}
|
|
445
445
|
`),b.testDir&&d.push(`**Test Dir**: ${b.testDir}
|
|
446
446
|
`),d.push(`**Files Analyzed**: ${b.fileCount}
|
|
447
447
|
`),d.push(`**Analysis Status**: ${b.status}${b.commitHash?` (commit: ${b.commitHash.slice(0,8)})`:""}
|
|
448
|
-
`),b.patterns
|
|
448
|
+
`),b.patterns?.length>0){d.push(`
|
|
449
449
|
### Code Patterns (Follow These)
|
|
450
450
|
`);for(let A of b.patterns)d.push(`- **${A.name}**: ${A.description}${A.location?` (${A.location})`:""}
|
|
451
|
-
`)}if(b.antiPatterns
|
|
451
|
+
`)}if(b.antiPatterns?.length>0){d.push(`
|
|
452
452
|
### Anti-Patterns (Avoid These)
|
|
453
453
|
`);for(let A of b.antiPatterns)d.push(`- **${A.issue}** in \`${A.file}\` \u2014 ${A.suggestion}
|
|
454
454
|
`)}}d.push(`
|
|
@@ -816,10 +816,10 @@ Status: Draft
|
|
|
816
816
|
|
|
817
817
|
${e.join(`
|
|
818
818
|
`)}
|
|
819
|
-
`:""}function Fb(r){let e=[];return r.patterns
|
|
819
|
+
`:""}function Fb(r){let e=[];return r.patterns?.length>0&&e.push(`
|
|
820
820
|
### Code Patterns (Follow These)
|
|
821
821
|
|
|
822
|
-
${or(r.patterns)}`),r.antiPatterns
|
|
822
|
+
${or(r.patterns)}`),r.antiPatterns?.length>0&&e.push(`
|
|
823
823
|
### Anti-Patterns (Avoid These)
|
|
824
824
|
|
|
825
825
|
${ir(r.antiPatterns)}`),e.push(fm(r)),e.join(`
|
|
@@ -896,11 +896,11 @@ Load from \`~/.prjct-cli/projects/${r.projectId}/agents/\`:
|
|
|
896
896
|
|
|
897
897
|
**Workflow**: ${r.agents.workflow.join(", ")}
|
|
898
898
|
**Domain**: ${r.agents.domain.join(", ")||"none"}
|
|
899
|
-
`}function Nb(r,e){let t=r.sources||jn(),n=[];if(n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(gt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns
|
|
900
|
-
`)}function Lb(r,e){let t=r.sources||jn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(gt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns
|
|
901
|
-
`)}function Ub(r,e){let t=r.sources||jn(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(gt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns
|
|
899
|
+
`}function Nb(r,e){let t=r.sources||jn(),n=[];if(n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("globs:"),n.push("alwaysApply: true"),n.push("---"),n.push(""),n.push(`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`),n.push(""),n.push(gt(t.languages)),n.push("## Tech Stack"),r.languages.length>0&&n.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- Frameworks: ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(t.commands)),n.push("## Commands"),n.push(`- Install: \`${r.commands.install}\``),n.push(`- Dev: \`${r.commands.dev}\``),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.push(""),r.analysis){r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(or(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(ir(r.analysis.antiPatterns)),n.push(""));let s=fm(r.analysis);s&&(n.push(s.trim()),n.push(""))}else n.push("> Run `p. sync` to populate project intelligence");return n.join(`
|
|
900
|
+
`)}function Lb(r,e){let t=r.sources||jn(),n=[];return n.push("# Copilot Instructions"),n.push(""),n.push(`This is ${r.name}, a ${r.ecosystem} project.`),n.push(""),n.push(gt(t.ecosystem)),n.push("## Project Info"),n.push(`- Type: ${r.projectType}`),n.push(`- Stack: ${r.frameworks.join(", ")||r.ecosystem}`),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(or(r.analysis.patterns,5)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns"),n.push(ir(r.analysis.antiPatterns,3)),n.push(""))):(n.push("> Run `p. sync` to populate project intelligence"),n.push("")),n.push(gt(t.commands)),n.push("## Commands"),n.push(`- Test: \`${r.commands.test}\``),n.push(`- Build: \`${r.commands.build}\``),n.join(`
|
|
901
|
+
`)}function Ub(r,e){let t=r.sources||jn(),n=[];return n.push("---"),n.push(`description: prjct context for ${r.name}`),n.push("trigger: always_on"),n.push("---"),n.push(""),n.push(`# ${r.name}`),n.push(""),n.push(`${r.projectType} project using ${r.ecosystem}.`),n.push(""),n.push(gt(t.languages)),n.push("## Stack"),n.push(`- ${r.languages.join(", ")}`),r.frameworks.length>0&&n.push(`- ${r.frameworks.join(", ")}`),n.push(""),n.push(gt(t.commands)),n.push("## Commands"),n.push("```bash"),n.push("# Install"),n.push(r.commands.install),n.push("# Dev"),n.push(r.commands.dev),n.push("# Test"),n.push(r.commands.test),n.push("# Build"),n.push(r.commands.build),n.push("```"),n.push(""),r.analysis?(r.analysis.patterns?.length>0&&(n.push("## Code Patterns"),n.push(or(r.analysis.patterns)),n.push("")),r.analysis.antiPatterns?.length>0&&(n.push("## Anti-Patterns (Avoid)"),n.push(ir(r.analysis.antiPatterns)))):n.push("> Run `p. sync` to populate project intelligence"),n.join(`
|
|
902
902
|
`)}function Hb(r,e){let t=[`You are working on ${r.name}, a ${r.projectType} ${r.ecosystem} project.`,"",`Stack: ${r.languages.join(", ")}${r.frameworks.length>0?` with ${r.frameworks.join(", ")}`:""}`,"","Commands:",`- Install: ${r.commands.install}`,`- Dev: ${r.commands.dev}`,`- Test: ${r.commands.test}`,`- Build: ${r.commands.build}`];if(r.analysis?.patterns?.length){t.push("","Code Patterns:");for(let o of r.analysis.patterns)t.push(`- ${o.name}: ${o.description}`)}if(r.analysis?.antiPatterns?.length){t.push("","Anti-Patterns (Avoid):");for(let o of r.analysis.antiPatterns)t.push(`- ${o.issue} in ${o.file} \u2014 ${o.suggestion}`)}r.analysis||t.push("","Run `p. sync` to populate project intelligence.");let s={systemMessage:t.join(`
|
|
903
|
-
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function Gb(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns
|
|
903
|
+
`),models:[],contextProviders:[{name:"code"},{name:"docs"},{name:"diff"},{name:"terminal"},{name:"problems"},{name:"folder"},{name:"codebase"}],slashCommands:[{name:"edit",description:"Edit selected code"},{name:"comment",description:"Add comments to code"},{name:"share",description:"Export conversation"},{name:"cmd",description:"Run terminal command"}],customCommands:[{name:"test",prompt:`Write tests for the selected code. Use the project's testing conventions. Test command: ${r.commands.test}`}]};return JSON.stringify(s,null,2)}function Gb(r,e){let t=[];return t.push(`# ${r.name} \u2014 Project Context`),t.push("<!-- Generated by prjct \u2014 https://prjct.app -->"),t.push(""),t.push("## Tech Stack"),r.languages.length>0&&t.push(`- Languages: ${r.languages.join(", ")}`),r.frameworks.length>0&&t.push(`- Frameworks: ${r.frameworks.join(", ")}`),r.analysis?.packageManager&&t.push(`- Package Manager: ${r.analysis.packageManager}`),t.push(""),t.push("## Commands"),t.push(""),t.push("| Action | Command |"),t.push("|--------|---------|"),t.push(`| Install | \`${r.commands.install}\` |`),t.push(`| Dev | \`${r.commands.dev}\` |`),t.push(`| Test | \`${r.commands.test}\` |`),t.push(`| Build | \`${r.commands.build}\` |`),t.push(""),(r.analysis?.sourceDir||r.analysis?.testDir)&&(t.push("## Project Structure"),r.analysis.sourceDir&&t.push(`- Source: \`${r.analysis.sourceDir}/\``),r.analysis.testDir&&t.push(`- Tests: \`${r.analysis.testDir}/\``),t.push("")),r.analysis?(r.analysis.patterns?.length>0&&(t.push("## Code Patterns"),t.push(""),t.push(or(r.analysis.patterns)),t.push("")),r.analysis.antiPatterns?.length>0&&(t.push("## Anti-Patterns (Avoid)"),t.push(""),t.push(ir(r.analysis.antiPatterns)),t.push(""))):(t.push("> Run `p. sync` to populate project intelligence"),t.push("")),t.push("## prjct Workflow"),t.push(""),t.push("Run `prjct` CLI commands for project management:"),t.push("- `prjct sync` \u2014 Analyze project, regenerate context"),t.push('- `prjct task "desc"` \u2014 Start a task'),t.push("- `prjct done` \u2014 Complete current subtask"),t.push('- `prjct ship "name"` \u2014 Ship feature with PR'),t.join(`
|
|
904
904
|
`)}function hm(r){return{claude:_b,cursor:Nb,copilot:Lb,windsurf:Ub,continue:Hb,codex:Gb}[r]||null}var Fc=y(()=>{"use strict";Oc();l(or,"formatPatterns");l(ir,"formatAntiPatterns");l(fm,"formatStructure");l(Fb,"formatAnalysisForClaude");l(_b,"formatForClaude");l(Nb,"formatForCursor");l(Lb,"formatForCopilot");l(Ub,"formatForWindsurf");l(Hb,"formatForContinue");l(Gb,"formatForCodex");l(hm,"getFormatter")});import{exec as zb}from"node:child_process";import Wb from"node:os";import rs from"node:path";import{promisify as Bb}from"node:util";function ym(r){return Jo[r]||null}async function Vo(r){try{return await Vb(`which ${r}`),!0}catch{return!1}}async function qo(r=process.cwd()){let e=[];return await Vo("claude")&&e.push("claude"),(await Vo("cursor")||await M(rs.join(r,".cursor")))&&e.push("cursor"),await M(rs.join(r,".github"))&&e.push("copilot"),(await Vo("windsurf")||await M(rs.join(r,".windsurf")))&&e.push("windsurf"),(await M(rs.join(r,".continue"))||await M(rs.join(Wb.homedir(),".continue")))&&e.push("continue"),(await Vo("codex")||await M(rs.join(r,".agents")))&&e.push("codex"),e}async function wm(r,e=process.cwd()){if(r==="auto"){let t=await qo(e);return t.length>0?t:["claude"]}return r==="all"?Jb:r.filter(t=>Jo[t])}var Vb,Jo,ar,Jb,_c=y(()=>{"use strict";Me();Vb=Bb(zb),Jo={claude:{id:"claude",name:"Claude Code",outputFile:"CLAUDE.md",outputPath:"global",maxTokens:6e3,format:"detailed",description:"Anthropic Claude Code CLI"},cursor:{id:"cursor",name:"Cursor",outputFile:".cursor/rules/prjct.mdc",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Cursor AI Editor"},copilot:{id:"copilot",name:"GitHub Copilot",outputFile:".github/copilot-instructions.md",outputPath:"repo",maxTokens:1500,format:"minimal",description:"GitHub Copilot"},windsurf:{id:"windsurf",name:"Windsurf",outputFile:".windsurf/rules/prjct.md",outputPath:"repo",maxTokens:2e3,format:"concise",description:"Codeium Windsurf Editor"},continue:{id:"continue",name:"Continue.dev",outputFile:".continue/config.json",outputPath:"repo",maxTokens:1500,format:"json",description:"Continue.dev open-source AI assistant"},codex:{id:"codex",name:"OpenAI Codex",outputFile:"AGENTS.md",outputPath:"repo",maxTokens:4e3,format:"detailed",description:"OpenAI Codex CLI"}},ar=["claude"],Jb=Object.keys(Jo);l(ym,"getAIToolConfig");l(Vo,"commandExists");l(qo,"detectInstalledTools");l(wm,"resolveToolIds")});import Nc from"node:fs/promises";import Lc from"node:path";async function Sm(r,e,t,n=ar){let s=[];for(let o of n){let i=ym(o);if(!i){s.push({toolId:o,outputFile:"",outputPath:"",success:!1,error:`Unknown tool: ${o}`});continue}let a=await qb(r,i,e,t);s.push(a)}return s}async function qb(r,e,t,n){let s=hm(e.id);if(!s)return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:`No formatter for: ${e.id}`};try{let o=s(r,e),i;e.outputPath==="repo"?i=Lc.join(n,e.outputFile):i=Lc.join(t,"context",e.outputFile),await Nc.mkdir(Lc.dirname(i),{recursive:!0});try{let a=await Nc.readFile(i,"utf-8"),c=sa(a);if(!c.valid){console.warn(`\u26A0\uFE0F ${e.outputFile} has invalid preserve blocks:`);for(let u of c.errors)console.warn(` ${u}`)}o=na(o,a)}catch{}return await Nc.writeFile(i,o,"utf-8"),{toolId:e.id,outputFile:e.outputFile,outputPath:i,success:!0}}catch(o){return{toolId:e.id,outputFile:e.outputFile,outputPath:"",success:!1,error:w(o)}}}var km=y(()=>{"use strict";O();ra();Fc();_c();l(Sm,"generateAIToolContexts");l(qb,"generateForTool")});var bm=y(()=>{"use strict";Fc();km();_c()});import cr from"node:fs/promises";import lr from"node:path";var Uc,Pm,Hc,Cm,xm=y(()=>{"use strict";O();Uc=".prjct/.prjct-state.md",Pm=".prjct-state.md",Hc=class{static{l(this,"LocalStateGenerator")}async generate(e,t){let n=lr.join(e,Uc);await cr.mkdir(lr.dirname(n),{recursive:!0});let s=this.toMarkdown(t);await cr.writeFile(n,s,"utf-8");try{let o=lr.join(e,Pm);await cr.unlink(o)}catch(o){if(!C(o))throw o}}async remove(e){for(let t of[Uc,Pm])try{await cr.unlink(lr.join(e,t))}catch(n){if(!C(n))throw n}}async exists(e){let t=lr.join(e,Uc);try{return await cr.access(t),!0}catch{return!1}}toMarkdown(e){let t=["<!-- Auto-generated by prjct - DO NOT EDIT -->","<!-- This file provides local state persistence for AI tools -->","","# prjct State",""];if(e.currentTask){let n=e.currentTask;if(t.push("## Current Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Started: ${n.startedAt}`),n.linearId&&t.push(`- Linear: ${n.linearId}`),n.branch&&t.push(`- Branch: ${n.branch}`),t.push(`- Status: ${n.status||"active"}`),t.push(""),n.subtasks&&n.subtasks.length>0){t.push("### Subtasks"),t.push(""),n.subtasks.forEach((a,c)=>{let u=a.status==="completed"?"\u2705":a.status==="in_progress"?"\u25B6\uFE0F":"\u23F3",d=c===n.currentSubtaskIndex?" \u2190 **Active**":"";t.push(`${c+1}. ${u} ${a.description}${d}`)}),t.push("");let s=n.subtasks.filter(a=>a.status==="completed").length,o=n.subtasks.length,i=Math.round(s/o*100);t.push(`**Progress**: ${s}/${o} (${i}%)`),t.push("")}}else t.push("*No active task*"),t.push(""),t.push('Start a task with `p. task "description"`'),t.push("");if(e.previousTask){let n=e.previousTask;t.push("---"),t.push(""),t.push("## Previous Task"),t.push(""),t.push(`**${n.description}**`),t.push(""),t.push(`- Status: ${n.status}`),n.prUrl&&t.push(`- PR: ${n.prUrl}`),t.push("")}return t.push("---"),t.push(`*Last updated: ${e.lastUpdated||new Date().toISOString()}*`),t.push(""),t.join(`
|
|
905
905
|
`)}},Cm=new Hc});import Gc from"node:fs/promises";import Kb from"node:os";import vm from"node:path";function zc(){return vm.join(Kb.homedir(),".prjct-cli","skills",Yb)}function Xb(){return{version:1,generatedAt:new Date().toISOString(),skills:{}}}async function ur(){try{let r=await Gc.readFile(zc(),"utf-8");return JSON.parse(r)}catch{return Xb()}}async function Wc(r){let e=zc();await Gc.mkdir(vm.dirname(e),{recursive:!0}),r.generatedAt=new Date().toISOString(),await Gc.writeFile(e,JSON.stringify(r,null,2),"utf-8")}async function Qb(r){let e=await ur();e.skills[r.name]=r,await Wc(e)}async function Zb(r){let e=await ur();return r in e.skills?(delete e.skills[r],await Wc(e),!0):!1}async function eP(r){return(await ur()).skills[r]||null}async function tP(){return(await ur()).skills}function nP(){return zc()}var Yb,dr,Tm=y(()=>{"use strict";Yb=".skill-lock.json";l(zc,"getLockFilePath");l(Xb,"createEmptyLockFile");l(ur,"read");l(Wc,"write");l(Qb,"addEntry");l(Zb,"removeEntry");l(eP,"getEntry");l(tP,"getAll");l(nP,"getPath");dr={read:ur,write:Wc,addEntry:Qb,removeEntry:Zb,getEntry:eP,getAll:tP,getPath:nP}});import{exec as sP}from"node:child_process";import zt from"node:fs/promises";import Vc from"node:os";import We from"node:path";import{promisify as rP}from"node:util";import{glob as Em}from"glob";function Im(r){if(r.startsWith("./")||r.startsWith("/")||r.startsWith("~")){let n=r.startsWith("~")?We.join(Vc.homedir(),r.slice(1)):We.resolve(r);return{type:"local",localPath:n,url:n}}let e=r.indexOf("@");if(e>0){let n=r.slice(0,e),s=r.slice(e+1),[o,i]=n.split("/");if(o&&i)return{type:"github",owner:o,repo:i,skillName:s,url:`https://github.com/${o}/${i}`}}let t=r.split("/");if(t.length===2&&t[0]&&t[1])return{type:"github",owner:t[0],repo:t[1],url:`https://github.com/${t[0]}/${t[1]}`};throw new Error(`Invalid source format: "${r}". Expected "owner/repo", "owner/repo@skill-name", or "./local-path"`)}async function Dm(r){let e=[];try{let s=We.join(r,"SKILL.md");await zt.access(s);let o=We.basename(r);e.push({name:o,filePath:s})}catch{}let t=await Em("*/SKILL.md",{cwd:r,absolute:!0});for(let s of t){let o=We.basename(We.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}let n=await Em("skills/*/SKILL.md",{cwd:r,absolute:!0});for(let s of n){let o=We.basename(We.dirname(s));e.some(i=>i.name===o)||e.push({name:o,filePath:s})}return e}function oP(r,e,t){let n=new Date().toISOString(),s=["_prjct:",` sourceUrl: ${e.url}`,` sourceType: ${e.type}`,` installedAt: ${n}`];t&&s.push(` sha: ${t}`);let o=/^---\s*\n([\s\S]*?)\n---/,i=r.match(o);if(i){let a=i[1];a=a.replace(/\n?_prjct:[\s\S]*?(?=\n[a-zA-Z]|\n---|\s*$)/g,"");let c=`${a.trimEnd()}
|
|
906
906
|
${s.join(`
|
|
@@ -952,7 +952,7 @@ Domain specialist for ${r} tasks.
|
|
|
952
952
|
You are the ${r} expert for this project. Apply best practices for the detected stack.
|
|
953
953
|
`}function Fm(r,e,t){let n=[];for(let o of r)o.skill&&n.push({agent:o.name,skill:o.skill});let s={projectId:e,syncedAt:k(),skills:n.map(o=>({name:o.skill,linkedAgents:[o.agent]})),agentSkillMap:Object.fromEntries(n.map(o=>[o.agent,o.skill]))};return ft.writeFile(ct.join(t,"config","skills.json"),JSON.stringify(s,null,2),"utf-8").catch(o=>{B.debug("Failed to write skills.json",{error:K(o)})}),n}async function _m(r){let e=[];try{let t=ct.join(__dirname,"..","..","templates","config","skill-mappings.json"),n=await ft.readFile(t,"utf-8"),o=JSON.parse(n).agentToSkillMap||{},i=[];for(let c of r){let u=o[c.name];if(u?.packages)for(let d of u.packages)i.push({pkg:d,agent:c.name})}if(i.length===0)return e;let a=ct.join(uP.homedir(),".claude","skills");for(let{pkg:c,agent:u}of i){let d=c.split("/").pop()||c,m=ct.join(a,d,"SKILL.md"),p=ct.join(a,`${d}.md`),g=!1;try{await ft.access(m),g=!0}catch{try{await ft.access(p),g=!0}catch{}}if(g){e.push({name:d,agent:u,status:"skipped"});continue}try{let f=c.split("/"),S;f.length===3?S=`${f[0]}/${f[1]}@${f[2]}`:S=c;let P=await jm.install(S);P.installed.length>0?(e.push({name:d,agent:u,status:"installed"}),B.info(`Installed skill: ${d} for agent: ${u}`)):P.errors.length>0?(e.push({name:d,agent:u,status:"error"}),B.debug(`Failed to install skill ${d}`,{errors:P.errors})):e.push({name:d,agent:u,status:"skipped"})}catch(f){e.push({name:d,agent:u,status:"error"}),B.debug(`Skill install error for ${d}`,{error:K(f)})}}}catch(t){B.debug("Skill auto-installation failed (non-critical)",{error:K(t)})}return e}var Nm=y(()=>{"use strict";qn();Ut();se();Zn();Rm();l($m,"generateAgents");l(Mm,"loadExistingAgents");l(Om,"resolveTemplateIncludes");l(dP,"generateWorkflowAgent");l(pP,"generateDomainAgent");l(mP,"injectFeedbackSection");l(gP,"generateMinimalWorkflowAgent");l(fP,"generateMinimalDomainAgent");l(Fm,"configureSkills");l(_m,"autoInstallSkills")});import Lm from"node:fs/promises";import Um from"node:path";var Ko,Hm=y(()=>{"use strict";Ko=class{static{l(this,"StackDetector")}projectPath;constructor(e){this.projectPath=e}async detect(){let e={hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]},t=await this.readPackageJson();if(t){let n={...t.dependencies,...t.devDependencies};this.detectFrontend(n,e),this.detectBackend(n,e),this.detectDatabase(n,e),this.detectTesting(n,t,e),this.collectFrameworks(n,e)}return e.hasDocker=await this.detectDocker(),e}detectFrontend(e,t){(e.react||e.vue||e.svelte||e["@angular/core"])&&(t.hasFrontend=!0,t.frontendType="web"),(e["react-native"]||e.expo)&&(t.hasFrontend=!0,t.frontendType=t.frontendType==="web"?"both":"mobile")}detectBackend(e,t){["express","fastify","hono","koa","@nestjs/core","nest","@hapi/hapi","restify","polka"].some(s=>e[s])&&(t.hasBackend=!0)}detectDatabase(e,t){["prisma","@prisma/client","mongoose","pg","mysql2","sequelize","typeorm","drizzle-orm","knex","better-sqlite3","mongodb","redis","ioredis"].some(s=>e[s])&&(t.hasDatabase=!0)}detectTesting(e,t,n){["jest","vitest","mocha","@testing-library/react","@testing-library/vue","cypress","playwright","@playwright/test","ava","tap","bun-types"].some(o=>e[o]||t.devDependencies?.[o])&&(n.hasTesting=!0)}async detectDocker(){let e=["Dockerfile","docker-compose.yml","docker-compose.yaml",".dockerignore"];for(let t of e)if(await this.fileExists(t))return!0;return!1}collectFrameworks(e,t){e.react&&t.frameworks.push("React"),e.next&&t.frameworks.push("Next.js"),e.vue&&t.frameworks.push("Vue"),e.nuxt&&t.frameworks.push("Nuxt"),e.svelte&&t.frameworks.push("Svelte"),e["@angular/core"]&&t.frameworks.push("Angular"),e["react-native"]&&t.frameworks.push("React Native"),e.expo&&t.frameworks.push("Expo"),e.express&&t.frameworks.push("Express"),e.fastify&&t.frameworks.push("Fastify"),e.hono&&t.frameworks.push("Hono"),e.koa&&t.frameworks.push("Koa"),(e["@nestjs/core"]||e.nest)&&t.frameworks.push("NestJS"),e.astro&&t.frameworks.push("Astro"),e.remix&&t.frameworks.push("Remix"),e.gatsby&&t.frameworks.push("Gatsby")}async readPackageJson(){try{let e=Um.join(this.projectPath,"package.json"),t=await Lm.readFile(e,"utf-8");return JSON.parse(t)}catch{return null}}async fileExists(e){try{return await Lm.access(Um.join(this.projectPath,e)),!0}catch{return!1}}}});import{exec as hP}from"node:child_process";import Gm from"node:fs/promises";import qc from"node:path";import{promisify as yP}from"node:util";async function zm(r){let e={branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0};try{let{stdout:t}=await Rn("git branch --show-current",{cwd:r});e.branch=t.trim()||"main";let{stdout:n}=await Rn("git rev-list --count HEAD",{cwd:r});e.commits=parseInt(n.trim(),10)||0;let{stdout:s}=await Rn("git shortlog -sn --all | wc -l",{cwd:r});e.contributors=parseInt(s.trim(),10)||0;let{stdout:o}=await Rn("git status --porcelain",{cwd:r}),i=o.trim().split(`
|
|
954
954
|
`).filter(Boolean);e.hasChanges=i.length>0;for(let u of i){let d=u.substring(0,2),m=u.substring(3);d.startsWith("A")||d.startsWith("M ")?e.stagedFiles.push(m):d.includes("M")?e.modifiedFiles.push(m):d.startsWith("??")&&e.untrackedFiles.push(m)}let{stdout:a}=await Rn('git log --oneline -20 --pretty=format:"%h|%s|%ad" --date=short',{cwd:r});e.recentCommits=a.split(`
|
|
955
|
-
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Rn('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:K(t)})}return e}async function Nt(r,e){try{return await Gm.access(qc.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function Wm(r){let e={fileCount:0,version:"0.0.0",name:qc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Rn('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:K(t)}),e.fileCount=0}try{let t=qc.join(r,"package.json"),n=JSON.parse(await Gm.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await Nt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:K(t)})}return await Nt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Nt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Nt(r,"requirements.txt")||await Nt(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Bm(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Nt(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Nt(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Nt(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Nt(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Nt(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Vm(r,e){let t=jn(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Jm(r){return new Ko(r).detect()}var Rn,qm=y(()=>{"use strict";Ut();Oc();Zn();Hm();Rn=yP(hP);l(zm,"analyzeGit");l(Nt,"fileExists");l(Wm,"gatherStats");l(Bm,"detectCommands");l(Vm,"buildSources");l(Jm,"detectStack")});import{exec as wP}from"node:child_process";import Kc from"node:fs/promises";import Yo from"node:path";import{promisify as SP}from"node:util";var kP,Yc,Xc,Km,Ym=y(()=>{"use strict";Mt();O();kP=SP(wP),Yc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Yo.join(r,s);try{await Kc.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=Yo.basename(r);try{await F.read(n)}catch(s){C(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Yo.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await Kc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Kc.readFile(Yo.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!C(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Xc=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Yc.contextFilesExist(t),Yc.jsonFilesValid(t),Yc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await kP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Km=new Xc});import Xo from"node:fs/promises";import Qo from"node:path";var Zo,pr,Xm=y(()=>{"use strict";Gn();em();am();um();gm();jc();Ut();fn();st();le();ho();en();ue();zs();yo();So();Bs();Vs();qs();bm();se();Zn();Va();Ja();xm();Ca();Nm();qm();Ym();Zo=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await qo(e)).filter(i=>!ar.includes(i));s=[...ar,...o]}else t.aiTools[0]==="auto"?(s=await qo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await wm("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Ws(this.projectId);try{let _=await wo(this.projectId);_>0&&B.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(_)})}let[i,a,c,u]=await Promise.all([zm(this.projectPath),Wm(this.projectPath),Bm(this.projectPath),Jm(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&lm(this.projectId))try{let{diff:_,currentHashes:Hg}=await Mc(this.projectPath,this.projectId),kl=_.added.length+_.modified.length+_.deleted.length;if(kl===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let yi=om(_,this.projectId);f=im(yi.allAffected);let Gg=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=yi.allAffected.some(cn=>{let zg=cn.substring(cn.lastIndexOf("."));return Gg.has(zg)}),g=yi.directlyChanged.some(cn=>cn==="package.json"||cn==="tsconfig.json"||cn.includes("Dockerfile")||cn.includes("docker-compose")),m={isIncremental:!0,filesChanged:kl,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}$c(this.projectId,Hg)}catch(_){B.debug("Incremental detection failed, falling back to full sync",{error:K(_)})}else try{let{currentHashes:_}=await Mc(this.projectPath,this.projectId);$c(this.projectId,_)}catch(_){B.debug("Hash computation failed (non-critical)",{error:K(_)})}if(p)try{await Promise.all([Zp(this.projectPath,this.projectId),rm(this.projectPath,this.projectId),mm(this.projectPath,this.projectId)])}catch(_){B.debug("File ranking index build failed (non-critical)",{error:K(_)})}let S;if(g)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(S=_)}catch{}let P=g?await $m(this.globalPath,u,a,S):await Mm(this.globalPath),I=Fm(P,this.projectId,this.globalPath),j=g?await _m(P):[],V=Vm(a,c),de=[],we;try{let _=await it.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(we={patterns:_.patterns,antiPatterns:_.antiPatterns,packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let Ue={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:P.filter(_=>_.type==="workflow").map(_=>_.name),domain:P.filter(_=>_.type==="domain").map(_=>_.name)},sources:V,analysis:we},b=await Sm(Ue,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let A=Date.now()-n,Se=await this.recordSyncMetrics(a,de,P,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await He.installGlobalConfig(),await He.syncCommands();let an;try{let _=await R.readConfig(this.projectPath);an=await Km.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){B.debug("Verification failed (non-critical)",{error:K(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:P,skills:I,skillsInstalled:j,contextFiles:de,aiTools:b.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:Se,verification:an,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:K(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Xo.mkdir(Qo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||k(),lastSync:k(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await F.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=k(),s.lastUpdated=k(),s.context={...s.context||{},lastSession:k(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,s);try{await Cm.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=Qo.join(this.globalPath,m),g=await Xo.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:K(p)})}for(let m of n)try{let p=Qo.join(this.globalPath,"agents",`${m.name}.md`),g=await Xo.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:K(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await kn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:K(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await F.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await it.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:k(),status:"draft",commitHash:s??void 0})}catch(s){B.debug("Failed to save draft analysis (non-critical)",{error:K(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Ke.archiveOldShipped(this.projectId).catch(()=>0),Fe.markDormantIdeas(this.projectId).catch(()=>0),me.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),qe.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=rt.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:K(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new dn,n=await Ba.learnFromTaskHistory(this.projectId,e,t);try{let s=await Td.getFeatureOutcomes(this.projectId);s.length>0&&await Ba.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:K(e)})}}async getCliVersion(){try{let e=Qo.join(__dirname,"..","..","package.json");return JSON.parse(await Xo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:K(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},pr=new Zo});var rn=y(()=>{"use strict";zu();Yu();Xu();td();sd();fa();id();Ca();ad();cd();Bp();Yp();Xm()});import Wt from"chalk";function Qm(r){return Math.ceil(r.length/bP)}function Zm(r){let e=r.split(`
|
|
955
|
+
`).filter(Boolean).map(u=>{let[d,m,p]=u.split("|");return{hash:d,message:m,date:p}});let{stdout:c}=await Rn('git log --oneline --since="1 week ago" | wc -l',{cwd:r});e.weeklyCommits=parseInt(c.trim(),10)||0}catch(t){B.debug("Git analysis failed (not a git repo?)",{error:K(t)})}return e}async function Nt(r,e){try{return await Gm.access(qc.join(r,e)),!0}catch(t){return B.debug("File not found",{filename:e,error:K(t)}),!1}}async function Wm(r){let e={fileCount:0,version:"0.0.0",name:qc.basename(r),ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]};try{let{stdout:t}=await Rn('find . -type f \\( -name "*.js" -o -name "*.ts" -o -name "*.tsx" -o -name "*.py" -o -name "*.go" -o -name "*.rs" \\) -not -path "./node_modules/*" -not -path "./.git/*" | wc -l',{cwd:r});e.fileCount=parseInt(t.trim(),10)||0}catch(t){B.debug("File count failed",{path:r,error:K(t)}),e.fileCount=0}try{let t=qc.join(r,"package.json"),n=JSON.parse(await Gm.readFile(t,"utf-8"));e.version=n.version||"0.0.0",e.name=n.name||e.name,e.ecosystem="JavaScript";let s={...n.dependencies,...n.devDependencies};(s.react||s["react-dom"])&&e.frameworks.push("React"),s.next&&e.frameworks.push("Next.js"),s.vue&&e.frameworks.push("Vue"),s.express&&e.frameworks.push("Express"),s.hono&&e.frameworks.push("Hono"),s["@angular/core"]&&e.frameworks.push("Angular"),s.svelte&&e.frameworks.push("Svelte"),n.devDependencies?.typescript||await Nt(r,"tsconfig.json")?e.languages.push("TypeScript"):e.languages.push("JavaScript")}catch(t){B.debug("No package.json found",{path:r,error:K(t)})}return await Nt(r,"Cargo.toml")&&(e.ecosystem="Rust",e.languages.push("Rust")),await Nt(r,"go.mod")&&(e.ecosystem="Go",e.languages.push("Go")),(await Nt(r,"requirements.txt")||await Nt(r,"pyproject.toml"))&&(e.ecosystem="Python",e.languages.push("Python")),e.fileCount>300||e.frameworks.length>=3?e.projectType="enterprise":(e.fileCount>50||e.frameworks.length>=2)&&(e.projectType="complex"),e}async function Bm(r){let e={install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"};return await Nt(r,"bun.lockb")?(e.install="bun install",e.run="bun run",e.test="bun test",e.build="bun run build",e.dev="bun run dev",e.lint="bun run lint",e.format="bun run format"):await Nt(r,"pnpm-lock.yaml")?(e.install="pnpm install",e.run="pnpm run",e.test="pnpm test",e.build="pnpm run build",e.dev="pnpm run dev",e.lint="pnpm run lint",e.format="pnpm run format"):await Nt(r,"yarn.lock")&&(e.install="yarn",e.run="yarn",e.test="yarn test",e.build="yarn build",e.dev="yarn dev",e.lint="yarn lint",e.format="yarn format"),await Nt(r,"Cargo.toml")&&(e.install="cargo build",e.run="cargo run",e.test="cargo test",e.build="cargo build --release",e.dev="cargo run",e.lint="cargo clippy",e.format="cargo fmt"),await Nt(r,"go.mod")&&(e.install="go mod download",e.run="go run .",e.test="go test ./...",e.build="go build",e.dev="go run .",e.lint="golangci-lint run",e.format="go fmt ./..."),e}function Vm(r,e){let t=jn(),s={JavaScript:"package.json",Rust:"Cargo.toml",Go:"go.mod",Python:"pyproject.toml"}[r.ecosystem]||"filesystem",o=l(a=>({file:a,type:"detected"}),"detected"),i=l(a=>({file:a,type:"inferred"}),"inferred");return t.ecosystem=o(s),t.name=o(s),t.version=o(s),t.languages=o(s),t.frameworks=o(s),e.install.startsWith("bun")?t.commands=o("bun.lockb"):e.install.startsWith("pnpm")?t.commands=o("pnpm-lock.yaml"):e.install==="yarn"?t.commands=o("yarn.lock"):e.install.startsWith("cargo")?t.commands=o("Cargo.toml"):e.install.startsWith("go")?t.commands=o("go.mod"):t.commands=o("package.json"),t.projectType=i("file count + frameworks"),t.git=o("git"),t}async function Jm(r){return new Ko(r).detect()}var Rn,qm=y(()=>{"use strict";Ut();Oc();Zn();Hm();Rn=yP(hP);l(zm,"analyzeGit");l(Nt,"fileExists");l(Wm,"gatherStats");l(Bm,"detectCommands");l(Vm,"buildSources");l(Jm,"detectStack")});import{exec as wP}from"node:child_process";import Kc from"node:fs/promises";import Yo from"node:path";import{promisify as SP}from"node:util";var kP,Yc,Xc,Km,Ym=y(()=>{"use strict";Mt();O();kP=SP(wP),Yc={async contextFilesExist(r){let e=Date.now(),t=["context/CLAUDE.md"],n=[];for(let s of t){let o=Yo.join(r,s);try{await Kc.access(o)}catch{n.push(s)}}return{name:"Context files exist",passed:n.length===0,output:n.length===0?`${t.length} files verified`:void 0,error:n.length>0?`Missing: ${n.join(", ")}`:void 0,durationMs:Date.now()-e}},async jsonFilesValid(r){let e=Date.now(),t=[],n=Yo.basename(r);try{await F.read(n)}catch(s){C(s)||t.push(`state: ${w(s)}`)}return{name:"State data valid",passed:t.length===0,output:t.length===0?"1 store validated":void 0,error:t.length>0?t.join("; "):void 0,durationMs:Date.now()-e}},async noSensitiveData(r){let e=Date.now(),t=Yo.join(r,"context"),n=[/(?:api[_-]?key|apikey)\s*[:=]\s*['"][^'"]{10,}/i,/(?:password|passwd|pwd)\s*[:=]\s*['"][^'"]{4,}/i,/(?:secret|token)\s*[:=]\s*['"][^'"]{10,}/i],s=[];try{let o=await Kc.readdir(t);for(let i of o){if(!i.endsWith(".md"))continue;let a=await Kc.readFile(Yo.join(t,i),"utf-8");for(let c of n)if(c.test(a)){s.push(`${i}: potential sensitive data detected`);break}}}catch(o){if(!C(o))return{name:"No sensitive data",passed:!1,error:`Could not scan: ${w(o)}`,durationMs:Date.now()-e}}return{name:"No sensitive data",passed:s.length===0,output:s.length===0?"No sensitive patterns found":void 0,error:s.length>0?s.join("; "):void 0,durationMs:Date.now()-e}}},Xc=class{static{l(this,"SyncVerifier")}async verify(e,t,n){let s=Date.now(),o=[],i=n?.failFast??!1,a=0,c=[Yc.contextFilesExist(t),Yc.jsonFilesValid(t),Yc.noSensitiveData(t)];for(let p of c){let g=await p;if(o.push(g),!g.passed&&i){a=n?.checks?.filter(f=>f.enabled!==!1).length??0;break}}if((!i||o.every(p=>p.passed))&&n?.checks)for(let p of n.checks){if(p.enabled===!1){a++;continue}let g=await this.runCustomCheck(p,e);if(o.push(g),!g.passed&&i){let f=n.checks.slice(n.checks.indexOf(p)+1);a+=f.filter(S=>S.enabled!==!1).length;break}}let d=o.filter(p=>!p.passed).length,m=o.filter(p=>p.passed).length;return{passed:d===0,checks:o,totalMs:Date.now()-s,failedCount:d,passedCount:m,skippedCount:a}}async runCustomCheck(e,t){let n=Date.now(),s=e.command||(e.script?`sh ${e.script}`:null);if(!s)return{name:e.name,passed:!1,error:"No command or script specified",durationMs:Date.now()-n};try{let{stdout:o,stderr:i}=await kP(s,{cwd:t,timeout:3e4});return{name:e.name,passed:!0,output:(o.trim()||i.trim()).slice(0,200)||void 0,durationMs:Date.now()-n}}catch(o){let i=o;return{name:e.name,passed:!1,error:(i.stderr?.trim()||i.message).slice(0,200),durationMs:Date.now()-n}}}},Km=new Xc});import Xo from"node:fs/promises";import Qo from"node:path";var Zo,pr,Xm=y(()=>{"use strict";Gn();em();am();um();gm();jc();Ut();fn();st();le();ho();en();ue();zs();yo();So();Bs();Vs();qs();bm();se();Zn();Va();Ja();xm();Ca();Nm();qm();Ym();Zo=class{static{l(this,"SyncService")}projectPath;projectId=null;globalPath="";cliVersion="0.0.0";constructor(){this.projectPath=process.cwd()}async sync(e=process.cwd(),t={}){this.projectPath=e;let n=Date.now(),s;if(!t.aiTools||t.aiTools.length===0){let o=(await qo(e)).filter(i=>!ar.includes(i));s=[...ar,...o]}else t.aiTools[0]==="auto"?(s=await qo(e),s.length===0&&(s=["claude"])):t.aiTools[0]==="all"?s=await wm("all",e):s=t.aiTools;try{if(this.projectId=await R.getProjectId(e),!this.projectId)return{success:!1,projectId:"",cliVersion:"",git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:"No prjct project. Run p. init first."};this.globalPath=E.getGlobalProjectPath(this.projectId),this.cliVersion=await this.getCliVersion(),await this.ensureDirectories(),await Ws(this.projectId);try{let _=await wo(this.projectId);_>0&&B.info("Swept legacy JSON files into SQLite",{swept:_})}catch(_){B.debug("Legacy JSON sweep failed (non-critical)",{error:K(_)})}let[i,a,c,u]=await Promise.all([zm(this.projectPath),Wm(this.projectPath),Bm(this.projectPath),Jm(this.projectPath)]),d=t.full===!0,m,p=!0,g=!0,f=new Set;if(!d&&lm(this.projectId))try{let{diff:_,currentHashes:Hg}=await Mc(this.projectPath,this.projectId),kl=_.added.length+_.modified.length+_.deleted.length;if(kl===0&&!t.changedFiles?.length)p=!1,g=!1,m={isIncremental:!0,filesChanged:0,filesUnchanged:_.unchanged.length,indexesRebuilt:!1,agentsRegenerated:!1,affectedDomains:[]};else{let yi=om(_,this.projectId);f=im(yi.allAffected);let Gg=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs"]);p=yi.allAffected.some(cn=>{let zg=cn.substring(cn.lastIndexOf("."));return Gg.has(zg)}),g=yi.directlyChanged.some(cn=>cn==="package.json"||cn==="tsconfig.json"||cn.includes("Dockerfile")||cn.includes("docker-compose")),m={isIncremental:!0,filesChanged:kl,filesUnchanged:_.unchanged.length,indexesRebuilt:p,agentsRegenerated:g,affectedDomains:Array.from(f)}}$c(this.projectId,Hg)}catch(_){B.debug("Incremental detection failed, falling back to full sync",{error:K(_)})}else try{let{currentHashes:_}=await Mc(this.projectPath,this.projectId);$c(this.projectId,_)}catch(_){B.debug("Hash computation failed (non-critical)",{error:K(_)})}if(p)try{await Promise.all([Zp(this.projectPath,this.projectId),rm(this.projectPath,this.projectId),mm(this.projectPath,this.projectId)])}catch(_){B.debug("File ranking index build failed (non-critical)",{error:K(_)})}let S;if(g)try{let _=await F.getAggregatedFeedback(this.projectId);(_.patternsDiscovered.length>0||_.knownGotchas.length>0||_.agentAccuracy.length>0)&&(S=_)}catch{}let P=g?await $m(this.globalPath,u,a,S):await Mm(this.globalPath),I=Fm(P,this.projectId,this.globalPath),j=g?await _m(P):[],V=Vm(a,c),de=[],we;try{let _=await it.getActive(this.projectId);(_?.patterns?.length||_?.antiPatterns?.length)&&(we={patterns:_.patterns??[],antiPatterns:_.antiPatterns??[],packageManager:_.packageManager,sourceDir:_.sourceDir,testDir:_.testDir})}catch{}let Ue={projectId:this.projectId,name:a.name,version:a.version,ecosystem:a.ecosystem,projectType:a.projectType,languages:a.languages,frameworks:a.frameworks,repoPath:this.projectPath,branch:i.branch,fileCount:a.fileCount,commits:i.commits,hasChanges:i.hasChanges,commands:c,agents:{workflow:P.filter(_=>_.type==="workflow").map(_=>_.name),domain:P.filter(_=>_.type==="domain").map(_=>_.name)},sources:V,analysis:we},b=await Sm(Ue,this.globalPath,this.projectPath,s);await Promise.all([this.updateProjectJson(i,a),this.updateStateJson(a,u),this.logToMemory(i,a),this.saveDraftAnalysis(i,a,u)]);let A=Date.now()-n,Se=await this.recordSyncMetrics(a,de,P,A);await this.archiveStaleData(),await this.autoLearnFromHistory(),await He.installGlobalConfig(),await He.syncCommands();let an;try{let _=await R.readConfig(this.projectPath);an=await Km.verify(this.projectPath,this.globalPath,_?.verification)}catch(_){B.debug("Verification failed (non-critical)",{error:K(_)})}return{success:!0,projectId:this.projectId,cliVersion:this.cliVersion,git:i,stats:a,commands:c,stack:u,agents:P,skills:I,skillsInstalled:j,contextFiles:de,aiTools:b.map(_=>({toolId:_.toolId,outputFile:_.outputFile,success:_.success})),syncMetrics:Se,verification:an,incremental:m}}catch(o){return{success:!1,projectId:this.projectId||"",cliVersion:this.cliVersion,git:this.emptyGitData(),stats:this.emptyStats(),commands:this.emptyCommands(),stack:this.emptyStack(),agents:[],skills:[],skillsInstalled:[],contextFiles:[],aiTools:[],error:K(o)}}}async ensureDirectories(){let e=["storage","context","agents","memory","analysis","config","sync"];await Promise.all(e.map(t=>Xo.mkdir(Qo.join(this.globalPath,t),{recursive:!0})))}async updateProjectJson(e,t){let n=$.getDoc(this.projectId,"project")||{},s={...n,projectId:this.projectId,repoPath:this.projectPath,name:t.name,version:t.version,cliVersion:this.cliVersion,techStack:t.frameworks,fileCount:t.fileCount,commitCount:e.commits,stack:t.ecosystem,currentBranch:e.branch,hasUncommittedChanges:e.hasChanges,createdAt:n.createdAt||k(),lastSync:k(),lastSyncCommit:e.recentCommits[0]?.hash||null,lastSyncBranch:e.branch};$.setDoc(this.projectId,"project",s)}async updateStateJson(e,t){let s={...await F.read(this.projectId)};s.projectId=this.projectId,s.stack={language:e.languages[0]||"Unknown",framework:e.frameworks[0]||null},s.domains={hasFrontend:t.hasFrontend,hasBackend:t.hasBackend,hasDatabase:t.hasDatabase,hasTesting:t.hasTesting,hasDocker:t.hasDocker},s.projectType=e.projectType,s.metrics={totalFiles:e.fileCount},s.lastSync=k(),s.lastUpdated=k(),s.context={...s.context||{},lastSession:k(),lastAction:"Synced project",nextAction:'Run `p. task "description"` to start working'},await F.write(this.projectId,s);try{await Cm.generate(this.projectPath,s)}catch(o){B.debug("Local state generation failed (optional)",{error:K(o)})}}async logToMemory(e,t){$.appendEvent(this.projectId,"sync",{branch:e.branch,uncommitted:e.hasChanges,fileCount:t.fileCount,commitCount:e.commits})}async recordSyncMetrics(e,t,n,s){let i=0;for(let m of t)try{let p=Qo.join(this.globalPath,m),g=await Xo.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Context file not found for metrics",{file:m,error:K(p)})}for(let m of n)try{let p=Qo.join(this.globalPath,"agents",`${m.name}.md`),g=await Xo.readFile(p,"utf-8");i+=g.length}catch(p){B.debug("Agent file not found for metrics",{agent:m.name,error:K(p)})}let a=Math.floor(i/4),u=e.fileCount*500,d=u>0?Math.max(0,(u-a)/u):0;try{await kn.recordSync(this.projectId,{originalSize:u,filteredSize:a,duration:s,isWatch:!1,agents:n.filter(m=>m.type==="domain").map(m=>m.name)})}catch(m){B.debug("Failed to record sync metrics",{error:K(m)})}return{duration:s,originalSize:u,filteredSize:a,compressionRate:d}}async saveDraftAnalysis(e,t,n){try{let s=e.recentCommits[0]?.hash||null,o=[],i=[];try{let a=await F.getAggregatedFeedback(this.projectId);a.patternsDiscovered.length>0&&(o=a.patternsDiscovered.map(c=>({name:c,description:`Discovered during task execution: ${c}`}))),a.knownGotchas.length>0&&(i=a.knownGotchas.map(c=>({issue:c,file:"multiple",suggestion:`Recurring issue reported across tasks: ${c}`})))}catch{}await it.saveDraft(this.projectId,{projectId:this.projectId,languages:t.languages,frameworks:t.frameworks,configFiles:[],fileCount:t.fileCount,patterns:o,antiPatterns:i,analyzedAt:k(),status:"draft",commitHash:s??void 0})}catch(s){B.debug("Failed to save draft analysis (non-critical)",{error:K(s)})}}async archiveStaleData(){if(this.projectId)try{let[e,t,n,s,o]=await Promise.all([Ke.archiveOldShipped(this.projectId).catch(()=>0),Fe.markDormantIdeas(this.projectId).catch(()=>0),me.removeStaleCompleted(this.projectId).catch(()=>0),F.archiveStalePausedTasks(this.projectId).catch(()=>[]),qe.capEntries(this.projectId).catch(()=>0)]),i=e+t+n+s.length+o;if(i>0){B.info("Archived stale data",{shipped:e,dormant:t,staleQueue:n,stalePaused:s.length,memoryCapped:o,total:i});let a=rt.getStats(this.projectId);B.debug("Archive stats",a)}}catch(e){B.debug("Archival failed (non-critical)",{error:K(e)})}}async autoLearnFromHistory(){if(this.projectId)try{let e=await F.getTaskHistory(this.projectId);if(e.length===0)return;let t=new dn,n=await Ba.learnFromTaskHistory(this.projectId,e,t);try{let s=await Td.getFeatureOutcomes(this.projectId);s.length>0&&await Ba.learnFromOutcomes(this.projectId,s,t)}catch{}n.memoriesInjected>0&&B.info("Auto-learned from task history",{patternsExtracted:n.patternsExtracted,memoriesInjected:n.memoriesInjected,patternsSkipped:n.patternsSkipped})}catch(e){B.debug("Auto-learning failed (non-critical)",{error:K(e)})}}async getCliVersion(){try{let e=Qo.join(__dirname,"..","..","package.json");return JSON.parse(await Xo.readFile(e,"utf-8")).version||"0.0.0"}catch(e){return B.debug("Failed to read CLI version",{error:K(e)}),"0.0.0"}}emptyGitData(){return{branch:"main",commits:0,contributors:0,hasChanges:!1,stagedFiles:[],modifiedFiles:[],untrackedFiles:[],recentCommits:[],weeklyCommits:0}}emptyStats(){return{fileCount:0,version:"0.0.0",name:"unknown",ecosystem:"unknown",projectType:"simple",languages:[],frameworks:[]}}emptyCommands(){return{install:"npm install",run:"npm run",test:"npm test",build:"npm run build",dev:"npm run dev",lint:"npm run lint",format:"npm run format"}}emptyStack(){return{hasFrontend:!1,hasBackend:!1,hasDatabase:!1,hasDocker:!1,hasTesting:!1,frontendType:null,frameworks:[]}}},pr=new Zo});var rn=y(()=>{"use strict";zu();Yu();Xu();td();sd();fa();id();Ca();ad();cd();Bp();Yp();Xm()});import Wt from"chalk";function Qm(r){return Math.ceil(r.length/bP)}function Zm(r){let e=r.split(`
|
|
956
956
|
`),t=[],n=null;for(let s=0;s<e.length;s++){let o=e[s],i=o.match(/^(#{1,3})\s+(.+)$/);i?(n&&(n.endLine=s-1,t.push(n)),n={name:i[2].trim(),content:o,startLine:s,endLine:s}):n&&(n.content+=`
|
|
957
957
|
${o}`)}return n&&(n.endLine=e.length-1,t.push(n)),t}function Qc(r){return r.includes("<!-- prjct:preserve")}function eg(r,e){let t=Zm(r),n=Zm(e),s={hasChanges:!1,added:[],modified:[],removed:[],preserved:[],tokensBefore:Qm(r),tokensAfter:Qm(e),tokenDelta:0};s.tokenDelta=s.tokensAfter-s.tokensBefore;let o=new Map(t.map(a=>[a.name.toLowerCase(),a])),i=new Map(n.map(a=>[a.name.toLowerCase(),a]));for(let a of t)Qc(a.content)&&s.preserved.push({name:a.name,lineCount:a.content.split(`
|
|
958
958
|
`).length});for(let a of n){let c=a.name.toLowerCase(),u=o.get(c);u?u.content.trim()!==a.content.trim()&&(Qc(u.content)||(s.modified.push({name:a.name,type:"modified",before:u.content,after:a.content,lineCount:a.content.split(`
|