prjct-cli 2.71.0 → 2.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/dist/bin/prjct-core.mjs +45 -45
- package/dist/bin/prjct.mjs +1 -1
- package/dist/daemon/entry.mjs +27 -27
- package/package.json +1 -1
package/dist/bin/prjct-core.mjs
CHANGED
|
@@ -824,7 +824,7 @@ public static class PrjctCredentialManager {
|
|
|
824
824
|
CredDelete(target, CRED_TYPE_GENERIC, 0);
|
|
825
825
|
}
|
|
826
826
|
}
|
|
827
|
-
`;a(sm,"powershellArgs");a(om,"windowsCommand");a(ev,"readWindowsCredentialManager");a(S0,"writeWindowsCredentialManager");a(E0,"clearWindowsCredentialManager");a(T0,"platformGet");a(C0,"platformSet");a(R0,"platformClear");a(x0,"platformLocation");a(im,"activeStore");a(qc,"getAuthToken");a(am,"setAuthToken");a(cm,"clearAuthToken")});var pm={};j(pm,{default:()=>
|
|
827
|
+
`;a(sm,"powershellArgs");a(om,"windowsCommand");a(ev,"readWindowsCredentialManager");a(S0,"writeWindowsCredentialManager");a(E0,"clearWindowsCredentialManager");a(T0,"platformGet");a(C0,"platformSet");a(R0,"platformClear");a(x0,"platformLocation");a(im,"activeStore");a(qc,"getAuthToken");a(am,"setAuthToken");a(cm,"clearAuthToken")});var pm={};j(pm,{default:()=>fe});import P0 from"node:crypto";import lm from"node:fs/promises";import nv from"node:os";import rv from"node:path";function ov(){return P0.randomUUID()}function um(n){return{...n,apiKey:null}}var iv,sv,dm,A0,fe,ur=h(()=>{"use strict";be();Y();tv();iv="https://cli-api.prjct.app",sv={apiKey:null,apiUrl:iv,userId:null,email:null,lastAuth:null};a(ov,"freshDeviceId");a(um,"metadataOnly");dm=class{static{a(this,"AuthConfigManager")}configPath;cachedConfig=null;constructor(){this.configPath=I.getAuthConfigPath()}getConfigPath(){return this.configPath}async read(){if(this.cachedConfig)return this.cachedConfig;let e=await Ie(this.configPath),t=await qc(),r={...e??sv,apiKey:t},s=!1;if(!t&&e?.apiKey&&(await am(e.apiKey),r={...r,apiKey:e.apiKey},s=!0),r.deviceId||(r.deviceId=ov(),s=!0),r.hostname||(r.hostname=nv.hostname(),s=!0),this.cachedConfig=r,s&&e)try{await Se(this.configPath,um(this.cachedConfig)),await lm.chmod(this.configPath,384)}catch{}return this.cachedConfig}async getDeviceId(){return(await this.read()).deviceId??ov()}async getHostname(){return(await this.read()).hostname??nv.hostname()}async write(e){let t=await this.read();Object.hasOwn(e,"apiKey")&&(e.apiKey?await am(e.apiKey):await cm());let r={...t,...e,apiKey:await qc(),lastAuth:new Date().toISOString()};await It(rv.dirname(this.configPath)),await Se(this.configPath,um(r)),await lm.chmod(this.configPath,384),this.cachedConfig=r}async hasAuth(){let e=await this.getApiKey();return e!==null&&e.length>0}async getApiKey(){return(await this.read()).apiKey||await qc()}async getApiUrl(){return(await this.read()).apiUrl||iv}async saveAuth(e,t,r){await this.write({apiKey:e,userId:t,email:r})}async clearAuth(){await cm(),this.cachedConfig={...sv},await It(rv.dirname(this.configPath)),await Se(this.configPath,um(this.cachedConfig)),await lm.chmod(this.configPath,384)}async getStatus(){let e=await this.read();return{authenticated:e.apiKey!==null,email:e.email,apiKeyPrefix:null,lastAuth:e.lastAuth}}clearCache(){this.cachedConfig=null}},A0=new dm,fe=A0});var cv={};j(cv,{publishCRUD:()=>av,publishCRUDSync:()=>Un});import j0 from"node:crypto";function I0(n){let e=n&&typeof n=="object"&&!Array.isArray(n)?JSON.stringify($0(n)):JSON.stringify(n);return j0.createHash("sha256").update(e).digest("hex")}function $0(n){let e={};for(let t of Object.keys(n).sort())e[t]=n[t];return e}async function D0(){if(mm)return mm;try{let{default:n}=await Promise.resolve().then(()=>(ur(),pm)),e=n;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return mm=t,t}return"unknown-device"}catch{return"unknown-device"}}async function av(n){try{let e=await D0(),t=I0(n.data),r={type:`${n.entityType}.${_0[n.eventType]}`,path:[n.entityType,n.entityId],data:n.data,timestamp:new Date().toISOString(),projectId:n.projectId,entityType:n.entityType,entityId:n.entityId,eventType:n.eventType,contentHash:t,deviceId:e,originDeviceId:n.originDeviceId??e,revisionCount:n.revisionCount??1};await Jt.publish(r)}catch{}}function Un(n){av(n)}var _0,mm,Pi=h(()=>{"use strict";xi();_0={upsert:"updated",delete:"deleted"};a(I0,"hashPayload");a($0,"sortKeys");mm=null;a(D0,"resolveDeviceId");a(av,"publishCRUD");a(Un,"publishCRUDSync")});var dr,fm,Rt,Lr=h(()=>{"use strict";lr();Pi();ce();Z();dr={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},fm=class{static{a(this,"ArchiveStorage")}archive(e,t){let r=nt(),s=R();return $.run(e,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,t.entityType,t.entityId,JSON.stringify(t.entityData),t.summary??null,s,t.reason),Un({projectId:e,entityType:"archives",entityId:r,eventType:"upsert",data:{id:r,entity_type:t.entityType,entity_id:t.entityId,summary:t.summary??null,reason:t.reason,archived_at:s}}),r}archiveMany(e,t){if(t.length===0)return 0;let r=R();return $.transaction(e,s=>{let o=s.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let i of t)o.run(nt(),i.entityType,i.entityId,JSON.stringify(i.entityData),i.summary??null,r,i.reason)}),t.length}getArchived(e,t,r=50){return t?$.query(e,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",t,r):$.query(e,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(e){let t=$.query(e,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let s of t){let o=s.entity_type;o in r&&(r[o]=s.count),r.total+=s.count}return r}restore(e,t){let r=$.get(e,"SELECT * FROM archives WHERE id = ?",t);return r?($.run(e,"DELETE FROM archives WHERE id = ?",t),JSON.parse(r.entity_data)):null}pruneOldArchives(e,t){let r=new Date(Date.now()-t*24*60*60*1e3).toISOString(),s=this.getTotalCount(e);$.run(e,"DELETE FROM archives WHERE archived_at < ?",r);let o=this.getTotalCount(e);return s-o}getTotalCount(e){return $.get(e,"SELECT COUNT(*) as count FROM archives")?.count??0}},Rt=new fm});var gm,rt,pr=h(()=>{"use strict";K();Or();Lr();Z();gm=class{static{a(this,"MemoryService")}async log(e,t,r,s){try{let o=await x.getProjectId(e);return o?{eventId:S.appendEvent(o,`memory.${t}`,{...r,author:s}),projectId:o}:null}catch(o){return console.error(`Memory log error: ${o instanceof Error?o.message:String(o)}`),null}}async clear(e){try{let t=await x.getProjectId(e);if(!t)return;S.run(t,"DELETE FROM events WHERE type >= ? AND type < ?",...yo)}catch(t){console.error(`Memory clear error: ${t instanceof Error?t.message:String(t)}`)}}async getRecentEvents(e,t=100){try{return S.query(e,"SELECT type, data, timestamp FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT ?",...yo,t).reverse().map(s=>{let o=JSON.parse(s.data);return{timestamp:s.timestamp,action:s.type.replace("memory.",""),...o}})}catch(r){return console.error(`Memory read error: ${r instanceof Error?r.message:String(r)}`),[]}}async capEntries(e){try{let r=S.get(e,"SELECT COUNT(*) as cnt FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?)",...yo,...Mr)?.cnt??0;if(r<=dr.MEMORY_MAX_ENTRIES)return 0;let s=r-dr.MEMORY_MAX_ENTRIES,o=S.query(e,"SELECT id, type, data, timestamp FROM events WHERE type >= ? AND type < ? AND NOT (type >= ? AND type < ?) ORDER BY id ASC LIMIT ?",...yo,...Mr,s);return Rt.archiveMany(e,o.map((i,c)=>({entityType:"memory_entry",entityId:`memory-${i.timestamp||c}`,entityData:{type:i.type,data:JSON.parse(i.data),timestamp:i.timestamp},summary:i.type.replace("memory.",""),reason:"overflow"}))),S.transaction(e,i=>{let c=i.prepare("DELETE FROM events WHERE id = ?");for(let l of o)c.run(l.id)}),s}catch(t){return console.error(`Memory cap error: ${t instanceof Error?t.message:String(t)}`),0}}},rt=new gm});function hm(n){return!(n.type==="improvement-signal"||n.tags?.pattern==="hot-file")}function lv(n,e){try{return JSON.parse(n)}catch{return e}}function ys(n){let e=n.type.slice(wn.length),t=lv(n.data,{});return{id:`mem_${n.id}`,type:e,content:t.content??"",tags:t.tags??{},rememberedAt:n.timestamp,source:t.source,provenance:t.provenance??"declared"}}function Vc(n){let e=n.data?lv(n.data,{}):{},t=e.tags??{};return n.type&&(t.type=n.type),{id:`ship_${n.id}`,type:"shipped",content:n.name,tags:t,rememberedAt:n.shipped_at,source:e.taskId,provenance:"extracted"}}function uv(n,e){let t=e.toLowerCase();if(n.content.toLowerCase().includes(t))return!0;for(let r of Object.values(n.tags))if(r.toLowerCase().includes(t))return!0;return!1}function Ai(n,e){for(let[t,r]of Object.entries(e))if(n.tags[t]!==r)return!1;return!0}function dv(n){let e=new Set,t=[];for(let r of n){let s=r.tags.key;if(!s){t.push(r);continue}let o=`${r.type}::${s}`;e.has(o)||(e.add(o),t.push(r))}return t}function Jc(n){let e=new Set;for(let t of n){t.tags["superseded-by"]&&e.add(t.id);for(let r of["supersedes","duplicates"]){let s=t.tags[r];if(s)for(let o of String(s).matchAll(N0))e.add(`mem_${o[1]}`)}}return e}var M0,ko,N0,bo=h(()=>{"use strict";Or();M0=["fact","decision","learning","gotcha","pattern","anti-pattern","shipped","inbox","todo","idea","insight","question","source","person","spec"],ko=M0;a(hm,"isModelMemory");a(lv,"safeJson");a(ys,"rowToEntry");a(Vc,"shippedRowToEntry");a(uv,"matchesTopic");a(Ai,"matchesTags");a(dv,"dedupeLatestByKey");N0=/\bmem[_-](\d+)\b/g;a(Jc,"collectSupersededIds")});var km={};j(km,{extractCorrectionIds:()=>wm,extractRefIds:()=>mv,usefulnessService:()=>wt});function mv(n,e){let t=new Set;for(let r of q0){let s=e[r];if(s)for(let o of String(s).matchAll(ym))t.add(`mem_${o[1]}`)}for(let r of n.matchAll(ym))t.add(`mem_${r[1]}`);for(let r of wm(e))t.delete(r);return[...t]}function wm(n){let e=new Set;for(let t of V0){let r=n[t];if(r)for(let s of String(r).matchAll(ym))e.add(`mem_${s[1]}`)}return[...e]}function pv(n,e,t,r,s){S.run(n,`INSERT INTO memory_usefulness (memory_id, score, ${r}, last_used_at)
|
|
828
828
|
VALUES (?, ?, 1, ?)
|
|
829
829
|
ON CONFLICT(memory_id) DO UPDATE SET
|
|
830
830
|
score = score + ?, ${r} = ${r} + 1, last_used_at = excluded.last_used_at`,e,t,s,t)}function Xc(n,e,t,r){S.run(n,`INSERT INTO memory_usefulness (memory_id, score, last_used_at)
|
|
@@ -1135,7 +1135,7 @@ that travel with this project:
|
|
|
1135
1135
|
When in doubt: capture is always safe; ship is never silent.`,$N=`${Gi}
|
|
1136
1136
|
${IN}
|
|
1137
1137
|
${Wi}
|
|
1138
|
-
`;a(qE,"writeProjectClaudeMd")});var JE={};j(JE,{AGENT_RUNTIME_REGISTRY:()=>qi,detectAgentRuntimes:()=>qr,getAgentRuntime:()=>DN,listAgentRuntimes:()=>MN,listProjectRuleTargets:()=>vf});import Bi from"node:path";function DN(n){let e=qi.find(t=>t.id===n);if(!e)throw new Error(`Unknown agent runtime: ${n}`);return e}function MN(){return qi}function vf(){return qi.flatMap(n=>n.projectRuleTargets??[])}async function qr(n){return Promise.all(qi.map(async e=>{let t=await NN(e,n);return{runtime:e,detected:t.length>0||e.id==="agents-md"||e.id==="mcp",reason:t[0],detectedSignals:t,writableMcpTargets:(e.mcpTargets??[]).filter(r=>r.writable),supportLevel:LN(e)}}))}async function NN(n,e){let t=[];for(let r of n.detectsBy?.projectFiles??[])await E(Bi.join(e,r))&&t.push(r);for(let r of n.detectsBy?.projectDirs??[])await Ve(Bi.join(e,r))&&t.push(`${r}/`);for(let r of n.detectsBy?.homeDirs??[])await Ve(Bi.join(qt(),r))&&t.push(`~/${r}/`);for(let r of n.detectsBy?.commands??[])await ON(r)&&t.push(`command:${r}`);return t}async function ON(n){try{return await H("which",[n]),!0}catch{return!1}}function LN(n){return n.status==="hosted"?"hosted":n.id==="claude"?"full":n.supports.agentsMd&&n.supports.mcp?"good":n.supports.agentsMd?"baseline":"manual"}var qi,Ao=h(()=>{"use strict";pe();Y();Pr();qi=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Uses CLAUDE.md, global skills, hooks, and Claude-style MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Uses AGENTS.md, compact skills, and Codex config.toml MCP servers."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses GEMINI.md and MCP; AGENTS.md keeps repo-level compatibility with other agents."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[Bi.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Multi-provider coding agent with AGENTS.md, project agents, plugins, and MCP config."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .cursor/rules; model/provider selection happens in Cursor."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"stable",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .windsurf/rules; keep legacy support but do not center it."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"VS Code agent with AGENTS.md, rules, skills, hooks, MCP, CLI, and ACP surfaces."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[Bi.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Hosted GitHub agent; repo instructions and MCP-compatible setup are the portable layer."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(DN,"getAgentRuntime");a(MN,"listAgentRuntimes");a(vf,"listProjectRuleTargets");a(qr,"detectAgentRuntimes");a(NN,"detectRuntimeSignals");a(ON,"commandExists");a(LN,"supportLevelFor")});import Sf from"node:fs/promises";import Cl from"node:path";async function FN(n){let e=tt(n);return e||Sf.readFile(Cl.join(lt,"templates",n),"utf-8")}async function HN(n,e,t){let r=Cl.join(n,e);await Sf.mkdir(Cl.dirname(r),{recursive:!0}),await Sf.writeFile(r,await FN(t),"utf-8")}async function XE(n,e={}){let t=new Set(e.agents??[]),r=[];for(let s of vf())(t.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await E(Cl.join(n,s.detectPath)))&&(await HN(n,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var zE=h(()=>{"use strict";mn();Ao();Y();Ne();a(FN,"loadTemplate");a(HN,"writeRule");a(XE,"writeProjectIdeRules")});var KE={};j(KE,{writeProjectAgentSurfaces:()=>cn});import UN from"node:path";async function cn(n,e={}){let t=new Set(e.agents??[]),r=await WE(n),s=await E(UN.join(n,"CLAUDE.md")),i=t.has("claude")||s?await qE(n):void 0,c=await XE(n,e);return{agentsMd:r,...i?{claudeMd:i}:{},ideRules:c.written}}var jo=h(()=>{"use strict";Y();BE();VE();zE();a(cn,"writeProjectAgentSurfaces")});function Rl(n,e,t){if(t.md){console.log(`> ${e}`);return}g[n](e)}function L(n,e={}){return GN(n,e),{success:!1,error:n}}function A(n,e={}){return Tn(n,e),{success:!1,error:n}}function Be(n,e){let t=w(n);return e&&Tn(t,e),{success:!1,error:t}}var GN,Ef,Tn,Kt,fe=h(()=>{"use strict";F();ie();a(Rl,"notify");GN=a((n,e={})=>Rl("warn",n,e),"notifyWarn"),Ef=a((n,e={})=>Rl("info",n,e),"notifyInfo"),Tn=a((n,e={})=>Rl("fail",n,e),"notifyFail"),Kt=a((n,e={})=>Rl("done",n,e),"notifyDone");a(L,"failWith");a(A,"failHard");a(Be,"failFromError")});import vt from"node:path";async function WN(n,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(vt.join(n,"pnpm-lock.yaml"))?"pnpm":await E(vt.join(n,"yarn.lock"))?"yarn":await E(vt.join(n,"bun.lockb"))||await E(vt.join(n,"bun.lock"))?"bun":(await E(vt.join(n,"package-lock.json")),"npm")}function YE(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function BN(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function _o(n,e){for(let s of qN)if(await E(vt.join(n,s)))return s;let r=(e??await tr(n)).find(s=>s.endsWith(VN));if(r)return r}async function wr(n){for(let e of JN)if(await E(vt.join(n,e)))return e}async function kr(n){let e=vt.join(n,"package.json"),t=await Ie(e,null);if(t){let c=await WN(n,t),l=t.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:YE(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:YE(c,"typecheck")}),l.test&&(u.test={tool:c,command:BN(c)}),u.versionFile=await _o(n),u.changelogFile=await wr(n),u}if(await E(vt.join(n,"pytest.ini"))){let c=await _o(n),l=await wr(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await Bt(vt.join(n,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await _o(n),l=await wr(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await E(vt.join(n,"Cargo.toml"))){let c=await wr(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await E(vt.join(n,"go.mod"))){let c=await _o(n),l=await wr(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await tr(n);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await _o(n,s),l=await wr(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await E(vt.join(n,"pom.xml"))){let c=await wr(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await E(vt.join(n,"gradlew"))&&(await E(vt.join(n,"build.gradle"))||await E(vt.join(n,"build.gradle.kts")))){let c=await wr(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let o=await _o(n),i=await wr(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var qN,VN,JN,Vi=h(()=>{"use strict";Y();a(WN,"detectPackageManager");a(YE,"pmRun");a(BN,"pmTest");qN=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],VN=".csproj",JN=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(_o,"detectVersionFile");a(wr,"detectChangelogFile");a(kr,"detectProjectCommands")});var Tf={};j(Tf,{AI_AGENTS:()=>Al,PROJECT_TYPES:()=>Io,detectInstalledAgents:()=>_l,detectProjectType:()=>jl,detectStack:()=>Il});import Pl from"node:fs/promises";import xl from"node:os";import Xe from"node:path";async function jl(n){try{let e=await Pl.readdir(n);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=Xe.join(n,"package.json"),r=JSON.parse(await Pl.readFile(t,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(r=>["main.py","app.py","server.py"].includes(r))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function _l(n){let e=[];await Ve(Xe.join(xl.homedir(),".claude"))&&e.push("claude"),await E(Xe.join(n,".cursorrules"))&&e.push("cursor"),await E(Xe.join(n,".windsurfrules"))&&e.push("windsurf"),await E(Xe.join(n,".github","copilot-instructions.md"))&&e.push("copilot"),await Ve(Xe.join(xl.homedir(),".gemini"))&&e.push("gemini"),await Ve(Xe.join(xl.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Ve(Xe.join(n,".opencode"))&&e.push("opencode"),await Ve(Xe.join(n,".qwen"))&&e.push("qwen-code"),await Ve(Xe.join(n,".goose"))&&e.push("goose"),(await E(Xe.join(n,".aider.conf.yml"))||await E(Xe.join(n,".aider.conf.yaml")))&&e.push("aider"),(await Ve(Xe.join(n,".cline"))||await Ve(Xe.join(n,".clinerules"))||await E(Xe.join(n,".clinerules")))&&e.push("cline"),await Ve(Xe.join(n,".roo"))&&e.push("roo-code"),await Ve(Xe.join(n,".continue"))&&e.push("continue"),await Ve(Xe.join(n,".kiro"))&&e.push("kiro"),await Ve(Xe.join(n,".zed"))&&e.push("zed");try{let{execAsync:t}=await Promise.resolve().then(()=>(pe(),Wd));await t("which codex"),e.push("codex")}catch{await Ve(Xe.join(xl.homedir(),".codex"))&&e.push("codex")}return e}async function Il(n){let e={language:"Unknown",technologies:[]};try{let t=await Pl.readdir(n);if(t.includes("package.json")){let r=Xe.join(n,"package.json"),s=JSON.parse(await Pl.readFile(r,"utf-8")),o={...s.dependencies,...s.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var Io,Al,$l=h(()=>{"use strict";Y();Io=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Al=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(jl,"detectProjectType");a(_l,"detectInstalledAgents");a(Il,"detectStack")});import*as Ee from"@clack/prompts";import Cs from"chalk";var Ji,QE=h(()=>{"use strict";ie();$l();Ji=class{static{a(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){Ee.intro(Cs.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return Ee.outro(Cs.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await jl(this.projectPath),this.confirmedType=this.detectedType;let e=await _l(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Il(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await jl(this.projectPath);let e=Io.findIndex(r=>r.value===this.detectedType),t=await Ee.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Io.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?Io[e].value:void 0});return Ee.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await _l(this.projectPath),t=Al.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await Ee.multiselect({message:"Which AI agents do you use?",options:t,initialValues:e,required:!0});return Ee.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Il(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);Ee.note(e,"Detected stack");let t=await Ee.confirm({message:"Is this stack correct?",initialValue:!0});if(Ee.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let r=await Ee.group({language:a(()=>Ee.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>Ee.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await Ee.group({verbosity:a(()=>Ee.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:a(()=>Ee.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Cs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Cs.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Cs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Cs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Cs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1138
|
+
`;a(qE,"writeProjectClaudeMd")});var JE={};j(JE,{AGENT_RUNTIME_REGISTRY:()=>qi,detectAgentRuntimes:()=>qr,getAgentRuntime:()=>DN,listAgentRuntimes:()=>MN,listProjectRuleTargets:()=>vf});import Bi from"node:path";function DN(n){let e=qi.find(t=>t.id===n);if(!e)throw new Error(`Unknown agent runtime: ${n}`);return e}function MN(){return qi}function vf(){return qi.flatMap(n=>n.projectRuleTargets??[])}async function qr(n){return Promise.all(qi.map(async e=>{let t=await NN(e,n);return{runtime:e,detected:t.length>0||e.id==="agents-md"||e.id==="mcp",reason:t[0],detectedSignals:t,writableMcpTargets:(e.mcpTargets??[]).filter(r=>r.writable),supportLevel:LN(e)}}))}async function NN(n,e){let t=[];for(let r of n.detectsBy?.projectFiles??[])await E(Bi.join(e,r))&&t.push(r);for(let r of n.detectsBy?.projectDirs??[])await Ve(Bi.join(e,r))&&t.push(`${r}/`);for(let r of n.detectsBy?.homeDirs??[])await Ve(Bi.join(qt(),r))&&t.push(`~/${r}/`);for(let r of n.detectsBy?.commands??[])await ON(r)&&t.push(`command:${r}`);return t}async function ON(n){try{return await H("which",[n]),!0}catch{return!1}}function LN(n){return n.status==="hosted"?"hosted":n.id==="claude"?"full":n.supports.agentsMd&&n.supports.mcp?"good":n.supports.agentsMd?"baseline":"manual"}var qi,Ao=h(()=>{"use strict";pe();Y();Pr();qi=[{id:"agents-md",displayName:"AGENTS.md-compatible agents",kind:"standard",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal project instruction surface shared by current and future coding agents."},{id:"mcp",displayName:"Model Context Protocol clients",kind:"standard",status:"stable",contextFiles:[],supports:{agentsMd:!1,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Universal tool surface for prjct memory, workflow, files, and code intelligence."},{id:"acp",displayName:"Agent Client Protocol clients",kind:"standard",status:"emerging",contextFiles:[],supports:{agentsMd:!1,mcp:!1,skills:!1,hooks:!1,acp:!0,projectRules:!1},notes:"Editor/agent transport for clients such as Zed and other ACP-compatible tools."},{id:"claude",displayName:"Claude Code",kind:"cli",status:"stable",detectsBy:{homeDirs:[".claude"],commands:["claude"]},contextFiles:["CLAUDE.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.claude/mcp.json",writable:!0}],supports:{agentsMd:!1,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Uses CLAUDE.md, global skills, hooks, and Claude-style MCP JSON."},{id:"codex",displayName:"OpenAI Codex",kind:"cli",status:"stable",detectsBy:{homeDirs:[".codex"],commands:["codex"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.codex/config.toml",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!1},notes:"Uses AGENTS.md, compact skills, and Codex config.toml MCP servers."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses GEMINI.md and MCP; AGENTS.md keeps repo-level compatibility with other agents."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[Bi.join(".gemini","antigravity")]},contextFiles:["ANTIGRAVITY.md","AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!1,acp:!1,projectRules:!0},notes:"Uses Antigravity skills under the Gemini config tree."},{id:"opencode",displayName:"OpenCode",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/opencode"],projectDirs:[".opencode"],commands:["opencode"]},contextFiles:["AGENTS.md","opencode.json","opencode.jsonc"],mcpTargets:[{format:"opencode-json",pathHint:"opencode.jsonc mcp",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Multi-provider coding agent with AGENTS.md, project agents, plugins, and MCP config."},{id:"qwen-code",displayName:"Qwen Code",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".qwen"],projectDirs:[".qwen"],commands:["qwen"]},contextFiles:["AGENTS.md","GEMINI.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Qwen-family coding runtime; treat model/provider choice as separate from runtime setup."},{id:"kimi-cli",displayName:"Kimi CLI",kind:"model-runtime",status:"emerging",detectsBy:{homeDirs:[".kimi"],projectDirs:[".kimi"],commands:["kimi"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Kimi-family coding runtime; AGENTS.md and MCP/CLI markdown output are the portable contract."},{id:"goose",displayName:"Goose",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/goose"],projectDirs:[".goose"],commands:["goose"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"generic",pathHint:"Goose extensions",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Open-source coding agent with extension/MCP-style tool configuration."},{id:"aider",displayName:"Aider",kind:"cli",status:"stable",detectsBy:{projectFiles:[".aider.conf.yml",".aider.conf.yaml"],commands:["aider"]},contextFiles:["AGENTS.md","CONVENTIONS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"CLI pair-programming agent; AGENTS.md provides durable repo instructions."},{id:"cursor",displayName:"Cursor",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cursor"],projectFiles:[".cursorrules"]},contextFiles:["AGENTS.md",".cursor/rules/prjct.mdc"],projectRuleTargets:[{relativePath:".cursor/rules/prjct.mdc",templateKey:"global/CURSOR.mdc",detectPath:".cursor"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .cursor/rules; model/provider selection happens in Cursor."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"stable",detectsBy:{projectDirs:[".windsurf"],projectFiles:[".windsurfrules"]},contextFiles:["AGENTS.md",".windsurf/rules/prjct.md"],projectRuleTargets:[{relativePath:".windsurf/rules/prjct.md",templateKey:"global/WINDSURF.md",detectPath:".windsurf"}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Project rules live under .windsurf/rules; keep legacy support but do not center it."},{id:"cline",displayName:"Cline",kind:"ide",status:"stable",detectsBy:{projectDirs:[".cline",".clinerules"],projectFiles:[".clinerules"]},contextFiles:["AGENTS.md",".clinerules/"],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!0,projectRules:!0},notes:"VS Code agent with AGENTS.md, rules, skills, hooks, MCP, CLI, and ACP surfaces."},{id:"roo-code",displayName:"Roo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".roo"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"VS Code agent with MCP and project rule surfaces."},{id:"continue",displayName:"Continue",kind:"ide",status:"stable",detectsBy:{projectDirs:[".continue"]},contextFiles:["AGENTS.md"],mcpTargets:[{format:"continue-yaml",pathHint:".continue/mcpServers/",writable:!1}],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE assistant with dedicated MCP server config directory."},{id:"kiro",displayName:"Kiro",kind:"ide",status:"stable",detectsBy:{homeDirs:[".kiro"],projectDirs:[".kiro"]},contextFiles:["AGENTS.md",".kiro/steering/"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!0,acp:!1,projectRules:!0},notes:"Agentic IDE with steering docs and MCP."},{id:"copilot",displayName:"GitHub Copilot coding agent",kind:"hosted",status:"hosted",detectsBy:{projectFiles:[Bi.join(".github","copilot-instructions.md")]},contextFiles:["AGENTS.md",".github/copilot-instructions.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Hosted GitHub agent; repo instructions and MCP-compatible setup are the portable layer."},{id:"devin",displayName:"Devin",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; repo-level AGENTS.md is the safest portable surface."},{id:"jules",displayName:"Google Jules",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md carries repo-level prjct instructions."},{id:"zed",displayName:"Zed Agent Panel",kind:"ide",status:"stable",detectsBy:{projectDirs:[".zed"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!0,projectRules:!0},notes:"Editor agent surface with ACP support; AGENTS.md remains the repo contract."},{id:"warp",displayName:"Warp",kind:"ide",status:"stable",detectsBy:{homeDirs:[".warp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Terminal agent surface; AGENTS.md plus MCP covers portable prjct usage."},{id:"amp",displayName:"Amp",kind:"cli",status:"stable",detectsBy:{homeDirs:[".config/amp"],commands:["amp"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Coding agent runtime; AGENTS.md and MCP are the portable contract."},{id:"factory",displayName:"Factory",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted/agentic development platform; repo instructions are the stable surface."},{id:"augment",displayName:"Augment",kind:"ide",status:"stable",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"IDE agent; universal project instructions avoid model-specific coupling."},{id:"kilo-code",displayName:"Kilo Code",kind:"ide",status:"stable",detectsBy:{projectDirs:[".kilocode"]},contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!0,skills:!1,hooks:!1,acp:!1,projectRules:!0},notes:"Agent runtime in the Cline/Roo family; AGENTS.md and MCP keep it compatible."},{id:"phoenix",displayName:"Phoenix",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"ona",displayName:"Ona",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Hosted coding agent; AGENTS.md is the repo-level bridge."},{id:"semgrep",displayName:"Semgrep assistant",kind:"hosted",status:"hosted",contextFiles:["AGENTS.md"],supports:{agentsMd:!0,mcp:!1,skills:!1,hooks:!1,acp:!1,projectRules:!1},notes:"Security/review agent surface; AGENTS.md carries project workflow guidance."}];a(DN,"getAgentRuntime");a(MN,"listAgentRuntimes");a(vf,"listProjectRuleTargets");a(qr,"detectAgentRuntimes");a(NN,"detectRuntimeSignals");a(ON,"commandExists");a(LN,"supportLevelFor")});import Sf from"node:fs/promises";import Cl from"node:path";async function FN(n){let e=tt(n);return e||Sf.readFile(Cl.join(lt,"templates",n),"utf-8")}async function HN(n,e,t){let r=Cl.join(n,e);await Sf.mkdir(Cl.dirname(r),{recursive:!0}),await Sf.writeFile(r,await FN(t),"utf-8")}async function XE(n,e={}){let t=new Set(e.agents??[]),r=[];for(let s of vf())(t.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await E(Cl.join(n,s.detectPath)))&&(await HN(n,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var zE=h(()=>{"use strict";mn();Ao();Y();Ne();a(FN,"loadTemplate");a(HN,"writeRule");a(XE,"writeProjectIdeRules")});var KE={};j(KE,{writeProjectAgentSurfaces:()=>cn});import UN from"node:path";async function cn(n,e={}){let t=new Set(e.agents??[]),r=await WE(n),s=await E(UN.join(n,"CLAUDE.md")),i=t.has("claude")||s?await qE(n):void 0,c=await XE(n,e);return{agentsMd:r,...i?{claudeMd:i}:{},ideRules:c.written}}var jo=h(()=>{"use strict";Y();BE();VE();zE();a(cn,"writeProjectAgentSurfaces")});function Rl(n,e,t){if(t.md){console.log(`> ${e}`);return}g[n](e)}function L(n,e={}){return GN(n,e),{success:!1,error:n}}function A(n,e={}){return Tn(n,e),{success:!1,error:n}}function Be(n,e){let t=w(n);return e&&Tn(t,e),{success:!1,error:t}}var GN,Ef,Tn,Kt,me=h(()=>{"use strict";F();ie();a(Rl,"notify");GN=a((n,e={})=>Rl("warn",n,e),"notifyWarn"),Ef=a((n,e={})=>Rl("info",n,e),"notifyInfo"),Tn=a((n,e={})=>Rl("fail",n,e),"notifyFail"),Kt=a((n,e={})=>Rl("done",n,e),"notifyDone");a(L,"failWith");a(A,"failHard");a(Be,"failFromError")});import vt from"node:path";async function WN(n,e){let t=e?.packageManager?.trim().toLowerCase();return t?.startsWith("pnpm@")?"pnpm":t?.startsWith("yarn@")?"yarn":t?.startsWith("bun@")?"bun":t?.startsWith("npm@")?"npm":await E(vt.join(n,"pnpm-lock.yaml"))?"pnpm":await E(vt.join(n,"yarn.lock"))?"yarn":await E(vt.join(n,"bun.lockb"))||await E(vt.join(n,"bun.lock"))?"bun":(await E(vt.join(n,"package-lock.json")),"npm")}function YE(n,e){return n==="yarn"?`yarn ${e}`:n==="pnpm"?`pnpm run ${e}`:n==="bun"?`bun run ${e}`:`npm run ${e}`}function BN(n){return n==="yarn"?"yarn test":n==="pnpm"?"pnpm test":n==="bun"?"bun test":"npm test"}async function _o(n,e){for(let s of qN)if(await E(vt.join(n,s)))return s;let r=(e??await tr(n)).find(s=>s.endsWith(VN));if(r)return r}async function wr(n){for(let e of JN)if(await E(vt.join(n,e)))return e}async function kr(n){let e=vt.join(n,"package.json"),t=await Ie(e,null);if(t){let c=await WN(n,t),l=t.scripts||{},u={stack:"js",packageManager:c};return l.lint&&(u.lint={tool:c,command:YE(c,"lint")}),l.typecheck&&(u.typecheck={tool:c,command:YE(c,"typecheck")}),l.test&&(u.test={tool:c,command:BN(c)}),u.versionFile=await _o(n),u.changelogFile=await wr(n),u}if(await E(vt.join(n,"pytest.ini"))){let c=await _o(n),l=await wr(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}let r=await Bt(vt.join(n,"pyproject.toml"),"");if(r.includes("[tool.pytest")||r.includes("pytest")){let c=await _o(n),l=await wr(n);return{stack:"python",test:{tool:"pytest",command:"pytest"},versionFile:c,changelogFile:l}}if(await E(vt.join(n,"Cargo.toml"))){let c=await wr(n);return{stack:"rust",test:{tool:"cargo",command:"cargo test"},versionFile:"Cargo.toml",changelogFile:c}}if(await E(vt.join(n,"go.mod"))){let c=await _o(n),l=await wr(n);return{stack:"go",test:{tool:"go",command:"go test ./..."},versionFile:c,changelogFile:l}}let s=await tr(n);if(s.some(c=>c.endsWith(".sln")||c.endsWith(".csproj")||c.endsWith(".fsproj"))){let c=await _o(n,s),l=await wr(n);return{stack:"dotnet",test:{tool:"dotnet",command:"dotnet test"},versionFile:c,changelogFile:l}}if(await E(vt.join(n,"pom.xml"))){let c=await wr(n);return{stack:"java",test:{tool:"maven",command:"mvn test"},versionFile:"pom.xml",changelogFile:c}}if(await E(vt.join(n,"gradlew"))&&(await E(vt.join(n,"build.gradle"))||await E(vt.join(n,"build.gradle.kts")))){let c=await wr(n);return{stack:"java",test:{tool:"gradle",command:"./gradlew test"},changelogFile:c}}let o=await _o(n),i=await wr(n);return{stack:"unknown",versionFile:o,changelogFile:i}}var qN,VN,JN,Vi=h(()=>{"use strict";Y();a(WN,"detectPackageManager");a(YE,"pmRun");a(BN,"pmTest");qN=["package.json","Cargo.toml","pyproject.toml","VERSION","version.txt"],VN=".csproj",JN=["CHANGELOG.md","HISTORY.md","NEWS.md","CHANGES.md"];a(_o,"detectVersionFile");a(wr,"detectChangelogFile");a(kr,"detectProjectCommands")});var Tf={};j(Tf,{AI_AGENTS:()=>Al,PROJECT_TYPES:()=>Io,detectInstalledAgents:()=>_l,detectProjectType:()=>jl,detectStack:()=>Il});import Pl from"node:fs/promises";import xl from"node:os";import Xe from"node:path";async function jl(n){try{let e=await Pl.readdir(n);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let t=Xe.join(n,"package.json"),r=JSON.parse(await Pl.readFile(t,"utf-8")),s={...r.dependencies,...r.devDependencies};if(r.bin)return"cli-tool";if(r.main&&!s.react&&!s.vue&&!s.angular&&!s.express&&!s.hono)return"library";if((s.react||s.vue)&&(s.express||s.hono||s.fastify))return"fullstack";if(s.react||s.vue||s["@angular/core"]||s.next||s.nuxt)return"web-app";if(s.express||s.hono||s.fastify||s.koa||s.nestjs)return"api-backend"}return e.includes("pyproject.toml")||e.includes("setup.py")?e.some(r=>["main.py","app.py","server.py"].includes(r))?"api-backend":"library":e.includes("go.mod")?e.includes("main.go")?"cli-tool":"library":e.includes("Cargo.toml")?"cli-tool":"unknown"}catch{return"unknown"}}async function _l(n){let e=[];await Ve(Xe.join(xl.homedir(),".claude"))&&e.push("claude"),await E(Xe.join(n,".cursorrules"))&&e.push("cursor"),await E(Xe.join(n,".windsurfrules"))&&e.push("windsurf"),await E(Xe.join(n,".github","copilot-instructions.md"))&&e.push("copilot"),await Ve(Xe.join(xl.homedir(),".gemini"))&&e.push("gemini"),await Ve(Xe.join(xl.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Ve(Xe.join(n,".opencode"))&&e.push("opencode"),await Ve(Xe.join(n,".qwen"))&&e.push("qwen-code"),await Ve(Xe.join(n,".goose"))&&e.push("goose"),(await E(Xe.join(n,".aider.conf.yml"))||await E(Xe.join(n,".aider.conf.yaml")))&&e.push("aider"),(await Ve(Xe.join(n,".cline"))||await Ve(Xe.join(n,".clinerules"))||await E(Xe.join(n,".clinerules")))&&e.push("cline"),await Ve(Xe.join(n,".roo"))&&e.push("roo-code"),await Ve(Xe.join(n,".continue"))&&e.push("continue"),await Ve(Xe.join(n,".kiro"))&&e.push("kiro"),await Ve(Xe.join(n,".zed"))&&e.push("zed");try{let{execAsync:t}=await Promise.resolve().then(()=>(pe(),Wd));await t("which codex"),e.push("codex")}catch{await Ve(Xe.join(xl.homedir(),".codex"))&&e.push("codex")}return e}async function Il(n){let e={language:"Unknown",technologies:[]};try{let t=await Pl.readdir(n);if(t.includes("package.json")){let r=Xe.join(n,"package.json"),s=JSON.parse(await Pl.readFile(r,"utf-8")),o={...s.dependencies,...s.devDependencies};e.language=o.typescript?"TypeScript":"JavaScript",o.next?e.framework="Next.js":o.nuxt?e.framework="Nuxt":o.react?e.framework="React":o.vue?e.framework="Vue":o["@angular/core"]?e.framework="Angular":o.express?e.framework="Express":o.hono?e.framework="Hono":o.fastify?e.framework="Fastify":(o.nestjs||o["@nestjs/core"])&&(e.framework="NestJS"),o.bun||o["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",t.includes("bun.lockb")?e.packageManager="Bun":t.includes("pnpm-lock.yaml")?e.packageManager="pnpm":t.includes("yarn.lock")?e.packageManager="Yarn":t.includes("package-lock.json")&&(e.packageManager="npm"),(o.prisma||o["@prisma/client"])&&e.technologies.push("Prisma"),(o.drizzle||o["drizzle-orm"])&&e.technologies.push("Drizzle"),o.tailwindcss&&e.technologies.push("Tailwind CSS"),o.zod&&e.technologies.push("Zod"),(o.trpc||o["@trpc/server"])&&e.technologies.push("tRPC")}else t.includes("pyproject.toml")||t.includes("requirements.txt")?e.language="Python":t.includes("go.mod")?e.language="Go":t.includes("Cargo.toml")?e.language="Rust":(t.includes("pom.xml")||t.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var Io,Al,$l=h(()=>{"use strict";Y();Io=[{value:"web-app",title:"Web Application",description:"React, Vue, Angular, Next.js, etc."},{value:"api-backend",title:"API / Backend Service",description:"Express, Hono, FastAPI, etc."},{value:"fullstack",title:"Full-Stack (Monorepo)",description:"Frontend + Backend in one repo"},{value:"cli-tool",title:"CLI Tool",description:"Command-line application"},{value:"library",title:"Library / Package",description:"Reusable npm/pip/cargo package"},{value:"monorepo",title:"Monorepo (Multiple Projects)",description:"Turborepo, Nx, Lerna, etc."}],Al=[{value:"claude",title:"Claude Code",description:"Anthropic's Claude in VS Code/CLI"},{value:"cursor",title:"Cursor",description:"AI-first code editor"},{value:"windsurf",title:"Windsurf",description:"Codeium's AI IDE"},{value:"copilot",title:"GitHub Copilot",description:"GitHub's AI pair programmer"},{value:"gemini",title:"Gemini CLI",description:"Google's Gemini in terminal"},{value:"codex",title:"OpenAI Codex",description:"OpenAI's coding agent in terminal"},{value:"opencode",title:"OpenCode",description:"Open-source terminal coding agent"},{value:"qwen-code",title:"Qwen Code",description:"Qwen-family coding runtime"},{value:"goose",title:"Goose",description:"Open-source coding agent with extensions"},{value:"aider",title:"Aider",description:"Terminal pair-programming agent"},{value:"cline",title:"Cline",description:"VS Code coding agent"},{value:"roo-code",title:"Roo Code",description:"VS Code coding agent with MCP"},{value:"continue",title:"Continue",description:"IDE assistant with MCP config"},{value:"kiro",title:"Kiro",description:"Agentic IDE with steering docs"},{value:"zed",title:"Zed",description:"Editor agent with ACP support"}];a(jl,"detectProjectType");a(_l,"detectInstalledAgents");a(Il,"detectStack")});import*as Ee from"@clack/prompts";import Cs from"chalk";var Ji,QE=h(()=>{"use strict";ie();$l();Ji=class{static{a(this,"OnboardingWizard")}projectPath;aborted=!1;detectedType="unknown";confirmedType="unknown";selectedAgents=[];detectedStack={language:"Unknown",technologies:[]};confirmedStack={language:"Unknown",technologies:[]};preferences={verbosity:"normal",autoSync:!0,telemetry:!1};constructor(e=process.cwd()){this.projectPath=e}async run(){Ee.intro(Cs.cyan.bold("\u26A1 prjct-cli setup"));let e=[{id:"project-type",title:"Project Type",run:a(()=>this.stepProjectType(),"run")},{id:"ai-agents",title:"AI Agents",run:a(()=>this.stepAIAgents(),"run")},{id:"stack",title:"Stack Confirmation",run:a(()=>this.stepStack(),"run")},{id:"preferences",title:"Preferences",run:a(()=>this.stepPreferences(),"run")},{id:"summary",title:"Summary",run:a(()=>this.stepSummary(),"run")}];for(let t of e)if(!await t.run()||this.aborted)return this.buildResult(!0);return Ee.outro(Cs.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){g.spin("Auto-detecting project configuration..."),this.detectedType=await jl(this.projectPath),this.confirmedType=this.detectedType;let e=await _l(this.projectPath);return this.selectedAgents=e,this.detectedStack=await Il(this.projectPath),this.confirmedStack=this.detectedStack,g.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await jl(this.projectPath);let e=Io.findIndex(r=>r.value===this.detectedType),t=await Ee.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:Io.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?Io[e].value:void 0});return Ee.isCancel(t)?(this.handleCancel(),!1):(this.confirmedType=t||this.detectedType,!0)}async stepAIAgents(){let e=await _l(this.projectPath),t=Al.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await Ee.multiselect({message:"Which AI agents do you use?",options:t,initialValues:e,required:!0});return Ee.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await Il(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);Ee.note(e,"Detected stack");let t=await Ee.confirm({message:"Is this stack correct?",initialValue:!0});if(Ee.isCancel(t))return this.handleCancel(),!1;if(t)this.confirmedStack=this.detectedStack;else{let r=await Ee.group({language:a(()=>Ee.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>Ee.text({message:"Framework (optional):",defaultValue:this.detectedStack.framework||""}),"framework")},{onCancel:a(()=>this.handleCancel(),"onCancel")});if(this.aborted)return!1;this.confirmedStack={...this.detectedStack,language:r.language||this.detectedStack.language,framework:r.framework||void 0}}return!0}async stepPreferences(){let e=await Ee.group({verbosity:a(()=>Ee.select({message:"Output verbosity:",options:[{label:"Minimal",hint:"Essential output only",value:"minimal"},{label:"Normal (Recommended)",hint:"Balanced information",value:"normal"},{label:"Verbose",hint:"Detailed logging",value:"verbose"}],initialValue:"normal"}),"verbosity"),autoSync:a(()=>Ee.confirm({message:"Auto-sync context on file changes?",initialValue:!0}),"autoSync")},{onCancel:a(()=>this.handleCancel(),"onCancel")});return this.aborted?!1:(this.preferences={verbosity:e.verbosity||"normal",autoSync:e.autoSync??!0,telemetry:!1},!0)}async stepSummary(){let e=[`${Cs.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${Cs.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${Cs.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${Cs.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${Cs.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1139
1139
|
`);Ee.note(e,"Configuration Summary");let t=await Ee.confirm({message:"Generate configuration with these settings?",initialValue:!0});return Ee.isCancel(t)||!t?(Ee.isCancel(t)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,Ee.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return Io.find(t=>t.value===e)?.title||"Unknown"}getAgentLabel(e){return Al.find(t=>t.value===e)?.title||e}formatStackDisplay(e){let t=[e.language];return e.framework&&t.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&t.push(e.runtime),e.technologies.length>0&&t.push(`+ ${e.technologies.slice(0,3).join(", ")}`),t.join(" / ")}buildResult(e){return{projectType:this.confirmedType,agents:this.selectedAgents,stack:this.confirmedStack,preferences:this.preferences,skipped:e}}getSelectedAgents(){return this.selectedAgents}getConfirmedStack(){return this.confirmedStack}getPreferences(){return this.preferences}}});var rT={};j(rT,{default:()=>$o,getUpdateNotificationSync:()=>QN,triggerBackgroundRefreshIfStale:()=>ZN});import{spawn as XN}from"node:child_process";import Cf from"node:fs";import zN from"node:https";import Dl from"node:path";import Vr from"chalk";function YN(n,e){let t=n.split(".").map(Number),r=e.split(".").map(Number);for(let s=0;s<3;s++){let o=t[s]||0,i=r[s]||0;if(o>i)return 1;if(o<i)return-1}return 0}function tT(){try{let n=Cf.readFileSync(eT(),"utf-8");return JSON.parse(n)}catch{return null}}function nT(n,e){let t=`Update available! ${n} \u2192 ${e}`,r="prjct upgrade",s=Math.max(t.length,`Run: ${r}`.length)+4,o=`\u250C${"\u2500".repeat(s)}\u2510`,i=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",Vr.yellow(o),Vr.yellow(c("")),Vr.yellow(`\u2502 ${Vr.bold(t)}${" ".repeat(s-t.length-2)}\u2502`),Vr.yellow(`\u2502 Run: ${Vr.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),Vr.yellow(c("")),Vr.yellow(i),""].join(`
|
|
1140
1140
|
`)}function QN(n){if(!n)return null;let e=tT();return!e?.latestVersion||YN(e.latestVersion,n)<=0?null:nT(n,e.latestVersion)}function ZN(){try{let e=tT();if(e?.lastCheck&&Date.now()-e.lastCheck<KN)return}catch{}try{Cf.mkdirSync(ZE(),{recursive:!0})}catch{return}let n=Dl.join(lt,"assets","scripts","refresh-update.mjs");if(Cf.existsSync(n))try{XN(process.execPath,[n,eT()],{detached:!0,stdio:"ignore"}).unref()}catch{}}var Rf,$o,ZE,eT,KN,Ml=h(()=>{"use strict";F();Y();Ne();be();Rf=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=I.globalConfigDir,this.cacheFile=Dl.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Dl.join(__dirname,"..","..","package.json");return(await Ie(e))?.version??null}catch(e){return console.error("Error reading package version:",w(e)),null}}async getLatestVersion(){return new Promise((e,t)=>{let r={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},s=zN.request(r,o=>{let i="";o.on("data",c=>{i+=c}),o.on("end",()=>{try{if(o.statusCode===200){let c=JSON.parse(i);e(c.version)}else t(new Error(`npm registry returned status ${o.statusCode}`))}catch(c){t(c)}})});s.on("error",o=>{t(o)}),s.setTimeout(5e3,()=>{s.destroy(),t(new Error("Request timeout"))}),s.end()})}compareVersions(e,t){let r=e.split(".").map(Number),s=t.split(".").map(Number);for(let o=0;o<3;o++){let i=r[o]||0,c=s[o]||0;if(i>c)return 1;if(i<c)return-1}return 0}async readCache(){try{if(await E(this.cacheFile))return await Ie(this.cacheFile)}catch{}return null}async writeCache(e){try{await Se(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let t=await this.readCache(),r=Date.now();if(t?.lastCheck&&r-t.lastCheck<this.checkInterval)return t.latestVersion&&this.compareVersions(t.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:t.latestVersion}:{updateAvailable:!1,currentVersion:e,latestVersion:e};let s=await this.getLatestVersion();return await this.writeCache({lastCheck:r,latestVersion:s}),{updateAvailable:this.compareVersions(s,e)>0,currentVersion:e,latestVersion:s}}catch{return null}}async getUpdateNotification(){let e=await this.checkForUpdates();return!e||!e.updateAvailable?null:nT(e.currentVersion,e.latestVersion)}},$o=Rf,ZE=a(()=>I.globalConfigDir,"updateCacheDir"),eT=a(()=>Dl.join(ZE(),"update-cache.json"),"updateCacheFile"),KN=1440*60*1e3;a(YN,"compareSemver");a(tT,"readCacheSync");a(nT,"formatUpdateBanner");a(QN,"getUpdateNotificationSync");a(ZN,"triggerBackgroundRefreshIfStale")});import sT from"node:path";async function nO(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let n=process.cwd();if(await E(sT.join(n,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await E(sT.join(e,".claude")))return!0;let t=process.cwd();return!!(t.includes("/.claude/")||t.includes("/claude-workspace/"))}function rO(){return{...eO}}function sO(){return{...tO}}async function oT(){return Nl||(Nl=await nO()?rO():sO(),Nl)}var Nl,eO,tO,iT=h(()=>{"use strict";Y();Nl=null,eO={type:"claude",name:"Claude (Code + Desktop)",isSupported:!0,capabilities:{mcp:!0,filesystem:"mcp",markdown:!0,emojis:!0,colors:!0,interactive:!0,agents:!0},config:{configFile:"CLAUDE.md",commandPrefix:"p.",responseStyle:"rich",dataDir:".prjct",commandsDir:"~/.claude/commands/p"},environment:{hasMCP:!0,sandboxed:!1,persistent:!0,agentSystem:!0}},tO={type:"terminal",name:"Terminal/CLI",isSupported:!0,capabilities:{mcp:!1,filesystem:"native",markdown:!1,emojis:!0,colors:!0,interactive:!0,agents:!1},config:{configFile:null,commandPrefix:"prjct",responseStyle:"cli",dataDir:".prjct",commandsDir:null},environment:{hasMCP:!1,sandboxed:!1,persistent:!0,agentSystem:!1}};a(nO,"isClaudeEnvironment");a(rO,"getClaudeAgent");a(sO,"getTerminalAgent");a(oT,"detect")});import Ol from"node:fs/promises";var xf,aT,cT=h(()=>{"use strict";F();Y();xf=class{static{a(this,"ClaudeAgent")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,t="info"){let r={success:"\u2705",error:"\u274C",warning:"\u26A0\uFE0F",info:"\u2139\uFE0F",celebrate:"\u{1F389}",ship:"\u{1F680}",focus:"\u{1F3AF}",idea:"\u{1F4A1}",progress:"\u{1F4CA}",task:"\u{1F4DD}"};return`${r[t]||r.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(t){console.warn(`MCP readFile failed, falling back to fs: ${w(t)}`)}return await Ol.readFile(e,"utf8")}async writeFile(e,t){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,t)}catch(r){console.warn(`MCP writeFile failed, falling back to fs: ${w(r)}`)}await Ol.writeFile(e,t,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(t){console.warn(`MCP listDirectory failed, falling back to fs: ${w(t)}`)}return await Ol.readdir(e)}async fileExists(e){return E(e)}async createDirectory(e){await Ol.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1141
1141
|
${e.map((t,r)=>`${r+1}. ${t}`).join(`
|
|
@@ -1313,9 +1313,9 @@ ${uR(e,t)}`}function Zt(n){let e=Object.entries(n).filter(([,s])=>s!=null);if(e.
|
|
|
1313
1313
|
|
|
1314
1314
|
`)}function mR(n,e,t,r){let s=e.replace(/_/g," "),o=[`> **${n}**: ${s}`];if(r)for(let[i,c]of Object.entries(r))o.push(`> ${i}: ${c}`);if(t.length>0){o.push("");for(let i of t)o.push(`- ${i.label}: \`${i.command}\``)}console.log(o.join(`
|
|
1315
1315
|
`))}var Ke=h(()=>{"use strict";Ne();a(oF,"mdHeader");a(iF,"mdFooter");a(_,"mdOutput");a(uR,"mdTable");a(dR,"mdCodeBlock");a(wg,"mdBadge");a(W,"mdSection");a(De,"mdList");a(ta,"mdTaskHeader");a(Ze,"mdNextSteps");a(Zt,"mdStats");a(Me,"mdDone");a(pR,"mdWarn");a(kg,"mdJoin");a(mR,"mdActionRequired")});import na from"chalk";function Lo(n,e={}){if(e.quiet)return;let t=gR[n]||"idle",r=bs.getValidCommands(t);if(r.length===0)return;let s=r.map(o=>({cmd:`p. ${o}`,desc:fR[o]||o}));console.log(na.dim(`
|
|
1316
|
-
Next:`));for(let o of s){let i=na.cyan(o.cmd.padEnd(12));console.log(na.dim(` ${i} \u2192 ${o.desc}`))}}function fu(n,e=!1){let t=gR[n]||"idle";return bs.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:fR[s]||s}))}function hR(n){let e=bs.getStateInfo(n);console.log(na.dim(`\u{1F4CD} State: ${na.white(n.toUpperCase())} - ${e.description}`))}var fR,gR,ra=h(()=>{"use strict";lf();fR={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},gR={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Lo,"showNextSteps");a(fu,"getNextSteps");a(hR,"showStateInfo")});async function aF(n,e={}){let t=await x.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function se(n,e={}){let t=await qn.ensureInit(n);return t.success?aF(n,e):{ok:!1,result:t}}async function gu(n,e={},t=process.cwd()){let r=await Ft(n,t);return r?{ok:!0,value:r}:{ok:!1,result:L('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function hu(n,e,t={}){if(e&&Pt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=Pt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:L(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var Lt=h(()=>{"use strict";K();Hl();vr();_i();
|
|
1316
|
+
Next:`));for(let o of s){let i=na.cyan(o.cmd.padEnd(12));console.log(na.dim(` ${i} \u2192 ${o.desc}`))}}function fu(n,e=!1){let t=gR[n]||"idle";return bs.getValidCommands(t).map(s=>({cmd:e?`prjct ${s} --md`:`p. ${s}`,desc:fR[s]||s}))}function hR(n){let e=bs.getStateInfo(n);console.log(na.dim(`\u{1F4CD} State: ${na.white(n.toUpperCase())} - ${e.description}`))}var fR,gR,ra=h(()=>{"use strict";lf();fR={task:"Start new task",done:"Complete current task",pause:"Pause and switch context",resume:"Continue paused task",ship:"Ship the feature",reopen:"Reopen for rework",next:"View task queue",sync:"Analyze project",bug:"Report a bug",idea:"Capture an idea"},gR={task:"working",done:"completed","done-subtask":"working",pause:"paused",resume:"working",ship:"shipped",reopen:"working",next:"idle",sync:"idle",init:"idle",bug:"working",idea:"idle"};a(Lo,"showNextSteps");a(fu,"getNextSteps");a(hR,"showStateInfo")});async function aF(n,e={}){let t=await x.getProjectId(n);return t?{ok:!0,value:t}:(e.md?console.log("> No project ID found. Run `prjct init` first."):g.failWithHint("NO_PROJECT_ID"),{ok:!1,result:{success:!1,error:"No project ID found"}})}async function se(n,e={}){let t=await qn.ensureInit(n);return t.success?aF(n,e):{ok:!1,result:t}}async function gu(n,e={},t=process.cwd()){let r=await Ft(n,t);return r?{ok:!0,value:r}:{ok:!1,result:L('No active task \u2014 start one with `prjct task "<desc>"`',e)}}function hu(n,e,t={}){if(e&&Pt.getWorkflow(n,e)?.enabled)return{ok:!0,value:{name:e}};let s=Pt.getAllWorkflows(n).map(o=>o.name).join(", ");return{ok:!1,result:L(`Workflow '${e??""}' not found. Available: ${s}`,t)}}var Lt=h(()=>{"use strict";K();Hl();vr();_i();me();ie();a(aF,"requireProjectId");a(se,"requireProject");a(gu,"requireActiveTask");a(hu,"requireWorkflow")});async function yR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await it.seal(r);return e.json?(console.log(JSON.stringify({success:s.success,signature:s.signature,error:s.error})),{success:s.success,error:s.error}):s.success?(g.done("Analysis sealed"),console.log(` Signature: ${s.signature?.substring(0,16)}...`),console.log(""),{success:!0,data:{signature:s.signature}}):(g.fail(s.error||"Seal failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}async function wR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await it.rollback(r);return e.json?(console.log(JSON.stringify({success:s.success,restoredSignature:s.restoredSignature,error:s.error})),{success:s.success,error:s.error}):e.md?s.success?(console.log(_(Me("Analysis Rolled Back"),Zt({"Restored signature":`${s.restoredSignature?.substring(0,16)}...`,Note:"Previous sealed version is now active. Current version moved to draft."}))),{success:!0,data:{restoredSignature:s.restoredSignature}}):(console.log(_("## Rollback Failed",`> ${s.error}`)),{success:!1,error:s.error}):s.success?(g.done("Analysis rolled back to previous sealed version"),console.log(` Restored signature: ${s.restoredSignature?.substring(0,16)}...`),console.log(" Previous sealed version demoted to draft"),console.log(""),{success:!0,data:{restoredSignature:s.restoredSignature}}):(g.fail(s.error||"Rollback failed"),{success:!1,error:s.error})}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(_("## Rollback Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}async function kR(n=process.cwd(),e={}){if(e.semantic)return bg(n,e);try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=await it.verify(r);return e.json?(console.log(JSON.stringify(s)),{success:s.valid}):(s.valid?g.done(s.message):g.fail(s.message),console.log(""),{success:s.valid,data:s})}catch(t){let r=w(t);return A(r)}}async function bg(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json?console.log(JSON.stringify({success:!1,error:"No project ID found"})):g.fail("No project ID found"),t.result;let r=t.value,s=n;try{s=$.getDoc(r,"project")?.repoPath||n}catch{}let o=await it.semanticVerify(r,s);if(e.json)return console.log(JSON.stringify(o)),{success:o.passed,data:o};console.log(""),o.passed?(g.done("Semantic verification passed"),console.log(` ${o.passedCount}/${o.checks.length} checks passed (${o.totalMs}ms)`)):(g.fail("Semantic verification failed"),console.log(` ${o.failedCount}/${o.checks.length} checks failed`)),console.log(""),console.log("Check Results:");for(let i of o.checks){let c=i.passed?"\u2713":"\u2717",l=i.passed?`${i.output} (${i.durationMs}ms)`:i.error||"Failed";console.log(` ${c} ${i.name}: ${l}`)}return console.log(""),{success:o.passed,data:o}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):g.fail(r),{success:!1,error:r}}}var bR=h(()=>{"use strict";Ur();Z();F();me();Ke();ie();Lt();a(yR,"seal");a(wR,"rollback");a(kR,"verify");a(bg,"semanticVerifyCommand")});import{z as U}from"zod";function vR(n){let e=yF.safeParse(n);return e.success?{ok:!0,value:e.data}:{ok:!1,error:e.error.issues.map(r=>`${r.path.length>0?r.path.join("."):"<root>"}: ${r.message}`).join("; ")}}var cF,lF,uF,dF,pF,mF,fF,gF,hF,yF,SR=h(()=>{"use strict";cF=U.object({style:U.string(),insights:U.array(U.string()),domains:U.array(U.string())}),lF=U.object({name:U.string(),description:U.string(),locations:U.array(U.string()),confidence:U.number().min(0).max(1),category:U.string()}),uF=U.object({issue:U.string(),reasoning:U.string(),files:U.array(U.string()),suggestion:U.string(),severity:U.enum(["low","medium","high"]),confidence:U.number().min(0).max(1)}),dF=U.object({description:U.string(),area:U.string(),effort:U.enum(["small","medium","large"]),impact:U.string(),priority:U.enum(["low","medium","high"])}),pF=U.object({path:U.string(),reason:U.string(),risk:U.string(),severity:U.enum(["low","medium","high"])}),mF=U.object({description:U.string(),files:U.array(U.string()),benefit:U.string(),effort:U.enum(["small","medium","large"])}),fF=U.object({category:U.string(),rule:U.string(),example:U.string().optional()}),gF=U.object({build:U.string().optional(),test:U.string().optional(),lint:U.string().optional(),dev:U.string().optional(),format:U.string().optional(),install:U.string().optional()}),hF=U.object({languages:U.array(U.string()),frameworks:U.array(U.string()),packageManager:U.string().optional()}),yF=U.object({version:U.literal(1),commitHash:U.string().nullable(),analyzedAt:U.string(),architecture:cF,patterns:U.array(lF),antiPatterns:U.array(uF),techDebt:U.array(dF),riskAreas:U.array(pF),refactorSuggestions:U.array(mF),projectInsights:U.array(U.string()),conventions:U.array(fF),commands:gF.optional(),stack:hF.optional()});a(vR,"parseLlmAnalysis")});import ER from"node:fs/promises";import TR from"node:path";async function RR(n,e=process.cwd(),t={}){try{let r=await se(e);if(!r.ok)return r.result;let s=r.value,o=await wF(n,e),i=await kF(o.content,e);xt.save(s,i);let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(Wn(),Br));return await c(e,s),t.md?console.log(_(Me("LLM Analysis Saved"),Zt({Input:o.source,Architecture:i.architecture.style,Patterns:i.patterns.length,"Anti-patterns":i.antiPatterns?.length||0,"Tech debt items":i.techDebt?.length||0,"Risk areas":i.riskAreas?.length||0,Conventions:i.conventions?.length||0}))):console.log(JSON.stringify({success:!0,message:"LLM analysis saved",input:o.source,stats:{patterns:i.patterns.length,antiPatterns:i.antiPatterns?.length||0,techDebt:i.techDebt?.length||0}})),{success:!0}}catch(r){return Be(r)}}async function wF(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm requires analysis text, JSON, or a file path");let r=TR.isAbsolute(t)?t:TR.resolve(e,t);try{if((await ER.stat(r)).isFile())return{content:await ER.readFile(r,"utf-8"),source:"file"}}catch{}return{content:n,source:"inline"}}async function kF(n,e){let t=n.trim();if(!t)throw new Error("analysis-save-llm received an empty analysis");let r=bF(t);if(r.ok){let s=vR(r.value);return s.ok?s.value:CR(`Structured analysis did not match the legacy schema; preserved as LLM notes.
|
|
1317
1317
|
|
|
1318
|
-
${JSON.stringify(r.value,null,2)}`,e)}return CR(t,e)}function bF(n){try{return{ok:!0,value:JSON.parse(n)}}catch{return{ok:!1}}}async function CR(n,e){let t=vF(n);return{version:1,commitHash:await EF(e),analyzedAt:R(),architecture:{style:"unknown",insights:t.slice(0,8),domains:[]},patterns:[],antiPatterns:[],techDebt:[],riskAreas:[],refactorSuggestions:[],projectInsights:t,conventions:[]}}function vF(n){let e=n.split(/\r?\n/).map(s=>s.replace(/^\s{0,3}#{1,6}\s+/,"").replace(/^\s*[-*]\s+\[[ xX]\]\s+/,"").replace(/^\s*[-*]\s+/,"").replace(/^\s*\d+[.)]\s+/,"").trim()).filter(SF),t=[],r=new Set;for(let s of e){let o=s.toLowerCase();if(!r.has(o)&&(r.add(o),t.push(s),t.length>=40))break}return t.length>0?t:[n.slice(0,2e3)]}function SF(n){if(!n||!/[\p{L}\p{N}]/u.test(n))return!1;let e=n.toLowerCase().replace(/\s+/g," ").trim();return!(["current work","wip","misc","todo","n/a","none","latest","unreleased","changelog"].includes(e)||/^[-=_]{3,}$/.test(e)||/^(added|changed|fixed|removed)$/i.test(e)||/^v?\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(e))}async function EF(n){try{let{stdout:e}=await H("git",["rev-parse","HEAD"],{cwd:n});return e.trim()||null}catch{return null}}async function xR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=xt.getActive(r);if(!s)return e.md?console.log(_("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(e.md){let o=[Me(`LLM Analysis (${s.architecture.style})`),""];if(s.architecture.insights.length>0&&o.push(W("Architecture Insights",De(s.architecture.insights.slice(0,5)))),s.patterns.length>0){let i=s.patterns.slice(0,8);o.push(W(`Patterns (${s.patterns.length})`,De(i.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(s.antiPatterns.length>0){let i=s.antiPatterns.slice(0,5);o.push(W(`Anti-Patterns (${s.antiPatterns.length})`,De(i.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(s.techDebt.length>0){let i=s.techDebt.slice(0,5);o.push(W(`Tech Debt (${s.techDebt.length})`,De(i.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}s.conventions.length>0&&o.push(W("Conventions",De(s.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(_(...o))}else{let o={...s,patterns:s.patterns.slice(0,10),antiPatterns:s.antiPatterns.slice(0,6),techDebt:s.techDebt.slice(0,6),conventions:s.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:s}}catch(t){return Be(t)}}var PR=h(()=>{"use strict";SR();ws();ce();pe();
|
|
1318
|
+
${JSON.stringify(r.value,null,2)}`,e)}return CR(t,e)}function bF(n){try{return{ok:!0,value:JSON.parse(n)}}catch{return{ok:!1}}}async function CR(n,e){let t=vF(n);return{version:1,commitHash:await EF(e),analyzedAt:R(),architecture:{style:"unknown",insights:t.slice(0,8),domains:[]},patterns:[],antiPatterns:[],techDebt:[],riskAreas:[],refactorSuggestions:[],projectInsights:t,conventions:[]}}function vF(n){let e=n.split(/\r?\n/).map(s=>s.replace(/^\s{0,3}#{1,6}\s+/,"").replace(/^\s*[-*]\s+\[[ xX]\]\s+/,"").replace(/^\s*[-*]\s+/,"").replace(/^\s*\d+[.)]\s+/,"").trim()).filter(SF),t=[],r=new Set;for(let s of e){let o=s.toLowerCase();if(!r.has(o)&&(r.add(o),t.push(s),t.length>=40))break}return t.length>0?t:[n.slice(0,2e3)]}function SF(n){if(!n||!/[\p{L}\p{N}]/u.test(n))return!1;let e=n.toLowerCase().replace(/\s+/g," ").trim();return!(["current work","wip","misc","todo","n/a","none","latest","unreleased","changelog"].includes(e)||/^[-=_]{3,}$/.test(e)||/^(added|changed|fixed|removed)$/i.test(e)||/^v?\d+\.\d+\.\d+(?:-[\w.-]+)?$/i.test(e))}async function EF(n){try{let{stdout:e}=await H("git",["rev-parse","HEAD"],{cwd:n});return e.trim()||null}catch{return null}}async function xR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=xt.getActive(r);if(!s)return e.md?console.log(_("## No LLM Analysis","> Run `prjct sync` to generate.")):console.log(JSON.stringify({success:!1,message:"No LLM analysis found"})),{success:!1,message:"No LLM analysis found"};if(e.md){let o=[Me(`LLM Analysis (${s.architecture.style})`),""];if(s.architecture.insights.length>0&&o.push(W("Architecture Insights",De(s.architecture.insights.slice(0,5)))),s.patterns.length>0){let i=s.patterns.slice(0,8);o.push(W(`Patterns (${s.patterns.length})`,De(i.map(c=>`**${c.name}** \u2014 ${c.description} (${c.category})`))))}if(s.antiPatterns.length>0){let i=s.antiPatterns.slice(0,5);o.push(W(`Anti-Patterns (${s.antiPatterns.length})`,De(i.map(c=>`[${c.severity}] ${c.issue} \u2014 ${c.suggestion}`))))}if(s.techDebt.length>0){let i=s.techDebt.slice(0,5);o.push(W(`Tech Debt (${s.techDebt.length})`,De(i.map(c=>`[${c.priority}/${c.effort}] ${c.description}`))))}s.conventions.length>0&&o.push(W("Conventions",De(s.conventions.slice(0,5).map(i=>`**${i.category}**: ${i.rule}`)))),console.log(_(...o))}else{let o={...s,patterns:s.patterns.slice(0,10),antiPatterns:s.antiPatterns.slice(0,6),techDebt:s.techDebt.slice(0,6),conventions:s.conventions.slice(0,6)};console.log(JSON.stringify({success:!0,analysis:o}))}return{success:!0,data:s}}catch(t){return Be(t)}}var PR=h(()=>{"use strict";SR();ws();ce();pe();me();Ke();Lt();a(RR,"saveLlmAnalysis");a(wF,"resolveAnalysisInput");a(kF,"normalizeAnalysis");a(bF,"tryParseJson");a(CR,"analysisFromText");a(vF,"textToInsights");a(SF,"isUsefulInsight");a(EF,"resolveCurrentCommit");a(xR,"getLlmAnalysis")});import TF from"node:path";async function AR(n,e){let t=Date.now()-e;await He.installGlobalConfig(),g.done(`Synced ${n.stats.name||"project"} (${(t/1e3).toFixed(1)}s)`),console.log("");let r=n.stats.frameworks.length>0?` (${n.stats.frameworks[0]})`:"",s=n.syncMetrics?.indexes,o=[`${n.stats.fileCount} files indexed`,`Stack: ${n.stats.ecosystem}${r} | Branch: ${n.git.branch}`];if(s?.bm25Files){let c=s.bm25Files*(s.bm25AvgTokens||0);o.push(`Index: ${Fo(c)} tokens | ${s.bm25VocabSize||0} terms | ${s.importEdges||0} imports`)}g.box("Sync Summary",o.join(`
|
|
1319
1319
|
`));let i=[];if(n.generatedSkills?.generated&&n.generatedSkills.generated.length>0){let c=n.generatedSkills.generated.length,l=c===1?"skill":"skills";i.push(`${c} ${l} generated`)}if(n.context7&&i.push(`Context7: ${n.context7.verified?"verified":`not ready${n.context7.message?` (${n.context7.message})`:""}`}`),n.analysisSummary&&i.push(`Analysis: ${n.analysisSummary.patterns} patterns | ${n.analysisSummary.antiPatterns} anti-patterns (${n.analysisSummary.criticalAntiPatterns} critical)`),g.section("Generated"),g.list(i,{bullet:"\u2713"}),console.log(""),n.git.hasChanges&&(g.warn("Uncommitted changes detected"),console.log("")),n.verification){let c=n.verification;if(c.passed){let l=c.checks.map(u=>`${u.name} (${u.durationMs}ms)`);g.section("Verified"),g.list(l,{bullet:"\u2713"})}else{g.section("Verification");let l=c.checks.map(u=>u.passed?`\u2713 ${u.name}`:`\u2717 ${u.name}${u.error?` \u2014 ${u.error}`:""}`);g.list(l),c.skippedCount>0&&g.warn(`${c.skippedCount} check(s) skipped (fail-fast)`)}console.log("")}return Lo("sync"),{success:!0,data:n,metrics:{elapsed:t,fileCount:n.stats.fileCount}}}async function jR(n){try{let e=await rt.getRecentEvents(n,100),t=new Date().toISOString().split("T")[0],r=e.filter(u=>(u.timestamp||u.ts)?.startsWith(t)),s=null;if(r.length>=2){let u=r.map(d=>new Date(d.timestamp||d.ts).getTime()).filter(d=>!Number.isNaN(d)).sort((d,p)=>d-p);if(u.length>=2){let d=u[u.length-1]-u[0];s=hi(d)}}let o=r.filter(u=>u.action==="task_completed").length,i=r.filter(u=>u.action==="feature_shipped").length,c=new Map;for(let u of r)if(u.action==="sync"&&Array.isArray(u.subagents))for(let d of u.subagents)c.set(d,(c.get(d)||0)+1);let l=Array.from(c.entries()).map(([u,d])=>({name:u,count:d})).sort((u,d)=>d.count-u.count);return{sessionDuration:s,tasksCompleted:o,featuresShipped:i,agentsUsed:l}}catch{return{sessionDuration:null,tasksCompleted:0,featuresShipped:0,agentsUsed:[]}}}function Fo(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}K`:n.toLocaleString()}function vg(n){return n<1e3?`${Math.round(n)}ms`:`${(n/1e3).toFixed(1)}s`}function _R(n){if(n.length===0)return"";let e="\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588",t=n.map(s=>s.tokensSaved),r=Math.max(...t,1);return t.map(s=>{let o=Math.min(Math.floor(s/r*(e.length-1)),e.length-1);return e[o]}).join("")}function IR(n,e,t,r,s,o){let i=[];if(i.push(`# ${t} - Stats Dashboard`),i.push(""),i.push(`_Generated: ${new Date().toLocaleString()} | Tracking since: ${r}_`),i.push(""),s){if(i.push("## Today's Activity"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),s.sessionDuration&&i.push(`| Duration | ${s.sessionDuration} |`),i.push(`| Tasks completed | ${s.tasksCompleted} |`),i.push(`| Features shipped | ${s.featuresShipped} |`),s.agentsUsed.length>0){let c=s.agentsUsed.slice(0,3).map(l=>`${l.name} (${l.count}\xD7)`).join(", ");i.push(`| Agents used | ${c} |`)}i.push("")}if(o&&(o.decisions>0||o.preferences>0)&&(i.push("## Patterns Learned"),i.push(""),i.push("| Type | Count |"),i.push("|------|-------|"),i.push(`| Decisions | ${o.learnedDecisions} confirmed (${o.decisions} total) |`),i.push(`| Preferences | ${o.preferences} |`),i.push(`| Workflows | ${o.workflows} |`),i.push("")),i.push("## Context Efficiency"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Tokens reduced | ${Fo(n.totalTokensSaved)} |`),i.push(`| Compression | ${(n.compressionRate*100).toFixed(0)}% |`),i.push(`| Est. cost saved | ${su(n.estimatedCostSaved)} |`),i.push(""),i.push("## Performance"),i.push(""),i.push("| Metric | Value |"),i.push("|--------|-------|"),i.push(`| Syncs | ${n.syncCount} |`),i.push(`| Avg time | ${vg(n.avgSyncDuration)} |`),i.push(""),n.topAgents.length>0){i.push("## Agent Usage"),i.push(""),i.push("| Agent | Usage |"),i.push("|-------|-------|");let c=n.topAgents.reduce((l,u)=>l+u.usageCount,0);for(let l of n.topAgents){let u=c>0?(l.usageCount/c*100).toFixed(0):0;i.push(`| ${l.agentName} | ${u}% (${l.usageCount}) |`)}i.push("")}if(i.push("## 30-Day Trend"),i.push(""),i.push(`- Tokens saved: ${Fo(n.last30DaysTokens)}`),n.trend!==0){let c=n.trend>0?"+":"";i.push(`- Trend: ${c}${n.trend.toFixed(0)}% vs previous period`)}return i.push(""),i.push("---"),i.push(""),i.push("_Generated with [prjct-cli](https://prjct.app)_"),i.join(`
|
|
1320
1320
|
`)}function $R(n,e){let t=[];t.push(`# Repository Analysis
|
|
1321
1321
|
`),t.push(`Generated: ${new Date().toLocaleString()}
|
|
@@ -1335,7 +1335,7 @@ ${JSON.stringify(r.value,null,2)}`,e)}return CR(t,e)}function bF(n){try{return{o
|
|
|
1335
1335
|
`).slice(0,5).forEach(c=>{if(c.trim()){let[l,,u,d]=c.split("|");t.push(`- \`${l}\` ${d} (${u})`)}}),t.push("")),t.push(`## Recommendations
|
|
1336
1336
|
`),t.push("Based on detected stack, consider generating specialized agents using `p. sync`.\n"),t.push(`---
|
|
1337
1337
|
`),t.push("*This analysis was generated automatically. For updated information, run `p. analyze` again.*\n"),t.join(`
|
|
1338
|
-
`)}var Sg=h(()=>{"use strict";Ln();ou();pr();ce();ra();ie();a(AR,"showSyncResult");a(jR,"getSessionActivity");a(Fo,"formatTokens");a(vg,"formatDuration");a(_R,"generateSparkline");a(IR,"generateStatsMarkdown");a($R,"generateAnalysisSummary")});async function DR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=await Oo.getSummary(r),o=await Oo.getDailyStats(r,30),i=await jR(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=$.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await Oo.read(r),d=u.firstSync?new Date(u.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${l.padEnd(20).slice(0,20)} | Since: ${d.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Fo(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${su(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vg(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=_R(o);if(console.log(` ${p} ${Fo(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${s.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),e.export){let p=IR(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Be(t)}}async function MR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await it.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(_("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(_(Kc(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(yv(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(_("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var NR=h(()=>{"use strict";ou();Yc();Ur();Z();og();F();
|
|
1338
|
+
`)}var Sg=h(()=>{"use strict";Ln();ou();pr();ce();ra();ie();a(AR,"showSyncResult");a(jR,"getSessionActivity");a(Fo,"formatTokens");a(vg,"formatDuration");a(_R,"generateSparkline");a(IR,"generateStatsMarkdown");a($R,"generateAnalysisSummary")});async function DR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return t.result;let r=t.value,s=await Oo.getSummary(r),o=await Oo.getDailyStats(r,30),i=await jR(r),c={decisions:0,preferences:0,workflows:0,learnedDecisions:0};if(e.json){let p={session:i,patterns:c,totalTokensSaved:s.totalTokensSaved,estimatedCostSaved:s.estimatedCostSaved,compressionRate:s.compressionRate,syncCount:s.syncCount,avgSyncDuration:s.avgSyncDuration,topAgents:s.topAgents.slice(0,5),last30DaysTokens:s.last30DaysTokens,trend:s.trend,dailyStats:o.slice(0,7)};return console.log(JSON.stringify(p)),{success:!0,data:p}}let l="Unknown";try{l=$.getDoc(r,"project")?.name||"Unknown"}catch{}let u=await Oo.read(r),d=u.firstSync?new Date(u.firstSync).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"}):"N/A";if(console.log(""),console.log("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),console.log("\u2502 \u{1F4CA} prjct-cli Stats Dashboard \u2502"),console.log(`\u2502 Project: ${l.padEnd(20).slice(0,20)} | Since: ${d.padEnd(12).slice(0,12)} \u2502`),console.log("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),console.log(""),console.log("\u{1F3AF} TODAY'S ACTIVITY"),i.sessionDuration&&console.log(` Duration: ${i.sessionDuration}`),console.log(` Tasks completed: ${i.tasksCompleted}`),console.log(` Features shipped: ${i.featuresShipped}`),i.agentsUsed.length>0){let p=i.agentsUsed.slice(0,3).map(m=>`${m.name} (${m.count}\xD7)`).join(", ");console.log(` Agents used: ${p}`)}if(console.log(""),(c.decisions>0||c.preferences>0)&&(console.log("\u{1F9E0} PATTERNS LEARNED"),console.log(` Decisions: ${c.learnedDecisions} confirmed (${c.decisions} total)`),console.log(` Preferences: ${c.preferences} saved`),console.log(` Workflows: ${c.workflows} tracked`),console.log("")),console.log("\u{1F4B0} TOKEN SAVINGS"),console.log(` Total saved: ${Fo(s.totalTokensSaved)} tokens`),console.log(` Compression: ${(s.compressionRate*100).toFixed(0)}% average reduction`),console.log(` Estimated cost: ${su(s.estimatedCostSaved)} saved`),console.log(""),console.log("\u26A1 PERFORMANCE"),console.log(` Syncs completed: ${s.syncCount.toLocaleString()}`),console.log(` Avg sync time: ${vg(s.avgSyncDuration)}`),console.log(""),s.topAgents.length>0){console.log("\u{1F916} AGENT USAGE (all time)");let p=s.topAgents.reduce((m,f)=>m+f.usageCount,0);for(let m of s.topAgents){let f=p>0?(m.usageCount/p*100).toFixed(0):0;console.log(` ${m.agentName.padEnd(12)}: ${f}% (${m.usageCount} uses)`)}console.log("")}if(o.length>0){console.log("\u{1F4C8} TREND (last 30 days)");let p=_R(o);if(console.log(` ${p} ${Fo(s.last30DaysTokens)} tokens saved`),s.trend!==0){let m=s.trend>0?"\u2191":"\u2193",f=s.trend>0?"+":"";console.log(` ${m} ${f}${s.trend.toFixed(0)}% vs previous 30 days`)}console.log("")}if(console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log("Export: prjct stats --export > stats.md"),console.log(""),e.export){let p=IR(s,o,l,d,i,c);return console.log(p),{success:!0,data:{markdown:p}}}return{success:!0,data:{...s,session:i,patterns:c}}}catch(t){return console.error("\u274C Error:",w(t)),Be(t)}}async function MR(n=process.cwd(),e={}){try{let t=await se(n);if(!t.ok)return e.json&&console.log(JSON.stringify({success:!1,error:"No project ID found"})),t.result;let r=t.value,s=await it.diff(r);if(!s){let o="Cannot compute diff: need both a sealed and a draft analysis. Run `p. sync` to create a draft.";return e.json?console.log(JSON.stringify({success:!1,error:o})):e.md?console.log(_("## Analysis Diff",`> ${o}`)):g.warn(o),{success:!1,error:o}}if(e.json)return console.log(JSON.stringify({success:!0,...s})),{success:!0,data:s};if(e.md)return console.log(_(Kc(s))),{success:!0,data:s};if(!s.hasChanges)g.done("No changes between draft and sealed analysis");else{g.section("Analysis Diff"),console.log(yv(s)),console.log("");let o=[];s.summary.added>0&&o.push(`${s.summary.added} added`),s.summary.removed>0&&o.push(`${s.summary.removed} removed`),s.summary.changed>0&&o.push(`${s.summary.changed} changed`),g.done(o.join(", "))}return console.log(""),{success:!0,data:s}}catch(t){let r=w(t);return e.json?console.log(JSON.stringify({success:!1,error:r})):e.md?console.log(_("## Diff Failed",`> ${r}`)):g.fail(r),{success:!1,error:r}}}var NR=h(()=>{"use strict";ou();Yc();Ur();Z();og();F();me();Ke();ie();Sg();Lt();a(DR,"stats");a(MR,"diff")});var yu={};j(yu,{AnalysisCommands:()=>Eg});import OR from"node:fs/promises";var LR,Eg,wu=h(()=>{"use strict";hT();K();be();Yc();AT();mu();Ur();ws();F();ce();me();Ke();ra();ie();bR();PR();NR();Sg();ye();Lt();LR=["> Review this project data and save concise notes for future AI agents.","> Focus on architecture, conventions, risks, and gotchas. Markdown/text is fine; JSON is optional.","> Most compatible save path: write notes to a temp file, then run `prjct analysis-save-llm <file> --md`."].join(`
|
|
1339
1339
|
`),Eg=class extends G{static{a(this,"AnalysisCommands")}async analyze(e={},t=process.cwd()){try{await this.initializeAgent(),console.log(`\u{1F50D} Analyzing repository...
|
|
1340
1340
|
`),ct.init(t);let r={packageJson:await ct.readPackageJson(),cargoToml:await ct.readCargoToml(),goMod:await ct.readGoMod(),requirements:await ct.readRequirements(),directories:await ct.listDirectories(),fileCount:await ct.countFiles(),gitStats:await ct.getGitStats(),gitLog:await ct.getGitLog(20),hasDockerfile:await ct.fileExists("Dockerfile"),hasDockerCompose:await ct.fileExists("docker-compose.yml"),hasReadme:await ct.fileExists("README.md"),hasTsconfig:await ct.fileExists("tsconfig.json"),hasViteConfig:await ct.fileExists("vite.config.ts")||await ct.fileExists("vite.config.js"),hasNextConfig:await ct.fileExists("next.config.js")||await ct.fileExists("next.config.mjs")},s=$R(r,t),o=await x.readConfig(t).catch(()=>null),i=await I.getWikiPath(t,o?.vaultPath),c=`${i}/_generated/analysis/repo-summary.md`;return await OR.mkdir(`${i}/_generated/analysis`,{recursive:!0}),await OR.writeFile(c,s,"utf-8"),await this.logToMemory(t,"repository_analyzed",{timestamp:R(),fileCount:r.fileCount,gitCommits:r.gitStats.totalCommits}),console.log(`\u2705 Analysis complete!
|
|
1341
1341
|
`),console.log(`\u{1F4C4} Full report: ${I.getDisplayPath(c)}
|
|
@@ -1369,9 +1369,9 @@ _No path-shaped scope entries found. Reviewers judge the spec body alone._`,c=[]
|
|
|
1369
1369
|
`)}function HF(n,e){let t={level:"warn",code:"no_context_match",message:`No codebase or memory context matched "${n}"`,suggestion:e??"Fill spec.notes manually or run with `--skip-context` next time."};process.stderr.write(`${JSON.stringify(t)}
|
|
1370
1370
|
`)}var zR,MF,NF,YR=h(()=>{"use strict";Te();XR();zR=5,MF=8,NF=.15;a(OF,"inferSpecContext");a(LF,"dedupeTopDirs");a(FF,"buildNotesBlock");a(HF,"warnNoContextMatch")});var Dg={};j(Dg,{breakdownSpecToTasks:()=>UF});async function UF(n,e,t){let r=t.content.acceptance_criteria;if(r.length===0)return{taskIds:[],skippedReason:"no_acceptance_criteria"};if(t.content.tasks_created_at!==null)return{taskIds:[],skippedReason:"already_broken_down"};let s=!1;if(t.content.linked_tasks.length>0){s=!0,await at.deleteByFeatureId(n,t.id);let c={...t.content,linked_tasks:[]};$e.updateContent(n,t.id,c)}let o=await at.addTasks(n,r.map(c=>({description:GF(c),body:c,priority:"medium",type:"feature",section:"backlog",featureId:t.id,groupId:t.id,groupName:t.title})));for(let c of o)$e.linkTask(n,t.id,c.id);let i=$e.get(n,t.id);if(i){let c={...i.content,tasks_created_at:R()};$e.updateContent(n,t.id,c)}return await O.remember(e,{type:"spec",content:`Auto-breakdown: ${o.length} tasks created from ${t.title}${s?" (recovered from partial)":""}`,tags:{spec_id:t.id,event:"auto_breakdown",task_count:String(o.length),...s?{recovered:"partial"}:{}},source:t.id}),{taskIds:o.map(c=>c.id),...s?{recoveredFromPartial:!0}:{}}}function GF(n){let e=n.replace(/\s+/g," ").trim();return e.length<=140?e:`${e.slice(0,137)}\u2026`}var Mg=h(()=>{"use strict";Te();hr();Ni();ce();a(UF,"breakdownSpecToTasks");a(GF,"truncateForDescription")});var sa={};j(sa,{specService:()=>Ht});async function WF(n){try{let{stdout:e}=await H("git",["rev-parse","HEAD"],{cwd:n}),t=e.trim();return/^[0-9a-f]{7,40}$/.test(t)?t:null}catch{return null}}var Ng,Ht,Ho=h(()=>{"use strict";K();Te();Ni();al();ce();pe();$g();a(WF,"readGitHead");Ng=class{static{a(this,"SpecService")}async create(e,t){let r=await this.requireProjectId(e),s=t.content.notes??"";if(t.autoContext!==!1&&!s.trim()){let{inferSpecContext:l,warnNoContextMatch:u}=await Promise.resolve().then(()=>(YR(),KR)),d=await l(t.title,r,e);d.empty?u(t.title):s=d.notesBlock}let i=gr.parse({goal:t.content.goal,eli10:t.content.eli10??"",stakes:t.content.stakes??"",acceptance_criteria:t.content.acceptance_criteria??[],scope:t.content.scope??[],out_of_scope:t.content.out_of_scope??[],risks:t.content.risks??[],test_plan:t.content.test_plan??[],reviews:t.content.reviews,linked_tasks:t.content.linked_tasks??[],notes:s}),c=$e.create(r,{title:t.title,content:i,tags:t.tags});return await O.remember(e,{type:"spec",content:`${c.title}
|
|
1371
1371
|
|
|
1372
|
-
Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},source:c.id,provenance:"declared"}),c}async get(e,t){let r=await this.requireProjectId(e);return $e.get(r,t)}async list(e,t={}){let r=await this.requireProjectId(e);return $e.list(r,t)}async setStatus(e,t,r){let s=await this.requireProjectId(e),o=$e.setStatus(s,t,r);return o&&await O.remember(e,{type:"spec",content:`Spec status \u2192 ${r}: ${o.title}`,tags:{spec_id:t,status:r,event:"status_change"},source:t}),o}async update(e,t,r){let s=await this.requireProjectId(e);return $e.updateContent(s,t,r)}async recordReview(e,t,r,s){let o=await this.requireProjectId(e),i=3,c=50,l=0,u=!1,d=null;for(;l<i;){let p=$e.get(o,t);if(!p)return null;let m={...s,ts:R()},f={...p.content,reviews:{...p.content.reviews??{},[r]:m}};if($e.casUpdate(o,t,f,p.updatedAt)){u=!0,d=$e.get(o,t);break}l++,l<i&&await new Promise(v=>setTimeout(v,c))}if(!u)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${i} retries failed for spec ${t}`);if(d&&UR(d.content)&&d.status==="draft"){let p=$e.setStatus(o,t,"reviewed");if(p){let{breakdownSpecToTasks:m}=await Promise.resolve().then(()=>(Mg(),Dg));return await m(o,e,p),$e.get(o,t)}return p}return d}async linkTask(e,t,r){let s=await this.requireProjectId(e);return $e.linkTask(s,t,r)}async ship(e,t,r){let s=await this.requireProjectId(e);r!==void 0&&$e.setShippedPr(s,t,r);let o=await WF(e);return o&&$e.setShippedSha(s,t,o),$e.setStatus(s,t,"shipped")}unmetCriteria(e,t=new Set){return e.content.acceptance_criteria.filter(r=>!t.has(r))}async setSelectedReviewers(e,t,r){let s=await this.requireProjectId(e),o=$e.get(s,t);return o?$e.updateContent(s,t,{...o.content,selected_reviewers:r}):null}async requireProjectId(e){let t=await x.readConfig(e);if(!t?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return t.projectId}},Ht=new Ng});var bu={};j(bu,{SddCommands:()=>Og,_internal:()=>qF,effectiveSddMode:()=>Lg});function Lg(n){let e=n?.sdd?.mode;if(e&&oa.includes(e))return e;let t=process.env.PRJCT_SDD_MODE?.toLowerCase();return t&&oa.includes(t)?t:"off"}var oa,BF,Og,qF,vu=h(()=>{"use strict";K();vr();
|
|
1372
|
+
Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},source:c.id,provenance:"declared"}),c}async get(e,t){let r=await this.requireProjectId(e);return $e.get(r,t)}async list(e,t={}){let r=await this.requireProjectId(e);return $e.list(r,t)}async setStatus(e,t,r){let s=await this.requireProjectId(e),o=$e.setStatus(s,t,r);return o&&await O.remember(e,{type:"spec",content:`Spec status \u2192 ${r}: ${o.title}`,tags:{spec_id:t,status:r,event:"status_change"},source:t}),o}async update(e,t,r){let s=await this.requireProjectId(e);return $e.updateContent(s,t,r)}async recordReview(e,t,r,s){let o=await this.requireProjectId(e),i=3,c=50,l=0,u=!1,d=null;for(;l<i;){let p=$e.get(o,t);if(!p)return null;let m={...s,ts:R()},f={...p.content,reviews:{...p.content.reviews??{},[r]:m}};if($e.casUpdate(o,t,f,p.updatedAt)){u=!0,d=$e.get(o,t);break}l++,l<i&&await new Promise(v=>setTimeout(v,c))}if(!u)throw new Error(`SPEC_RECORD_REVIEW_CONFLICT_RETRY_EXHAUSTED: ${i} retries failed for spec ${t}`);if(d&&UR(d.content)&&d.status==="draft"){let p=$e.setStatus(o,t,"reviewed");if(p){let{breakdownSpecToTasks:m}=await Promise.resolve().then(()=>(Mg(),Dg));return await m(o,e,p),$e.get(o,t)}return p}return d}async linkTask(e,t,r){let s=await this.requireProjectId(e);return $e.linkTask(s,t,r)}async ship(e,t,r){let s=await this.requireProjectId(e);r!==void 0&&$e.setShippedPr(s,t,r);let o=await WF(e);return o&&$e.setShippedSha(s,t,o),$e.setStatus(s,t,"shipped")}unmetCriteria(e,t=new Set){return e.content.acceptance_criteria.filter(r=>!t.has(r))}async setSelectedReviewers(e,t,r){let s=await this.requireProjectId(e),o=$e.get(s,t);return o?$e.updateContent(s,t,{...o.content,selected_reviewers:r}):null}async requireProjectId(e){let t=await x.readConfig(e);if(!t?.projectId)throw new Error("not a prjct project (run `prjct init` first)");return t.projectId}},Ht=new Ng});var bu={};j(bu,{SddCommands:()=>Og,_internal:()=>qF,effectiveSddMode:()=>Lg});function Lg(n){let e=n?.sdd?.mode;if(e&&oa.includes(e))return e;let t=process.env.PRJCT_SDD_MODE?.toLowerCase();return t&&oa.includes(t)?t:"off"}var oa,BF,Og,qF,vu=h(()=>{"use strict";K();vr();me();Ke();ie();ye();oa=["off","advisory","strict"],BF=[{key:"spec drafted",reached:a(()=>!0,"reached")},{key:"audit-spec passed (reviewed)",reached:a(n=>n!=="draft","reached")},{key:"task linked",reached:a(n=>n==="in_progress"||n==="shipped","reached")},{key:"shipped",reached:a(n=>n==="shipped","reached")}],Og=class extends G{static{a(this,"SddCommands")}async sdd(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();return!o||o==="status"||o==="show"?this.showStatus(t,r):oa.includes(o)?this.setMode(o,t,r):L(`Unknown sdd subcommand "${o}". Use: ${oa.join("|")}.`,r)}async showStatus(e,t){let r=await x.readConfig(e).catch(()=>null);if(!r?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=Lg(r),o="no active task",i="Active spec: none";try{let l=await Ft(r.projectId,e);if(l?.linkedSpecId){let{specService:u}=await Promise.resolve().then(()=>(Ho(),sa)),d=await u.get(e,l.linkedSpecId);d&&(i=`Active spec: \`${d.title}\` (${d.status})`,o=BF.map(p=>`${p.reached(d.status)?"\u2713":"\u25CB"} ${p.key}`).join(" "))}else l&&(i="Active task has NO linked spec")}catch{}let c=[`Mode: ${s}${s==="off"?" (pipeline stays escalate-only)":""}`,i,`Pipeline: ${o}`,"Set: prjct sdd off|advisory|strict"];return t.md?console.log(_("## SDD",`> **Mode**: \`${s}\``,c.slice(1).join(`
|
|
1373
1373
|
`))):g.info(`SDD \u2014 ${c.join(`
|
|
1374
|
-
`)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",r);s.sdd={mode:e},await x.writeConfig(t,s);let o=e==="off"?"SDD mode off \u2014 the spec pipeline stays escalate-only (no gating).":e==="advisory"?"SDD mode \u2192 advisory. The skill nudges toward a spec for complex work; `ship` surfaces acceptance criteria.":"SDD mode \u2192 strict. Every `prjct task` must link a REVIEWED spec, and `ship` blocks unspecced work (override: `prjct ship --no-spec-gate`).";return r.md?console.log(_("## SDD",`> ${o}`)):g.done(o),{success:!0,mode:e}}};a(Lg,"effectiveSddMode");qF={effectiveSddMode:Lg,SDD_MODES:oa}});var Ug={};j(Ug,{TddCommands:()=>Fg,_internal:()=>VF,effectiveTddMode:()=>Hg});function Hg(n){let e=n?.tdd?.mode;if(e&&ia.includes(e))return e;let t=process.env.PRJCT_TDD_MODE?.toLowerCase();return t&&ia.includes(t)?t:"off"}var ia,Fg,VF,Gg=h(()=>{"use strict";K();F();pe();
|
|
1374
|
+
`)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",r);s.sdd={mode:e},await x.writeConfig(t,s);let o=e==="off"?"SDD mode off \u2014 the spec pipeline stays escalate-only (no gating).":e==="advisory"?"SDD mode \u2192 advisory. The skill nudges toward a spec for complex work; `ship` surfaces acceptance criteria.":"SDD mode \u2192 strict. Every `prjct task` must link a REVIEWED spec, and `ship` blocks unspecced work (override: `prjct ship --no-spec-gate`).";return r.md?console.log(_("## SDD",`> ${o}`)):g.done(o),{success:!0,mode:e}}};a(Lg,"effectiveSddMode");qF={effectiveSddMode:Lg,SDD_MODES:oa}});var Ug={};j(Ug,{TddCommands:()=>Fg,_internal:()=>VF,effectiveTddMode:()=>Hg});function Hg(n){let e=n?.tdd?.mode;if(e&&ia.includes(e))return e;let t=process.env.PRJCT_TDD_MODE?.toLowerCase();return t&&ia.includes(t)?t:"off"}var ia,Fg,VF,Gg=h(()=>{"use strict";K();F();pe();me();Ke();ie();Vi();ye();ia=["off","assist","strict"],Fg=class extends G{static{a(this,"TddCommands")}async tdd(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();return!o||o==="status"||o==="show"?this.showStatus(t,r):ia.includes(o)?this.setMode(o,t,r):o==="check"?this.check(t,r):L(`Unknown tdd subcommand "${o}". Use: check, or ${ia.join("|")}.`,r)}async showStatus(e,t){let r=await x.readConfig(e).catch(()=>null);if(!r?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=Hg(r),i=(await kr(e).catch(()=>null))?.test?.command??null,c=[`Mode: ${s}${s==="off"?" (guidance + ship TDD gate dormant)":""}`,`Test command: ${i??"none detected (add tests to enable the gate)"}`,"Set: prjct tdd off|assist|strict","Check: prjct tdd check \u2014 run the test command now (red/green)"];return t.md?console.log(_("## TDD",`> **Mode**: \`${s}\``,`- Test command: \`${i??"none detected"}\``,c.slice(2).join(`
|
|
1375
1375
|
`))):g.info(`TDD \u2014 ${c.join(`
|
|
1376
1376
|
`)}`),{success:!0,mode:s,testCommand:i}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",r);s.tdd={mode:e},await x.writeConfig(t,s);let o=e==="off"?"TDD mode off \u2014 test-first guidance and the ship TDD gate are dormant.":e==="assist"?"TDD mode \u2192 assist. Guidance biases test-first (red\u2192green\u2192refactor); `ship` reminds.":"TDD mode \u2192 strict. Test-first expected; `ship` surfaces a hard gate \u2014 run `prjct tdd check` and don't ship on red.";return r.md?console.log(_("## TDD",`> ${o}`)):g.done(o),{success:!0,mode:e}}async check(e,t){let s=(await kr(e).catch(()=>null))?.test?.command;if(!s){let o="tdd check: no test command detected for this stack. Add a test script first.";return console.log(t.md?_("## TDD check",`> ${o}`):o),{success:!1,reason:"no_test_command"}}try{await J(s,{cwd:e,maxBuffer:32*1024*1024});let o=`tdd check: GREEN \u2014 \`${s}\` passed.`;return console.log(t.md?_("## TDD check",`> \u2705 ${o}`):o),{success:!0,green:!0,testCommand:s}}catch(o){let i=`tdd check: RED \u2014 \`${s}\` failed. Fix before shipping.`;return t.md?console.log(_("## TDD check",`> \u274C ${i}`,w(o))):(g.fail(i),g.info(w(o))),{success:!1,green:!1,testCommand:s}}}};a(Hg,"effectiveTddMode");VF={effectiveTddMode:Hg,TDD_MODES:ia}});function QR(n){let e=n.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function JF(n){let e=n.trim();if(!e)return{};let t=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(t)return{provider:QR(t[1]),repoSlug:t[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:QR(r.host),repoSlug:s}}catch{return{}}}async function XF(n){try{let{stdout:e}=await H("git",["remote","get-url","origin"],{cwd:n});return e.trim()||void 0}catch{return}}async function zF(n){try{let{stdout:e}=await H("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:n});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function _s(n){return typeof n=="string"&&n.length>0?n:void 0}function ZR(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function KF(n){return Object.fromEntries(Object.entries(n).filter(([,e])=>e!==void 0))}async function Su(n){let e=$.getDoc(n,"project")||{},t=_s(e.repoPath),{provider:r,repoSlug:s}=t?JF(await XF(t)||""):{},o=t?await zF(t):void 0,i=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return KF({provider:r,repoSlug:s,currentBranch:_s(e.currentBranch),defaultBranch:o,stack:_s(e.stack),techStack:i&&i.length>0?i:void 0,version:_s(e.version),commitCount:ZR(e.commitCount),fileCount:ZR(e.fileCount),lastCommit:_s(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:_s(e.cliVersion),syncedAt:_s(e.lastSync)})}var Wg=h(()=>{"use strict";Z();pe();a(QR,"providerForHost");a(JF,"parseRemote");a(XF,"gitRemoteUrl");a(zF,"gitDefaultBranch");a(_s,"str");a(ZR,"num");a(KF,"compact");a(Su,"buildProjectMeta")});function YF(n){if(n==null)return null;if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return null}}var ex,tx=h(()=>{"use strict";Z();ex={async upsert(n,e){let t=e.name||"";if(!t)return;let r=e.description??null,s=YF(e.metadata),o=e.enabled===0?0:1,i=e.is_builtin===1?1:0,c=new Date().toISOString(),l=S.get(n,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",t);if(l){if(l.is_builtin===1)return;S.run(n,"UPDATE custom_workflows SET description = ?, metadata = ?, enabled = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",r,s,o,c,t);return}S.run(n,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
|
|
1377
1377
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,t,r,e.created_at||c,c,i,o,s)},async delete(n,e){let t=e.name||"";t&&S.run(n,"UPDATE custom_workflows SET enabled = 0 WHERE name = ? AND is_builtin = 0",t)}};a(YF,"serializeMetadata")});var nx,rx=h(()=>{"use strict";Kl();nx={async upsert(n,e){let t=e.id||"";if(!t)return;let r=e.title||e.text||"",s=e.priority||"medium",o=e.status||"active";await As.update(n,i=>{let c=i.ideas.findIndex(p=>p.id===t),u={id:t,text:r,priority:s,status:o==="archived"?"archived":"pending",addedAt:i.ideas[c]?.addedAt??new Date().toISOString(),tags:i.ideas[c]?.tags??[]},d=c>=0?i.ideas.map((p,m)=>m===c?{...p,...u}:p):[...i.ideas,u];return{...i,ideas:d}})},async delete(n,e){let t=e.id||"";t&&await As.update(n,r=>({...r,ideas:r.ideas.map(s=>s.id===t?{...s,status:"archived"}:s)}))}}});function QF(n){if(!n)return{};if(typeof n=="string")try{return JSON.parse(n)}catch{return{}}return typeof n=="object"?n:{}}function aa(n,e,t){return n[e]??n[t]??""}var sx,ox=h(()=>{"use strict";Ec();Or();Z();a(QF,"asTags");a(aa,"field");sx={async upsert(n,e){let t=aa(e,"content","content"),r=aa(e,"type","type");if(!t||!r)return;let s=QF(e.tags),o=aa(e,"provenance","provenance")||"declared",i=e.source??null,c=jr(t);if(S.get(n,"SELECT id FROM memories WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",c,r))return;let u=S.appendEvent(n,`memory.${ho}${r}`,{content:t,tags:s,source:i,provenance:o});if(u==null)return;let d=`mem_${u}`,p=new Date().toISOString(),m=(t.split(`
|
|
@@ -1385,7 +1385,7 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
|
|
|
1385
1385
|
VALUES (?, ?, ?, ?)
|
|
1386
1386
|
ON CONFLICT(entity_type, entity_id) DO UPDATE SET
|
|
1387
1387
|
content_hash = excluded.content_hash,
|
|
1388
|
-
applied_at = excluded.applied_at`,e,t,r,R())}catch{}}function wx(n,e,t){if(!(!e||!t))try{S.run(n,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var kx=h(()=>{"use strict";Z();ce();a(hx,"getApplied");a(yx,"recordApplied");a(wx,"clearApplied")});function tH(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function nH(n){let e={};for(let[t,r]of Object.entries(n))e[tH(t)]=r;return e}function rH(n,e){let[t,r]=e.type.split("."),s=Is(e.entityType)??Is(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=nH(c),u=e.entityId||l.id||c.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function bx(n,e){return e.map(t=>rH(n,t)).filter(t=>t!==null)}var vx=h(()=>{"use strict";Tu();a(tH,"camelToSnake");a(nH,"snakeCaseKeys");a(rH,"mapCliEventToWebFormat");a(bx,"mapCliEventsToWebFormat")});var Vg,$s,Cu,ca=h(()=>{"use strict";Cc();ur();vx();Vg=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=bx(e,t),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof t=="number"&&t>0&&(c.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),oo("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await
|
|
1388
|
+
applied_at = excluded.applied_at`,e,t,r,R())}catch{}}function wx(n,e,t){if(!(!e||!t))try{S.run(n,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",e,t)}catch{}}var kx=h(()=>{"use strict";Z();ce();a(hx,"getApplied");a(yx,"recordApplied");a(wx,"clearApplied")});function tH(n){return n.replace(/[A-Z]/g,e=>`_${e.toLowerCase()}`)}function nH(n){let e={};for(let[t,r]of Object.entries(n))e[tH(t)]=r;return e}function rH(n,e){let[t,r]=e.type.split("."),s=Is(e.entityType)??Is(t);if(!s)return null;let i=e.eventType==="delete"||r==="deleted"||r==="archived"||r==="removed"?"delete":"upsert",c=e.data||{},l=nH(c),u=e.entityId||l.id||c.id||"",d={event_type:i,entity_type:s,entity_id:u,data:{...l,project_id:n},project_id:n};return e.originDeviceId!==void 0&&(d.origin_device_id=e.originDeviceId),e.contentHash!==void 0&&(d.content_hash=e.contentHash),e.revisionCount!==void 0&&(d.revision_count=e.revisionCount),e.timestamp&&(d.ts=e.timestamp),d}function bx(n,e){return e.map(t=>rH(n,t)).filter(t=>t!==null)}var vx=h(()=>{"use strict";Tu();a(tH,"camelToSnake");a(nH,"snakeCaseKeys");a(rH,"mapCliEventToWebFormat");a(bx,"mapCliEventsToWebFormat")});var Vg,$s,Cu,ca=h(()=>{"use strict";Cc();ur();vx();Vg=class{static{a(this,"SyncClient")}retryConfig={maxRetries:3,baseDelayMs:1e3,maxDelayMs:3e4};async pushEvents(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=bx(e,t),c=await this.fetchWithRetry(`${r}/sync/batch`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,events:i})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async pullEvents(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c={projectId:e};typeof t=="number"&&t>0&&(c.sinceEventId=t);let l=await this.fetchWithRetry(`${s}/sync/pull`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify(c)});if(!l.ok)throw await this.parseErrorResponse(l);return await l.json()}async getStatus(e){let{apiUrl:t,apiKey:r,deviceId:s}=await this.getAuthHeaders();if(!r)throw this.createError("AUTH_REQUIRED","No API key configured");let o=await this.fetchWithRetry(`${t}/sync/status/${e}`,{method:"GET",headers:{...this.authHeaders(r,s)}});if(!o.ok)throw await this.parseErrorResponse(o);return await o.json()}async linkProject(e,t,r){let{apiUrl:s,apiKey:o,deviceId:i}=await this.getAuthHeaders();if(!o)throw this.createError("AUTH_REQUIRED","No API key configured");let c=await this.fetchWithRetry(`${s}/sync/link`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(o,i)},body:JSON.stringify({projectId:e,...t?{name:t}:{},...r?{meta:r}:{}})});if(!c.ok)throw await this.parseErrorResponse(c);return await c.json()}async publishBenchmark(e,t){let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)throw this.createError("AUTH_REQUIRED","No API key configured");let i=await this.fetchWithRetry(`${r}/benchmarks/evals`,{method:"POST",headers:{"Content-Type":"application/json",...this.authHeaders(s,o)},body:JSON.stringify({projectId:e,...t})});if(!i.ok)throw await this.parseErrorResponse(i);return await i.json()}async testConnection(){let e=new AbortController,t=setTimeout(()=>e.abort(),oo("API_REQUEST"));try{let{apiUrl:r,apiKey:s,deviceId:o}=await this.getAuthHeaders();if(!s)return clearTimeout(t),!1;let i=await fetch(`${r}/auth/verify`,{method:"GET",headers:{...this.authHeaders(s,o)},signal:e.signal});return clearTimeout(t),i.status===401||i.status===403?(await fe.clearAuth(),!1):i.ok}catch{return clearTimeout(t),!1}}async hasAuth(){return await fe.hasAuth()}async getAuthHeaders(){let[e,t,r]=await Promise.all([fe.getApiUrl(),fe.getApiKey(),fe.getDeviceId()]);return{apiUrl:e,apiKey:t,deviceId:r}}authHeaders(e,t){return{"X-Api-Key":e,"X-Device-Id":t}}async fetchWithRetry(e,t,r=0){let s=new AbortController,o=setTimeout(()=>s.abort(),oo("API_REQUEST")),i=(t.method??"GET").toUpperCase(),c=i==="GET"||i==="HEAD";try{let l=await fetch(e,{...t,signal:s.signal});if(clearTimeout(o),c&&l.status>=500&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}return l}catch(l){if(clearTimeout(o),l instanceof Error&&l.name==="AbortError")throw this.createError("NETWORK_ERROR",`Request timed out. Try increasing PRJCT_TIMEOUT_API_REQUEST (current: ${oo("API_REQUEST")}ms)`);if(c&&r<this.retryConfig.maxRetries){let u=Math.min(this.retryConfig.baseDelayMs*2**r,this.retryConfig.maxDelayMs);return await this.sleep(u),this.fetchWithRetry(e,t,r+1)}throw this.createError("NETWORK_ERROR",l instanceof Error?l.message:"Network request failed")}}async parseErrorResponse(e){try{let t=await e.json(),r=t.detail||t.message||t.error||`HTTP ${e.status}`;return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",r,e.status)):e.status===402?this.createError("PAYMENT_REQUIRED",r,e.status):this.createError("API_ERROR",r,e.status)}catch{return e.status===401||e.status===403?(await fe.clearAuth(),this.createError("AUTH_REQUIRED",`HTTP ${e.status}`,e.status)):this.createError("API_ERROR",`HTTP ${e.status}`,e.status)}}createError(e,t,r){return{code:e,message:t,status:r}}sleep(e){return new Promise(t=>setTimeout(t,e))}},$s=new Vg,Cu=$s});var Xg={};j(Xg,{syncCursorStorage:()=>sH});var Jg,sH,zg=h(()=>{"use strict";ce();Z();Jg=class{static{a(this,"SyncCursorStorage")}get(e,t=null,r=null){if(!r)return null;let s=S.get(e,`SELECT * FROM sync_cursors
|
|
1389
1389
|
WHERE project_id = ?
|
|
1390
1390
|
AND device_id = ?
|
|
1391
1391
|
AND ${t===null?"user_id IS NULL":"user_id = ?"}`,...t===null?[e,r]:[e,r,t]);return s?this.rowToCursor(s):null}touch(e,t=null,r=null){if(!r)return;let s=R();this.upsert({userId:t,deviceId:r,projectId:e,lastEventId:this.getLastEventId(e,t,r),updatedAt:s})}advance(e,t,r={}){let s=r.userId??null,o=r.deviceId??null;if(!o)return;let i=this.getLastEventId(e,s,o);t<=i||this.upsert({userId:s,deviceId:o,projectId:e,lastEventId:t,updatedAt:R()})}getLastEventId(e,t,r){return S.get(e,`SELECT last_event_id FROM sync_cursors
|
|
@@ -1396,11 +1396,11 @@ Goal: ${c.content.goal}`,tags:{...t.tags??{},spec_id:c.id,status:c.status},sourc
|
|
|
1396
1396
|
WHERE project_id = ? AND device_id = ? AND user_id IS NULL`,r,R(),e,t)}upsert(e){S.run(e.projectId,`INSERT INTO sync_cursors (user_id, device_id, project_id, last_event_id, updated_at)
|
|
1397
1397
|
VALUES (?, ?, ?, ?, ?)
|
|
1398
1398
|
ON CONFLICT(user_id, device_id, project_id)
|
|
1399
|
-
DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},sH=new Jg});function oH(n){if(Sx.has(n))return;Sx.add(n);let t=mx.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function iH(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Is(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function Ex(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function Tx(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var Sx,Kg,aH,Pn,la=h(()=>{"use strict";xi();Wg();ur();fx();Tu();kx();ca();Sx=new Set;a(oH,"warnNoLocalHandler");a(iH,"normalizeEventShape");a(Ex,"errorMessage");a(Tx,"errorCode");Kg=class{static{a(this,"SyncManager")}async hasAuth(){return await
|
|
1399
|
+
DO UPDATE SET last_event_id = excluded.last_event_id, updated_at = excluded.updated_at`,e.userId,e.deviceId,e.projectId,e.lastEventId,e.updatedAt)}rowToCursor(e){return{userId:e.user_id,deviceId:e.device_id,projectId:e.project_id,lastEventId:e.last_event_id,updatedAt:e.updated_at}}},sH=new Jg});function oH(n){if(Sx.has(n))return;Sx.add(n);let t=mx.has(n)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${n}' (${t}). code=no_local_handler`)}function iH(n){let e=n.data??{},t=n.content_hash??n.contentHash;if(n.entity_type){let i=(n.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:n.entity_type,eventType:i,data:e,contentHash:t}}if(n.entityType){let i=n.eventType||"upsert";return{entityType:n.entityType,eventType:i==="delete"?"delete":"upsert",data:e,contentHash:t}}let[r,s]=(n.type||"").split("."),o=s==="deleted"||s==="archived"||s==="removed";return{entityType:Is(r)||r||"unknown",eventType:o?"delete":"upsert",data:e,contentHash:t}}function Ex(n){return n instanceof Error?n.message:n&&typeof n=="object"&&"message"in n?String(n.message):"Unknown error"}function Tx(n){if(n&&typeof n=="object"&&"code"in n)return n.code}var Sx,Kg,aH,Pn,la=h(()=>{"use strict";xi();Wg();ur();fx();Tu();kx();ca();Sx=new Set;a(oH,"warnNoLocalHandler");a(iH,"normalizeEventShape");a(Ex,"errorMessage");a(Tx,"errorCode");Kg=class{static{a(this,"SyncManager")}async hasAuth(){return await fe.hasAuth()}async getStatus(e){if(!await this.hasAuth())return null;try{return await $s.getStatus(e)}catch{return null}}async sync(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1},s=await this.push(e,t);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let o=await this.pull(e);return o.success&&!o.skipped&&(r.pulled={count:o.count||0,syncedAt:o.syncedAt||new Date().toISOString()}),(!s.success||!o.success)&&(r.success=!1,r.error=s.error||o.error,r.code=s.code||o.code),r}async push(e,t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await Jt.getPending(e),s=t?.include?r.filter(l=>{let u=Is(l.entityType)??Is(l.type?.split(".")[0]);return u?gx(u,t.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let o=await this.createProjectLinkEvent(e),i=o?[o,...s]:s,c=await $s.pushEvents(e,i);if(c.success)return await Jt.clearPending(e),await Jt.updateLastSync(e),{success:!0,skipped:!1,count:c.processed,syncedAt:c.syncedAt};{let l=c.processed,u=c.errors.length,d=c.errors.map(p=>p.error).join(", ");return{success:!1,skipped:!1,count:l,syncedAt:c.syncedAt,error:`${u} events failed: ${d}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:Ex(r),code:Tx(r)}}}async pull(e){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:t}=await Promise.resolve().then(()=>(zg(),Xg)),r=await fe.read(),s=r.deviceId??null,o=r.userId??null,c=(s?t.get(e,o,s):null)?.lastEventId??0,l=await $s.pullEvents(e,c);if(l.events.length===0)return await Jt.updateLastSync(e),{success:!0,skipped:!1,count:0,applied:0,syncedAt:l.syncedAt};let u=await this.applyPulledEvents(e,l.events),d=c;for(let p of l.events){let m=[p.event_id,p.eventId];for(let f of m)typeof f=="number"&&f>d&&(d=f)}return s&&d>c&&t.advance(e,d,{userId:o,deviceId:s}),await Jt.updateLastSync(e),{success:!0,skipped:!1,count:l.events.length,applied:u,syncedAt:l.syncedAt}}catch(t){return{success:!1,skipped:!1,reason:"error",error:Ex(t),code:Tx(t)}}}async applyPulledEvents(e,t){let r=0;for(let s of t)try{await this.applyEvent(e,s),r++}catch(o){let i=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${i}:`,o)}return r}async applyRealtimeEvent(e,t){try{let r=await fe.read(),s=r.deviceId??null,o=t.origin_device_id??t.originDeviceId;if(s&&o&&o===s)return!1;await this.applyEvent(e,t);let i=typeof t.event_id=="number"?t.event_id:typeof t.eventId=="number"?t.eventId:null;if(i!==null){let{syncCursorStorage:c}=await Promise.resolve().then(()=>(zg(),Xg)),l=r.userId??null,u=r.deviceId??null;if(u){let d=c.get(e,l,u);(!d||i>d.lastEventId)&&c.advance(e,i,{userId:l,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(e,t){let{entityType:r,eventType:s,data:o,contentHash:i}=iH(t),c=o.id??"",l=qg[r];if(!l){oH(r);return}if(s==="delete"){await l.delete(e,o),c&&wx(e,r,c);return}i&&this.alreadyApplied(e,r,c,i)||(await l.upsert(e,o),i&&c&&yx(e,r,c,i))}alreadyApplied(e,t,r,s){if(!r)return!1;let o=hx(e,t,r);return o!==null&&o===s}async createProjectLinkEvent(e){try{let t=await Su(e).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:e,cli_project_id:e,meta:t},timestamp:new Date().toISOString(),projectId:e}}catch{return null}}},aH=new Kg,Pn=aH});var Yg={};j(Yg,{flushIfLinked:()=>cH});async function cH(n,e){try{let t=e??null;if(!t){let{default:s}=await Promise.resolve().then(()=>(K(),yn));t=await s.readConfig(n).catch(()=>null)}if(!t?.projectId||!t.cloud?.enabled||t.cloud.paused)return{ran:!1};if(!await Pn.hasAuth())return{ran:!1};let r=await Pn.sync(t.projectId,{include:t.cloud.include??{}});return{ran:!0,pushed:r.pushed?.count??0,pulled:r.pulled?.count??0,error:r.success?void 0:r.error}}catch{return{ran:!1}}}var Qg=h(()=>{"use strict";la();a(cH,"flushIfLinked")});var xu={};j(xu,{ShippingCommands:()=>Zg,seedCodeShipRules:()=>th});import{existsSync as Rx}from"node:fs";import xx from"node:path";function Cx(n){let e=n?.trim();return e||null}async function lH(n){let e=await Ro(n);if(!e)return null;let t=e.replace(/^refs\/heads\//,"").trim();if(!t||/^(main|master|develop|development|dev|trunk)$/i.test(t))return null;let r=t.split("/").filter(Boolean).at(-1)??t;if(!r||/^\d+(?:\.\d+)*$/.test(r))return null;let s=r.replace(/^[a-z]+-\d+[-_]/i,"").replace(/[_-]+/g," ").replace(/[^\p{L}\p{N} ]+/gu," ").replace(/\s+/g," ").trim();return s.length>=3?s:null}function Px(n){return["package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","VERSION"].some(t=>Rx(xx.join(n,t)))}function eh(n){return Rx(xx.join(n,".git"))}async function th(n,e){if(!Px(e))return!1;let t=new Date().toISOString(),r=ue.getRulesForCommand(n,"ship"),s=new Set(r.map(d=>d.action)),i=r.reduce((d,p)=>Math.max(d,p.sortOrder??0),0)+1,c=[];eh(e)&&c.push({action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",timeoutMs:5e3});let l=[{action:"version:bump",description:"Bump version (stack-aware)",timeoutMs:1e4},{action:"changelog:add",description:"Append CHANGELOG entry",timeoutMs:1e4}];eh(e)&&(l.push({action:"git:commit",description:"Commit ship",timeoutMs:15e3}),l.push({action:"git:push",description:"Push to origin",timeoutMs:3e4}));let u=0;for(let d of c)s.has(d.action)||(ue.addRule(n,{type:"gate",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);for(let d of l)s.has(d.action)||(ue.addRule(n,{type:"step",command:"ship",position:"before",action:d.action,description:d.description,enabled:!0,timeoutMs:d.timeoutMs,sortOrder:i++,createdAt:t}),u++);return u>0}async function uH(n,e,t,r){if(r.intent==="proceed"||r.intent==="register-only")return null;if(!t.some(c=>c.type==="step"&&c.position==="before"))return{question:"No `ship` workflow steps are configured for this project. What should ship do?",options:["register-only","seed-code-workflow","abort"],state:{rulesCount:t.length,looksLikeCode:Px(e)}};if(await Ft(n,e))return null;let i=await pH(e);return i?{question:`No active task, and PR #${i.number} ("${i.title}") is OPEN for this branch. Continue ship anyway?`,options:["proceed","abort"],state:{openPr:i.number,branch:i.branch}}:null}function dH(n,e){if(e){let t=_(W("Clarification needed",n.question),W("Options",De(n.options.map(r=>`\`prjct ship --intent=${r}\``))),n.state?W("State",De(Object.entries(n.state).map(([r,s])=>`${r}: ${JSON.stringify(s)}`))):null);console.log(t);return}console.log(`
|
|
1400
1400
|
\u26A0\uFE0F ${n.question}`),console.log(`
|
|
1401
|
-
Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function pH(n){if(!eh(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(pe(),Wd)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var Ru,Zg,Pu=h(()=>{"use strict";K();mu();vr();Fi();Z();ks();fr();F();ce();
|
|
1401
|
+
Options:`);for(let t of n.options)console.log(` prjct ship --intent=${t}`)}async function pH(n){if(!eh(n))return null;try{let{execFileAsync:e}=await Promise.resolve().then(()=>(pe(),Wd)),{stdout:t}=await e("git",["branch","--show-current"],{cwd:n,timeout:3e3}),r=t.toString().trim();if(!r)return null;let{stdout:s}=await e("gh",["pr","list","--head",r,"--state","open","--json","number,title","--limit","1"],{cwd:n,timeout:5e3}),o=JSON.parse(s.toString());return o.length===0?null:{number:o[0].number,title:o[0].title,branch:r}}catch{return null}}var Ru,Zg,Pu=h(()=>{"use strict";K();mu();vr();Fi();Z();ks();fr();F();ce();me();Ke();ra();ie();Vi();vl();ye();Lt();Ru="ship:in_progress",Zg=class extends G{static{a(this,"ShippingCommands")}async ship(e,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;let o=s.value;try{let P=$.getDoc(o,Ru);P?.version&&(await Dt.getByVersion(o,P.version)||(await Dt.addShipped(o,{name:P.feature,version:P.version}),console.log(`\u2139\uFE0F Reconciled an interrupted ship: ${P.feature} (v${P.version})`)),$.deleteDoc(o,Ru))}catch{}let i=Cx(e),c=await Ft(o,t),l=c?.linkedSpecId;if(c&&(i||(i=Cx(c.description)),await nh(o,t)),!r.noSpecGate&&!l)try{let P=await x.readConfig(t).catch(()=>null),{effectiveSddMode:T}=await Promise.resolve().then(()=>(vu(),bu));if(T(P)==="strict")return{success:!1,error:"Strict SDD: this work has no linked spec. Start it via `prjct spec` \u2192 `audit-spec` \u2192 `prjct task --spec <id>`, or override with `prjct ship --no-spec-gate`."}}catch{}if(l&&!r.noSpecGate)try{let{specService:P}=await Promise.resolve().then(()=>(Ho(),sa)),T=await P.get(t,l);if(T&&T.content.acceptance_criteria.length>0){let M=[];M.push(""),M.push(`## Spec acceptance gate \u2014 \`${T.title}\` (${T.id.slice(0,8)})`),M.push(""),M.push("Walk each criterion. STOP if any is unmet."),M.push("");for(let V of T.content.acceptance_criteria)M.push(`- [ ] ${V}`);M.push(""),M.push("Override (only with explicit user consent): `prjct ship --no-spec-gate`."),M.push(""),console.log(M.join(`
|
|
1402
1402
|
`))}}catch{}if(!r.noTestGate)try{let{effectiveTddMode:P}=await Promise.resolve().then(()=>(Gg(),Ug)),T=await x.readConfig(t).catch(()=>null),M=P(T);if(M!=="off"){let ne=(await kr(t).catch(()=>null))?.test?.command,X=[""];M==="strict"?(X.push("## TDD gate (strict) \u2014 tests must be green before ship"),X.push(""),X.push(ne?`Run \`prjct tdd check\` (\`${ne}\`). STOP and fix if RED.`:"No test command detected \u2014 add tests (strict TDD expects them)."),X.push("Override (only with explicit user consent): `prjct ship --no-test-gate`.")):(X.push("## TDD reminder (assist)"),X.push(""),X.push(ne?`Did the change ship with tests? Verify green: \`prjct tdd check\` (\`${ne}\`).`:"Consider adding a test for this change.")),X.push(""),console.log(X.join(`
|
|
1403
|
-
`))}}catch{}let u=ue.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await th(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=ue.getRulesForCommand(o,"ship")}!u.some(P=>P.type==="step"&&P.position==="before")&&r.intent!=="register-only"&&await th(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=ue.getRulesForCommand(o,"ship"));let p=await uH(o,t,u,r);if(p)return dH(p,r.md===!0),{success:!1,clarification:p};if(i=i??await lH(t),!i)return{success:!1,error:'Ship needs a release description. Pass one explicitly, e.g. `prjct ship "add universal agent compatibility"`, or ship from a named feature branch.'};let m={feature:i},f=await yr(o,"ship","before",{projectPath:t,skipRules:r.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{$.setDoc(o,Ru,{feature:i,version:y,startedAt:R()})}catch{}await Dt.addShipped(o,{name:i,version:y});try{$.deleteDoc(o,Ru)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:R()});let v=await yr(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),k=[...f.instructions,...v.instructions];try{await zr.sync(t)}catch(P){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(P))}try{let{regenerateWikiDeferred:P}=await Promise.resolve().then(()=>(Wn(),Br));await P(t,o)}catch(P){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(P))}let b=f.stepsRun.length+v.stepsRun.length;if(r.md){let P=fu("ship",!0),T=_(Me(`Shipped: ${i}`,`Version: ${y}`),W("Results",De([`Version: ${y}`,`Workflow steps run: ${b>0?[...f.stepsRun,...v.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+v.hooksFailed.length}`])),k.length>0?W("Agent Instructions",De(k)):null,Ze(P.map(M=>({label:M.desc,command:M.cmd}))));console.log(T)}else g.done(`v${y} shipped`),Lo("ship");if(c?.id)try{let{usefulnessService:P}=await Promise.resolve().then(()=>(mr(),km));P.creditShippedTask(o,c.id)}catch{}return(async()=>{try{let{flushIfLinked:P}=await Promise.resolve().then(()=>(Qg(),Yg));await P(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Be(s)}}};a(Cx,"normalizeShipFeature");a(lH,"inferShipFeatureFromBranch");a(Px,"isCodeProject");a(eh,"isGitRepo");a(th,"seedCodeShipRules");a(uH,"buildClarification");a(dH,"renderClarification");a(pH,"findOpenPrForBranch")});var Au={};j(Au,{PlanningCommands:()=>sh});async function mH(){if(!rh){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(wu(),yu));rh=new n}return rh}var rh,sh,ju=h(()=>{"use strict";Mc();Ln();K();be();jo();fr();F();fe();ie();Vi();QE();ye();rh=null;a(mH,"getAnalysisCommands");sh=class extends G{static{a(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await x.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",c=null;if(i)o&&r.yes&&(c=await new Ji(t).runNonInteractive());else if(c=await new Ji(t).run(),c.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await po(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await x.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await I.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let k=await mH();if((await k.analyze({},t)).success){g.step(4,4,"Generating agents..."),await k.sync(t);let P=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,P??void 0),{success:!0,mode:"existing",projectId:p,wizard:c}}}let y=r.idea;if(m&&!f){if(!y){await He.installGlobalConfig();let P=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("blank project - provide idea for architect mode"),this._printNextSteps(c,P??void 0),{success:!0,mode:"blank_no_idea",projectId:p,wizard:c}}g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(Te(),zc));await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await He.installGlobalConfig();let b=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("architect mode ready"),this._printNextSteps(c,b??void 0),{success:!0,mode:"architect",projectId:p,idea:y,wizard:c}}await He.installGlobalConfig();let v=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,v??void 0),{success:!0,projectId:p,wizard:c}}catch(r){return g.fail(w(r)),Be(r)}}_printNextSteps(e,t){console.log(""),console.log(" \u2713 global prjct router refreshed where supported"),t?.claudeMd&&console.log(" \u2713 project CLAUDE.md updated with routing block"),t?.agentsMd&&console.log(" \u2713 project AGENTS.md updated with universal routing block"),(t?.ideRules.length??0)>0&&console.log(` \u2713 project IDE rules updated: ${t?.ideRules.join(", ")}`),console.log(""),console.log(" You don't run prjct commands. Your AI coding agent does."),console.log(""),console.log(" Just describe what you're doing \u2014 the agent reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _agentSelections(e,t){if(e)return e.agents;try{let{detectInstalledAgents:r}=await Promise.resolve().then(()=>($l(),Tf));return r(t)}catch{return[]}}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(jg(),HR)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(K(),yn))).default,c=await i.readConfig(e);if(c){let l=c.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...c,persona:l})}}}async _seedShipWorkflow(e,t){let r=await kr(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(Pu(),xu));await o(e,t),s=ue.getRulesForCommand(e,"ship").reduce((i,c)=>Math.max(i,c.sortOrder??0),0)+1,ue.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),r.lint&&ue.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&ue.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var oh,qn,Ax,Hl=h(()=>{"use strict";Yn();Mc();K();be();F();Y();ie();oh=class{static{a(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await x.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(wc(),yc));if(await o.detect(e)){let c=await o.getMainWorktree(e);if(c&&c!==e&&await x.isConfigured(c))return await o.setup(e,c),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ju(),Au)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await x.getProjectId(e);if(!t)throw Za.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await po();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await tr(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return q(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await tr(e)).some(s=>t.includes(s))}catch(t){return q(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await x.isConfigured(e)}async needsMigration(e){return await x.needsMigration(e)}},qn=new oh,Ax=qn});function jx(n){let e=n.toLowerCase(),t=hH(e),r=fH.some(d=>e.includes(d)),s=Kr(e,["security","seguridad","auth","permission","secret","migration","sqlite","database","arquitectura","architecture","must","critical","critico","cr\xEDtico"]),o=yH(t,e,s),i=wH(o,s),c=kH(t,o,r),l=bH(o),u=SH(n);return{level:o,kind:t,risk:i,expectedEvidence:c,scopeHints:u,gates:l,rationale:vH(o,t,i),createdAt:R()}}async function ih(n,e){let t=e.harness;if(!t||t.level==="H0")return{changedFiles:[],observedEvidence:[],warnings:[]};let r=await xH(n),s=EH(r),o=[];t.expectedEvidence.includes("regression-test")&&!s.includes("tests-changed")&&o.push(`${t.level} expects a regression test; no test file changed in the diff.`),t.expectedEvidence.includes("docs-if-public-behavior")&&RH(r)&&!s.includes("docs-changed")&&o.push("Public-facing files changed; no README/docs/changelog file changed.");let i=await PH(n);return i>400&&o.push(`Diff is ${i} changed lines; consider splitting or justify the scope.`),{changedFiles:r,observedEvidence:s,warnings:o}}function hH(n){return Kr(n,["security","seguridad","auth","permission","secret"])?"security":Kr(n,["bug","fix","falla","fallo","error","broken","regression","no se"])?"bug":Kr(n,["refactor","cleanup","split","restructure"])?"refactor":Kr(n,["doc","readme","changelog","typo"])?"docs":Kr(n,["chore","format","lint"])?"chore":Kr(n,["add","agrega","crear","implement","implementa","feature","mejora"])?"feature":"unknown"}function yH(n,e,t){return n==="docs"||n==="chore"?"H0":n==="security"||t&&Kr(e,["migration","sqlite","database","architecture","arquitectura"])?"H3":n==="feature"||n==="refactor"?"H2":"H1"}function wH(n,e){return n==="H3"||e?"high":n==="H2"||n==="H1"?"medium":"low"}function kH(n,e,t){let r=new Set;return n==="bug"&&(r.add("regression-test"),r.add("focused-tests"),r.add("edge-cases")),(n==="feature"||n==="refactor")&&(r.add("focused-tests"),r.add("scope-check")),t&&r.add("docs-if-public-behavior"),(e==="H2"||e==="H3")&&r.add("spec-or-design"),e==="H3"&&r.add("config-preservation"),[...r]}function bH(n){return n==="H0"?[]:n==="H1"?["verify-before-done"]:n==="H2"?["verify-before-done","scope-check"]:["spec-before-implementation","verify-before-done","scope-check","review-before-ship"]}function vH(n,e,t){return n==="H0"?`Low-risk ${e}; keep the task direct and low-friction.`:`${n} ${e}/${t}; define expected evidence up front and verify before closure.`}function SH(n){let e=n.toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").split(/[^a-z0-9_.-]+/u).filter(t=>t.length>=3&&!gH.has(t));return[...new Set(e)].slice(0,8)}function Kr(n,e){return e.some(t=>n.includes(t))}function EH(n){let e=new Set;return n.some(TH)&&e.add("tests-changed"),n.some(CH)&&e.add("docs-changed"),[...e]}function TH(n){return/(^|\/)(__tests__|tests?|specs?)\//.test(n)||/\.(test|spec)\.[cm]?[tj]sx?$/.test(n)}function CH(n){return/(^|\/)(README|CHANGELOG|docs\/)/i.test(n)}function RH(n){return n.some(e=>e.startsWith("core/commands/")||e.startsWith("core/mcp/")||e.startsWith("templates/")||e==="README.md")}async function xH(n){let e=new Set;try{let{stdout:t}=await H("git",["diff","--name-only","HEAD"],{cwd:n});for(let r of t.split(`
|
|
1403
|
+
`))}}catch{}let u=ue.getRulesForCommand(o,"ship");if(r.intent==="seed-code-workflow"){if(!await th(o,t))return{success:!1,error:"seed-code-workflow requested but this project does not look like code (no package.json / Cargo.toml / pyproject.toml / VERSION). Add rules manually with `prjct workflow add`."};u=ue.getRulesForCommand(o,"ship")}!u.some(P=>P.type==="step"&&P.position==="before")&&r.intent!=="register-only"&&await th(o,t)&&(console.log("\u2139\uFE0F Auto-seeded code ship workflow (one-time migration)"),u=ue.getRulesForCommand(o,"ship"));let p=await uH(o,t,u,r);if(p)return dH(p,r.md===!0),{success:!1,clarification:p};if(i=i??await lH(t),!i)return{success:!1,error:'Ship needs a release description. Pass one explicitly, e.g. `prjct ship "add universal agent compatibility"`, or ship from a named feature branch.'};let m={feature:i},f=await yr(o,"ship","before",{projectPath:t,skipRules:r.skipHooks,runContext:m});if(!f.success)return{success:!1,error:`Ship blocked: ${f.gatesFailed.length>0?f.gatesFailed.join(", "):"unknown step"}`};let y=typeof m.version=="string"?m.version:"unversioned";try{$.setDoc(o,Ru,{feature:i,version:y,startedAt:R()})}catch{}await Dt.addShipped(o,{name:i,version:y});try{$.deleteDoc(o,Ru)}catch{}await this.logToMemory(t,"feature_shipped",{feature:i,version:y,timestamp:R()});let v=await yr(o,"ship","after",{projectPath:t,skipRules:r.skipHooks,runContext:m}),k=[...f.instructions,...v.instructions];try{await zr.sync(t)}catch(P){console.warn("\u26A0\uFE0F Failed to sync AI context after shipping:",w(P))}try{let{regenerateWikiDeferred:P}=await Promise.resolve().then(()=>(Wn(),Br));await P(t,o)}catch(P){console.warn("\u26A0\uFE0F Wiki regeneration failed (non-blocking):",w(P))}let b=f.stepsRun.length+v.stepsRun.length;if(r.md){let P=fu("ship",!0),T=_(Me(`Shipped: ${i}`,`Version: ${y}`),W("Results",De([`Version: ${y}`,`Workflow steps run: ${b>0?[...f.stepsRun,...v.stepsRun].join(", "):"none"}`,`Hooks failed (non-blocking): ${f.hooksFailed.length+v.hooksFailed.length}`])),k.length>0?W("Agent Instructions",De(k)):null,Ze(P.map(M=>({label:M.desc,command:M.cmd}))));console.log(T)}else g.done(`v${y} shipped`),Lo("ship");if(c?.id)try{let{usefulnessService:P}=await Promise.resolve().then(()=>(mr(),km));P.creditShippedTask(o,c.id)}catch{}return(async()=>{try{let{flushIfLinked:P}=await Promise.resolve().then(()=>(Qg(),Yg));await P(t)}catch{}})(),{success:!0,feature:i,version:y}}catch(s){return g.fail(w(s)),Be(s)}}};a(Cx,"normalizeShipFeature");a(lH,"inferShipFeatureFromBranch");a(Px,"isCodeProject");a(eh,"isGitRepo");a(th,"seedCodeShipRules");a(uH,"buildClarification");a(dH,"renderClarification");a(pH,"findOpenPrForBranch")});var Au={};j(Au,{PlanningCommands:()=>sh});async function mH(){if(!rh){let{AnalysisCommands:n}=await Promise.resolve().then(()=>(wu(),yu));rh=new n}return rh}var rh,sh,ju=h(()=>{"use strict";Mc();Ln();K();be();jo();fr();F();me();ie();Vi();QE();ye();rh=null;a(mH,"getAnalysisCommands");sh=class extends G{static{a(this,"PlanningCommands")}async init(e={},t=process.cwd()){try{let r={};if(typeof e=="string"||e===null?r={idea:e}:r=e,await this.initializeAgent(),await x.isConfigured(t))return g.warn("already initialized"),{success:!1,message:"Already initialized"};let o=process.stdout.isTTY&&process.stdin.isTTY,i=r.yes||!o||process.env.CI==="true",c=null;if(i)o&&r.yes&&(c=await new Ji(t).runNonInteractive());else if(c=await new Ji(t).run(),c.skipped)return{success:!1,message:"Setup cancelled"};g.step(1,4,"Detecting author...");let l=await po(),u={name:l.name||void 0,email:l.email||void 0,github:l.github||void 0},p=(await x.createConfig(t,u)).projectId;await this._applyInitialPacksAndPersona(t,r),g.step(2,4,"Creating structure..."),await I.ensureProjectStructure(p),await this._seedShipWorkflow(p,t);let m=await this._detectEmptyDirectory(t),f=await this._detectExistingCode(t);if(f||!m){g.step(3,4,"Analyzing project...");let k=await mH();if((await k.analyze({},t)).success){g.step(4,4,"Generating agents..."),await k.sync(t);let P=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,P??void 0),{success:!0,mode:"existing",projectId:p,wizard:c}}}let y=r.idea;if(m&&!f){if(!y){await He.installGlobalConfig();let P=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("blank project - provide idea for architect mode"),this._printNextSteps(c,P??void 0),{success:!0,mode:"blank_no_idea",projectId:p,wizard:c}}g.spin("architect mode...");let{projectMemory:k}=await Promise.resolve().then(()=>(Te(),zc));await k.remember(t,{type:"idea",content:y,tags:{source:"architect-init",status:"awaiting-stack-recommendation"},source:"architect-init"}),await He.installGlobalConfig();let b=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("architect mode ready"),this._printNextSteps(c,b??void 0),{success:!0,mode:"architect",projectId:p,idea:y,wizard:c}}await He.installGlobalConfig();let v=await cn(t,{agents:await this._agentSelections(c,t)}).catch(()=>null);return g.done("initialized"),this._printNextSteps(c,v??void 0),{success:!0,projectId:p,wizard:c}}catch(r){return g.fail(w(r)),Be(r)}}_printNextSteps(e,t){console.log(""),console.log(" \u2713 global prjct router refreshed where supported"),t?.claudeMd&&console.log(" \u2713 project CLAUDE.md updated with routing block"),t?.agentsMd&&console.log(" \u2713 project AGENTS.md updated with universal routing block"),(t?.ideRules.length??0)>0&&console.log(` \u2713 project IDE rules updated: ${t?.ideRules.join(", ")}`),console.log(""),console.log(" You don't run prjct commands. Your AI coding agent does."),console.log(""),console.log(" Just describe what you're doing \u2014 the agent reads the intent and"),console.log(" runs the right verb. Routine captures (decision, learning,"),console.log(" gotcha, idea) save automatically; ship and other destructive"),console.log(" verbs surface a one-line plan and wait for your OK."),console.log(""),console.log(" If you want to drive manually:"),console.log(" prjct sync Refresh context + skill body"),console.log(" prjct task Start a task"),console.log(" prjct hooks Auto-sync on commit/checkout"),console.log(""),e&&e.agents.length>0&&(console.log(` Detected agents: ${e.agents.join(", ")}`),console.log("")),console.log(" Docs: https://prjct.app/docs"),console.log("")}async _agentSelections(e,t){if(e)return e.agents;try{let{detectInstalledAgents:r}=await Promise.resolve().then(()=>($l(),Tf));return r(t)}catch{return[]}}async _applyInitialPacksAndPersona(e,t){let{activatePacks:r,detectSuggestedPacks:s}=await Promise.resolve().then(()=>(jg(),HR)),o=[];if(t.pack?o=t.pack.split(",").map(i=>i.trim()).filter(Boolean):t.persona||(o=await s(e)),o.length>0&&await r(e,o,{suggestPersona:!0}),t.persona){let i=(await Promise.resolve().then(()=>(K(),yn))).default,c=await i.readConfig(e);if(c){let l=c.persona??{role:t.persona};l.role=t.persona,await i.writeConfig(e,{...c,persona:l})}}}async _seedShipWorkflow(e,t){let r=await kr(t),s=0,{seedCodeShipRules:o}=await Promise.resolve().then(()=>(Pu(),xu));await o(e,t),s=ue.getRulesForCommand(e,"ship").reduce((i,c)=>Math.max(i,c.sortOrder??0),0)+1,ue.addRule(e,{type:"gate",command:"ship",position:"before",action:'git branch --show-current | grep -vE "^(main|master)$"',description:"Prevent shipping from main branch",enabled:!0,timeoutMs:5e3,sortOrder:s++,createdAt:new Date().toISOString()}),r.lint&&ue.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.lint.command} || true`,description:"Lint code",enabled:!0,timeoutMs:12e4,sortOrder:s++,createdAt:new Date().toISOString()}),r.test&&ue.addRule(e,{type:"step",command:"ship",position:"before",action:`${r.test.command} || true`,description:"Run tests",enabled:!0,timeoutMs:3e5,sortOrder:s++,createdAt:new Date().toISOString()})}}});var oh,qn,Ax,Hl=h(()=>{"use strict";Yn();Mc();K();be();F();Y();ie();oh=class{static{a(this,"ProjectService")}currentAuthor=null;async ensureInit(e){if(await x.isConfigured(e))return{success:!0};try{let{worktreeService:o}=await Promise.resolve().then(()=>(wc(),yc));if(await o.detect(e)){let c=await o.getMainWorktree(e);if(c&&c!==e&&await x.isConfigured(c))return await o.setup(e,c),{success:!0}}}catch{}g.spin("initializing project...");let{PlanningCommands:t}=await Promise.resolve().then(()=>(ju(),Au)),s=await new t().init(null,e);return s.success?{success:!0}:s}async getProjectId(e){let t=await x.getProjectId(e);if(!t)throw Za.notInitialized();return t}async getGlobalPath(e){let t=await this.getProjectId(e);return await I.ensureProjectStructure(t),I.getGlobalProjectPath(t)}async ensureAuthor(){if(this.currentAuthor)return this.currentAuthor;let e=await po();return this.currentAuthor={name:e.name??void 0,email:e.email??void 0,github:e.github??void 0},this.currentAuthor}getCurrentAuthor(){return this.currentAuthor}clearAuthorCache(){this.currentAuthor=null}async isEmptyDirectory(e){try{return(await tr(e)).filter(s=>!s.startsWith(".")&&s!=="node_modules"&&s!=="package.json"&&s!=="package-lock.json"&&s!=="README.md").length===0}catch(t){return q(t)||console.error(`Directory check error: ${w(t)}`),!0}}async hasExistingCode(e){try{let t=["src","lib","app","components","pages","api","main.go","main.rs","main.py"];return(await tr(e)).some(s=>t.includes(s))}catch(t){return q(t)||console.error(`Code check error: ${w(t)}`),!1}}async isConfigured(e){return await x.isConfigured(e)}async needsMigration(e){return await x.needsMigration(e)}},qn=new oh,Ax=qn});function jx(n){let e=n.toLowerCase(),t=hH(e),r=fH.some(d=>e.includes(d)),s=Kr(e,["security","seguridad","auth","permission","secret","migration","sqlite","database","arquitectura","architecture","must","critical","critico","cr\xEDtico"]),o=yH(t,e,s),i=wH(o,s),c=kH(t,o,r),l=bH(o),u=SH(n);return{level:o,kind:t,risk:i,expectedEvidence:c,scopeHints:u,gates:l,rationale:vH(o,t,i),createdAt:R()}}async function ih(n,e){let t=e.harness;if(!t||t.level==="H0")return{changedFiles:[],observedEvidence:[],warnings:[]};let r=await xH(n),s=EH(r),o=[];t.expectedEvidence.includes("regression-test")&&!s.includes("tests-changed")&&o.push(`${t.level} expects a regression test; no test file changed in the diff.`),t.expectedEvidence.includes("docs-if-public-behavior")&&RH(r)&&!s.includes("docs-changed")&&o.push("Public-facing files changed; no README/docs/changelog file changed.");let i=await PH(n);return i>400&&o.push(`Diff is ${i} changed lines; consider splitting or justify the scope.`),{changedFiles:r,observedEvidence:s,warnings:o}}function hH(n){return Kr(n,["security","seguridad","auth","permission","secret"])?"security":Kr(n,["bug","fix","falla","fallo","error","broken","regression","no se"])?"bug":Kr(n,["refactor","cleanup","split","restructure"])?"refactor":Kr(n,["doc","readme","changelog","typo"])?"docs":Kr(n,["chore","format","lint"])?"chore":Kr(n,["add","agrega","crear","implement","implementa","feature","mejora"])?"feature":"unknown"}function yH(n,e,t){return n==="docs"||n==="chore"?"H0":n==="security"||t&&Kr(e,["migration","sqlite","database","architecture","arquitectura"])?"H3":n==="feature"||n==="refactor"?"H2":"H1"}function wH(n,e){return n==="H3"||e?"high":n==="H2"||n==="H1"?"medium":"low"}function kH(n,e,t){let r=new Set;return n==="bug"&&(r.add("regression-test"),r.add("focused-tests"),r.add("edge-cases")),(n==="feature"||n==="refactor")&&(r.add("focused-tests"),r.add("scope-check")),t&&r.add("docs-if-public-behavior"),(e==="H2"||e==="H3")&&r.add("spec-or-design"),e==="H3"&&r.add("config-preservation"),[...r]}function bH(n){return n==="H0"?[]:n==="H1"?["verify-before-done"]:n==="H2"?["verify-before-done","scope-check"]:["spec-before-implementation","verify-before-done","scope-check","review-before-ship"]}function vH(n,e,t){return n==="H0"?`Low-risk ${e}; keep the task direct and low-friction.`:`${n} ${e}/${t}; define expected evidence up front and verify before closure.`}function SH(n){let e=n.toLowerCase().normalize("NFD").replace(new RegExp("\\p{Diacritic}","gu"),"").split(/[^a-z0-9_.-]+/u).filter(t=>t.length>=3&&!gH.has(t));return[...new Set(e)].slice(0,8)}function Kr(n,e){return e.some(t=>n.includes(t))}function EH(n){let e=new Set;return n.some(TH)&&e.add("tests-changed"),n.some(CH)&&e.add("docs-changed"),[...e]}function TH(n){return/(^|\/)(__tests__|tests?|specs?)\//.test(n)||/\.(test|spec)\.[cm]?[tj]sx?$/.test(n)}function CH(n){return/(^|\/)(README|CHANGELOG|docs\/)/i.test(n)}function RH(n){return n.some(e=>e.startsWith("core/commands/")||e.startsWith("core/mcp/")||e.startsWith("templates/")||e==="README.md")}async function xH(n){let e=new Set;try{let{stdout:t}=await H("git",["diff","--name-only","HEAD"],{cwd:n});for(let r of t.split(`
|
|
1404
1404
|
`)){let s=r.trim();s&&e.add(s)}}catch{return[]}try{let{stdout:t}=await H("git",["ls-files","--others","--exclude-standard"],{cwd:n});for(let r of t.split(`
|
|
1405
1405
|
`)){let s=r.trim();s&&e.add(s)}}catch{}return[...e].sort()}async function PH(n){try{let{stdout:e}=await H("git",["diff","--shortstat","HEAD"],{cwd:n}),t=Number.parseInt(e.match(/(\d+) insertions?/)?.[1]??"0",10),r=Number.parseInt(e.match(/(\d+) deletions?/)?.[1]??"0",10);return t+r}catch{return 0}}var fH,gH,_x=h(()=>{"use strict";ce();pe();fH=["cli","command","install","setup","doctor","mcp","codex","claude","statusline","statusbar","output","help"],gH=new Set(["the","and","for","with","that","this","task","implement","implementa","fix","bug","add","agrega","crear","hacer","esto","debe"]);a(jx,"buildTaskHarness");a(ih,"evaluateHarnessCompletion");a(hH,"detectKind");a(yH,"detectLevel");a(wH,"detectRisk");a(kH,"expectedEvidenceFor");a(bH,"gatesFor");a(vH,"rationaleFor");a(SH,"extractScopeHints");a(Kr,"hasAny");a(EH,"observedEvidenceFromFiles");a(TH,"isTestFile");a(CH,"isDocsFile");a(RH,"touchesPublicSurface");a(xH,"readChangedFiles");a(PH,"readDiffSize")});function _H(n){let e=n.trim(),t=AH.some(s=>s.test(e)),r=jH.some(s=>s.test(e));return t&&!r?{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"trivial-keyword"}:r?{kind:"substantive",station:"spec_required",requiresSpec:!0,requiresTestsFirst:!0,reason:"substantive-keyword"}:{kind:"trivial",station:"direct",requiresSpec:!1,requiresTestsFirst:!1,reason:"conservative-default"}}function Ix(n,e){let t=_H(n);return t.kind==="substantive"&&e?{...t,station:"test_red",reason:"linked-spec"}:t}function $x(n){switch(n.station){case"direct":return"Proceed directly; no spec is required for this trivial task.";case"spec_required":return"Create or link a reviewed spec before implementation; write tests before implementation from the spec acceptance criteria.";case"test_red":return"Write failing tests before implementation, covering the linked spec acceptance criteria and edge cases.";case"implementation":return"Implement the minimum code needed to make the existing tests pass.";case"verify":return"Run verification and keep the task blocked on red tests."}}var AH,jH,Dx=h(()=>{"use strict";AH=[/\btypo\b/i,/\bdocs?\b/i,/\breadme\b/i,/\bformat\b/i,/\bchangelog\b/i,/\brerun\b.*\btests?\b/i,/\bre-?run\b.*\btests?\b/i],jH=[/\badd\b/i,/\bimplement\b/i,/\bcreate\b/i,/\bbuild\b/i,/\bfeature\b/i,/\bbilling\b/i,/\bauth\b/i,/\bsecurity\b/i,/\bmigration\b/i,/\bretry\b/i,/\bfailure\b/i,/\brecovery\b/i,/\baudit\b/i,/\bworkflow\b/i,/\borchestrat/i];a(_H,"classifyTaskPipeline");a(Ix,"decideTaskPipeline");a($x,"formatTaskPipelineNextAction")});import IH from"node:fs/promises";import Mx from"node:path";async function Nx(n){try{return await IH.realpath(n)}catch{return n}}function ah(n,e){return`${n} \xB7 ${e??"(detached)"}`}async function Ds(n){let e=Date.now(),t=Ox.get(n);if(t&&e-t.at<$H)return t.ctx;let r=await DH(n);return Ox.set(n,{ctx:r,at:e}),r}async function DH(n){let e="",t="",r="",s;try{let{stdout:u}=await H("git",["rev-parse","--show-toplevel","--git-dir","--git-common-dir","--abbrev-ref","HEAD"],{cwd:n}),[d="",p="",m="",f=""]=u.trim().split(`
|
|
1406
1406
|
`);e=d.trim(),t=p.trim(),r=m.trim(),s=f.trim()&&f.trim()!=="HEAD"?f.trim():void 0}catch{let u=await Nx(n);return{workspaceId:St,worktreePath:u,shortId:St,isMain:!0,label:ah(St)}}let o=Mx.resolve(n,t)===Mx.resolve(n,r),i=await Nx(e||n);if(o)return{workspaceId:St,worktreePath:i,shortId:St,branch:s,isMain:!0,label:ah(St,s)};let c=xc(i),l=c.slice(0,6);return{workspaceId:c,worktreePath:i,shortId:l,branch:s,isMain:!1,label:ah(l,s)}}var St,Ox,$H,ch=h(()=>{"use strict";pe();bi();St="main";a(Nx,"safeRealpath");a(ah,"buildLabel");Ox=new Map,$H=5e3;a(Ds,"deriveWorkspace");a(DH,"computeWorkspace")});var dh={};j(dh,{completeActiveTask:()=>nh,readLastStatus:()=>ua,resolveActiveTask:()=>Ft,setTaskStatus:()=>uh,startTask:()=>lh});async function lh(n,e,t,r={}){let s=await yr(n,"task","before",{projectPath:e,skipRules:r.skipHooks});if(!s.success)return{ok:!1,blocked:s.gatesFailed.length>0?`Blocked: ${s.gatesFailed.join(", ")}`:`Hook failed: ${s.hooksFailed.join(", ")}`};{let k=await x.readConfig(e).catch(()=>null),{effectiveSddMode:b}=await Promise.resolve().then(()=>(vu(),bu));if(b(k)==="strict"){if(!r.spec)return{ok:!1,blocked:'Strict SDD: a spec is required before a task. Run `prjct spec "<title>"`, pass `prjct audit-spec <id>`, then `prjct task --spec <id>`. (Relax with `prjct sdd advisory`.)'};try{let{specService:P}=await Promise.resolve().then(()=>(Ho(),sa)),T=await P.get(e,r.spec);if(!T)return{ok:!1,blocked:`Strict SDD: spec ${r.spec} not found.`};if(T.status==="draft")return{ok:!1,blocked:`Strict SDD: spec "${T.title}" hasn't passed audit-spec yet (status: draft). Run \`prjct audit-spec ${r.spec}\` first.`}}catch{}}}let o=/^[A-Z]+-\d+$/.test(t)?t:void 0,i=nt(),c=r.spec,l=jx(t),u=await Ds(e),d=u.isMain?St:u.workspaceId,p={id:i,description:t,sessionId:nt(),linearId:o,linkedSpecId:c,harness:l};u.isMain?await ee.startTask(n,p):await ee.startTaskInWorkspace(n,{...p,branch:u.branch,workspaceId:u.workspaceId,worktreePath:u.worktreePath},u.workspaceId);let m=Ix(t,c),f=EE(n,{taskId:i,workspaceId:d,classification:m.kind,station:m.station,requiresSpec:m.requiresSpec,requiresTestsFirst:m.requiresTestsFirst,reason:m.reason,linkedSpecId:c??null});if(c)try{let{specService:k}=await Promise.resolve().then(()=>(Ho(),sa));await k.linkTask(e,c,i)}catch{}let y=await Ax.ensureAuthor();await rt.log(e,"task_started",{task:t,taskId:i,harness:l,timestamp:R()},y.name),await yr(n,"task","after",{projectPath:e,skipRules:r.skipHooks});let v=await Ro(e).catch(()=>"");return{ok:!0,taskId:i,description:t,branch:v,linearId:o,linkedSpecId:c,harness:l,pipeline:{classification:f.classification,station:f.station,nextAction:$x(m),requiresSpec:f.requiresSpec,requiresTestsFirst:f.requiresTestsFirst},instructions:s.instructions}}async function uh(n,e,t){let r=t.toLowerCase(),s=MH.includes(r),o=await Ds(e);if(!o.isMain){let u=await ee.getCurrentTaskForWorkspace(n,o.workspaceId);if(!u)return{ok:!1,reason:"no-active-task"};if(r==="done"||r==="completed"){let d=await ua(n,u.id),p=await ih(e,u);return await rt.log(e,Nr,{taskId:u.id,from:d??null,to:t,workspaceId:o.workspaceId,harnessWarnings:p.warnings}),await ee.completeTaskInWorkspace(n,o.workspaceId),{ok:!0,taskId:u.id,status:t,verificationWarnings:p.warnings}}return{ok:!1,reason:"unsupported",message:`'${t}' isn't supported for a worktree task yet \u2014 only 'done'. (pause/resume per-worktree is a planned follow-up)`}}if(s&&!await ee.getCurrentTask(n)){let d=await ee.resumeTask(n);if(d)return await rt.log(e,Nr,{taskId:d.id,from:"paused",to:t}),{ok:!0,taskId:d.id,status:t}}let i=await ee.getCurrentTask(n);if(!i)return{ok:!1,reason:"no-active-task"};let c=await ua(n,i.id),l=r==="done"||r==="completed"?await ih(e,i):{warnings:[]};await rt.log(e,Nr,{taskId:i.id,from:c??null,to:t,harnessWarnings:l.warnings});try{r==="done"||r==="completed"?await ee.completeTask(n):r==="paused"||r==="pause"?await ee.pauseTask(n):s&&(await ee.getCurrentTask(n)||await ee.resumeTask(n))}catch{}return{ok:!0,taskId:i.id,status:t,verificationWarnings:l.warnings}}async function Ft(n,e){let t=await Ds(e);return t.isMain?ee.getCurrentTask(n):ee.getCurrentTaskForWorkspace(n,t.workspaceId)}async function nh(n,e,t){let r=await Ds(e);return r.isMain?ee.completeTask(n,t):ee.completeTaskInWorkspace(n,r.workspaceId,t)}async function ua(n,e){try{let{default:t}=await Promise.resolve().then(()=>(Z(),_r)),r=t.query(n,"SELECT data FROM events WHERE type = ? ORDER BY id DESC LIMIT 10",`memory.${Nr}`);for(let s of r)try{let o=JSON.parse(s.data);if(o.taskId===e&&o.to)return o.to}catch{}}catch{}return null}var MH,vr=h(()=>{"use strict";K();Or();lr();Fi();Nt();mf();ce();vl();pr();Hl();_x();Dx();ch();MH=["active","resume","in_progress","working"];a(lh,"startTask");a(uh,"setTaskStatus");a(Ft,"resolveActiveTask");a(nh,"completeActiveTask");a(ua,"readLastStatus")});var Hx={};j(Hx,{buildSessionContext:()=>Iu,buildSubagentDigest:()=>ph,runSessionStartHook:()=>mh});async function Iu(n,e,t={}){let r=e??await x.readConfig(n);if(!r?.projectId)return null;let s=r.persona,o=t.digest?OH(r.projectId):null;if(!s&&!o)return null;let i=["# prjct: project context",""];return s&&i.push(HH(s),"","> Exposed as state, not prescription. Decide whether any of this matters for the current turn."),o&&(s&&i.push(""),i.push(o)),i.join(`
|
|
@@ -1431,12 +1431,12 @@ ${c}`:i,ZH)},"build")},e)}var ZH,eU,tU,pa,Rh=h(()=>{"use strict";K();Vt();Te();U
|
|
|
1431
1431
|
`).toLowerCase()}function k1(n){return typeof n=="string"?n:Array.isArray(n)?n.map(e=>{if(typeof e=="string")return e;if(e&&typeof e=="object"&&"text"in e){let t=e.text;return typeof t=="string"?t:""}return""}).join(`
|
|
1432
1432
|
`).trim():""}function xP(n){let e=new Set;for(let t of n.toLowerCase().split(/[^a-z0-9]+/))t.length<jP||_P.has(t)||e.add(t);return e}function b1(n){let e=[...n].filter(r=>r.length>=g1);if(e.length>0)return new Set(e);let t="";for(let r of n)(r.length>t.length||r.length===t.length&&r<t)&&(t=r);return t?new Set([t]):new Set}function Bu(n){let e=new Set;for(let t of n)for(let r of t.split("/")){let s=r.replace(/\.[a-z0-9]+$/i,"").toLowerCase();s.length>=jP&&!_P.has(s)&&e.add(s)}return e}function PP(n,e){let t=Bu([n]);for(let r of Bu([e]))if(t.has(r))return!0;return!1}function v1(n){let e=n.evidenceFile!==""?`touched \`${n.evidenceFile}\``:"worked the same area";return[`[skill-miss] Unused project knowledge (${n.memType}, ${n.memId}): "${n.excerpt}"`,`This session ${e} but never referenced it. Apply it, or supersede it via: prjct remember decision "<resolution>" --tags resolves:skill-miss,relates:${n.memId}`].join(`
|
|
1433
1433
|
`)}function S1(n,e){let t=`${n}::${e.toLowerCase().replace(/\s+/g," ").trim()}`;return a1.createHash("sha256").update(t).digest("hex")}function E1(n,e){let t=O.recall(n,{types:[...d1],limit:120}),r=Date.now()-p1,s=[];for(let o of t)o.provenance!=="inferred"&&(Date.parse(o.rememberedAt)>r||e&&o.tags.session===e||s.push({id:o.id,type:o.type,content:o.content,fileTag:o.tags.file??"",rememberedAt:o.rememberedAt,provenance:o.provenance,session:o.tags.session??""}));return s}function T1(n){try{let e=O.recall(n,{types:["improvement-signal"],tags:{source:AP},limit:100,dedupeByKey:!1}),t=new Set;for(let r of e)r.tags.key&&t.add(r.tags.key);return t}catch{return new Set}}function C1(n){try{let e=ft("node:fs"),r=ft("node:path").join(n,".prjct","prjct.config.json");return JSON.parse(e.readFileSync(r,"utf-8")).projectId??null}catch{return null}}var AP,l1,u1,d1,p1,m1,f1,jP,g1,_P,$P=h(()=>{"use strict";Te();Fi();pl();wa();mr();AP="skill-miss-detector",l1=3,u1=280,d1=["decision","gotcha","anti-pattern"],p1=5400*1e3,m1=360*60*1e3,f1=2,jP=5,g1=8,_P=new Set(["should","because","project","prjct","instead","always","never","using","value","state","change","changes","update","updated","function","return","returns","error","errors","tests","testing","config","default","import","export","before","after","without"]);a(IP,"detectSkillMisses");a(h1,"analyze");a(y1,"parseJsonl");a(w1,"transcriptTextOf");a(k1,"textOf");a(xP,"tokenize");a(b1,"signatureOf");a(Bu,"fileStems");a(PP,"sharesStem");a(v1,"formatSkillMiss");a(S1,"hashKey");a(E1,"recallCandidates");a(T1,"existingSkillMissKeys");a(C1,"projectIdFromPath")});import R1 from"node:crypto";import x1 from"node:fs/promises";async function LP(n,e,t,r={}){let s={scanned:0,ingested:0,skipped:[],errors:[]},o=r.preloadedConfig!==void 0?r.preloadedConfig:await x.readConfig(n).catch(()=>null);if(!o?.projectId)return s.errors.push("no project config"),s;let i;if(r.preloadedLines)i=r.preloadedLines;else{let p;try{p=await x1.readFile(e,"utf-8")}catch(m){return s.errors.push(`transcript read failed: ${m.message}`),s}i=Qr(p)}let c=j1(i);if(s.scanned=c.length,c.length===0)return s;let l=$1(c);if(l.length===0)return s;let u=N1(o.projectId),d=t?t.slice(0,12):"unknown";for(let p of l){if(u.has(p.hash)){s.skipped.push({reason:"duplicate",phrase:p.matchedPhrase});continue}try{await O.remember(n,{type:p.type,content:p.content,tags:{source:NP,session:d,hash:p.hash,phrase:p.matchedPhrase},provenance:"inferred",projectId:o.projectId}),s.ingested+=1}catch(m){s.errors.push(`remember failed: ${m.message}`)}}return s}function j1(n){let e=[];for(let t of n){let r=_1(t);if(r!=="assistant")continue;let s=I1(t);!s||s.length<OP||e.push({role:r,text:s})}return e}function _1(n){let e=n.role;if(typeof e=="string")return MP(e);let t=n.message;if(t&&typeof t=="object"&&"role"in t){let s=t.role;if(typeof s=="string")return MP(s)}let r=n.type;return r==="assistant"||r==="user"||r==="system"?r:null}function MP(n){let e=n.toLowerCase();return e==="assistant"||e==="user"||e==="system"?e:null}function I1(n){let e=n.content;if(e===void 0&&n.message&&typeof n.message=="object"&&(e=n.message.content),typeof e=="string")return e.trim();if(Array.isArray(e)){let t=[];for(let r of e){if(!r||typeof r!="object")continue;let s=r;s.type==="text"&&typeof s.text=="string"&&t.push(s.text)}return t.join(`
|
|
1434
|
-
`).trim()}return""}function $1(n){let e=[],t=new Set;for(let r of n){let s=D1(r.text);for(let o of s){if(e.length>=P1)return e;if(o.length<OP)continue;let i=o.toLowerCase(),c=A1.find(d=>i.includes(d.phrase));if(!c)continue;let l=o.length>DP?`${o.slice(0,DP)}\u2026`:o,u=M1(l);t.has(u)||(t.add(u),e.push({type:c.type,content:l,hash:u,matchedPhrase:c.phrase}))}}return e}function D1(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function M1(n){return R1.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}function N1(n){let e=new Set;try{let{prjctDb:t}=(Z(),gt(_r)),{REMEMBER_EVENT_RANGE:r}=(Or(),gt(zb)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==NP)continue;let l=c.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var NP,OP,DP,P1,A1,FP=h(()=>{"use strict";K();Te();wa();NP="transcript-auto",OP=80,DP=1500,P1=12,A1=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];a(LP,"ingestTranscript");a(j1,"projectMessages");a(_1,"inferRole");a(MP,"normalizeRole");a(I1,"extractText");a($1,"extractCandidates");a(D1,"splitParagraphs");a(M1,"hashContent");a(N1,"collectExistingAutoHashes")});var HP={};j(HP,{runStopHook:()=>Wh});import O1 from"node:fs/promises";function Wh(n=process.cwd(),e){return Qe({event:"Stop",projectPath:n,afterEmit:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await O1.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Qr(i))}try{await Gm(r)}catch{}try{await Bm(r,s)}catch{}if(t.transcript_path)try{await LP(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await vP(r,s)}catch{}try{await gP(r,s)}catch{}try{let i=await TP(s.projectId);await CP(s.projectId,i)}catch{}if(t.transcript_path)try{if((await uP(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:c}=await Promise.resolve().then(()=>(Uo(),Bx)),u=(await c(s.projectId,r)).current?.id;u&&wt.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await IP(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await ya.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Qg(),Yg));await i(r,s)}catch{}await Li(r,s.projectId).catch(()=>{})},"afterEmit")},e)}var Bh=h(()=>{"use strict";K();Uu();pP();hP();SP();RP();$P();wa();FP();mr();Wn();il();hn();a(Wh,"runStopHook")});var UP={};j(UP,{runSubagentStartHook:()=>qh});function qh(n=process.cwd(),e){return Qe({event:"SubagentStart",projectPath:n,build:a((t,r)=>ph(r),"build")},e)}var Vh=h(()=>{"use strict";hn();da();a(qh,"runSubagentStartHook")});var GP={};j(GP,{runSubagentStopHook:()=>Jh});function Jh(n=process.cwd(),e){return Qe({event:"SubagentStop",projectPath:n,build:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId||Go(s)==="off")return null;let o=[];try{let i=await Sr(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await at.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await $u("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}var Xh=h(()=>{"use strict";K();Uo();hr();Du();hn();a(Jh,"runSubagentStopHook")});var BP={};j(BP,{HOOK_RUNNERS:()=>WP,getHookRunner:()=>zh});function zh(n){return n?WP[n]:void 0}var WP,Kh=h(()=>{"use strict";gh();wh();bh();Sh();Th();Rh();da();Bh();Vh();Xh();WP={"session-start":mh,prompt:Ch,"pre-commit":vh,"pre-edit":Eh,"post-edit":kh,stop:Wh,"subagent-start":qh,"subagent-stop":Jh,notification:yh,"cwd-changed":fh};a(zh,"getHookRunner")});var ba,Vn,L1,qP,qu=h(()=>{"use strict";ba={core:{title:"Core Workflow",description:"Essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Vn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},description:"Register a task, auto-classify its harness, or show the active one",usage:{claude:'p. task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"core",routing:{group:"primitives",method:"status"},optionSchema:{},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"p. status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"p. tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"context",group:"setup",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'p. spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to <vault-root>/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"p. audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],L1={"-h":"help","--help":"help","-v":"version","--version":"version"},qP=new Set([...Vn.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(L1).filter(([,n])=>Vn.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)])});var VP={};j(VP,{BIN_COMMANDS_SET:()=>H1,REGISTERED_VERBS_SET:()=>F1});var F1,H1,JP=h(()=>{"use strict";qu();F1=new Set(Vn.filter(n=>n.routing).map(n=>n.name)),H1=qP});var XP={};j(XP,{REMOVED_VERBS:()=>va,isRemovedVerb:()=>Sa,migrationMessage:()=>Yh});function Sa(n){return Object.hasOwn(va,n)}function Yh(n){let e=va[n];return e?`'prjct ${n}' was removed in v2.
|
|
1434
|
+
`).trim()}return""}function $1(n){let e=[],t=new Set;for(let r of n){let s=D1(r.text);for(let o of s){if(e.length>=P1)return e;if(o.length<OP)continue;let i=o.toLowerCase(),c=A1.find(d=>i.includes(d.phrase));if(!c)continue;let l=o.length>DP?`${o.slice(0,DP)}\u2026`:o,u=M1(l);t.has(u)||(t.add(u),e.push({type:c.type,content:l,hash:u,matchedPhrase:c.phrase}))}}return e}function D1(n){return n.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean)}function M1(n){return R1.createHash("sha256").update(n.toLowerCase().trim()).digest("hex").slice(0,16)}function N1(n){let e=new Set;try{let{prjctDb:t}=(Z(),gt(_r)),{REMEMBER_EVENT_RANGE:r}=(Or(),gt(zb)),s=t.query(n,"SELECT data FROM events WHERE type >= ? AND type < ? ORDER BY id DESC LIMIT 500",...r);for(let o of s){let i;try{i=JSON.parse(o.data)}catch{continue}if(!i||typeof i!="object")continue;let c=i.tags;if(!c||c.source!==NP)continue;let l=c.hash;typeof l=="string"&&e.add(l)}}catch{}return e}var NP,OP,DP,P1,A1,FP=h(()=>{"use strict";K();Te();wa();NP="transcript-auto",OP=80,DP=1500,P1=12,A1=[{phrase:"decided to",type:"decision"},{phrase:"we chose",type:"decision"},{phrase:"going with",type:"decision"},{phrase:"the right call",type:"decision"},{phrase:"best approach is",type:"decision"},{phrase:"turns out that",type:"learning"},{phrase:"now i understand",type:"learning"},{phrase:"the key insight",type:"learning"},{phrase:"i learned that",type:"learning"},{phrase:"discovered that",type:"learning"},{phrase:"gotcha:",type:"gotcha"},{phrase:"bug:",type:"gotcha"},{phrase:"fails when",type:"gotcha"},{phrase:"breaks when",type:"gotcha"},{phrase:"be careful",type:"gotcha"}];a(LP,"ingestTranscript");a(j1,"projectMessages");a(_1,"inferRole");a(MP,"normalizeRole");a(I1,"extractText");a($1,"extractCandidates");a(D1,"splitParagraphs");a(M1,"hashContent");a(N1,"collectExistingAutoHashes")});var HP={};j(HP,{runStopHook:()=>Wh});import O1 from"node:fs/promises";function Wh(n=process.cwd(),e){return Qe({event:"Stop",projectPath:n,afterEmit:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId)return;let o;if(t.transcript_path){let i=await O1.readFile(t.transcript_path,"utf-8").catch(()=>null);i!==null&&(o=Qr(i))}try{await Gm(r)}catch{}try{await Bm(r,s)}catch{}if(t.transcript_path)try{await LP(r,t.transcript_path,t.session_id??null,{preloadedConfig:s,preloadedLines:o})}catch{}try{await vP(r,s)}catch{}try{await gP(r,s)}catch{}try{let i=await TP(s.projectId);await CP(s.projectId,i)}catch{}if(t.transcript_path)try{if((await uP(r,t.transcript_path,t.session_id??null,{preloadedLines:o})).signalsRecorded>0){let{collectActiveTasks:c}=await Promise.resolve().then(()=>(Uo(),Bx)),u=(await c(s.projectId,r)).current?.id;u&&wt.penalizeSurfaced(s.projectId,u)}}catch{}if(t.transcript_path)try{await IP(r,t.transcript_path,t.session_id??null,{preloadedLines:o})}catch{}try{await ya.backfill(s.projectId,s,new Date().toISOString())}catch{}try{let{flushIfLinked:i}=await Promise.resolve().then(()=>(Qg(),Yg));await i(r,s)}catch{}await Li(r,s.projectId).catch(()=>{})},"afterEmit")},e)}var Bh=h(()=>{"use strict";K();Uu();pP();hP();SP();RP();$P();wa();FP();mr();Wn();il();hn();a(Wh,"runStopHook")});var UP={};j(UP,{runSubagentStartHook:()=>qh});function qh(n=process.cwd(),e){return Qe({event:"SubagentStart",projectPath:n,build:a((t,r)=>ph(r),"build")},e)}var Vh=h(()=>{"use strict";hn();da();a(qh,"runSubagentStartHook")});var GP={};j(GP,{runSubagentStopHook:()=>Jh});function Jh(n=process.cwd(),e){return Qe({event:"SubagentStop",projectPath:n,build:a(async(t,r)=>{let s=await x.readConfig(r).catch(()=>null);if(!s?.projectId||Go(s)==="off")return null;let o=[];try{let i=await Sr(s.projectId,r);i.current&&o.push(`active: ${i.current.description}`)}catch{}try{let i=await at.getActiveTasks(s.projectId);i.length>0&&o.push(`pending: ${i.length}`)}catch{}return await $u("prjct \u2014 subagent finished",o.join(" \xB7 ")||"A subagent finished"),null},"build")},e)}var Xh=h(()=>{"use strict";K();Uo();hr();Du();hn();a(Jh,"runSubagentStopHook")});var BP={};j(BP,{HOOK_RUNNERS:()=>WP,getHookRunner:()=>zh});function zh(n){return n?WP[n]:void 0}var WP,Kh=h(()=>{"use strict";gh();wh();bh();Sh();Th();Rh();da();Bh();Vh();Xh();WP={"session-start":mh,prompt:Ch,"pre-commit":vh,"pre-edit":Eh,"post-edit":kh,stop:Wh,"subagent-start":qh,"subagent-stop":Jh,notification:yh,"cwd-changed":fh};a(zh,"getHookRunner")});var ba,Vn,L1,qP,qu=h(()=>{"use strict";ba={core:{title:"Core Workflow",description:"Essential commands for daily development workflow",order:1},optional:{title:"Optional Commands",description:"Advanced features for specialized workflows",order:2},setup:{title:"Setup",description:"Installation and configuration (not for daily use)",order:3}},Vn=[{name:"init",group:"core",routing:{group:"planning",method:"init"},description:"Deep project analysis and initialization",usage:{claude:'p. init "[idea]"',terminal:'prjct init "[idea]"'},params:"[idea]",implemented:!0,hasTemplate:!0,requiresProject:!1,requiresLlm:!0,features:["Architect mode for blank projects","Auto tech stack recommendation","Analyzes existing codebases"]},{name:"task",group:"core",routing:{group:"workflow",method:"now"},optionSchema:{strings:["spec"]},description:"Register a task, auto-classify its harness, or show the active one",usage:{claude:'p. task "<description>"',terminal:'prjct task "<description>"'},params:"[description]",implemented:!0,hasTemplate:!0,requiresProject:!0,features:["No arg \u2192 shows the active task (or none)","Auto-harness classifies H0-H3 and stores expected evidence on the task","Writes to stateStorage; runs before/after workflow rules","Optional Linear issue link when the arg matches `[A-Z]+-\\d+`"]},{name:"ship",group:"core",routing:{group:"shipping",method:"ship"},optionSchema:{booleans:["skipHooks","noSpecGate","noTestGate"],strings:["intent"]},description:"Commit, push, and celebrate shipped feature",usage:{claude:'p. ship ["feature"]',terminal:'prjct ship ["feature"]'},params:"[feature]",implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["No arg \u2192 ships the active task description, or derives a summary from the branch"]},{name:"sync",group:"core",routing:{group:"analysis",method:"sync"},description:"Sync project state and update workflow agents",usage:{claude:"p. sync",terminal:"prjct sync [--package=<name>] [--full]"},implemented:!0,hasTemplate:!0,requiresProject:!0,requiresLlm:!0,features:["Incremental sync: only re-analyzes changed files (default)","Force full sync: --full bypasses incremental cache","Monorepo support: --package=<name> for single package sync","Nested PRJCT.md inheritance","Per-package CLAUDE.md generation"]},{name:"regen",group:"core",routing:{group:"analysis",method:"regenVault"},description:"Full rebuild of the Obsidian vault for the current project",usage:{claude:"p. regen",terminal:"prjct regen [--md]"},implemented:!0,hasTemplate:!1,requiresProject:!0,requiresLlm:!1,features:["Nukes `_generated/` and rebuilds from SQLite + CHANGELOG","Use after upgrading prjct-cli to migrate an old vault layout","Idempotent \u2014 same output if nothing changed"]},{name:"eval",group:"optional",routing:{group:"eval",method:"eval"},optionSchema:{booleans:["publish","dryRun","json"],strings:["baseline","candidate","source","target","file"]},description:"Run product evals, compare versions, and publish actionable results",usage:{claude:"p. eval run [--candidate <version>] [--publish]",terminal:"prjct eval <run|compare|report|publish> [--baseline <version>] [--candidate <version>] [--target cloud] [--dry-run]"},params:"[run|compare|report|publish]",implemented:!0,hasTemplate:!1,requiresProject:!1,requiresLlm:!1,features:["Deterministic local eval runs stored under PRJCT_CLI_HOME/evals","Version comparisons with regression/improvement actionables","Cloud publication for shared benchmark history with server-side ownership and subscription checks"]},{name:"status",group:"core",routing:{group:"primitives",method:"status"},optionSchema:{},description:"Inline status change on the active task (Linear-style escape hatch)",usage:{claude:"p. status <value>",terminal:"prjct status <value>"},params:"[value]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["No args \u2192 prints active task + current status","Workflows are the primary status-change mechanism; this is the escape"]},{name:"tag",group:"core",routing:{group:"primitives",method:"tag"},optionSchema:{},description:"Attach k:v tags to the active task (type:bug, domain:frontend, \u2026)",usage:{claude:"p. tag type:bug",terminal:"prjct tag type:bug domain:auth"},params:"<pairs...>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Claude decides what to tag \u2014 no heuristic classifier","type:<feature|bug|improvement|chore> promotes to tasks.type"]},{name:"remember",group:"core",routing:{group:"primitives",method:"remember"},optionSchema:{strings:["tags"]},description:"Capture a project memory entry (fact, decision, learning, gotcha, \u2026)",usage:{claude:'p. remember learning "message"',terminal:'prjct remember learning "message" --tags domain:auth'},params:'<type> "<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Types: fact, decision, learning, gotcha, pattern, anti-pattern, shipped, inbox, todo, idea, insight, question, source, person \u2014 plus user-defined","Grows the project memory consumable via `prjct context memory`"]},{name:"forget",group:"core",routing:{group:"primitives",method:"forget"},optionSchema:{},description:"Delete a project memory entry by id (the delete half of `remember`)",usage:{claude:"p. forget mem_1234",terminal:"prjct forget mem_1234 [--md]"},params:"<id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Accepts `mem_1234`, `mem-1234`, or a bare `1234`","Hard-deletes the source event + drops the FTS mirror and any embedding \u2014 cannot resurface lexically or semantically","Regenerates the vault so the entry stops surfacing in `.prjct/wiki/_generated/`"]},{name:"capture",group:"core",routing:{group:"capture",method:"capture"},optionSchema:{strings:["tags"],booleans:["force"]},description:"GTD-style universal inbox \u2014 dump anything to project memory with zero ceremony",usage:{claude:'p. capture "<anything>"',terminal:'prjct capture "call Ana re pricing" --tags domain:sales'},params:'"<content>" [--tags k:v,...]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes memory type=inbox; Claude retypes later via a clarify workflow","No task id, no branch, no worktree \u2014 just persists",'Bare `prjct "<text>"` auto-routes to `capture`']},{name:"seed",group:"core",routing:{group:"seed",method:"seed"},routingMode:"bin-only",optionSchema:{},description:"Manage declarative packs (persona, memory types, workflow slots, hook signals)",usage:{claude:"p. seed list",terminal:"prjct seed add pm,daily"},params:"[add|remove|list|suggest] [pack,pack,...]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Packs declare signals only \u2014 no bash is written","Add or remove multi-persona contexts per project","Auto-detect suggestion from project stack"]},{name:"mcp",group:"core",routing:{group:"mcp",method:"mcp"},routingMode:"bin-only",optionSchema:{},description:"Toggle MCP servers per-project \u2014 interactive multi-select in your terminal, list/deny/allow for scripts",usage:{claude:"p. mcp list",terminal:"prjct mcp"},params:"[list|status|deny|allow] [serverName]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Interactive multi-select with live tool-cost delta (default UX in TTY)","Project-local \u2014 writes only to .claude/settings.local.json","Knows the well-known cloud MCPs from claude.ai (PostHog, Atlassian, etc.)","Headless list/deny/allow for LLM agents and scripts (--md flag)"]},{name:"install",group:"core",routing:{group:"install",method:"install"},routingMode:"bin-only",optionSchema:{},description:"Install universal agent surfaces, Claude hooks, and Codex config",usage:{claude:"p. install",terminal:"prjct install"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Inside a prjct project, refreshes AGENTS.md as the portable baseline","Writes Claude passive hooks: SessionStart, UserPromptSubmit, \u2026","Repairs detected Codex config.toml with prjct MCP and TUI status_line","Idempotent; existing non-prjct hooks stay intact","Audit agent support with `prjct agents doctor`"]},{name:"help",group:"core",routingMode:"bin-only",description:"Contextual help and guidance",usage:{claude:"p. help [topic]",terminal:"prjct help [topic]"},params:"[topic]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"analysis-save-llm",group:"optional",routing:{group:"analysis",method:"saveLlmAnalysis"},description:"Persist analysis notes produced by an LLM run",usage:{claude:null,terminal:"prjct analysis-save-llm <file|text|json>"},params:"<file|text|json>",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0},{name:"analyze",group:"optional",routing:{group:"analysis",method:"analyze"},description:"Analyze repository and sync tasks",usage:{claude:"p. analyze",terminal:"prjct analyze"},implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0},{name:"lean",group:"optional",routing:{group:"lean",method:"lean"},optionSchema:{},description:"Anti-over-engineering: set intensity, review/audit/debt (read-only)",usage:{claude:"p. lean [review|audit|debt|off|lite|full|ultra]",terminal:"prjct lean [sub]"},params:"[review|audit|debt|off|lite|full|ultra]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show active intensity mode + a one-screen summary","review/audit/debt are advisory \u2014 no gate, no source writes","off|lite|full|ultra sets the intensity (mirrors ponytail modes)"]},{name:"tdd",group:"optional",routing:{group:"tdd",method:"tdd"},optionSchema:{},description:"Test-Driven Development: set intensity, run the test command (check)",usage:{claude:"p. tdd [check|off|assist|strict]",terminal:"prjct tdd [sub]"},params:"[check|off|assist|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the auto-detected test command","off|assist|strict sets the intensity (opt-in, like lean)","check runs the detected test command now (red/green) \u2014 the real gate"]},{name:"sdd",group:"optional",routing:{group:"sdd",method:"sdd"},optionSchema:{},description:"Spec-Driven Development: gate the spec pipeline (off/advisory/strict)",usage:{claude:"p. sdd [off|advisory|strict]",terminal:"prjct sdd [sub]"},params:"[off|advisory|strict]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["No arg \u2192 show mode + the active task spec station (pipeline checklist)","off|advisory|strict sets the intensity (opt-in, like lean)","strict: every task needs a reviewed spec; ship blocks unspecced work"]},{name:"notify",group:"optional",routing:{group:"notify",method:"notify"},optionSchema:{},description:"Desktop notifications (default on): ping on Claude-waiting + subagent-finished",usage:{claude:"p. notify [on|off]",terminal:"prjct notify [on|off]"},params:"[on|off]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Default ON \u2014 pings when Claude is waiting or a subagent finishes","No arg \u2192 show mode + what fires","off silences OS notifications (per-prompt work-state block stays)"]},{name:"agents",group:"optional",routing:{group:"agents",method:"agents"},optionSchema:{booleans:["fix"]},description:"Show the concrete compatibility matrix for AI coding agents",usage:{claude:"p. agents [doctor|doctor --fix]",terminal:"prjct agents [doctor|doctor --fix]"},params:"[doctor|status|list] [--fix]",implemented:!0,hasTemplate:!1,requiresProject:!1,isOptional:!0,features:["Derives support levels from the runtime registry","Reports AGENTS.md, MCP, skills, hooks, ACP, and project-rule support","doctor --fix refreshes repo-local agent surfaces when run inside a project",'Use this to audit claims like "works with Codex/Gemini/OpenCode/Cursor/Windsurf"']},{name:"value",group:"optional",routing:{group:"product",method:"value"},optionSchema:{},description:"Show concrete proof that prjct is paying for itself",usage:{claude:"p. value",terminal:"prjct value [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Scores project continuity from real SQLite data","Counts durable memory, preventive guardrails, shipped work, sync metrics, and agent coverage","Designed as the paid-tier proof screen for humans and agents"]},{name:"memory-doctor",group:"optional",routing:{group:"product",method:"memoryDoctor"},optionSchema:{},description:"Audit memory quality before it becomes noisy context",usage:{claude:"p. memory-doctor",terminal:"prjct memory-doctor [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Finds duplicate groups, stale inbox entries, low-signal memories, and missing types","Read-only by default; recommends exact cleanup actions","Protects recall quality across Claude, Codex, Gemini, OpenCode, and future agents"]},{name:"report",group:"optional",routing:{group:"product",method:"report"},optionSchema:{numbers:["days"]},description:"Generate a human weekly report from shipped work and project memory",usage:{claude:"p. report [7]",terminal:"prjct report [days] [--md]"},params:"[days]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Summarizes shipped features, completed tasks, active work, and carry-forward lessons","Uses real project state instead of a marketing changelog","Useful for founders, teams, and paid Cloud status emails"]},{name:"handoff",group:"optional",routing:{group:"product",method:"handoff"},optionSchema:{},description:"Create an agent handoff prompt with durable project context",usage:{claude:"p. handoff codex",terminal:"prjct handoff codex [--md]"},params:"[agent]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Gives the next agent the active task, required prjct checks, and high-value memories","Works across Codex, Claude, Gemini, Cursor, OpenCode, Qwen, Kimi, and unknown future agents","Makes multi-agent continuity concrete instead of relying on private model memory"]},{name:"guardrails",group:"optional",routing:{group:"product",method:"guardrails"},optionSchema:{},description:"Show risk guardrails for the current changeset",usage:{claude:"p. guardrails",terminal:"prjct guardrails [--md]"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Checks changed files against preventive memory","Falls back to general project traps when no file-specific hit exists","Advisory only; no gate, no mutation"]},{name:"cloud",group:"optional",routing:{group:"cloud",method:"cloud"},optionSchema:{},description:"Cloud sync (paid): link/unlink a project, sync/pull, pause/resume, status",usage:{claude:"p. cloud [link|unlink|sync|pull|pause|resume|status]",terminal:"prjct cloud [sub]"},params:"[link|unlink|sync|pull|pause|resume|status]",implemented:!0,hasTemplate:!1,requiresProject:!0,isOptional:!0,features:["Local-first: nothing leaves the machine until `prjct cloud link`","Token API only \u2014 no backend engine details, no client-side paywall","Auto-syncs on `prjct ship` and at session end once linked"]},{name:"workflow",group:"optional",routing:{group:"workflow",method:"workflow"},optionSchema:{},description:"Configure workflow hooks via natural language",usage:{claude:'p. workflow ["config"]',terminal:'prjct workflow ["config"]'},params:'["natural language config"]',implemented:!0,hasTemplate:!0,requiresProject:!0,isOptional:!0,requiresLlm:!0,features:["Natural language configuration","Before/after hooks for task, done, ship, sync","Permanent, session, or one-time preferences"]},{name:"start",group:"setup",routing:{group:"setup",method:"start"},routingMode:"bin-only",description:"First-time setup (install commands to editors)",usage:{claude:null,terminal:"prjct start"},implemented:!0,hasTemplate:!1,requiresProject:!1},{name:"setup",group:"setup",routing:{group:"setup",method:"setup"},routingMode:"bin-only",description:"Reconfigure editor installations and user-owned defaults",usage:{claude:"p. setup",terminal:"prjct setup [--vault-root <path>]"},params:"[--force] [--vault-root <path>] [--non-interactive]",implemented:!0,hasTemplate:!0,requiresProject:!1},{name:"login",group:"setup",routing:{group:"setup",method:"login"},description:"Authenticate with prjct cloud (opens browser)",usage:{claude:null,terminal:"prjct login"},params:"",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"logout",group:"setup",routing:{group:"setup",method:"logout"},description:"Sign out from prjct cloud",usage:{claude:null,terminal:"prjct logout"},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"auth",group:"setup",routing:{group:"setup",method:"auth"},description:"Manage cloud authentication",usage:{claude:"p. auth [action]",terminal:"prjct auth [action]"},params:"[logout|status]",implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"},{name:"context",group:"setup",routing:{group:"context",method:"context"},routingMode:"bin-only",optionSchema:{},description:"Smart context filtering tools for AI agents",usage:{claude:null,terminal:"prjct context <tool> [args]"},params:"<tool> [args]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["files - Find relevant files for a task","signatures - Extract code structure (~90% compression)","imports - Analyze dependency graphs","recent - Find hot files from git history","summary - Intelligent file summarization"]},{name:"search",group:"core",routing:{group:"context",method:"search"},optionSchema:{},description:"Search project memory (decisions, learnings, gotchas, ships\u2026) \u2014 BM25 + semantic + recall",usage:{claude:'p. search "<query>"',terminal:'prjct search "<query>" [--md]'},params:"<query>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Blended retrieval: FTS5 BM25 + opt-in semantic + recency recall","Reranks by proven usefulness, expands one hop of the memory graph","`prjct search mem_1234` resolves a specific entry by id"]},{name:"update",group:"setup",routing:{group:"update",method:"update"},routingMode:"bin-only",description:"Update prjct system-wide: package + migrations + daemon restart",usage:{claude:null,terminal:"prjct update [--dry-run]"},params:"[--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Phase 1: npm update (migrates homebrew \u2192 npm if needed)","Phase 2: All projects \u2014 migrate, sweep, reinstall commands","Phase 3: Daemon stop + restart with new code","--dry-run to preview without changes"]},{name:"uninstall",group:"setup",routing:{group:"uninstall",method:"uninstall"},routingMode:"bin-only",description:"Complete system removal of prjct",usage:{claude:null,terminal:"prjct uninstall"},params:"[--force] [--backup] [--dry-run]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Removes ~/.prjct-cli/ data","Cleans CLAUDE.md prjct section","Uninstalls Homebrew/npm packages","Backup option before deletion"]},{name:"team",group:"core",routing:{group:"team",method:"team"},optionSchema:{booleans:["required","enforce"],strings:["minVersion"]},description:"Enroll this repo in prjct team mode \u2014 commits .prjct/team.json + .claude/CLAUDE.md so teammates pick up shared expectations",usage:{claude:"p. team",terminal:"prjct team [--required] [--min-version <semver>]"},params:"[--required] [--min-version <semver>]",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Writes .prjct/team.json with required/minVersion config","Adds prjct context block to .claude/CLAUDE.md (per-project)","Stages both files for the next commit (does NOT commit)","Teammates clone repo + install prjct \u2192 ready to go"]},{name:"embeddings",group:"core",routing:{group:"embeddings",method:"embeddings"},optionSchema:{strings:["key","model","baseUrl","authHeader","authScheme","headers","query"]},description:"Configure the GLOBAL semantic-embeddings provider (BYOT) \u2014 one API key, stored securely, used by every project.",usage:{claude:"p. embeddings status",terminal:'prjct embeddings <set|status|test|clear> [--key <K>] [--model <M>] [--base-url <U>] [--auth-header <H>] [--auth-scheme <S|none>] [--headers "k=v,..."] [--query <qs>]'},params:"[set|status|test|clear]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["BYOT: bring your own embedding API key \u2014 ANY OpenAI-compatible provider","Zero-config: paste just --key, the base URL is auto-detected from its prefix","OpenAI, OpenRouter, Ollama, Together, Mistral, Voyage, Jina, LM Studio\u2026",'Non-Bearer providers too: --auth-header api-key --auth-scheme none --query "api-version=..." (Azure OpenAI)',"Key stored in the macOS Keychain (else a 0600 file), never in config","Global \u2014 applies to all projects; per-project config still overrides","Without a key, recall uses the always-on local subword embedder","Validate with: prjct embeddings test"]},{name:"guard",group:"core",routing:{group:"guard",method:"guard"},optionSchema:{numbers:["limit"]},description:"Surface preventive memory (gotchas, anti-patterns, recurring-bugs) recorded against a file BEFORE you edit it \u2014 anticipation, provider-agnostic.",usage:{claude:"p. guard <file>",terminal:"prjct guard <file>"},params:"<file>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Pillar 3 (anticipation): see the trap before you step in it","Pull, not push \u2014 also exposed as the prjct_guard MCP tool for Claude + Codex","Strict: only gotchas / anti-patterns / recurring-bugs \u2014 never plain decisions, so no noise",'Quiet by design: "clear to edit" when nothing preventive matches',"Matches absolute or repo-relative paths by exact / suffix / basename"]},{name:"config",group:"core",routing:{group:"config",method:"config"},optionSchema:{},description:"Read/write global prjct config \u2014 auto-update opt-in, suggestions toggle, etc.",usage:{claude:"p. config list",terminal:"prjct config <list|get|set|unset> [key] [value]"},params:"<list|get|set|unset> [key] [value]",implemented:!0,hasTemplate:!1,requiresProject:!1,features:["Stored at ~/.prjct-cli/config/global.json","Opt into silent auto-update: prjct config set auto-update on","Toggle proactive suggestions: prjct config set suggestions off","Booleans accept on/off/true/false; numbers parsed automatically"]},{name:"spec",group:"core",routing:{group:"spec",method:"draft"},routingMode:"cold-only",description:"Draft a spec \u2014 Goal/Acceptance/Scope/Risks. The SDD entry point: spec \u2192 audit \u2192 task \u2192 ship.",usage:{claude:'p. spec "<title>"',terminal:'prjct spec "<title>" [--goal "..."] [--tags k:v,...]'},params:'"<title>" [--goal] [--tags]',implemented:!0,hasTemplate:!1,requiresProject:!0,features:['Drafting: `prjct spec "<title>"` IS the create action \u2014 there is no `draft` subverb (aliases `draft`/`new`/`create` are tolerated and stripped)',"Persists in `specs` SQLite table + memory event stream","Renders to <vault-root>/<slug>/_generated/specs/<slug>.md","Sub-verbs: list, show, update, set-status, record-review, link-task, ship, audit, inventory"]},{name:"audit-spec",group:"core",routing:{group:"spec",method:"audit"},routingMode:"cold-only",description:"Emit subagent dispatch for parallel strategic/architecture/design review of a spec",usage:{claude:"p. audit-spec <id>",terminal:"prjct audit-spec <id>"},params:"<spec-id>",implemented:!0,hasTemplate:!1,requiresProject:!0,features:["Emits dispatch prompt \u2014 Claude runs three Agent calls in parallel","Each reviewer writes back via `prjct spec record-review`","All three pass \u2192 spec auto-promotes draft \u2192 reviewed"]},...[["daemon","Run the prjct daemon in the foreground"],["stop","Stop the running prjct daemon"],["restart","Restart the prjct daemon"],["upgrade","Alias of `prjct update`",{group:"update",method:"update"}],["hook","Run a Claude Code hook event (internal; called by the hook scripts)"],["hooks","Inspect or reinstall the Claude Code hooks"],["claude","Claude Code integration management (install/uninstall)"],["crew","Run a crew (multi-subagent) workflow"],["doctor","Diagnose the local prjct installation"],["watch","Watch project files and react to changes"],["version","Print the installed prjct version + provider status"],["prefs","Inspect or set workflow preferences"],["retro","Summarize what shipped over a time window"],["health","Codebase health snapshot"],["skill-adherence","Report how well sessions follow the prjct skill"],["review-risk","Risk-ranked review hints for the working tree"],["context-save","Save the current working context for later restore"],["context-restore","Restore a previously saved working context"]].map(([n,e,t])=>({name:n,group:"setup",description:e,routing:t,usage:{claude:null,terminal:`prjct ${n}`},implemented:!0,hasTemplate:!1,requiresProject:!1,routingMode:"bin-only"}))],L1={"-h":"help","--help":"help","-v":"version","--version":"version"},qP=new Set([...Vn.filter(n=>n.routingMode==="bin-only").map(n=>n.name),...Object.entries(L1).filter(([,n])=>Vn.some(e=>e.name===n&&e.routingMode==="bin-only")).map(([n])=>n)])});var VP={};j(VP,{BIN_COMMANDS_SET:()=>H1,REGISTERED_VERBS_SET:()=>F1});var F1,H1,JP=h(()=>{"use strict";qu();F1=new Set(Vn.filter(n=>n.routing).map(n=>n.name)),H1=qP});var XP={};j(XP,{REMOVED_VERBS:()=>va,isRemovedVerb:()=>Sa,migrationMessage:()=>Yh});function Sa(n){return Object.hasOwn(va,n)}function Yh(n){let e=va[n];return e?`'prjct ${n}' was removed in v2.
|
|
1435
1435
|
\u2192 Use: ${e.replacement}
|
|
1436
|
-
${e.note}`:null}var va,Vu=h(()=>{"use strict";va={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};a(Sa,"isRemovedVerb");a(Yh,"migrationMessage")});var YP={};j(YP,{sessionTracker:()=>Ea});var zP,KP,Qh,Ea,Zh=h(()=>{"use strict";ic();Z();fi();ce();zP=50,KP=200,Qh=class{static{a(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return no(e.lastActivity,t)}async touch(e){let t=await this.read(e),r=R();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=r,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:r,lastActivity:r,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,r){let s=await this.read(e);if(!s.current)return;let o=R();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:r}),s.current.commands.length>zP&&(s.current.commands=s.current.commands.slice(-zP)),await this.write(e,s)}async trackFile(e,t,r){let s=await this.read(e);if(!s.current)return;let o=R();s.current.lastActivity=o,s.current.files.push({path:t,operation:r,timestamp:o}),s.current.files.length>KP&&(s.current.files=s.current.files.slice(-KP)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let r=t.current,s=Date.now(),o=new Date(r.createdAt).getTime(),i=new Date(r.lastActivity).getTime(),c=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-c),d=r.commands.map(f=>f.command),p=new Set(r.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(r.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:r.id,duration:hi(s-o),idleSince:r.lastActivity,idleMs:c,expiresIn:hi(u),commandCount:r.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Ea=new Qh});var ZP={};j(ZP,{default:()=>Ta,performanceTracker:()=>QP});var G1,ey,QP,Ta,ty=h(()=>{"use strict";Z();G1=BigInt(300*1e9),ey=class{static{a(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let r=process.hrtime.bigint();return this.marks.delete(e),Number(r-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,r]of this.marks)e-r>G1&&this.marks.delete(t)}recordSample(e,t,r,s,o){let i=new Date().toISOString();S.run(e,"INSERT INTO perf_samples (metric, value, unit, data, timestamp) VALUES (?, ?, ?, ?, ?)",t,s??null,o??null,JSON.stringify(r),i)}recordTiming(e,t,r,s){let o=Math.round(r*100)/100;this.recordSample(e,t,{metric:t,value:o,unit:"ms",context:s},o,"ms")}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let r=this.snapshotMemory(),s=[{metric:"heap_used",value:r.heapUsed,unit:"bytes"},{metric:"heap_total",value:r.heapTotal,unit:"bytes"},{metric:"rss",value:r.rss,unit:"bytes"},{metric:"external_memory",value:r.external,unit:"bytes"}];for(let o of s)this.recordSample(e,o.metric,{metric:o.metric,value:o.value,unit:o.unit,context:t},o.value,o.unit);return r}recordContextCorrectness(e,t){this.recordSample(e,"context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){this.recordSample(e,"subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let r=t.toISOString(),s=[];try{let i=S.query(e,"SELECT data, timestamp FROM perf_samples WHERE timestamp >= ? ORDER BY id DESC",r);for(let c of i){let l=JSON.parse(c.data);s.push({...l,timestamp:c.timestamp})}}catch{}let o=S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",r);for(let i of o){let c=JSON.parse(i.data);s.push({...c,timestamp:i.timestamp})}return s}getReport(e,t=7){let r=new Date;r.setDate(r.getDate()-t),r.setHours(0,0,0,0);let s=this.getMetrics(e,r),o={period:`${t}d`},i=s.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(f=>f.value);o.startup={avg:Math.round(m.reduce((f,y)=>f+y,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let c=s.filter(m=>"metric"in m&&m.metric==="heap_used"),l=s.filter(m=>"metric"in m&&m.metric==="rss");if(c.length>0){let m=a(v=>Math.round(v/1048576*10)/10,"toMB"),f=c.map(v=>v.value),y=l.map(v=>v.value);o.memory={avgHeapMB:m(f.reduce((v,k)=>v+k,0)/f.length),peakHeapMB:m(Math.max(...f)),avgRssMB:y.length>0?m(y.reduce((v,k)=>v+k,0)/y.length):0}}let u=s.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(f=>f.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=s.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(f=>f.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=s.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let f of p){let y=f.context?.command||"unknown";m[y]||(m[y]=[]),m[y].push(f.value)}o.commandDurations={};for(let[f,y]of Object.entries(m))o.commandDurations[f]={avg:Math.round(y.reduce((v,k)=>v+k,0)/y.length),min:Math.min(...y),max:Math.max(...y),count:y.length,unit:"ms"}}return o}},QP=new ey,Ta=QP});function eA(n){let e=n.trim();for(let{type:t,patterns:r}of W1){let s=e.match(r);if(s){let o=s[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function Ju(n){let e=n.trim();if(e.startsWith('"')){let r=e.indexOf('"',1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}if(e.startsWith("'")){let r=e.indexOf("'",1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function tA(n,e){let t=e.toLowerCase();return n.filter(r=>r.action.toLowerCase().includes(t)||(r.description?.toLowerCase().includes(t)??!1)||r.command.toLowerCase().includes(t)||String(r.id)===t)}var W1,ny=h(()=>{"use strict";W1=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];a(eA,"detectIntent");a(Ju,"parseAction");a(tA,"searchRules")});var Zr,ry=h(()=>{"use strict";Zr={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function Xu(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var sy,nA,oy=h(()=>{"use strict";sy=["task","done","ship","sync"],nA=["before","after"];a(Xu,"newRuleDefaults")});async function sA(n,e,t){let[r,s]=Ju(n);if(!r||!s)return L('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=s.split(/\s+/),i=o[0]?.toLowerCase(),c=o[1]?.toLowerCase();if(!i||!nA.includes(i))return L('Position must be "before" or "after"',t);let l=hu(e,c,t);if(!l.ok)return l.result;let u=ue.addRule(e,{type:"hook",command:l.value.name,position:i,action:r,timeoutMs:Zr.HOOK_DEFAULT_MS,...Xu()});return t.md?console.log(_(Me("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${r}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Kt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${r}`),{success:!0,ruleId:u}}async function oA(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=hu(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),[i]=Ju(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let c=ue.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Zr.GATE_DEFAULT_MS,...Xu()});return t.md?console.log(_(Me("Gate Added",`#${c} [gate] before ${s.value.name} \u2192 \`${i}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):Kt(`gate #${c} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:c}}async function iA(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=hu(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let c=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=Ju(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ue.addRule(e,{type:"instruction",command:s.value.name,position:c,action:u,timeoutMs:Zr.INSTRUCTION_MS,...Xu()});return t.md?console.log(_(Me("Instruction Added",`#${d} [instruction] ${c} ${s.value.name} \u2192 \`${u}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Kt(`instruction #${d} added: ${c} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function aA(n,e,t){let r=parseInt(n.trim(),10);return Number.isNaN(r)?L("Usage: prjct workflow rm <rule-id>",t):ue.removeRule(e,r)?(t.md?console.log(_(Me("Rule Removed",`Removed rule #${r}`))):Kt(`removed rule #${r}`),{success:!0}):L(`Rule #${r} not found`,t)}async function cA(n,e){let t=ue.resetRules(n),r=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(_(Me("Rules Reset",r))):Kt(`reset: ${r.toLowerCase()}`),{success:!0,count:t}}async function lA(n,e,t){let r=n.trim(),s=parseInt(r,10);if(!Number.isNaN(s)){let d=ue.getRuleById(e,s);if(!d)return L(`Rule #${s} not found`,t);if(!d.enabled){let p=`Rule #${s} is already disabled`;return t.md?console.log(`> ${p}`):Tn(p),{success:!0,message:p}}return ue.updateRule(e,s,{enabled:!1}),t.md?console.log(_(Me("Rule Disabled",`#${s} [${d.type}] ${d.action}`),Ze([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Kt(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=ue.getAllRules(e),i=tA(o,r);if(i.length===0)return L(`No rules matching "${r}"`,t);if(i.length===1){let d=i[0];return ue.updateRule(e,d.id,{enabled:!1}),t.md?console.log(_(Me("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Kt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let c=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=c.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(_(W("Multiple matches",`${i.length} rules match "${r}"`),De(d),Ze(c.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{Tn(`${i.length} rules match "${r}" \u2014 specify an ID:`);for(let d of c)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var uA=h(()=>{"use strict";fr();fe();Ke();ry();Lt();ny();oy();a(sA,"workflowAdd");a(oA,"workflowGate");a(iA,"workflowInstruction");a(aA,"workflowRm");a(cA,"workflowReset");a(lA,"workflowDisable")});function dA(n,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),r=e.filter(m=>m.type==="instruction"&&m.position==="before"),s=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),c=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=a((m,f,y)=>{let v=f.map(T=>` ${T.enabled?y:"o"} #${T.id} ${T.action}`),k=[m,...v],P=Math.max(...k.map(T=>T.length))+2;u.push(`+${"-".repeat(P)}+`);for(let T of k)u.push(`| ${T.padEnd(P-1)}|`);u.push(`+${"-".repeat(P)}+`)},"drawBox"),p=a(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),r.length>0&&(d("INSTRUCTIONS (before)",r,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),c.length>0&&(p(u),d("HOOKS (after)",c,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
|
|
1436
|
+
${e.note}`:null}var va,Vu=h(()=>{"use strict";va={done:{replacement:"prjct status done",note:"Mark the active task complete via the v2 status primitive."},pause:{replacement:"prjct status paused",note:"Pause the active task via the v2 status primitive."},resume:{replacement:"prjct status active",note:"Resume the active task via the v2 status primitive."},reopen:{replacement:"prjct status active",note:"Reopen a completed task by setting status back to active."},next:{replacement:"prjct status",note:"Queue view is not part of v2. Use status for the active task."},dash:{replacement:"prjct status",note:"The dash command was removed. Use status, or open the web dashboard."},bug:{replacement:'prjct capture "<description>" --tags bug',note:"Bugs are captured via the GTD inbox with a tag in v2."},idea:{replacement:'prjct capture "<description>" --tags idea',note:"Ideas are captured via the GTD inbox with a tag in v2."},linear:{replacement:"MCP server (see `prjct seed list`)",note:"Native Linear CLI was removed; integration is now via MCP."},jira:{replacement:"MCP server (see `prjct seed list`)",note:"Native Jira CLI was removed; integration is now via MCP."},tokens:{replacement:"prjct status",note:"Token tracking was removed in v2."},velocity:{replacement:"prjct status",note:"Velocity reports were removed in v2."},plan:{replacement:"prjct init",note:"Planning is now part of init/task flow."}};a(Sa,"isRemovedVerb");a(Yh,"migrationMessage")});var YP={};j(YP,{sessionTracker:()=>Ea});var zP,KP,Qh,Ea,Zh=h(()=>{"use strict";ic();Z();fi();ce();zP=50,KP=200,Qh=class{static{a(this,"SessionTracker")}async read(e){try{return $.getDoc(e,"session-tracker")??this.getDefault()}catch{return this.getDefault()}}async write(e,t){$.setDoc(e,"session-tracker",t)}getDefault(){return{current:null,config:{idleTimeoutMs:18e5}}}isExpired(e,t){return no(e.lastActivity,t)}async touch(e){let t=await this.read(e),r=R();if(t.current&&!this.isExpired(t.current,t.config.idleTimeoutMs))return t.current.lastActivity=r,await this.write(e,t),t.current;let s={id:crypto.randomUUID(),projectId:e,status:"active",createdAt:r,lastActivity:r,commands:[],files:[]};return t.current=s,await this.write(e,t),s}async trackCommand(e,t,r){let s=await this.read(e);if(!s.current)return;let o=R();s.current.lastActivity=o,s.current.commands.push({command:t,timestamp:o,durationMs:r}),s.current.commands.length>zP&&(s.current.commands=s.current.commands.slice(-zP)),await this.write(e,s)}async trackFile(e,t,r){let s=await this.read(e);if(!s.current)return;let o=R();s.current.lastActivity=o,s.current.files.push({path:t,operation:r,timestamp:o}),s.current.files.length>KP&&(s.current.files=s.current.files.slice(-KP)),await this.write(e,s)}async getInfo(e){let t=await this.read(e);if(!t.current||this.isExpired(t.current,t.config.idleTimeoutMs))return{active:!1,id:null,duration:null,idleSince:null,idleMs:0,expiresIn:null,commandCount:0,commands:[],filesRead:0,filesWritten:0};let r=t.current,s=Date.now(),o=new Date(r.createdAt).getTime(),i=new Date(r.lastActivity).getTime(),c=s-i,l=t.config.idleTimeoutMs,u=Math.max(0,l-c),d=r.commands.map(f=>f.command),p=new Set(r.files.filter(f=>f.operation==="read").map(f=>f.path)).size,m=new Set(r.files.filter(f=>f.operation==="write").map(f=>f.path)).size;return{active:!0,id:r.id,duration:hi(s-o),idleSince:r.lastActivity,idleMs:c,expiresIn:hi(u),commandCount:r.commands.length,commands:d,filesRead:p,filesWritten:m}}async expire(e){let t=await this.read(e);t.current&&(t.current.status="expired",t.current=null,await this.write(e,t))}async expireIfStale(e){let t=await this.read(e);return t.current&&this.isExpired(t.current,t.config.idleTimeoutMs)?(t.current=null,await this.write(e,t),!0):!1}},Ea=new Qh});var ZP={};j(ZP,{default:()=>Ta,performanceTracker:()=>QP});var G1,ey,QP,Ta,ty=h(()=>{"use strict";Z();G1=BigInt(300*1e9),ey=class{static{a(this,"PerformanceTracker")}marks=new Map;markStart(e){this.pruneStaleMarks(),this.marks.set(e,process.hrtime.bigint())}markEnd(e){let t=this.marks.get(e);if(t===void 0)return null;let r=process.hrtime.bigint();return this.marks.delete(e),Number(r-t)/1e6}pruneStaleMarks(){if(this.marks.size<10)return;let e=process.hrtime.bigint();for(let[t,r]of this.marks)e-r>G1&&this.marks.delete(t)}recordSample(e,t,r,s,o){let i=new Date().toISOString();S.run(e,"INSERT INTO perf_samples (metric, value, unit, data, timestamp) VALUES (?, ?, ?, ?, ?)",t,s??null,o??null,JSON.stringify(r),i)}recordTiming(e,t,r,s){let o=Math.round(r*100)/100;this.recordSample(e,t,{metric:t,value:o,unit:"ms",context:s},o,"ms")}snapshotMemory(){let e=process.memoryUsage();return{heapUsed:e.heapUsed,heapTotal:e.heapTotal,rss:e.rss,external:e.external}}recordMemory(e,t){let r=this.snapshotMemory(),s=[{metric:"heap_used",value:r.heapUsed,unit:"bytes"},{metric:"heap_total",value:r.heapTotal,unit:"bytes"},{metric:"rss",value:r.rss,unit:"bytes"},{metric:"external_memory",value:r.external,unit:"bytes"}];for(let o of s)this.recordSample(e,o.metric,{metric:o.metric,value:o.value,unit:o.unit,context:t},o.value,o.unit);return r}recordContextCorrectness(e,t){this.recordSample(e,"context_correctness",{metric:"context_correctness",...t})}recordSubtaskHandoff(e,t){this.recordSample(e,"subtask_handoff",{metric:"subtask_handoff",...t})}getMetrics(e,t){t||(t=new Date,t.setDate(t.getDate()-7));let r=t.toISOString(),s=[];try{let i=S.query(e,"SELECT data, timestamp FROM perf_samples WHERE timestamp >= ? ORDER BY id DESC",r);for(let c of i){let l=JSON.parse(c.data);s.push({...l,timestamp:c.timestamp})}}catch{}let o=S.query(e,"SELECT data, timestamp FROM events WHERE type LIKE ? AND timestamp >= ? ORDER BY id DESC","perf.%",r);for(let i of o){let c=JSON.parse(i.data);s.push({...c,timestamp:i.timestamp})}return s}getReport(e,t=7){let r=new Date;r.setDate(r.getDate()-t),r.setHours(0,0,0,0);let s=this.getMetrics(e,r),o={period:`${t}d`},i=s.filter(m=>"metric"in m&&m.metric==="startup_time");if(i.length>0){let m=i.map(f=>f.value);o.startup={avg:Math.round(m.reduce((f,y)=>f+y,0)/m.length),min:Math.min(...m),max:Math.max(...m),count:m.length,unit:"ms"}}let c=s.filter(m=>"metric"in m&&m.metric==="heap_used"),l=s.filter(m=>"metric"in m&&m.metric==="rss");if(c.length>0){let m=a(v=>Math.round(v/1048576*10)/10,"toMB"),f=c.map(v=>v.value),y=l.map(v=>v.value);o.memory={avgHeapMB:m(f.reduce((v,k)=>v+k,0)/f.length),peakHeapMB:m(Math.max(...f)),avgRssMB:y.length>0?m(y.reduce((v,k)=>v+k,0)/y.length):0}}let u=s.filter(m=>"metric"in m&&m.metric==="context_correctness");if(u.length>0){let m=u.filter(f=>f.receivedSync).length;o.contextCorrectness={total:u.length,receivedSync:m,rate:Math.round(m/u.length*100)}}let d=s.filter(m=>"metric"in m&&m.metric==="subtask_handoff");if(d.length>0){let m=d.filter(f=>f.outputPopulated).length;o.subtaskHandoff={total:d.length,outputPopulated:m,rate:Math.round(m/d.length*100)}}let p=s.filter(m=>"metric"in m&&m.metric==="command_duration");if(p.length>0){let m={};for(let f of p){let y=f.context?.command||"unknown";m[y]||(m[y]=[]),m[y].push(f.value)}o.commandDurations={};for(let[f,y]of Object.entries(m))o.commandDurations[f]={avg:Math.round(y.reduce((v,k)=>v+k,0)/y.length),min:Math.min(...y),max:Math.max(...y),count:y.length,unit:"ms"}}return o}},QP=new ey,Ta=QP});function eA(n){let e=n.trim();for(let{type:t,patterns:r}of W1){let s=e.match(r);if(s){let o=s[0],i=e.slice(o.length).trim();return{type:t,args:i,confidence:"exact"}}}return{type:"view",args:e,confidence:"exact"}}function Ju(n){let e=n.trim();if(e.startsWith('"')){let r=e.indexOf('"',1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}if(e.startsWith("'")){let r=e.indexOf("'",1);return r===-1?[e.slice(1),""]:[e.slice(1,r),e.slice(r+1).trim()]}let t=e.match(/^(.+?)\s+(before|after)\s+/i);return t?[t[1].trim(),e.slice(t[1].length).trim()]:[e,""]}function tA(n,e){let t=e.toLowerCase();return n.filter(r=>r.action.toLowerCase().includes(t)||(r.description?.toLowerCase().includes(t)??!1)||r.command.toLowerCase().includes(t)||String(r.id)===t)}var W1,ny=h(()=>{"use strict";W1=[{type:"help",patterns:/^help\b/i},{type:"add",patterns:/^add\b/i},{type:"gate",patterns:/^gate\b/i},{type:"instruction",patterns:/^instruction\b/i},{type:"remove",patterns:/^rm\b/i},{type:"reset",patterns:/^reset\b/i},{type:"init",patterns:/^init\b/i},{type:"create",patterns:/^(?:create|new)\b/i},{type:"list",patterns:/^list\b/i},{type:"delete",patterns:/^delete\b/i},{type:"run",patterns:/^run\b/i},{type:"disable",patterns:/^disable\b/i},{type:"view",patterns:/^(?:show|view)\b/i}];a(eA,"detectIntent");a(Ju,"parseAction");a(tA,"searchRules")});var Zr,ry=h(()=>{"use strict";Zr={HOOK_DEFAULT_MS:6e4,GATE_DEFAULT_MS:6e4,GATE_QUICK_MS:5e3,STEP_LINT_MS:12e4,STEP_TEST_MS:3e5,INSTRUCTION_MS:0}});function Xu(){return{description:null,enabled:!0,sortOrder:0,createdAt:new Date().toISOString()}}var sy,nA,oy=h(()=>{"use strict";sy=["task","done","ship","sync"],nA=["before","after"];a(Xu,"newRuleDefaults")});async function sA(n,e,t){let[r,s]=Ju(n);if(!r||!s)return L('Usage: prjct workflow add "command" before|after <task|done|ship|sync>',t);let o=s.split(/\s+/),i=o[0]?.toLowerCase(),c=o[1]?.toLowerCase();if(!i||!nA.includes(i))return L('Position must be "before" or "after"',t);let l=hu(e,c,t);if(!l.ok)return l.result;let u=ue.addRule(e,{type:"hook",command:l.value.name,position:i,action:r,timeoutMs:Zr.HOOK_DEFAULT_MS,...Xu()});return t.md?console.log(_(Me("Rule Added",`#${u} [hook] ${i} ${l.value.name} \u2192 \`${r}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${u} --md`}]))):Kt(`rule #${u} added: [hook] ${i} ${l.value.name} \u2192 ${r}`),{success:!0,ruleId:u}}async function oA(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=hu(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),[i]=Ju(o);if(!i)return L('Usage: prjct workflow gate <command> "shell command"',t);let c=ue.addRule(e,{type:"gate",command:s.value.name,position:"before",action:i,timeoutMs:Zr.GATE_DEFAULT_MS,...Xu()});return t.md?console.log(_(Me("Gate Added",`#${c} [gate] before ${s.value.name} \u2192 \`${i}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this gate",command:`prjct workflow rm ${c} --md`}]))):Kt(`gate #${c} added: before ${s.value.name} \u2192 ${i}`),{success:!0,ruleId:c}}async function iA(n,e,t){let r=n.trim().split(/\s+/)[0]?.toLowerCase(),s=hu(e,r,t);if(!s.ok)return s.result;let o=n.slice(n.indexOf(s.value.name)+s.value.name.length).trim(),i=o.match(/^(before|after)\s+/i);if(!i)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let c=i[1].toLowerCase(),l=o.slice(i[0].length).trim(),[u]=Ju(l);if(!u)return L('Usage: prjct workflow instruction <command> before|after "instruction text"',t);let d=ue.addRule(e,{type:"instruction",command:s.value.name,position:c,action:u,timeoutMs:Zr.INSTRUCTION_MS,...Xu()});return t.md?console.log(_(Me("Instruction Added",`#${d} [instruction] ${c} ${s.value.name} \u2192 \`${u}\``),Ze([{label:"View all rules",command:"prjct workflow --md"},{label:"Remove this rule",command:`prjct workflow rm ${d} --md`}]))):Kt(`instruction #${d} added: ${c} ${s.value.name} \u2192 ${u}`),{success:!0,ruleId:d}}async function aA(n,e,t){let r=parseInt(n.trim(),10);return Number.isNaN(r)?L("Usage: prjct workflow rm <rule-id>",t):ue.removeRule(e,r)?(t.md?console.log(_(Me("Rule Removed",`Removed rule #${r}`))):Kt(`removed rule #${r}`),{success:!0}):L(`Rule #${r} not found`,t)}async function cA(n,e){let t=ue.resetRules(n),r=`Removed ${t} rule${t!==1?"s":""}`;return e.md?console.log(_(Me("Rules Reset",r))):Kt(`reset: ${r.toLowerCase()}`),{success:!0,count:t}}async function lA(n,e,t){let r=n.trim(),s=parseInt(r,10);if(!Number.isNaN(s)){let d=ue.getRuleById(e,s);if(!d)return L(`Rule #${s} not found`,t);if(!d.enabled){let p=`Rule #${s} is already disabled`;return t.md?console.log(`> ${p}`):Tn(p),{success:!0,message:p}}return ue.updateRule(e,s,{enabled:!1}),t.md?console.log(_(Me("Rule Disabled",`#${s} [${d.type}] ${d.action}`),Ze([{label:"Re-enable this rule",command:`prjct workflow enable ${s} --md`},{label:"View all rules",command:"prjct workflow --md"}]))):Kt(`disabled rule #${s}: ${d.action}`),{success:!0,ruleId:s}}let o=ue.getAllRules(e),i=tA(o,r);if(i.length===0)return L(`No rules matching "${r}"`,t);if(i.length===1){let d=i[0];return ue.updateRule(e,d.id,{enabled:!1}),t.md?console.log(_(Me("Rule Disabled",`#${d.id} [${d.type}] ${d.action}`))):Kt(`disabled rule #${d.id}: ${d.action}`),{success:!0,ruleId:d.id}}let c=i.slice(0,5),l=i.length-5,u=l>0?`...and ${l} more`:null;if(t.md){let d=c.map(p=>`#${p.id} [${p.type}] ${p.position} ${p.command} -> \`${p.action}\``);u&&d.push(u),console.log(_(W("Multiple matches",`${i.length} rules match "${r}"`),De(d),Ze(c.map(p=>({label:`Disable #${p.id}`,command:`prjct workflow disable ${p.id} --md`})))))}else{Tn(`${i.length} rules match "${r}" \u2014 specify an ID:`);for(let d of c)console.log(` #${d.id} [${d.type}] ${d.position} ${d.command} -> ${d.action}`);u&&console.log(` ${u}`)}return{success:!0,matches:i.map(d=>d.id)}}var uA=h(()=>{"use strict";fr();me();Ke();ry();Lt();ny();oy();a(sA,"workflowAdd");a(oA,"workflowGate");a(iA,"workflowInstruction");a(aA,"workflowRm");a(cA,"workflowReset");a(lA,"workflowDisable")});function dA(n,e){let t=e.filter(m=>m.type==="gate"&&m.position==="before"),r=e.filter(m=>m.type==="instruction"&&m.position==="before"),s=e.filter(m=>m.type==="hook"&&m.position==="before"),o=e.filter(m=>m.type==="step"&&m.position==="before"),i=e.filter(m=>m.type==="instruction"&&m.position==="after"),c=e.filter(m=>m.type==="hook"&&m.position==="after"),l=e.filter(m=>m.type==="step"&&m.position==="after"),u=[],d=a((m,f,y)=>{let v=f.map(T=>` ${T.enabled?y:"o"} #${T.id} ${T.action}`),k=[m,...v],P=Math.max(...k.map(T=>T.length))+2;u.push(`+${"-".repeat(P)}+`);for(let T of k)u.push(`| ${T.padEnd(P-1)}|`);u.push(`+${"-".repeat(P)}+`)},"drawBox"),p=a(m=>{m.push(" |"),m.push(" v")},"arrow");return t.length>0&&(d("GATES (must pass)",t,"#"),p(u)),r.length>0&&(d("INSTRUCTIONS (before)",r,"\u{1F4CB}"),p(u)),s.length>0&&(d("HOOKS (before)",s,">"),p(u)),o.length>0&&(d("STEPS (before)",o,">"),p(u)),u.push(` [ ${n.toUpperCase()} ]`),i.length>0&&(p(u),d("INSTRUCTIONS (after)",i,"\u{1F4CB}")),c.length>0&&(p(u),d("HOOKS (after)",c,">")),l.length>0&&(p(u),d("STEPS (after)",l,">")),u.join(`
|
|
1437
1437
|
`)}var pA=h(()=>{"use strict";a(dA,"buildFlowDiagram")});async function mA(n){return n.md?console.log(_(W("Workflow Help","Manage hooks, gates, and steps for your workflow"),W("Commands",De(["`prjct workflow` \u2014 View all rules","`prjct workflow ship` \u2014 View rules for a command",'`prjct workflow add "npm test" before ship` \u2014 Add a hook','`prjct workflow gate ship "npm test"` \u2014 Add a blocking gate','`prjct workflow instruction ship after "Post review in Linear"` \u2014 Add an agent instruction',"`prjct workflow disable 3` \u2014 Disable rule #3","`prjct workflow rm 3` \u2014 Remove rule #3","`prjct workflow reset` \u2014 Remove all rules","`prjct workflow init` \u2014 Seed defaults from project"])),W("Natural Language (EN/ES)",De(['`prjct workflow "show ship rules"` \u2014 muestra / show / list / ver','`prjct workflow "add npm test before ship"` \u2014 a\xF1ade / add / agrega / pon','`prjct workflow "remove 3"` \u2014 quita / remove / elimina / borra','`prjct workflow "disable lint"` \u2014 deshabilita / disable / apaga','`prjct workflow "gate ship npm test"` \u2014 gate / bloquea'])))):(console.log(""),console.log("WORKFLOW HELP"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(""),console.log(" Commands:"),console.log(" prjct workflow View all rules"),console.log(" prjct workflow <command> View rules for command"),console.log(' prjct workflow add "cmd" before ship Add a hook'),console.log(' prjct workflow gate ship "cmd" Add a blocking gate'),console.log(' prjct workflow instruction ship after "text" Add an agent instruction'),console.log(" prjct workflow disable <id|query> Disable a rule"),console.log(" prjct workflow rm <id> Remove a rule"),console.log(" prjct workflow reset Remove all rules"),console.log(" prjct workflow init Seed defaults"),console.log(""),console.log(" Natural language (EN/ES):"),console.log(" show/muestra add/a\xF1ade remove/quita disable/deshabilita gate/bloquea"),console.log("")),{success:!0}}async function zu(n,e,t){let r=n!==null&&sy.includes(n),s=r?ue.getRulesForCommand(e,n):ue.getAllRules(e);if(s.length===0)return t.md?console.log(_(W("Workflow Rules","No rules configured"),Ze([{label:"Add a hook",command:'prjct workflow add "npm test" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "npm test" --md'}]))):(Tn("no workflow rules configured"),console.log(""),console.log(' Add a hook: prjct workflow add "npm test" before ship'),console.log(' Add a gate: prjct workflow gate ship "npm test"'),console.log(" Reset all: prjct workflow reset")),{success:!0,rules:[]};if(t.md){let o=r?[n]:sy,i=[];for(let u of o){let d=s.filter(p=>p.command===u);d.length!==0&&i.push(dA(u,d))}let c=r?`Workflow: ${n}`:"Workflow Rules",l=`${s.length} rule${s.length!==1?"s":""}`;console.log(_(W(c,l),i.length>0?dR(i.join(`
|
|
1438
1438
|
|
|
1439
|
-
`),""):null,Ze([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let o=r?`WORKFLOW RULES: ${n.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let i of s){let c=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:s}}var fA=h(()=>{"use strict";fr();
|
|
1439
|
+
`),""):null,Ze([{label:"Add a hook",command:'prjct workflow add "cmd" before ship --md'},{label:"Add a gate",command:'prjct workflow gate ship "cmd" --md'},{label:"Remove a rule",command:"prjct workflow rm <id> --md"}])))}else{let o=r?`WORKFLOW RULES: ${n.toUpperCase()}`:"WORKFLOW RULES";console.log(""),console.log(o),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let i of s){let c=i.enabled?"":" (disabled)";console.log(` #${i.id} [${i.type}] ${i.position.padEnd(6)} ${i.command.padEnd(5)} \u2192 ${i.action}${c}`)}console.log(""),console.log("Commands: add | gate | rm | reset")}return{success:!0,rules:s}}var fA=h(()=>{"use strict";fr();me();Ke();pA();oy();a(mA,"workflowHelp");a(zu,"workflowShow")});import iy from"node:fs/promises";import B1 from"node:os";import Ku from"node:path";var ay,cy,gA=h(()=>{"use strict";F();Y();ay=class{static{a(this,"TemplateGenerator")}commandsPath;constructor(){this.commandsPath=Ku.join(B1.homedir(),".claude","commands","p")}async generateWorkflowTemplate(e,t){try{await iy.mkdir(this.commandsPath,{recursive:!0});let r=Ku.join(this.commandsPath,`${e}.md`),s=this.buildTemplateContent(e,t);return await iy.writeFile(r,s,"utf-8"),{success:!0,path:r}}catch(r){return{success:!1,error:w(r)}}}async deleteWorkflowTemplate(e){try{let t=Ku.join(this.commandsPath,`${e}.md`);return await iy.unlink(t),{success:!0}}catch(t){return q(t)?{success:!0}:{success:!1,error:w(t)}}}async templateExists(e){let t=Ku.join(this.commandsPath,`${e}.md`);return E(t)}buildTemplateContent(e,t){return`---
|
|
1440
1440
|
allowed-tools: [Bash, Read, Write, Edit, Glob, Grep, Task, AskUserQuestion]
|
|
1441
1441
|
---
|
|
1442
1442
|
|
|
@@ -1477,28 +1477,28 @@ Run with: p. ${o}`)),{success:!0,workflowId:c,name:o,templatePath:l.path}):(Pt.d
|
|
|
1477
1477
|
`))),s.length>0&&i.push(W("Custom Workflows",s.map(o).join(`
|
|
1478
1478
|
`))),console.log(_(...i,Ze([{label:"Create workflow",command:'prjct workflow create <name> "description" --md'},{label:"View workflow",command:"prjct workflow <name> --md"}])))}else{if(Kt(`${t.length} workflow${t.length!==1?"s":""}`),r.length>0){console.log(`
|
|
1479
1479
|
Built-in:`);for(let i of r)console.log(` ${i.name} \u2014 ${i.description}`)}if(s.length>0){console.log(`
|
|
1480
|
-
Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function kA(n,e,t){let r=n.trim();if(!r)return L("Usage: prjct workflow delete <name>",t);try{return Pt.deleteWorkflow(e,r)?(await cy.deleteWorkflowTemplate(r),t.md?console.log(_(Me("Workflow Deleted",`Deleted workflow: ${r}`))):Kt(`deleted workflow: ${r}`),{success:!0}):L(`Workflow '${r}' not found`,t)}catch(s){return L(w(s),t)}}var bA=h(()=>{"use strict";gA();_i();fr();F();
|
|
1480
|
+
Custom:`);for(let i of s)console.log(` ${i.name} \u2014 ${i.description}`)}}return{success:!0,workflows:t}}async function kA(n,e,t){let r=n.trim();if(!r)return L("Usage: prjct workflow delete <name>",t);try{return Pt.deleteWorkflow(e,r)?(await cy.deleteWorkflowTemplate(r),t.md?console.log(_(Me("Workflow Deleted",`Deleted workflow: ${r}`))):Kt(`deleted workflow: ${r}`),{success:!0}):L(`Workflow '${r}' not found`,t)}catch(s){return L(w(s),t)}}var bA=h(()=>{"use strict";gA();_i();fr();F();me();Ke();Vi();ry();a(hA,"workflowInit");a(yA,"workflowCreate");a(wA,"workflowList");a(kA,"workflowDelete")});var uy={};j(uy,{WorkflowCommands:()=>ly});var ly,dy=h(()=>{"use strict";Uo();vr();_i();F();me();Ke();ra();ie();vl();ye();Lt();ny();uA();fA();bA();ly=class extends G{static{a(this,"WorkflowCommands")}async now(e=null,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;let o=s.value;if(!e)return this._showActiveTask(o,t,r);let i=await lh(o,t,e,{skipHooks:r.skipHooks,spec:r.spec});if(!i.ok)return{success:!1,error:i.blocked??"Task start blocked"};let c=i.description??e,l=i.taskId??"",u=i.linearId,d=i.branch??"",p=i.instructions??[],m=i.pipeline,f=i.harness;return r.md?console.log(_(ta({description:c,status:"active"}),W("State",De([`Task: \`${l}\``,d?`Branch: \`${d}\``:null,u?`Linear: \`${u}\``:null,f?`Harness: ${f.level} ${f.kind}/${f.risk}`:null,f?.expectedEvidence.length?`Evidence: ${f.expectedEvidence.join(", ")}`:null,p.length>0?`Agent instructions: ${p.length}`:null].filter(y=>y!==null))),m?W("Task Pipeline",De([`Classification: \`${m.classification}\``,`Station: \`${m.station}\``,`Requires spec: ${m.requiresSpec?"yes":"no"}`,`Tests first: ${m.requiresTestsFirst?"yes":"no"}`,`Next action: ${m.nextAction}`])):null,p.length>0?W("Agent Instructions",De(p)):null,Ze([{label:"Pull project memory",command:"prjct context memory <topic>"},{label:"Tag the task",command:"prjct tag type:bug domain:auth"},{label:"Capture learnings",command:'prjct remember learning "..."'},{label:"Ship when done",command:"prjct ship --md"}]))):(g.done(`Task: ${c}`),f&&(g.info(`Harness: ${f.level} ${f.kind}/${f.risk}`),f.expectedEvidence.length>0&&g.info(`Evidence: ${f.expectedEvidence.join(", ")}`)),hR("working"),Lo("task")),{success:!0,task:c,taskId:l,harness:f}}catch(s){let o=w(s);return r.md?console.log(`> ${o}`):g.fail(o),{success:!1,error:o}}}async _showActiveTask(e,t,r){let s=await Sr(e,t),o=s.current,i=s.all.filter(c=>!c.isCurrent);if(!o){let c='no active task. `prjct task "<description>"` to start one.',l=i.length>0?`
|
|
1481
1481
|
${i.length} active in other workspace(s):
|
|
1482
1482
|
${i.map(d=>` ${d.label} ${d.description}`).join(`
|
|
1483
|
-
`)}`:"",u=c+l;return r.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(r.md)console.log(_(ta({description:o.description,status:"active"}),W("State",De([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,o.pipeline?`Pipeline: \`${o.pipeline.station}\``:null,o.harness?`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`:null,i.length>0?`Other active workspaces: ${i.length}`:null].filter(c=>c!==null))),o.pipeline?W("Next Action",De([o.pipeline.requiresTestsFirst?"Write tests before implementation for substantive work.":"Proceed directly for this trivial task."])):null,i.length>0?W("Other Active Workspaces",De(i.map(c=>`${c.label} \u2014 ${c.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`),o.pipeline&&g.info(`Pipeline: ${o.pipeline.station}`),o.harness&&g.info(`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`);for(let c of i)g.info(` other: ${c.label} \u2014 ${c.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return zu(null,o,r);let c=eA(i);switch(c.type){case"add":return sA(c.args,o,r);case"gate":return oA(c.args,o,r);case"instruction":return iA(c.args,o,r);case"remove":return aA(c.args,o,r);case"disable":return lA(c.args,o,r);case"reset":return cA(o,r);case"init":return hA(o,t,r);case"help":return mA(r);case"create":return yA(c.args,o,t,r);case"list":return wA(o,r);case"delete":return kA(c.args,o,r);case"run":return this.run(c.args,t,r);case"view":return zu(c.args||null,o,r);default:return zu(i.split(/\s+/)[0]?.toLowerCase()||null,o,r)}}catch(s){return r.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Be(s)}}async run(e,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let c=Pt.getWorkflow(o,i);if(!c||!c.enabled){let u=`Workflow '${i}' not found`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await yr(o,i,"before",{projectPath:t});if(!l.success){if(r.md)mR("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await yr(o,i,"after",{projectPath:t}),r.md?console.log(_(Me(`Workflow: ${i}`,c.description||""),Ze([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return r.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var Qu={};j(Qu,{SetupCommands:()=>py});import Yu from"node:fs/promises";import q1 from"node:http";import Ca from"node:path";import V1 from"node:readline";import we from"chalk";var py,Zu=h(()=>{"use strict";Ln();K();be();hc();ur();ca();la();F();pe();Y();
|
|
1484
|
-
- **Status**: Logged out`:""};default:{let s=await
|
|
1483
|
+
`)}`:"",u=c+l;return r.md?console.log(`> ${u}`):g.info(u),{success:!0,message:"no active task"}}if(r.md)console.log(_(ta({description:o.description,status:"active"}),W("State",De([`Task: \`${o.id}\``,`Workspace: \`${o.label}\``,o.branch?`Branch: \`${o.branch}\``:null,o.linearId?`Linear: \`${o.linearId}\``:null,`Started: ${o.startedAt}`,o.pipeline?`Pipeline: \`${o.pipeline.station}\``:null,o.harness?`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`:null,i.length>0?`Other active workspaces: ${i.length}`:null].filter(c=>c!==null))),o.pipeline?W("Next Action",De([o.pipeline.requiresTestsFirst?"Write tests before implementation for substantive work.":"Proceed directly for this trivial task."])):null,i.length>0?W("Other Active Workspaces",De(i.map(c=>`${c.label} \u2014 ${c.description}`))):null));else{g.info(`Active: ${o.description}`),g.info(`Workspace: ${o.label}`),o.pipeline&&g.info(`Pipeline: ${o.pipeline.station}`),o.harness&&g.info(`Harness: ${o.harness.level} ${o.harness.kind}/${o.harness.risk}`);for(let c of i)g.info(` other: ${c.label} \u2014 ${c.description}`)}return{success:!0,currentTask:o}}async workflow(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=s.value,i=e?.trim()??"";if(!i)return zu(null,o,r);let c=eA(i);switch(c.type){case"add":return sA(c.args,o,r);case"gate":return oA(c.args,o,r);case"instruction":return iA(c.args,o,r);case"remove":return aA(c.args,o,r);case"disable":return lA(c.args,o,r);case"reset":return cA(o,r);case"init":return hA(o,t,r);case"help":return mA(r);case"create":return yA(c.args,o,t,r);case"list":return wA(o,r);case"delete":return kA(c.args,o,r);case"run":return this.run(c.args,t,r);case"view":return zu(c.args||null,o,r);default:return zu(i.split(/\s+/)[0]?.toLowerCase()||null,o,r)}}catch(s){return r.md?console.log(`> Error: ${w(s)}`):g.fail(w(s)),Be(s)}}async run(e,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=s.value,i=e.trim();if(!i){let u="Usage: prjct workflow run <name>";return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let c=Pt.getWorkflow(o,i);if(!c||!c.enabled){let u=`Workflow '${i}' not found`;return r.md?console.log(`> ${u}`):g.warn(u),{success:!1,error:u}}let l=await yr(o,i,"before",{projectPath:t});if(!l.success){if(r.md)mR("failed","workflow_gates_failed",[{label:"View rules",command:`prjct workflow ${i} --md`}]);else if(g.fail("Workflow gates failed"),l.gatesFailed)for(let u of l.gatesFailed)console.log(` \u2717 ${u}`);return{success:!1,error:"Workflow gates failed",gatesFailed:l.gatesFailed}}return await yr(o,i,"after",{projectPath:t}),r.md?console.log(_(Me(`Workflow: ${i}`,c.description||""),Ze([{label:"View rules",command:`prjct workflow ${i} --md`},{label:"Run again",command:`p. ${i}`}]))):g.done(`${i} completed successfully`),{success:!0,workflow:i}}catch(s){let o=w(s);return r.md?console.log(`> Error: ${o}`):g.fail(o),{success:!1,error:o}}}}});var Qu={};j(Qu,{SetupCommands:()=>py});import Yu from"node:fs/promises";import q1 from"node:http";import Ca from"node:path";import V1 from"node:readline";import we from"chalk";var py,Zu=h(()=>{"use strict";Ln();K();be();hc();ur();ca();la();F();pe();Y();me();ie();Ne();ye();Uf();py=class extends G{static{a(this,"SetupCommands")}async auth(e=null,t={}){switch(e?.split(" ")[0]||"status"){case"login":return t.md||g.fail("Manual token login is not supported. Run prjct login."),{success:!1,message:t.md?"## Error\nManual token login is not supported. Run `prjct login`.":""};case"logout":return await fe.clearAuth(),t.md||g.done("Logged out. Auth credentials cleared"),{success:!0,message:t.md?`## Auth
|
|
1484
|
+
- **Status**: Logged out`:""};default:{let s=await fe.getStatus();return t.md?{success:!0,message:s.authenticated?`## Auth Status
|
|
1485
1485
|
- **Authenticated**: Yes
|
|
1486
1486
|
- **Email**: ${s.email||"N/A"}
|
|
1487
1487
|
- **Token**: stored securely
|
|
1488
1488
|
- **Last auth**: ${s.lastAuth||"N/A"}`:"## Auth Status\n- **Authenticated**: No\n- Run `prjct login` to connect"}:(s.authenticated?g.box("Auth Status",`Email: ${s.email||"N/A"}
|
|
1489
1489
|
Token: stored securely
|
|
1490
|
-
Since: ${s.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${we.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await
|
|
1490
|
+
Since: ${s.lastAuth||"N/A"}`):(g.info("Not authenticated"),g.info(`Run ${we.cyan("prjct login")} to connect`)),{success:!0,message:""})}}}async login(e={}){let t=await fe.getStatus();if(t.authenticated)return e.md||(g.box("Already Authenticated",`Email: ${t.email}
|
|
1491
1491
|
Token: stored securely`),g.info(`Run ${we.cyan("prjct logout")} first to re-authenticate`)),{success:!0,message:e.md?`## Already Authenticated
|
|
1492
1492
|
- **Email**: ${t.email}
|
|
1493
1493
|
- **Token**: stored securely
|
|
1494
1494
|
|
|
1495
|
-
Run \`prjct logout\` first to re-authenticate.`:""};let r="https://cli.prjct.app",s="https://cli-api.prjct.app";return new Promise(o=>{let i=q1.createServer(async(c,l)=>{let u=new URL(c.url||"/","http://127.0.0.1");if(u.pathname==="/callback"){let d=u.searchParams.get("key"),p=u.searchParams.get("email"),m=u.searchParams.get("user_id"),f=!1,y="No API key received";if(d)try{await
|
|
1495
|
+
Run \`prjct logout\` first to re-authenticate.`:""};let r="https://cli.prjct.app",s="https://cli-api.prjct.app";return new Promise(o=>{let i=q1.createServer(async(c,l)=>{let u=new URL(c.url||"/","http://127.0.0.1");if(u.pathname==="/callback"){let d=u.searchParams.get("key"),p=u.searchParams.get("email"),m=u.searchParams.get("user_id"),f=!1,y="No API key received";if(d)try{await fe.saveAuth(d,m||"",p||""),await fe.write({apiUrl:s}),f=await $s.testConnection(),f||(y="Could not verify credentials with prjct Cloud",await fe.clearAuth())}catch(v){y=v instanceof Error?v.message:"Could not store credentials securely",await fe.clearAuth()}f?(l.writeHead(200,{"Content-Type":"text/html"}),l.end(this.buildSuccessPage(p||""))):(l.writeHead(d?401:400,{"Content-Type":"text/html"}),l.end(this.buildErrorPage(y))),i.close(),f&&d?(e.md||(g.step(3,3,"Connected"),g.stop(),g.box("Authentication Complete",`Email: ${p}
|
|
1496
1496
|
Token: stored securely
|
|
1497
1497
|
Status: Connected`)),await this.autoSync(),o({success:!0,message:e.md?`## Authenticated
|
|
1498
1498
|
- **Email**: ${p}
|
|
1499
1499
|
- **Token**: stored securely`:""})):(e.md||g.fail(`Authentication failed: ${y}`),o({success:!1,message:e.md?`## Error
|
|
1500
1500
|
Authentication failed: ${y}`:""}));return}l.writeHead(404),l.end("Not found")});i.listen(0,"127.0.0.1",async()=>{let c=i.address();if(!c||typeof c=="string"){i.close(),e.md||g.fail("Failed to start callback server"),o({success:!1,message:e.md?`## Error
|
|
1501
|
-
Failed to start callback server`:""});return}let l=c.port,u=await
|
|
1501
|
+
Failed to start callback server`:""});return}let l=c.port,u=await fe.getDeviceId(),d=await fe.getHostname(),p=new URLSearchParams({port:String(l),device_id:u,hostname:d}),m=`${r}/auth/cli?${p.toString()}`;g.step(1,3,"Opening browser..."),g.stop(),g.info(we.dim(m));let f=process.platform,y=f==="darwin"?`open "${m}"`:f==="win32"?`start "${m}"`:`xdg-open "${m}"`;try{await J(y)}catch{g.warn("Could not open browser automatically"),g.info(`Visit: ${m}`)}g.step(2,3,"Waiting for authentication...")}),setTimeout(()=>{i.close(),g.stop(),e.md||(g.fail("Authentication timed out"),g.info(`Run ${we.cyan("prjct login")} to try again`)),o({success:!1,message:e.md?"## Error\nAuthentication timed out. Run `prjct login` to try again.":""})},300*1e3)})}async logout(){return await fe.clearAuth(),g.done("Logged out"),{success:!0,message:""}}async autoSync(){try{let e=await x.readConfig(process.cwd()).catch(()=>null),t=e?.projectId;if(!t||!e.cloud?.enabled||e.cloud.paused)return;g.spin("Syncing project...");let r=await Pn.sync(t,{include:e.cloud.include??{}});if(g.stop(),r.success&&!r.skipped){let s=r.pushed?.count||0,o=r.pulled?.count||0;s>0||o>0?g.done(`Synced (${s} pushed, ${o} pulled)`):g.done("Synced \u2014 everything up to date")}}catch{g.stop()}}buildSuccessPage(e){return`<!DOCTYPE html>
|
|
1502
1502
|
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
1503
1503
|
<title>prjct CLI Connected</title>
|
|
1504
1504
|
<style>
|
|
@@ -1625,7 +1625,7 @@ fi
|
|
|
1625
1625
|
echo "\u26A1 prjct"
|
|
1626
1626
|
`;await Yu.writeFile(r,s,{mode:493});let o={};if(await E(t))try{o=await Ie(t)??{}}catch{}return o.statusLine={type:"command",command:r},await Se(t,o),{success:!0}}catch(e){return Be(e)}}showAsciiArt(){console.log(we.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(we.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(we.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")),console.log(we.bold.cyan(" \u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(we.bold.cyan(" \u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(we.bold.cyan(" \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")),console.log(we.bold.cyan(" \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${we.bold.cyan("prjct")}${we.magenta("/")}${we.green("cli")} ${we.dim.white(`v${ae} installed`)}`),console.log(""),console.log(` ${we.yellow("\u26A1")} Ship faster with zero friction`),console.log(` ${we.green("\u{1F4DD}")} From idea to technical tasks in minutes`),console.log(` ${we.cyan("\u{1F916}")} Perfect context for AI agents`),console.log(""),console.log(we.cyan("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),console.log(""),console.log(we.bold.cyan("\u{1F680} Quick Start")),console.log(we.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${we.bold("1.")} Initialize your project:`),console.log(` ${we.green("cd your-project && prjct init")}`),console.log(""),console.log(` ${we.bold("2.")} Start your first task:`),console.log(` ${we.green('prjct task "build auth"')}`),console.log(""),console.log(` ${we.bold("3.")} Ship & celebrate:`),console.log(` ${we.green('prjct ship "user login"')}`),console.log(""),console.log(we.dim("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),console.log(""),console.log(` ${we.dim("Documentation:")} ${we.cyan("https://prjct.app")}`),console.log(` ${we.dim("Report issues:")} ${we.cyan("https://github.com/jlopezlira/prjct-cli/issues")}`),console.log(""),console.log(we.bold.magenta("Happy shipping! \u{1F680}")),console.log("")}}});import{execFileSync as Ra}from"node:child_process";import J1 from"node:os";import Ns from"node:path";function qo(){try{return!!Ra("brew",["list","prjct-cli"],{encoding:"utf-8",stdio:["pipe","pipe","ignore"]})}catch{return!1}}function ed(n){try{return Ra("which",[n],{stdio:"pipe"}),!0}catch{return!1}}function my(){let n=[process.argv[1],process.execPath].filter(Boolean);for(let e of n){let t=e;try{t=ft("node:fs").realpathSync(e)}catch{}if(t.includes("/.bun/install/global")||t.includes("/.bun/bin/"))return"bun";if(t.includes("/Library/pnpm/")||t.includes("/.pnpm/")||t.includes("/.local/share/pnpm/"))return"pnpm";if(t.includes("/.yarn/")||t.includes("/yarn/global"))return"yarn"}return null}function td(){let n=my();if(n&&ed(n))return Jn[n];for(let e of["bun","pnpm","npm","yarn"])if(ed(e))return Jn[e];throw new Error("No supported package manager found in PATH (tried npm, pnpm, bun, yarn). Install one and re-run, or upgrade manually: bun add -g prjct-cli@latest")}function xa(){let n=[];for(let e of[Jn.bun,Jn.pnpm,Jn.npm,Jn.yarn]){let t=e.getInstallRoot();if(!t)continue;let r=Ns.join(t,"prjct-cli","package.json");try{let s=JSON.parse(ft("node:fs").readFileSync(r,"utf-8"));s?.name==="prjct-cli"&&typeof s.version=="string"&&n.push({pm:e,version:s.version})}catch{}}return n}function vA(){try{let{existsSync:n,realpathSync:e,readFileSync:t}=ft("node:fs"),r=(()=>{try{return e(Ns.resolve(__dirname,"..","..",".."))}catch{return""}})(),s=[Jn.bun.getInstallRoot(),Jn.pnpm.getInstallRoot(),Jn.npm.getInstallRoot(),Jn.yarn.getInstallRoot()].filter(o=>!!o);for(let o of s){let i=Ns.join(o,"prjct-cli"),c=Ns.join(i,"package.json");if(!n(c))continue;let l=i;try{l=e(i)}catch{}if(r&&l===r)continue;try{if(JSON.parse(t(Ns.join(l,"package.json"),"utf-8"))?.name!=="prjct-cli")continue}catch{continue}Fd(l);let{resetBundle:u}=(mn(),gt(oc));u();return}}catch{}}var X1,Jn,fy=h(()=>{"use strict";Ne();X1=J1.homedir(),Jn={npm:{name:"npm",installArgs:["install","-g","prjct-cli@latest"],getInstallRoot:a(()=>{try{return Ra("npm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},pnpm:{name:"pnpm",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:a(()=>{try{return Ra("pnpm",["root","-g"],{encoding:"utf-8",stdio:"pipe"}).trim()}catch{return null}},"getInstallRoot")},bun:{name:"bun",installArgs:["add","-g","prjct-cli@latest"],getInstallRoot:a(()=>Ns.join(X1,".bun","install","global","node_modules"),"getInstallRoot")},yarn:{name:"yarn",installArgs:["global","add","prjct-cli@latest"],getInstallRoot:a(()=>{try{let n=Ra("yarn",["global","dir"],{encoding:"utf-8",stdio:"pipe"}).trim();return Ns.join(n,"node_modules")}catch{return null}},"getInstallRoot")}};a(qo,"isHomebrewInstall");a(ed,"isOnPath");a(my,"detectInstallerFromRunningBinary");a(td,"selectPackageManager");a(xa,"getAllInstalledLocations");a(vA,"redirectToInstalledPackage")});import{execSync as SA}from"node:child_process";import{realpathSync as gy}from"node:fs";import EA from"node:path";import z1 from"node:readline";function Y1(){try{let n=SA("command -v prjct",{stdio:"pipe",shell:"/bin/sh"}).toString().trim();if(!n)return null;try{return gy(n)}catch{return n}}catch{return null}}function Q1(){try{return gy(EA.resolve(__dirname,"..","..",".."))}catch{return""}}function Z1(){let n=Y1(),e=my(),t=Q1(),r=[];if(!n&&!e)return{winner:null,removable:[],skipped:[{pm:"(all)",reason:"cannot resolve the PATH-winning binary \u2014 refusing to remove"}]};let s=n?.includes("/Cellar/")||n?.includes("/homebrew/"),o=s?"brew":e,i=[];for(let c of xa()){if(c.pm.name===e){r.push({pm:c.pm.name,reason:"PATH winner \u2014 kept"});continue}let l=c.pm.getInstallRoot();if(l&&t){let u=EA.join(l,"prjct-cli");try{u=gy(u)}catch{}if(u===t){r.push({pm:c.pm.name,reason:"resolves to the dev source tree (link) \u2014 kept"});continue}}i.push({pm:c.pm.name,version:c.version})}return qo()&&!s?i.push({pm:"brew",version:"(homebrew)"}):qo()&&s&&r.push({pm:"brew",reason:"PATH winner \u2014 kept"}),{winner:o,removable:i,skipped:r}}function eG(n){let e=n==="brew"?"brew uninstall prjct-cli":K1[n];try{return SA(e,{stdio:"pipe",shell:"/bin/sh"}),{ok:!0}}catch(t){return{ok:!1,error:`${n}: ${t.message.split(`
|
|
1627
1627
|
`)[0]}`}}}async function tG(n){let e=z1.createInterface({input:process.stdin,output:process.stdout});try{let t=await new Promise(r=>e.question(`${n} [y/N] `,r));return/^y(es)?$/i.test(t.trim())}finally{e.close()}}async function TA(n,e,t){let r=[],s=[];if(n==="off")return r.push("Install consolidation skipped (--no-cleanup)"),{details:r,errors:s};let o=Z1();if(o.removable.length===0)return r.push(o.skipped.some(u=>u.pm==="(all)")?`Consolidation skipped \u2014 ${o.skipped[0].reason}`:"Single install \u2014 nothing to consolidate"),{details:r,errors:s};let i=o.removable.map(u=>`${u.pm} (${u.version})`).join(", ");if(r.push(`Winner: ${o.winner??"unknown"} \u2014 redundant copies: ${i}`),e){for(let u of o.removable)r.push(`Would remove ${u.pm} copy`);return{details:r,errors:s}}let c=process.stdin.isTTY===!0&&process.stdout.isTTY===!0;if(!(n==="force"||t||c&&await tG(`Remove ${o.removable.length} redundant prjct install(s) [${i}], keeping ${o.winner}?`)))return c?r.push("Consolidation declined \u2014 left all installs in place"):r.push(`Multiple installs detected [${i}]. Run \`prjct upgrade --yes\` to consolidate (kept ${o.winner}).`),{details:r,errors:s};for(let u of o.removable){let d=eG(u.pm);d.ok?r.push(`Removed redundant ${u.pm} install`):s.push(d.error??`failed to remove ${u.pm}`)}for(let u of o.skipped)r.push(`Kept ${u.pm}: ${u.reason}`);return{details:r,errors:s}}var K1,CA=h(()=>{"use strict";fy();K1={npm:"npm uninstall -g prjct-cli",pnpm:"pnpm remove -g prjct-cli",bun:"bun remove -g prjct-cli",yarn:"yarn global remove prjct-cli"};a(Y1,"pathWinnerReal");a(Q1,"sourceRoot");a(Z1,"planCleanup");a(eG,"removeOne");a(tG,"confirm");a(TA,"consolidateInstalls")});import Os from"chalk";function RA(n,e){let t=n.phase1.success&&n.phase2.success,r=[...n.phase1.errors,...n.phase2.errors];console.log("");let s=[{label:"Package",result:n.phase1,fatal:!0},{label:"Cleanup",result:n.phase2,fatal:!0},{label:"Daemon",result:n.phase3,fatal:!1}];for(let{label:o,result:i,fatal:c}of s){let l=i.success?Os.green("\u2713"):c?Os.red("\u2717"):Os.yellow("\u26A0");console.log(` ${l} ${Os.bold(o)}`);for(let u of i.details)console.log(` ${Os.dim(u)}`);for(let u of i.warnings??[])console.log(` ${Os.yellow("\u26A0")} ${u}`);for(let u of i.errors)console.log(` ${Os.yellow("\u26A0")} ${u}`)}return console.log(""),e?g.done("Dry run complete \u2014 no changes made"):t?g.done("System updated"):g.warn(`Updated with ${r.length} error(s)`),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}function xA(n,e){let t=n.phase1.success&&n.phase2.success,r=[];r.push(e?"# Update (Dry Run)":"# System Update"),r.push("");let s=[{label:"Package Update",result:n.phase1,fatal:!0},{label:"Global Cleanup",result:n.phase2,fatal:!0},{label:"Daemon Restart",result:n.phase3,fatal:!1}];for(let{label:o,result:i,fatal:c}of s){let l=i.success?"OK":c?"FAILED":"WARNING";r.push(`## ${o} (${l})`);for(let u of i.details)r.push(`- ${u}`);for(let u of i.warnings??[])r.push(`- WARNING: ${u}`);for(let u of i.errors)r.push(`- WARNING: ${u}`);r.push("")}return e||r.push(t?"**Status:** All phases completed successfully.":"**Status:** Completed with errors."),console.log(r.join(`
|
|
1628
|
-
`)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var PA=h(()=>{"use strict";ie();a(RA,"formatTerminalOutput");a(xA,"formatMdOutput")});var ky={};j(ky,{UpdateCommands:()=>wy});import{execFileSync as AA}from"node:child_process";import hy from"node:fs/promises";import yy from"node:path";var wy,by=h(()=>{"use strict";Ln();Ei();be();Ml();Yf();F();
|
|
1628
|
+
`)),{success:t,message:e?"Dry run complete":t?"System updated":"Updated with errors"}}var PA=h(()=>{"use strict";ie();a(RA,"formatTerminalOutput");a(xA,"formatMdOutput")});var ky={};j(ky,{UpdateCommands:()=>wy});import{execFileSync as AA}from"node:child_process";import hy from"node:fs/promises";import yy from"node:path";var wy,by=h(()=>{"use strict";Ln();Ei();be();Ml();Yf();F();me();ie();Ne();ye();CA();PA();fy();wy=class extends G{static{a(this,"UpdateCommands")}async update(e={},t=process.cwd()){let r=e["dry-run"]===!0,s=e.md===!0,o=e.cleanup===!1?"off":e.cleanup===!0?"force":"auto",i=e.yes===!0||e.y===!0,c={phase1:{success:!0,details:[],errors:[],warnings:[]},phase2:{success:!0,details:[],errors:[],warnings:[]},phase3:{success:!0,details:[],errors:[],warnings:[]}};try{if(!r)try{let{isDaemonRunning:l,stopDaemon:u,forceKillDaemon:d}=await Promise.resolve().then(()=>(on(),sn));await l()&&(await u()||d())}catch{}if(s||g.step(1,3,"Updating package..."),c.phase1=await this.phasePackageUpdate(r),s||g.stop(),!r&&c.phase1.success&&vA(),s||g.step(2,3,"Cleaning up all projects..."),c.phase2=await this.phaseGlobalCleanup(r,o,i),s||g.stop(),s||g.step(3,3,"Restarting daemon..."),c.phase3=await this.phaseDaemonRestart(r),s||g.stop(),!r){try{await Si.updateVersion(ae)}catch{}try{await new $o().writeCache({lastCheck:0,latestVersion:""})}catch{}}return s?xA(c,r):RA(c,r)}catch(l){return s||g.stop(),g.fail(w(l)),Be(l)}}async phasePackageUpdate(e){let t={success:!0,details:[],errors:[],warnings:[]},r=xa();if(e){if(qo()){let o;try{o=td().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push("Would uninstall homebrew formula"),t.details.push(`Would install via ${o}`)}else if(r.length===0){let o;try{o=td().name}catch(i){o="<none-available>",t.errors.push(w(i))}t.details.push(`Would install via ${o}`)}else for(let{pm:o,version:i}of r)t.details.push(`Would reinstall via ${o.name} (currently v${i})`);return t}try{if(qo())try{AA("brew",["uninstall","prjct-cli"],{stdio:["pipe","pipe","ignore"]}),t.details.push("Uninstalled homebrew formula")}catch{t.details.push("Homebrew uninstall skipped (not found)")}let o;r.length>0?o=r.map(d=>d.pm):o=[td()];let i=null;try{let d=(await new $o().getLatestVersion())?.trim();d&&/^\d+\.\d+\.\d+/.test(d)&&(i=`prjct-cli@${d}`)}catch{}for(let d of o){if(!ed(d.name)){t.errors.push(`${d.name} is not on PATH but has a prjct-cli install. Either install ${d.name} or remove that copy.`);continue}try{let p=i?d.installArgs.map(m=>m==="prjct-cli@latest"?i:m):d.installArgs;AA(d.name,p,{stdio:"pipe"}),t.details.push(`${d.name} install complete${i?` (${i})`:""}`)}catch(p){t.errors.push(`${d.name}: ${w(p)}`)}}let c=xa(),l=new Map(r.map(d=>[d.pm.name,d.version])),u=[];for(let{pm:d,version:p}of c){let m=l.get(d.name);m&&m!==p?u.push(`${d.name}: ${m} \u2192 ${p}`):m||u.push(`${d.name}: installed v${p}`)}if(u.length>1)for(let d of u)t.details.push(d);else u.length===1?t.details.push(u[0]):c.length>0&&t.details.push(`v${c[0].version} (already latest)`)}catch(s){t.success=!1,t.errors.push(w(s))}return t}async phaseGlobalCleanup(e,t="auto",r=!1){let s={success:!0,details:[],errors:[],warnings:[]},o=await this.getAllProjectIds();if(o.length===0)s.details.push("No projects found");else{let i=0,c=0,l=0,u=0;for(let d of o)if(!e)try{if(!YT(d)){l+=1;continue}let p=await Ql(d),m=await Zl(d);if(i+=p.migratedFiles.length,c+=m,p.errors.length>0)for(let f of p.errors)u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${f.file}: ${f.error}`)}catch(p){u+=1,(s.warnings?.length??0)<10&&s.warnings?.push(`${d.slice(0,8)}: ${w(p)}`)}if(e)s.details.push(`Would migrate ${o.length} project(s)`);else{let d=[`${o.length} project(s) checked`];if(l>0&&d.push(`${l} already on SQLite`),i>0&&d.push(`${i} files migrated`),c>0&&d.push(`${c} leftovers swept`),s.details.push(d.join(", ")),u>0){let p=u-(s.warnings?.length??0);s.details.push(`Legacy migration skipped ${u} issue(s) without blocking update${p>0?` (${p} more hidden)`:""}`)}}}if(e)s.details.push("Would clean all legacy artifacts"),s.details.push("Would reinstall editor commands"),s.details.push("Would reinstall global config (all providers)");else{try{let c=await new On().cleanupAllLegacy();c.cleaned.length>0&&s.details.push(`Cleaned ${c.cleaned.length} legacy artifact(s)`)}catch(i){s.errors.push(`Legacy cleanup: ${w(i)}`)}try{let c=await new On().installCommands();s.details.push(`Editor commands reinstalled (${c.installed?.length||0} providers)`)}catch(i){s.errors.push(`Commands: ${w(i)}`)}try{await new On().installGlobalConfig(),s.details.push("Global config updated (prjct section replaced)")}catch(i){s.errors.push(`Global config: ${w(i)}`)}try{let{detectAllProviders:i}=await Promise.resolve().then(()=>(ut(),Nn)),c=await i(),l=yy.join(ft("node:os").homedir());if(c.gemini.installed){let u=yy.join(l,".gemini","GEMINI.md");try{let d=await hy.readFile(u,"utf-8"),p="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",m="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->";if(d.includes(p)&&d.includes(m)){let{getTemplateContent:f}=await Promise.resolve().then(()=>(mn(),oc)),y=f("global/GEMINI.md");if(y?.includes(p)&&y.includes(m)){let v=y.substring(y.indexOf(p),y.indexOf(m)+m.length),k=d.substring(0,d.indexOf(p)),b=d.substring(d.indexOf(m)+m.length),P=k+v+b,T="<!-- prjct-project:start - DO NOT REMOVE THIS MARKER -->",M="<!-- prjct-project:end - DO NOT REMOVE THIS MARKER -->";if(P.includes(T)&&P.includes(M)){let V=P.substring(0,P.indexOf(T)),ne=P.substring(P.indexOf(M)+M.length);P=`${(V+ne).replace(/\n{3,}/g,`
|
|
1629
1629
|
|
|
1630
1630
|
`).trim()}
|
|
1631
1631
|
`}await hy.writeFile(u,P,"utf-8"),s.details.push("Gemini global config updated")}}}catch{}}}catch{}}try{let i=await TA(t,e,r);s.details.push(...i.details),s.errors.push(...i.errors)}catch(i){s.errors.push(`install consolidation skipped: ${w(i)}`)}return s.errors.length>0&&(s.success=!1),s}async phaseDaemonRestart(e){let t={success:!0,details:[],errors:[],warnings:[]};if(e)return t.details.push("Would restart daemon"),t;try{let{isDaemonRunning:r,stopDaemon:s,forceKillDaemon:o,spawnDaemon:i}=await Promise.resolve().then(()=>(on(),sn));await r()?(await s()||o(),await new Promise(u=>setTimeout(u,300)),t.details.push("Daemon stopped")):(o(),t.details.push("No running daemon (cleaned stale files)"));let c=await i();t.details.push(c?"Daemon restarted":"Daemon will start automatically on next use")}catch(r){t.success=!1,t.errors.push(w(r))}return t}async getAllProjectIds(){let e=yy.join(I.getGlobalBasePath(),"projects");try{return(await hy.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")).map(r=>r.name)}catch{return[]}}}});async function jA(n,e,t={}){let{topic:r,types:s,tags:o}=t,i=t.limit??30,c=[];if(r){let l=r.split(/\s+/).filter(Boolean);try{let u=O.searchFts(e,l,i);s&&(u=u.filter(d=>s.includes(d.type))),o&&(u=u.filter(d=>Ai(d,o))),c=u}catch{c=[]}}if(c.length<i){let l=new Set(c.map(d=>d.id)),u=O.recall(e,{topic:r,types:s,tags:o,limit:i});for(let d of u)if(!l.has(d.id)&&(c.push(d),c.length>=i))break}if(r)try{let l=await x.readConfig(n);if(l&&ya.isEnabled(l)){let u=await ya.semanticSearch(e,r,l,10);if(u.length>0){let d=new Set(c.map(m=>m.id)),p=u.filter(m=>!d.has(m.id));s&&(p=p.filter(m=>s.includes(m.type))),o&&(p=p.filter(m=>Ai(m,o))),c=[...p,...c].slice(0,i)}}}catch{}if(c.length>1&&(c=wt.rerank(e,c)),t.expandLinks!==!1&&c.length>0){let l=O.expandWithLinks(e,c,5);l.length>0&&(c=c.concat(l))}try{let l=await ee.getCurrentTask(e);l?.id&&wt.recordSurfaced(e,c.map(u=>u.id),l.id)}catch{}return c}var _A=h(()=>{"use strict";K();Uu();mr();Nt();bo();Te();a(jA,"enrichedRecall")});var vy={};j(vy,{runContextTool:()=>nG});async function nG(n,e,t){let[r,...s]=n;try{switch(r){case"memory":return await IA(s,t,{kind:"memory"});case"learnings":return await IA(s,t,{kind:"learnings"});case"wiki":return await rG(t,s);case"help":return{tool:"error",result:{error:oG(),code:"HELP"}};default:return{tool:"error",result:{error:`Unknown tool: ${r}. Use 'prjct context help' for usage.`,code:"UNKNOWN_TOOL"}}}}catch(o){return{tool:"error",result:{error:w(o),code:"EXECUTION_ERROR"}}}}async function rG(n,e=[]){let t=await x.getProjectId(n);if(!t)return{tool:"error",result:{error:"No prjct project. Run `prjct init` first.",code:"NO_PROJECT"}};if(e[0]==="sync")return sG(n,t,e.slice(1));let{generateWiki:s}=await Promise.resolve().then(()=>(Wn(),Br)),{wikiRoot:o,filesWritten:i}=await s(n,t);return{tool:"wiki",result:{markdown:`> Wiki rebuilt at \`${o}\` \u2014 ${i} files. Read \`${o}/_generated/index.md\` with the Read tool.`,entryCount:i}}}async function sG(n,e,t){let r=t.includes("--force"),{ingestCapturedNotes:s}=await Promise.resolve().then(()=>(il(),TS)),{regenerateWikiDeferred:o}=await Promise.resolve().then(()=>(Wn(),Br)),i=await s(n,{force:r});i.ingested>0&&await o(n,e);let c=[];if(c.push(`> Ingested ${i.ingested} note(s) from \`.prjct/wiki/captured/\`.`),i.skipped.length>0){c.push("","**Skipped:**");for(let l of i.skipped)c.push(`- \`${l.file}\` \u2014 ${l.reason}`)}if(i.errors.length>0){c.push("","**Errors:**");for(let l of i.errors)c.push(`- \`${l.file}\` \u2014 ${l.error}`)}return i.ingested===0&&i.skipped.length===0&&i.errors.length===0&&c.push("","Nothing to ingest. Drop markdown notes with frontmatter into `.prjct/wiki/captured/` and re-run."),{tool:"wiki",result:{markdown:c.join(`
|
|
@@ -1655,19 +1655,19 @@ summary) were removed in alpha.12 \u2014 Claude has Glob/Grep/Read/git
|
|
|
1655
1655
|
natively and re-implementing them in prjct was harness. The
|
|
1656
1656
|
underlying functions still exist for the orchestrator + MCP surface.
|
|
1657
1657
|
`.trim()}var Sy=h(()=>{"use strict";K();_A();Vt();Te();mr();F();a(nG,"runContextTool");a(rG,"runWikiTool");a(sG,"runWikiSyncTool");a(IA,"runMemoryTool");a(oG,"getHelpText")});var rd={};j(rd,{ContextCommands:()=>nd,contextCommands:()=>$A,default:()=>cG});import iG from"node:fs/promises";import aG from"node:path";var nd,$A,cG,sd=h(()=>{"use strict";K();be();Nt();F();Ke();nd=class{static{a(this,"ContextCommands")}async context(e=null,t=process.cwd(),r={}){try{let s=await x.readConfig(t);if(!s||!s.projectId)return console.log(JSON.stringify({projectId:"",globalPath:"",currentTask:null,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:"unknown",frameworks:[],hasTests:!1,technologies:[]}})),{success:!1,message:"No prjct project. Run `prjct init` first."};let o=s.projectId,i=I.getGlobalProjectPath(o),c=await ee.read(o),l=c?.currentTask?{id:c.currentTask.id,description:c.currentTask.description,startedAt:c.currentTask.startedAt,subtasks:c.currentTask.subtasks?.map(p=>({id:p.id,description:p.description,status:p.status,domain:p.domain})),currentSubtaskIndex:c.currentTask.currentSubtaskIndex}:null,u=await this.loadRepoAnalysis(i),d={projectId:o,globalPath:i,currentTask:l,domains:[],primaryDomain:null,subtasks:null,repoAnalysis:{ecosystem:u?.ecosystem||"unknown",frameworks:u?.frameworks||[],hasTests:u?.hasTests||!1,technologies:u?.technologies||[]}};return r.md?console.log(this.formatContextMd(d)):console.log(JSON.stringify(d)),{success:!0,message:""}}catch(s){return{success:!1,message:`Context error: ${w(s)}`}}}async search(e=null,t=process.cwd(),r={}){let s=await x.getProjectId(t);if(!s)return{success:!1,message:"No prjct project. Run `prjct init` first."};let o=(e??"").trim();if(!o)return{success:!1,message:"search requires a query"};let{runContextTool:i}=await Promise.resolve().then(()=>(Sy(),vy)),c=await i(["memory",o],s,t),l=c.tool!=="error",u=r.md?c.result.markdown??"":JSON.stringify(c,null,2);return{success:l,message:u}}formatContextMd(e){let t=[];if(t.push(W("Project",kg(wg("ID",e.projectId),wg("Path",e.globalPath)))),e.currentTask){let r=e.currentTask;if(t.push(ta({description:r.description,status:"in-progress"})),r.subtasks&&r.subtasks.length>0){let s=r.subtasks.map(o=>`- [${o.status==="completed"?"x":" "}] ${o.description}${o.domain?` (${o.domain})`:""}`);t.push(s.join(`
|
|
1658
|
-
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(W("Stack",Zt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),_(...t)}async loadRepoAnalysis(e){try{let t=aG.join(e,"analysis","repo-analysis.json"),r=await iG.readFile(t,"utf-8"),s=JSON.parse(r);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return q(t),null}}},$A=new nd,cG=$A});var Ty={};j(Ty,{PrimitiveCommands:()=>Ey});function uG(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let r=t.indexOf(":");return r<=0?null:[t.slice(0,r),t.slice(r+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function dG(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function pG(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let r=e.slice(0,t).toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${ko.join(", ")}`};let s=r,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var lG,Ey,Cy=h(()=>{"use strict";bo();Te();pr();vr();Nt();F();
|
|
1658
|
+
`))}}else t.push("> No active task");return e.repoAnalysis&&t.push(W("Stack",Zt({Ecosystem:e.repoAnalysis.ecosystem,Frameworks:e.repoAnalysis.frameworks.join(", ")||"none",Tests:e.repoAnalysis.hasTests?"yes":"no",Tech:e.repoAnalysis.technologies.join(", ")||"none"}))),_(...t)}async loadRepoAnalysis(e){try{let t=aG.join(e,"analysis","repo-analysis.json"),r=await iG.readFile(t,"utf-8"),s=JSON.parse(r);return{ecosystem:s.ecosystem||"unknown",frameworks:s.frameworks||[],hasTests:s.hasTests??!1,technologies:s.technologies||[]}}catch(t){return q(t),null}}},$A=new nd,cG=$A});var Ty={};j(Ty,{PrimitiveCommands:()=>Ey});function uG(n){let e=n.split(/\s+/).map(t=>t.trim()).filter(Boolean).map(t=>{let r=t.indexOf(":");return r<=0?null:[t.slice(0,r),t.slice(r+1)]}).filter(t=>t!==null);return Object.fromEntries(e)}function dG(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function pG(n){let e=n.trim(),t=e.search(/\s/);if(t<=0)return{ok:!1,error:'expected `<type> "<content>"`'};let r=e.slice(0,t).toLowerCase().trim();if(!r||!/^[a-z][a-z0-9-]*$/.test(r))return{ok:!1,error:`invalid type '${r}'. Lowercase letters + dashes only. Base types: ${ko.join(", ")}`};let s=r,o=e.slice(t+1).trim();return(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o?{ok:!0,type:s,content:o}:{ok:!1,error:"content is required"}}var lG,Ey,Cy=h(()=>{"use strict";bo();Te();pr();vr();Nt();F();me();ie();Ri();sl();ye();Lt();lG=["feature","bug","improvement","chore"],Ey=class extends G{static{a(this,"PrimitiveCommands")}async status(e=null,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;if(e){let p=await uh(s.value,t,e);if(!p.ok){if(p.reason==="unsupported")return r.md?console.log(`> ${p.message}`):g.fail(p.message),{success:!1,error:p.message};let y=await gu(s.value,r,t);return y.ok?{success:!1,error:"No active task"}:y.result}let m=`status \u2192 ${e}`;r.md?console.log(`\u2713 ${m}`):g.done(m);let f=p.verificationWarnings??[];if(f.length>0)if(r.md){console.log(`
|
|
1659
1659
|
## Harness warnings`);for(let y of f)console.log(`- ${y}`)}else for(let y of f)g.warn(`Harness: ${y}`);return{success:!0,taskId:p.taskId,status:e}}if(!await Ft(s.value,t)){let p=await ee.getPausedTasks(s.value);if(p.length>0){let m=p[0],f=`Task: ${m.id} | Type: ${m.type??"unset"} | Status: paused`;return r.md?console.log(f):g.info(f),{success:!0,taskId:m.id,status:"paused"}}}let i=await gu(s.value,r,t);if(!i.ok)return i.result;let c=i.value,l=await ua(s.value,c.id),u=`Task: ${c.id} | Type: ${c.type??"unset"} | Status: ${l??"active"}`,d=c.harness?`Harness: ${c.harness.level} ${c.harness.kind}/${c.harness.risk}`:null;return r.md?console.log(d?`${u}
|
|
1660
1660
|
${d}`:u):(g.info(u),d&&g.info(d)),{success:!0,taskId:c.id,status:l??"active",harness:d}}catch(s){let o=w(s);return A(o)}}async tag(e=null,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;let o=await gu(s.value,r,t);if(!o.ok)return o.result;if(!e)return g.info("Usage: prjct tag <key:value> [<key:value>...]"),{success:!1,error:"No tags provided"};let i=uG(e);if(Object.keys(i).length===0)return g.fail("no valid k:v pairs (expected `key:value`)"),{success:!1,error:"Invalid tag format"};let c=i.type;c&&lG.includes(c)&&await ee.updateCurrentTask(s.value,{type:c}),await rt.log(t,"task.tagged",{taskId:o.value.id,tags:i});let l=Object.entries(i).map(([u,d])=>`${u}=${d}`).join(", ");return r.md?console.log(`\u2713 tagged ${l}`):g.done(`tagged ${l}`),{success:!0,taskId:o.value.id,tags:i}}catch(s){let o=w(s);return A(o)}}async remember(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!e)return g.info(`Usage: prjct remember <type> "<content>" [--tags k:v,...]
|
|
1661
|
-
Types: ${ko.join(" | ")}`),{success:!1,error:"Missing args"};let o=pG(e);if(!o.ok)return A(o.error);let{type:i,content:c}=o,l=Eo(c);if(l.length>0&&!r.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=go(c);if(u.length>0&&!r.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=dG(r.tags),p=await se(t);if(!p.ok)return p.result;let m=await Ft(p.value,t);await O.remember(t,{type:i,content:c,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>(Wn(),Br));return await f(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return A(o)}}async forget(e=null,t=process.cwd(),r={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await se(t);if(!o.ok)return o.result;if(!O.forget(o.value,s))return r.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(Wn(),Br));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return A(o)}}};a(uG,"parseTagPairs");a(dG,"parseFlagTags");a(pG,"parseRememberArgs")});var od={};j(od,{SeedCommands:()=>Ry});var Ry,id=h(()=>{"use strict";Cg();jg();F();
|
|
1661
|
+
Types: ${ko.join(" | ")}`),{success:!1,error:"Missing args"};let o=pG(e);if(!o.ok)return A(o.error);let{type:i,content:c}=o,l=Eo(c);if(l.length>0&&!r.force){let y=l.join(", ");return g.fail(`refusing to store memory that looks like a secret (${y}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"}}let u=go(c);if(u.length>0&&!r.force)return g.fail(`refusing to store memory that looks like prompt injection (${u.join(", ")}). Entries are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let d=dG(r.tags),p=await se(t);if(!p.ok)return p.result;let m=await Ft(p.value,t);await O.remember(t,{type:i,content:c,tags:d,source:m?.id});let{regenerateWikiDeferred:f}=await Promise.resolve().then(()=>(Wn(),Br));return await f(t,p.value),r.md?console.log(`\u2713 remembered ${i}: ${c}`):g.done(`remembered ${i}`),{success:!0,type:i,content:c,tags:d}}catch(s){let o=w(s);return A(o)}}async forget(e=null,t=process.cwd(),r={}){try{let s=(e??"").trim();if(!s)return g.info("Usage: prjct forget <id> (e.g. prjct forget mem_1234)"),{success:!1,error:"Missing id"};let o=await se(t);if(!o.ok)return o.result;if(!O.forget(o.value,s))return r.md?console.log(`\u2717 no memory entry matched ${s}`):g.fail(`no memory entry matched ${s}`),{success:!1,error:`No memory entry matched ${s}`};let{regenerateWikiDeferred:c}=await Promise.resolve().then(()=>(Wn(),Br));return await c(t,o.value),r.md?console.log(`\u2713 forgot ${s}`):g.done(`forgot ${s}`),{success:!0,id:s}}catch(s){let o=w(s);return A(o)}}};a(uG,"parseTagPairs");a(dG,"parseFlagTags");a(pG,"parseRememberArgs")});var od={};j(od,{SeedCommands:()=>Ry});var Ry,id=h(()=>{"use strict";Cg();jg();F();me();ie();ye();Ry=class extends G{static{a(this,"SeedCommands")}async seed(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list",i=s.slice(1).join(",");switch(o){case"add":return this.add(i||null,t,r);case"remove":return this.remove(i||null,t,r);case"list":return this.list(null,t,r);case"suggest":return this.suggest(null,t,r);default:return g.fail(`Unknown seed subcommand: ${o}. Use: add, remove, list, suggest.`),{success:!1,error:"Unknown seed subcommand"}}}async add(e=null,t=process.cwd(),r={}){try{if(!e)return g.info(`Usage: prjct seed add <pack>[,<pack>...]
|
|
1662
1662
|
Available: ${Tg.join(", ")}`),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await xg(t,s,{suggestPersona:r.suggestPersona??!1}),i=`activated: ${o.activated.join(", ")||"none"}${o.skipped.length?` \u2022 unknown: ${o.skipped.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return A(o)}}async remove(e=null,t=process.cwd(),r={}){try{if(!e)return g.info("Usage: prjct seed remove <pack>[,<pack>...]"),{success:!1,error:"No pack given"};let s=e.split(",").map(c=>c.trim()).filter(Boolean),o=await Pg(t,s),i=`deactivated: ${o.deactivated.join(", ")||"none"}${o.notActive.length?` \u2022 not active: ${o.notActive.join(", ")}`:""}`;return r.md?console.log(`\u2713 ${i}`):g.done(i),{success:!0,...o}}catch(s){let o=w(s);return A(o)}}async list(e=null,t=process.cwd(),r={}){try{let s=await Ag(t);if(s.length===0){let o=`no packs active. Run \`prjct seed add <name>\` \u2014 available: ${Tg.join(", ")}`;return r.md?console.log(`> ${o}`):g.info(o),{success:!0,active:[]}}if(r.md){let o=["# Active packs",""];for(let i of s)o.push(`## ${i.name}`),o.push(i.description),o.push(`- memory types: ${i.memoryTypes.join(", ")||"\u2014"}`),o.push(`- workflow slots: ${i.slots.join(", ")||"\u2014"}`),o.push("");console.log(o.join(`
|
|
1663
1663
|
`))}else for(let o of s)g.info(`${o.name}: ${o.description}`),g.info(` memory: ${o.memoryTypes.join(", ")||"\u2014"}`),g.info(` slots: ${o.slots.join(", ")||"\u2014"}`);return{success:!0,active:s}}catch(s){let o=w(s);return A(o)}}async suggest(e=null,t=process.cwd(),r={}){try{let s=await Rg(t),o=s.map(i=>{let c=js[i];return{name:i,description:c?.description??""}});if(r.md){let i=["# Suggested packs for this project",""];for(let c of o)i.push(`- **${c.name}** \u2014 ${c.description}`);i.push(""),i.push(`Activate with: \`prjct seed add ${s.join(",")}\``),console.log(i.join(`
|
|
1664
|
-
`))}else g.info(`Suggested: ${s.join(", ")}`),g.info(`Activate: prjct seed add ${s.join(",")}`);return{success:!0,suggested:s}}catch(s){let o=w(s);return A(o)}}}});var Pa={};j(Pa,{InstallCommands:()=>xy});var xy,Aa=h(()=>{"use strict";Ao();K();jo();Lc();F();Hf();
|
|
1664
|
+
`))}else g.info(`Suggested: ${s.join(", ")}`),g.info(`Activate: prjct seed add ${s.join(",")}`);return{success:!0,suggested:s}}catch(s){let o=w(s);return A(o)}}}});var Pa={};j(Pa,{InstallCommands:()=>xy});var xy,Aa=h(()=>{"use strict";Ao();K();jo();Lc();F();Hf();me();ie();ye();xy=class extends G{static{a(this,"InstallCommands")}async install(e=null,t=process.cwd(),r={}){try{let s=await Wp(),i=(await x.readConfig(t).catch(()=>null))?.projectId?await cn(t):null,l=(await qr(t)).filter(y=>y.detected),d=l.some(y=>y.runtime.id==="codex")?await ql():null,p=fo.length,m=s.hooksPruned>0?`, ${s.hooksPruned} retired removed`:"",f=`installed Claude hooks adapter: ${s.hooksWritten} new, ${s.alreadyPresent} already present${m} (total ${p} hooks)`;if(r.md)console.log(["# prjct install","","## Universal project surface",i?`- AGENTS.md: ${i.agentsMd.action}`:"- skipped: not inside an initialized prjct project",...i?.claudeMd?[`- CLAUDE.md adapter: ${i.claudeMd.action}`]:[],...i?.ideRules.length?i.ideRules.map(y=>`- project rule adapter: \`${y}\``):[],...d?[`- Codex config: ${d.skipped==="user-managed"?"user-managed MCP preserved":d.changed?"updated":"already ready"}`,`- Codex status line: ${d.statusLineChanged?"installed":"already configured"}`]:[],"","## Claude hooks adapter",`Wrote to \`${s.settingsPath}\`.`,"",`- new: ${s.hooksWritten}`,`- already present: ${s.alreadyPresent}`,`- retired removed: ${s.hooksPruned}`,`- total expected: ${p}`,"","## Runtime detection",...l.map(y=>`- ${y.runtime.displayName}: ${y.supportLevel}`),"","> Claude hooks are an adapter, not the universal layer. AGENTS.md + MCP/CLI --md are the portable baseline.","> Only `_prjctManaged: true` hook entries were touched. Your other hooks are untouched."].join(`
|
|
1665
1665
|
`));else{if(g.done(f),g.info(`settings: ${s.settingsPath}`),i){g.info(`AGENTS.md: ${i.agentsMd.action}`);for(let y of i.ideRules)g.info(`adapter: ${y}`)}else g.info("project surface: skipped (not inside an initialized prjct project)");if(d){let y=d.skipped==="user-managed"?"user-managed MCP preserved":d.changed?"updated":"already ready";g.info(`Codex config: ${y}`),g.info(`Codex status line: ${d.statusLineChanged?"installed":"already configured"}`)}}return{success:!0,hooksWritten:s.hooksWritten,projectSurface:i?.agentsMd.action??"skipped",detectedRuntimes:l.length,codexConfig:d?{path:d.path,changed:d.changed,skipped:d.skipped,statusLineChanged:d.statusLineChanged??!1}:null}}catch(s){let o=w(s);return A(o)}}async uninstall(e=null,t=process.cwd(),r={}){try{let s=await Bp(),o=`removed ${s.hooksRemoved} prjct hook(s)`;return r.md?console.log(`# prjct hooks removed
|
|
1666
1666
|
|
|
1667
1667
|
- removed: ${s.hooksRemoved}
|
|
1668
1668
|
- settings: \`${s.settingsPath}\`
|
|
1669
|
-
`):g.done(o),{success:!0,hooksRemoved:s.hooksRemoved}}catch(s){let o=w(s);return A(o)}}async status(e=null,t=process.cwd()){try{let r=await qp();return{success:!0,installed:r.installed,expected:r.expected}}catch(r){return Be(r)}}}});var Ay={};j(Ay,{CaptureCommands:()=>Py});function mG(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}var Py,jy=h(()=>{"use strict";Te();F();
|
|
1670
|
-
`,"utf-8")}},Ls=new Iy});var Dy={};j(Dy,{McpCommands:()=>$y});import*as Ut from"@clack/prompts";import Er from"chalk";var $y,My=h(()=>{"use strict";DA();F();
|
|
1669
|
+
`):g.done(o),{success:!0,hooksRemoved:s.hooksRemoved}}catch(s){let o=w(s);return A(o)}}async status(e=null,t=process.cwd()){try{let r=await qp();return{success:!0,installed:r.installed,expected:r.expected}}catch(r){return Be(r)}}}});var Ay={};j(Ay,{CaptureCommands:()=>Py});function mG(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}var Py,jy=h(()=>{"use strict";Te();F();me();ie();Ri();sl();ye();Py=class extends G{static{a(this,"CaptureCommands")}async capture(e=null,t=process.cwd(),r={}){try{if(!e||!e.trim())return g.info('Usage: prjct capture "<anything>" [--tags k:v,...]'),{success:!1,error:"Content required"};let s=e.trim(),o=Eo(s);if(o.length>0&&!r.force)return g.fail(`refusing to capture content that looks like a secret (${o.join(", ")}). Re-run with --force if intentional.`),{success:!1,error:"Secret-like content detected"};let i=go(s);if(i.length>0&&!r.force)return g.fail(`refusing to capture content that looks like prompt injection (${i.join(", ")}). Captures are inlined into LLM context \u2014 re-run with --force if intentional.`),{success:!1,error:"Prompt-injection-like content detected"};let c=mG(r.tags),l=await this.ensureProjectInit(t);if(!l.success)return l;await O.remember(t,{type:"inbox",content:s,tags:c,provenance:"declared"});let u=s.length>60?`${s.slice(0,57)}\u2026`:s;return r.md?console.log(`\u2713 captured: ${u}`):g.done(`captured: ${u}`),{success:!0,type:"inbox",content:s,tags:c}}catch(s){let o=w(s);return A(o)}}};a(mG,"parseFlagTags")});import _y from"node:fs";import fG from"node:os";import ad from"node:path";var gG,Iy,Ls,DA=h(()=>{"use strict";gG=[{name:"claude_ai_PostHog",displayName:"PostHog",description:"Product analytics, dashboards, feature flags, surveys",estimatedTools:280},{name:"claude_ai_Atlassian",displayName:"Atlassian (Jira + Confluence)",description:"Jira issues, Confluence pages, Compass components",estimatedTools:40},{name:"claude_ai_Supabase",displayName:"Supabase",description:"Postgres projects, migrations, edge functions, branches",estimatedTools:30},{name:"claude_ai_Google_Drive",displayName:"Google Drive",description:"Read files from your Drive (auth-gated)",estimatedTools:2},{name:"claude_ai_Linear",displayName:"Linear",description:"Issues, projects, comments",estimatedTools:25},{name:"claude_ai_GitHub",displayName:"GitHub",description:"Repos, PRs, issues (claude.ai integration, separate from gh CLI)",estimatedTools:35},{name:"claude_ai_Notion",displayName:"Notion",description:"Pages, databases, blocks",estimatedTools:20},{name:"claude_ai_Slack",displayName:"Slack",description:"Messages, channels, threads",estimatedTools:15}],Iy=class{static{a(this,"McpService")}async list(e){let t=new Set(this.readDenied(e).map(i=>i.serverName)),r=[];for(let i of gG)r.push({name:i.name,displayName:i.displayName,source:"cloud",description:i.description,estimatedTools:i.estimatedTools,denied:t.has(i.name)});let s=this.readJson(ad.join(e,".mcp.json"));if(s?.mcpServers)for(let i of Object.keys(s.mcpServers))r.push({name:i,displayName:i,source:"project",description:"stdio server declared in .mcp.json",estimatedTools:0,denied:t.has(i)});let o=this.readJson(ad.join(fG.homedir(),".claude.json"));if(o?.mcpServers)for(let i of Object.keys(o.mcpServers))r.push({name:i,displayName:i,source:"global",description:"stdio server declared in ~/.claude.json",estimatedTools:0,denied:t.has(i)});return r}async deny(e,t){let r=this.localSettingsPath(e),s=this.readJson(r)??{},o=s.deniedMcpServers??[];return o.some(c=>c.serverName===t)?{alreadyDenied:!0,settingsPath:r}:(s.deniedMcpServers=[...o,{serverName:t}],this.writeJson(r,s),{alreadyDenied:!1,settingsPath:r})}async allow(e,t){let r=this.localSettingsPath(e),s=this.readJson(r)??{},o=s.deniedMcpServers??[],i=o.filter(c=>c.serverName!==t);return i.length===o.length?{wasDenied:!1,settingsPath:r}:(i.length===0?delete s.deniedMcpServers:s.deniedMcpServers=i,this.writeJson(r,s),{wasDenied:!0,settingsPath:r})}async setEnabled(e,t,r){let s=this.localSettingsPath(e),o=this.readJson(s)??{},i=new Set((o.deniedMcpServers??[]).map(p=>p.serverName)),c=new Set(t),l=new Set(i);for(let p of r)c.has(p)?l.delete(p):l.add(p);let u=[],d=[];for(let p of r){let m=i.has(p),f=l.has(p);!m&&f?u.push(p):m&&!f&&d.push(p)}return u.length===0&&d.length===0?{nowDenied:u,nowAllowed:d,settingsPath:s}:(l.size===0?delete o.deniedMcpServers:o.deniedMcpServers=Array.from(l).map(p=>({serverName:p})),this.writeJson(s,o),{nowDenied:u,nowAllowed:d,settingsPath:s})}localSettingsPath(e){return ad.join(e,".claude","settings.local.json")}readDenied(e){return this.readJson(this.localSettingsPath(e))?.deniedMcpServers??[]}readJson(e){try{let t=_y.readFileSync(e,"utf-8");return JSON.parse(t)}catch{return null}}writeJson(e,t){_y.mkdirSync(ad.dirname(e),{recursive:!0}),_y.writeFileSync(e,`${JSON.stringify(t,null,2)}
|
|
1670
|
+
`,"utf-8")}},Ls=new Iy});var Dy={};j(Dy,{McpCommands:()=>$y});import*as Ut from"@clack/prompts";import Er from"chalk";var $y,My=h(()=>{"use strict";DA();F();me();Ke();ie();ye();$y=class extends G{static{a(this,"McpCommands")}async mcp(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??null,i=s[1]??null;if(o===null)return!r.md&&!!process.stdin.isTTY&&!!process.stdout.isTTY?this.interactive(t):this.list(t,r);switch(o){case"list":return this.list(t,r);case"status":return this.status(t,r);case"deny":return this.deny(i,t,r);case"allow":return this.allow(i,t,r);default:return g.fail(`Unknown mcp subcommand: ${o}. Use: list, status, deny <name>, allow <name>.`),{success:!1,error:"Unknown mcp subcommand"}}}async interactive(e){try{let t=await Ls.list(e);if(t.length===0)return g.info("No MCP servers detected for this project."),{success:!0,servers:[]};let r=a(b=>b.reduce((P,T)=>P+T.estimatedTools,0),"sumTools"),s=t.filter(b=>!b.denied),o=r(s),i=r(t),c=e.split("/").pop()??"this project";Ut.intro(Er.cyan.bold(`MCP servers \u2014 ${c}`)),Ut.note([`${s.length}/${t.length} active \xB7 ~${o} of ~${i} tools loaded`,Er.dim("Space toggles \xB7 Enter applies \xB7 Esc cancels")].join(`
|
|
1671
1671
|
`),"Context cost");let l={cloud:"cloud",project:"project",global:"global"},u=[...t].sort((b,P)=>{if(b.source!==P.source){let T=["cloud","project","global"];return T.indexOf(b.source)-T.indexOf(P.source)}return P.estimatedTools-b.estimatedTools}),d=await Ut.multiselect({message:"Keep enabled in this project:",options:u.map(b=>({value:b.name,label:this.optionLabel(b,l[b.source]),hint:b.description})),initialValues:u.filter(b=>!b.denied).map(b=>b.name),required:!1});if(Ut.isCancel(d))return Ut.cancel("No changes."),{success:!0,cancelled:!0};let p=d,m=await Ls.setEnabled(e,p,t.map(b=>b.name)),f=r(t.filter(b=>p.includes(b.name))),y=f-o;if(m.nowDenied.length===0&&m.nowAllowed.length===0)return Ut.outro(Er.dim("No changes.")),{success:!0,unchanged:!0};let v=[];m.nowDenied.length>0&&v.push(Er.red(`\u2717 denied (${m.nowDenied.length}): ${m.nowDenied.join(", ")}`)),m.nowAllowed.length>0&&v.push(Er.green(`\u2713 allowed (${m.nowAllowed.length}): ${m.nowAllowed.join(", ")}`));let k=y>0?"+":"";return v.push(""),v.push(`Tools loaded: ${o} \u2192 ${f} (${Er.bold(`${k}${y}`)})`),Ut.note(v.join(`
|
|
1672
1672
|
`),`Wrote ${this.relativeSettingsPath(m.settingsPath,e)}`),Ut.outro(Er.yellow("Restart Claude Code to apply (MCP config is cached at session start).")),{success:!0,...m,beforeTools:o,afterTools:f}}catch(t){let r=w(t);return A(r)}}optionLabel(e,t){let r=e.estimatedTools>0?Er.dim(` ~${e.estimatedTools} tools`):"";return`${Er.dim(`[${t}]`)} ${e.displayName}${r}`}relativeSettingsPath(e,t){return e.startsWith(t)?e.slice(t.length+1):e}async list(e,t){try{let r=await Ls.list(e);return t.md?console.log(this.formatMd(r,!1)):this.formatTerminal(r,!1),{success:!0,servers:r}}catch(r){let s=w(r);return A(s)}}async status(e,t){try{let s=(await Ls.list(e)).filter(o=>o.denied);return t.md?console.log(this.formatMd(s,!0)):this.formatTerminal(s,!0),{success:!0,denied:s}}catch(r){let s=w(r);return A(s)}}async deny(e,t,r){if(!e)return g.fail("Usage: prjct mcp deny <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await Ls.deny(t,e),o=s.alreadyDenied?"already denied":"denied",i=`${e} ${o} in this project`;return r.md?console.log(_(W("Done",i),W("What to do next",this.restartHint(s.settingsPath)))):(g.done(i),console.log(this.restartHint(s.settingsPath))),{success:!0,...s}}catch(s){let o=w(s);return A(o)}}async allow(e,t,r){if(!e)return g.fail("Usage: prjct mcp allow <serverName>"),{success:!1,error:"Missing serverName"};try{let s=await Ls.allow(t,e),o=s.wasDenied?`${e} re-allowed in this project`:`${e} was not denied \u2014 nothing to change`;return r.md?console.log(_(W("Done",o),s.wasDenied?W("What to do next",this.restartHint(s.settingsPath)):null)):(g.done(o),s.wasDenied&&console.log(this.restartHint(s.settingsPath))),{success:!0,...s}}catch(s){let o=w(s);return A(o)}}formatTerminal(e,t){if(e.length===0){t?g.info("No MCP servers denied in this project."):g.info("No MCP servers detected.");return}let r=e.filter(o=>o.denied).reduce((o,i)=>o+i.estimatedTools,0),s=e.filter(o=>!o.denied).reduce((o,i)=>o+i.estimatedTools,0);t||console.log(`
|
|
1673
1673
|
MCP servers \u2014 this project (${process.cwd().split("/").pop()})
|
|
@@ -1685,7 +1685,7 @@ Nothing to show.
|
|
|
1685
1685
|
`}return`${n.replace(/\s+$/,"")}
|
|
1686
1686
|
|
|
1687
1687
|
${e}
|
|
1688
|
-
`}var Ny,MA,NA,Ly,kG,Hy=h(()=>{"use strict";K();Te();hl();F();Y();
|
|
1688
|
+
`}var Ny,MA,NA,Ly,kG,Hy=h(()=>{"use strict";K();Te();hl();F();Y();me();Ke();ie();Ne();ye();Ny=yG(hG),MA="<!-- prjct-team:start - DO NOT REMOVE THIS MARKER -->",NA="<!-- prjct-team:end - DO NOT REMOVE THIS MARKER -->";a(Oy,"renderTeamMirror");Ly=class extends G{static{a(this,"TeamCommands")}async team(e=null,t=process.cwd(),r={}){if(e==="check")return this.check(t,r);try{let s={required:r.required===!0,minVersion:r.minVersion??ae??"0.0.0",enrolledAt:new Date().toISOString(),enrolledBy:null},o=Vo.join(t,".prjct","team.json"),i=Vo.join(t,".claude","CLAUDE.md"),c=await this.ensureProjectInit(t);if(!c.success)return c;let l=await x.getProjectId(t);if(!l)return A("No prjct project. Run `prjct init` first.",r);Co.set(l,s);try{await as(o,Oy(s))}catch(P){let T=w(P);await O.remember(t,{type:"inbox",content:`team.json mirror write failed: ${T}`,tags:{"mirror-drift":"1"},provenance:"declared"}).catch(()=>{})}await Fs.mkdir(Vo.dirname(i),{recursive:!0});let u=bG(s),d="";try{d=await Fs.readFile(i,"utf-8")}catch{}let p=vG(d,u,MA,NA);await Fs.writeFile(i,p,"utf-8");let m=!1,f=[o,i];try{await Ny("git rev-parse --show-toplevel",{cwd:t});let P=null;r.enforce===!0&&(P=Vo.join(t,".githooks","pre-commit"),await Fs.mkdir(Vo.dirname(P),{recursive:!0}),await Fs.writeFile(P,kG,"utf-8"),await Fs.chmod(P,493),await Ny("git config core.hooksPath .githooks",{cwd:t}),f.push(P)),await Ny(`git add ${f.map(T=>JSON.stringify(T)).join(" ")}`,{cwd:t}),m=!0}catch{}let y=r.enforce?" + pre-commit enforce":"",v=`${s.required?"\u2713 team mode (required)":"\u2713 team mode (optional)"}${y} \u2014 minVersion ${s.minVersion}`,k=m?`Staged: ${f.map(P=>P.replace(`${t}/`,"")).join(", ")}`:"Files written but not staged (no git repo or git missing).",b=["1. Review the diff: `git diff --staged`",'2. Commit: `git commit -m "chore: enroll repo in prjct team mode"`',"3. Push: `git push`","4. Teammates run `curl -sSL https://raw.githubusercontent.com/jlopezlira/prjct-cli/main/scripts/install-via-claude.sh | bash` (or `npm install -g prjct-cli@latest`).",...r.enforce?["5. **Each teammate** runs `git config core.hooksPath .githooks` once (or `prjct team --enforce` to do it automatically)."]:[]].join(`
|
|
1689
1689
|
`);return r.md?console.log(_(W("Team mode enrolled",v),W("Files",k),W("Next",b))):(g.done(v),console.log(k),console.log(`
|
|
1690
1690
|
Next steps:`),console.log(b)),{success:!0,teamConfig:s,staged:m,teamPath:o,claudeMdPath:i}}catch(s){let o=w(s);return A(o)}}async check(e=process.cwd(),t={}){try{let r=await this.ensureProjectInit(e);if(!r.success)return r;let s=await x.getProjectId(e);if(!s)return A("No prjct project. Run `prjct init` first.",t);let o=Vo.join(e,".prjct","team.json"),i=Co.get(s),c=null;try{c=await Fs.readFile(o,"utf-8")}catch{c=null}if(i===null&&c!==null){let u;try{u=JSON.parse(c)}catch{return L(`cannot parse ${o} \u2014 fix or delete the file before running team check again`,t)}let d={required:typeof u.required=="boolean"?u.required:!1,minVersion:typeof u.minVersion=="string"?u.minVersion:ae??"0.0.0",enrolledAt:typeof u.enrolledAt=="string"?u.enrolledAt:new Date().toISOString(),enrolledBy:typeof u.enrolledBy=="string"?u.enrolledBy:null};Co.set(s,d),await as(o,Oy(d));let p="\u2713 team check: migrated disk \u2192 DB; mirror rewritten";return t.md?console.log(`> ${p}`):g.done(p),{success:!0,healed:!0,migrated:!0}}if(i!==null){let u=fl(i);if((c===null?null:wG(c,i))===u){let m="\u2713 team check: mirror in sync";return t.md?console.log(`> ${m}`):g.done(m),{success:!0,healed:!1}}await as(o,Oy(i));let p="\u2713 team check: drift detected; mirror rewritten from DB";return t.md?console.log(`> ${p}`):g.done(p),{success:!0,healed:!0}}let l="\u2713 team check: no enrollment configured";return t.md?console.log(`> ${l}`):g.done(l),{success:!0,healed:!1,empty:!0}}catch(r){return A(w(r),t)}}};a(wG,"canonicalizeDiskTeamJson");kG=`#!/usr/bin/env sh
|
|
1691
1691
|
# prjct team enforce \u2014 blocks commits when team.json says required:true
|
|
@@ -1712,11 +1712,11 @@ fi
|
|
|
1712
1712
|
|
|
1713
1713
|
exit 0
|
|
1714
1714
|
`;a(bG,"teamClaudeMdBlock");a(vG,"upsertBetweenMarkers")});var Gy={};j(Gy,{ConfigCommands:()=>Uy});function SG(n){let e=n.toLowerCase();if(e==="true"||e==="on")return"on";if(e==="false"||e==="off")return"off";let t=Number(n);return!Number.isNaN(t)&&/^-?\d+(\.\d+)?$/.test(n)?t:n}var Uy,Wy=h(()=>{"use strict";ui();Ke();ie();ye();Uy=class extends G{static{a(this,"ConfigCommands")}async config(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"list";switch(o){case"list":return this.list(r);case"get":return this.get(s[1],r);case"set":return this.set(s[1],s.slice(2).join(" "),r);case"unset":return this.unset(s[1],r);default:return g.fail(`Unknown config subcommand: ${o}. Use: list, get <k>, set <k> <v>, unset <k>.`),{success:!1,error:"Unknown config subcommand"}}}list(e){let t=ak(),r=Object.keys(t).sort();if(e.md){let s=r.length===0?"_No global config set._":r.map(o=>`- \`${o}\`: \`${JSON.stringify(t[o])}\``).join(`
|
|
1715
|
-
`);console.log(_(W("Global config",s),W("Path",`\`${ck()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let r=yt(e);return t.md?console.log(_(W(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=SG(t);_e(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(_(W("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};Id(e);let r=`Removed ${e}`;return t.md?console.log(_(W("Unset",r))):g.done(r),{success:!0,key:e}}};a(SG,"parseValue")});var qy={};j(qy,{EmbeddingsCommands:()=>By});function EG(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(n))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function es(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function TG(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var By,Vy=h(()=>{"use strict";Uu();Lu();F();
|
|
1715
|
+
`);console.log(_(W("Global config",s),W("Path",`\`${ck()}\``)))}else if(r.length===0)g.info("No global config set.");else for(let s of r)console.log(` ${s} = ${JSON.stringify(t[s])}`);return{success:!0,config:t}}get(e,t){if(!e)return g.fail("Usage: prjct config get <key>"),{success:!1,error:"Missing key"};let r=yt(e);return t.md?console.log(_(W(e,r===void 0?"_(unset)_":`\`${JSON.stringify(r)}\``))):r===void 0?g.info("(unset)"):console.log(JSON.stringify(r)),{success:!0,key:e,value:r}}set(e,t,r){if(!e||t===void 0||t==="")return g.fail("Usage: prjct config set <key> <value>"),{success:!1,error:"Missing key or value"};let s=SG(t);_e(e,s);let o=`${e} = ${JSON.stringify(s)}`;return r.md?console.log(_(W("Set",o))):g.done(o),{success:!0,key:e,value:s}}unset(e,t){if(!e)return g.fail("Usage: prjct config unset <key>"),{success:!1,error:"Missing key"};Id(e);let r=`Removed ${e}`;return t.md?console.log(_(W("Unset",r))):g.done(r),{success:!0,key:e}}};a(SG,"parseValue")});var qy={};j(qy,{EmbeddingsCommands:()=>By});function EG(n){if(/\b401\b|invalid_api_key|incorrect api key|unauthor/i.test(n))return"The endpoint rejected the key (401). The base URL must match the key's provider \u2014 e.g. an OpenRouter key (sk-or-\u2026) needs `--base-url https://openrouter.ai/api/v1`, not OpenAI's. Re-set with: prjct embeddings set --key <api-key> --base-url <url>";if(/\b404\b|not found/i.test(n))return"No /embeddings route at that base URL (404). Check the base URL is the provider's OpenAI-compatible root (e.g. https://openrouter.ai/api/v1, https://api.openai.com/v1).";if(/ENOTFOUND|ECONNREFUSED|fetch failed|getaddrinfo|ETIMEDOUT/i.test(n))return"Could not reach the endpoint. Check the base URL and your network: prjct embeddings status"}function es(n,e){let t=n.indexOf(`--${e}`);if(t>=0&&n[t+1])return n[t+1];let r=n.find(s=>s.startsWith(`--${e}=`));return r?r.slice(e.length+3):void 0}function TG(n){if(!n?.trim())return;let e={};for(let t of n.split(",")){let r=t.indexOf("=");if(r<=0)continue;let s=t.slice(0,r).trim(),o=t.slice(r+1).trim();s&&(e[s]=o)}return Object.keys(e).length?e:void 0}var By,Vy=h(()=>{"use strict";Uu();Lu();F();me();Ke();ie();ye();a(EG,"embeddingsFailureHint");a(es,"flag");a(TG,"parseHeaderPairs");By=class extends G{static{a(this,"EmbeddingsCommands")}async embeddings(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean),o=s[0]??"status";switch(o){case"set":return this.set(s.slice(1),r);case"status":return this.status(r);case"test":return this.test(r);case"clear":return this.clear(r);default:return A(`Unknown subcommand '${o}'. Use: set --key <K> [--model <M>] [--base-url <U>] | status | test | clear`,r)}}async set(e,t){let r=t.key??es(e,"key"),s=t.model??es(e,"model"),o=t.baseUrl??es(e,"base-url")??es(e,"baseUrl"),i;if(!o&&r){let y=Ah(r);y&&(o=y.baseUrl,i=y.provider)}let c=t.authHeader??es(e,"auth-header"),l=t.authScheme??es(e,"auth-scheme"),u=l===void 0?void 0:/^none$/i.test(l)?"":l,d=TG(t.headers??es(e,"headers")),p=t.query??es(e,"query");if(!r&&!s&&!o&&c===void 0&&u===void 0&&!d&&p===void 0)return A('Nothing to set. Usage: prjct embeddings set --key <api-key> [--model <id>] [--base-url <url>] [--auth-header <h>] [--auth-scheme <s|none>] [--headers "k=v,..."] [--query <qs>]');let m;if(r)try{m=await oP(r)}catch(y){return A(`Could not store the key securely: ${w(y)}`)}let f=Mh({model:s,baseUrl:o,authHeader:c,authScheme:u,extraHeaders:d,query:p});return t.md?(console.log(_(W("Embeddings configured","Global embeddings now apply to all projects."),Zt({provider:f.provider,model:f.model,"base URL":f.baseUrl,detected:i,"auth header":f.authHeader,auth:f.authScheme===void 0?void 0:f.authScheme||"(raw key, no scheme)",query:f.query,headers:f.extraHeaders?Object.keys(f.extraHeaders).join(", "):void 0,"api key":m?`stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`:void 0}),W("Next","Run `prjct embeddings test --md` to validate now."))),{success:!0}):(g.done("Global embeddings configured (applies to all projects)"),i&&g.info(`detected: ${i} (from key prefix)`),g.info(`provider: ${f.provider}`),g.info(`model: ${f.model}`),g.info(`base URL: ${f.baseUrl}`),f.authHeader&&g.info(`auth hdr: ${f.authHeader}`),f.authScheme!==void 0&&g.info(`auth: ${f.authScheme?f.authScheme:"(raw key, no scheme)"}`),f.query&&g.info(`query: ${f.query}`),f.extraHeaders&&g.info(`headers: ${Object.keys(f.extraHeaders).join(", ")}`),m&&g.info(`api key: stored in ${m==="keychain"?"macOS Keychain":"~/.prjct-cli/config/embeddings.key (0600)"}`),g.info("Each project re-vectorizes on its next session (Stop hook). Run `prjct embeddings test` to validate now."),{success:!0})}async status(e){let t=Ms(),r=await sP();return t?e.md?(console.log(_(W("Embeddings","Global embeddings are configured."),Zt({provider:t.provider,model:t.model,"base URL":t.baseUrl,"auth header":t.authHeader,auth:t.authScheme===void 0?void 0:t.authScheme||"(raw key, no scheme)",query:t.query,headers:t.extraHeaders?Object.keys(t.extraHeaders).join(", "):void 0,"api key":r==="none"?"MISSING - set with `prjct embeddings set --key <api-key>`":`present (${r})`}))),{success:!0,configured:!0}):(g.done("Global embeddings: configured"),g.info(`provider: ${t.provider}`),g.info(`model: ${t.model}`),g.info(`base URL: ${t.baseUrl}`),t.authHeader&&g.info(`auth hdr: ${t.authHeader}`),t.authScheme!==void 0&&g.info(`auth: ${t.authScheme?t.authScheme:"(raw key, no scheme)"}`),t.query&&g.info(`query: ${t.query}`),t.extraHeaders&&g.info(`headers: ${Object.keys(t.extraHeaders).join(", ")}`),g.info(`api key: ${r==="none"?"MISSING \u2014 set with `prjct embeddings set --key <api-key>`":`present (${r})`}`),{success:!0,configured:!0}):e.md?(console.log(_(W("Embeddings","Global embeddings are not configured. Recall uses the built-in local subword embedder."),Zt({"api key":r==="none"?"none":`present (${r})`}),W("Next","Set one with `prjct embeddings set --key <api-key> --md`."))),{success:!0,configured:!1}):(g.info("Global embeddings: not configured \u2014 using the built-in local subword embedder."),g.info(`api key: ${r==="none"?"none":`present (${r})`}`),g.info("Set one with: prjct embeddings set --key <api-key>"),{success:!0,configured:!1})}async test(e){let t=Hu(null);try{let[r]=await t.embed(["prjct embeddings connectivity probe"]);return!r||r.length===0?A(`Provider '${t.model}' returned an empty vector.`,e):e.md?(console.log(_(W("Embeddings test",`Provider '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal?W("Next","This is the local embedder. Set a key to upgrade: `prjct embeddings set --key <api-key> --md`."):null)),{success:!0,model:t.model,dims:r.length}):(g.done(`OK \u2014 '${t.model}' returned a ${r.length}-dim vector.`),t.isLocal&&g.info("This is the local embedder. Set a key to upgrade: prjct embeddings set --key <api-key>"),{success:!0,model:t.model,dims:r.length})}catch(r){let s=w(r);Tn(`Embedding test failed for '${t.model}'.`,e),Ef(s,e);let o=EG(s);return o&&Ef(o,e),{success:!1,error:s}}}async clear(e){return await iP(),Nh(),e.md?(console.log(_(W("Embeddings cleared","Semantic recall now falls back to the local embedder."),Zt({"default model":ma}))),{success:!0}):(g.done("Cleared global embeddings \u2014 semantic recall falls back to the local embedder."),g.info(`(Default model when you reconfigure: ${ma}.)`),{success:!0})}}});var Xy={};j(Xy,{GuardCommands:()=>Jy});var Jy,zy=h(()=>{"use strict";Vt();Te();Mu();ie();ye();Lt();Jy=class extends G{static{a(this,"GuardCommands")}async guard(e=null,t=process.cwd(),r={}){let s=(e??"").trim().split(/\s+/).filter(Boolean)[0];if(!s){let u="Usage: prjct guard <file> \u2014 surfaces preventive memory before you edit it.";return r.md?console.log(`> ${u}`):g.fail(u),{success:!1,error:"Missing file argument"}}let o=await se(t,r);if(!o.ok)return o.result;let i=typeof r.limit=="number"&&r.limit>0?r.limit:3,c;try{c=O.recallForFile(o.value,s,i)}catch{c=[]}Wo(o.value,t,c.map(u=>u.id));let l=s.split("/").pop()??s;if(c.length===0){let u=`No preventive memory recorded against \`${l}\` \u2014 clear to edit.`;return r.md?console.log(`> ${u}`):g.done(`No preventive memory for ${l} \u2014 clear to edit.`),{success:!0,file:s,hits:0}}if(r.md){let u=[`# prjct: heads up before editing \`${l}\``,"","Preventive memory recorded against this file \u2014 check before you change it:",""];for(let d of c)u.push(`- **[${fs(d)}] ${Oe(d)}** \u2014 ${$r(d.content)} \`${d.id}\``);u.push("","> Surfaced as prevention. Apply if relevant; ignore if not."),console.log(u.join(`
|
|
1716
1716
|
`))}else{g.info(`\u26A0 ${c.length} preventive memory entr${c.length===1?"y":"ies"} for ${l}:`);for(let u of c)g.info(` \u2022 [${fs(u)}] ${Oe(u)} \u2014 ${$r(u.content,120)} (${u.id})`)}return{success:!0,file:s,hits:c.length}}}});var HA={};j(HA,{buildInventory:()=>PG,renderInventoryMd:()=>DG});import OA from"node:fs/promises";import Jo from"node:path";async function PG(n,e){let t=$e.list(e,{includeArchived:!0}),r={};for(let d of t)r[d.status]=(r[d.status]??0)+1;let s=new Map,o=new Set;for(let d of t){let p=AG(d);if(!p)continue;o.add(p);let m=s.get(p)??[];m.push(d),s.set(p,m)}let i=await jG(n);for(let d of i)o.add(d);let c=[],l=[];for(let d of[...o].sort()){let p=s.get(d)??[],m=await _G(n,d),f=await IG(n,d,p),y=p.length>0?p.reduce((k,b)=>b.updatedAt>k?b.updatedAt:k,""):null,v=!1;for(let k of p.filter(b=>b.status==="shipped")){let b=await $G(n,k);l.push({specId:k.id,title:k.title,status:k.status,drift:b.drift,locChanged:b.locChanged,cosmeticOnly:b.cosmeticOnly}),b.drift===!0?v=!0:b.drift==="unknown"&&v===!1&&(v="unknown")}c.push({module:d,specCount:p.length,coveredFiles:f,totalFiles:m,coveredPct:m===0?null:Math.round(f/m*1e4)/100,lastUpdated:y||null,drift:v})}let u=c.filter(d=>d.specCount===0).map(d=>d.module);return{generatedAt:new Date().toISOString(),projectPath:n,totalSpecs:t.length,byStatus:r,modules:c,driftDetail:l,uncoveredModules:u}}function AG(n){let e=n.content.scope[0];if(!e)return null;let t=e.match(/([a-zA-Z0-9_./-]+\/[a-zA-Z0-9_-]+)/);if(!t)return null;let r=t[1].split("/").slice(0,2);return r.length===2?r.join("/"):null}async function jG(n){let e=Jo.join(n,"core");try{return(await OA.readdir(e,{withFileTypes:!0})).filter(r=>r.isDirectory()&&!r.name.startsWith(".")&&!r.name.startsWith("__")).map(r=>`core/${r.name}`)}catch{return[]}}async function _G(n,e){let t=Jo.join(n,e),r=0;try{await Ky(t,async s=>{let o=Jo.relative(n,s);LA(o)||FA(o)&&r++})}catch{}return r}async function IG(n,e,t){let r=Jo.join(n,e),s=new Set;for(let i of t)for(let c of i.content.scope){let l=c.match(/[a-zA-Z0-9_./-]+\.[a-z]+/);l&&s.add(l[0])}let o=0;try{await Ky(r,async i=>{let c=Jo.relative(n,i);if(!LA(c)&&FA(c)){for(let l of s)if(c===l||c.startsWith(l.endsWith("/")?l:`${l}/`)){o++;break}}})}catch{}return o}async function Ky(n,e){let t;try{t=await OA.readdir(n,{withFileTypes:!0})}catch{return}for(let r of t){if(r.name.startsWith(".")||r.name==="node_modules"||r.name==="dist")continue;let s=Jo.join(n,r.name);r.isDirectory()?await Ky(s,e):r.isFile()&&await e(s)}}function LA(n){return xG.some(e=>e.test(n))}function FA(n){return/\.(ts|tsx|js|jsx|mjs|cjs)$/.test(n)}async function $G(n,e){if(!e.shippedSha)return{drift:"unknown"};let t=e.content.scope.map(o=>o.match(/[a-zA-Z0-9_./-]+\.[a-z]+/)?.[0]??o.match(/[a-zA-Z0-9_./-]+\//)?.[0]).filter(o=>!!o);if(t.length===0)return{drift:"unknown"};let r=0;try{let{stdout:o}=await H("git",["diff","--shortstat",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.match(/(\d+) insertions?/),c=o.match(/(\d+) deletions?/);r=(i?Number.parseInt(i[1],10):0)+(c?Number.parseInt(c[1],10):0)}catch{return{drift:"unknown"}}if(r<=CG)return{drift:!1,locChanged:r,cosmeticOnly:!1};let s=!0;try{let{stdout:o}=await H("git",["log","--format=%s",`${e.shippedSha}..HEAD`,"--",...t],{cwd:n}),i=o.split(`
|
|
1717
1717
|
`).filter(Boolean);if(i.length===0)return{drift:!1,locChanged:r,cosmeticOnly:!0};s=i.every(c=>RG.test(c))}catch{s=!1}return{drift:!s,locChanged:r,cosmeticOnly:s}}function DG(n){let e=[];if(e.push("# Spec inventory"),e.push(""),e.push(`_${n.totalSpecs} specs across ${n.modules.length} modules \xB7 generated ${n.generatedAt}_`),e.push(""),Object.keys(n.byStatus).length>0){e.push("## By status");for(let[t,r]of Object.entries(n.byStatus))e.push(`- ${t}: ${r}`);e.push("")}e.push("## Coverage by module"),e.push(""),e.push("| Module | Specs | Files | Covered | % | Drift | Last updated |"),e.push("|---|---|---|---|---|---|---|");for(let t of n.modules){let r=t.coveredPct===null?"n/a":`${t.coveredPct}%`,s=t.drift===!0?"\u26A0\uFE0F yes":t.drift==="unknown"?"\u2754":"\u2713",o=t.lastUpdated?t.lastUpdated.slice(0,10):"\u2014";e.push(`| \`${t.module}\` | ${t.specCount} | ${t.totalFiles} | ${t.coveredFiles} | ${r} | ${s} | ${o} |`)}if(n.uncoveredModules.length>0){e.push(""),e.push("## Modules with NO specs");for(let t of n.uncoveredModules)e.push(`- \`${t}\``)}return e.join(`
|
|
1718
1718
|
`)}var CG,RG,xG,UA=h(()=>{"use strict";Ni();pe();CG=5,RG=/^(chore|style|format|fmt|docs|typo)(\(|:|!)/i,xG=[/(^|\/)types\.ts$/,/(^|\/)types\//,/\/__tests__\//,/\.d\.ts$/,/(^|\/)index\.ts$/,/\.test\.ts$/,/\.spec\.ts$/];a(PG,"buildInventory");a(AG,"inferModule");a(jG,"listTopLevelModules");a(_G,"countModuleFiles");a(IG,"countCoveredFiles");a(Ky,"walk");a(LA,"excluded");a(FA,"isCodeFile");a($G,"driftForSpec");a(DG,"renderInventoryMd")});var Qy={};j(Qy,{SpecCommands:()=>Yy,renderAuditDispatch:()=>Ig});function MG(n){if(!n)return{};let e={};for(let t of n.split(",")){let r=t.trim(),s=r.indexOf(":");s>0&&(e[r.slice(0,s)]=r.slice(s+1))}return e}function NG(n){let e=n.content,t=[`# ${n.title}`,"",`**id:** \`${n.id}\` \xB7 **status:** ${n.status} \xB7 **created:** ${n.createdAt}`,"","## Goal",e.goal];if(e.eli10&&t.push("","## ELI10",e.eli10),e.stakes&&t.push("","## Stakes",e.stakes),e.acceptance_criteria.length>0){t.push("","## Acceptance criteria");for(let r of e.acceptance_criteria)t.push(`- [ ] ${r}`)}if(e.scope.length>0){t.push("","## Scope");for(let r of e.scope)t.push(`- ${r}`)}if(e.out_of_scope.length>0){t.push("","## Out of scope");for(let r of e.out_of_scope)t.push(`- ${r}`)}if(e.risks.length>0){t.push("","## Risks");for(let r of e.risks)t.push(`- **${r.risk}** \u2014 ${r.mitigation}`)}if(e.test_plan.length>0){t.push("","## Test plan");for(let r of e.test_plan)t.push(`- ${r}`)}if(e.reviews&&Object.keys(e.reviews).length>0){t.push("","## Reviews");for(let[r,s]of Object.entries(e.reviews))t.push(`- **${r}:** ${s.verdict} \u2014 ${s.notes} _(${s.ts})_`)}return e.linked_tasks.length>0&&t.push("","## Linked tasks",...e.linked_tasks.map(r=>`- ${r}`)),e.notes&&t.push("","## Notes",e.notes),t.join(`
|
|
1719
|
-
`)}var Yy,Zy=h(()=>{"use strict";K();$g();Ho();F();al();
|
|
1719
|
+
`)}var Yy,Zy=h(()=>{"use strict";K();$g();Ho();F();al();me();ie();ye();Yy=class extends G{static{a(this,"SpecCommands")}async draft(e=null,t=process.cwd(),r={}){try{if(!e||!e.trim())return g.info('Usage: prjct spec "<title>" [--goal "..."] [--tags k:v,...]'),{success:!1,error:"Title required"};let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=r.goal?.trim()||e.trim(),i=MG(r.tags),c=await Ht.create(t,{title:e.trim(),content:{goal:o},tags:i,autoContext:!r.skipContext});return r.md?console.log(`\u2713 spec drafted: ${c.title}
|
|
1720
1720
|
|
|
1721
1721
|
spec_id: ${c.id}
|
|
1722
1722
|
status: ${c.status}
|
|
@@ -1744,7 +1744,7 @@ ${c.length} errors:`));for(let l of c)console.log(Le.red(` - ${l}`))}return con
|
|
|
1744
1744
|
`).map(t=>t.trim()).filter(Boolean).map(t=>{let r=t.match(/^([^:]+):(\d+):/);return r?`${r[1]}:${r[2]}`:t}).slice(0,100):[]}function ij(){return{loc:0,addedFiles:0,newDeps:0,leanMarkers:0}}function aj(n,e){let t=ij();for(let s of e.split(`
|
|
1745
1745
|
`))/^A\s/.test(s)&&(t.addedFiles+=1);let r=!1;for(let s of n.split(`
|
|
1746
1746
|
`)){if(s.startsWith("+++ ")){r=/\/package\.json$|^\+\+\+ b\/package\.json$/.test(s);continue}s.startsWith("+++")||s.startsWith("---")||((s.startsWith("+")||s.startsWith("-"))&&(t.loc+=1),s.startsWith("+")&&(r&&qG.test(s)&&(t.newDeps+=1),new RegExp(`\\b${nj}`,"i").test(s)&&(t.leanMarkers+=1)))}return t}function cj(n){let e=[];return n.newDeps>0&&e.push(`${n.newDeps} new dependency(ies) \u2014 verify none replaces a stdlib/native/one-liner.`),n.addedFiles>=rj&&e.push(`${n.addedFiles} new files \u2014 check for speculative abstraction / premature structure.`),n.leanMarkers>0&&e.push(`${n.leanMarkers} new \`lean:\` marker(s) \u2014 deferred simplifications; track via \`prjct lean debt\`.`),e}function tj(n,e){let t=[`- LOC changed: ${n.loc}`,`- New files: ${n.addedFiles}`,`- New deps: ${n.newDeps}`,`- New \`lean:\` markers: ${n.leanMarkers}`];if(e.length>0){t.push("","Flags:");for(let r of e)t.push(` - ${r}`)}else t.push("","_No blunt smells \u2014 the heuristic is clean; the rubric pass may still find subtler over-engineering._");return t.join(`
|
|
1747
|
-
`)}var Ia,nj,ej,rj,UG,aw,qG,oj,VG,uj=h(()=>{"use strict";K();Te();ws();F();pe();
|
|
1747
|
+
`)}var Ia,nj,ej,rj,UG,aw,qG,oj,VG,uj=h(()=>{"use strict";K();Te();ws();F();pe();me();Ke();ie();ye();Ia=["off","lite","full","ultra"],nj="lean:",ej=24e3,rj=5,UG=["Apply the lean decision ladder to this diff, in order:","1. Does this need to exist at all? (YAGNI \u2014 delete beats add)","2. Does the standard library already provide it?","3. Is there a native platform feature for it?","4. Does an already-installed dependency cover it? (never add one for a trivial need)","5. Can it be one line? Only then write minimal code.","Flag: speculative abstractions (interface/factory with one implementation),","premature config, needless new dependencies, clever over boring.","NON-NEGOTIABLE \u2014 never flag away: input/trust-boundary validation, data-loss","handling, security, accessibility, edge-case correctness, explicitly-asked scope."].join(`
|
|
1748
1748
|
`),aw=class extends G{static{a(this,"LeanCommands")}async lean(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.showStatus(t,r);if(Ia.includes(o))return this.setMode(o,t,r);switch(o){case"review":return this.review(t,r);case"audit":return this.audit(t,r);case"debt":return this.debt(t,r);default:return L(`Unknown lean subcommand "${o}". Use: review, audit, debt, or ${Ia.join("|")}.`,r)}}async showStatus(e,t){let r=await x.readConfig(e).catch(()=>null);if(!r?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=sj(r),o=[`Mode: ${s}${s==="off"?" (guidance + lean-debt detector dormant)":""}`,"Set: prjct lean off|lite|full|ultra","Review: prjct lean review \u2014 over-engineering in the current diff","Audit: prjct lean audit \u2014 repo-wide, over stored analysis","Debt: prjct lean debt \u2014 deferred `lean:` simplifications"];return t.md?console.log(_("## Lean",`> **Mode**: \`${s}\``,o.slice(1).join(`
|
|
1749
1749
|
`))):g.info(`Lean \u2014 ${o.join(`
|
|
1750
1750
|
`)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",r);s.lean={mode:e},await x.writeConfig(t,s);let o=e==="off"?"Lean mode off \u2014 guidance and the lean-debt detector are dormant.":`Lean mode \u2192 ${e}. Guidance biases toward YAGNI/KISS; the Stop-hook lean-debt detector is armed.`;return r.md?console.log(_("## Lean",`> ${o}`)):g.done(o),{success:!0,mode:e}}async review(e,t){try{if(!(await x.readConfig(e).catch(()=>null))?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=await WG(e);if(!s||!s.diff.trim()&&!s.nameStatus.trim()){let l="lean review: no changeset to review (nothing ahead of base, no working changes).";return console.log(t.md?_("## Lean review",`> ${l}`):l),{success:!0,smells:ij()}}let o=aj(s.diff,s.nameStatus),i=cj(o),c=s.diff.length>ej?`${s.diff.slice(0,ej)}
|
|
@@ -1767,15 +1767,15 @@ ${s.map(l=>`- ${l.content.split(`
|
|
|
1767
1767
|
> none logged.`,c=o.length>0?`### \`lean:\` markers in source (${o.length})
|
|
1768
1768
|
${o.map(l=>`- \`${l}\``).join(`
|
|
1769
1769
|
`)}`:"### `lean:` markers in source\n> none found.";console.log(_("## Lean debt",i,c))}else{g.info(`Lean debt \u2014 ${s.length} logged, ${o.length} \`lean:\` markers in source`);for(let i of s)g.info(` \u2022 ${i.content.split(`
|
|
1770
|
-
`)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return A(w(r),t)}}};a(sj,"effectiveMode");a(zo,"safeGit");a(GG,"resolveBase");a(WG,"collectReviewDiff");a(BG,"scanLeanMarkers");qG=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,oj=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(ij,"emptySmells");a(aj,"scanDiffSmells");a(cj,"leanFlags");a(tj,"formatSmells");VG={effectiveMode:sj,scanDiffSmells:aj,leanFlags:cj,LEAN_MODES:Ia,MANY_NEW_FILES:rj,OVER_ENGINEERING_RE:oj}});import JG from"node:path";function cw(){return JG.join(I.getStatePath(),"cloud-linked.json")}async function dd(){let n=await Ie(cw(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function dj(n,e){let r=(await dd()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await It(I.getStatePath()),await Se(cw(),r)}async function pj(n){let e=await dd();await It(I.getStatePath()),await Se(cw(),e.filter(t=>t.projectId!==n))}var lw=h(()=>{"use strict";be();Y();a(cw,"registryPath");a(dd,"listLinkedProjects");a(dj,"addLinkedProject");a(pj,"removeLinkedProject")});function mj(){return typeof globalThis.WebSocket=="function"}function XG(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function zG(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var pd,fj=h(()=>{"use strict";a(mj,"hasGlobalWebSocket");a(XG,"buildRealtimeUrl");a(zG,"backoffDelay");pd=class{static{a(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=XG(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=r=>{this.handleMessage(r?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=zG(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var uw,md,Us,dw=h(()=>{"use strict";ur();lw();fj();la();uw=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&mj()}async startAll(){if(!this.available())return;let e=await dd();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:r}=await Promise.resolve().then(()=>(K(),yn)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await
|
|
1770
|
+
`)[0]}`);for(let i of o)g.info(` \xB7 ${i}`)}return{success:!0,logged:s.length,markers:o.length}}catch(r){return A(w(r),t)}}};a(sj,"effectiveMode");a(zo,"safeGit");a(GG,"resolveBase");a(WG,"collectReviewDiff");a(BG,"scanLeanMarkers");qG=/^\+\s*"[\w@/.-]+"\s*:\s*"[\^~>=<\dvx*]/,oj=/over-?engineer|speculative|abstraction|premature|yagni|boilerplate|needless/i;a(ij,"emptySmells");a(aj,"scanDiffSmells");a(cj,"leanFlags");a(tj,"formatSmells");VG={effectiveMode:sj,scanDiffSmells:aj,leanFlags:cj,LEAN_MODES:Ia,MANY_NEW_FILES:rj,OVER_ENGINEERING_RE:oj}});import JG from"node:path";function cw(){return JG.join(I.getStatePath(),"cloud-linked.json")}async function dd(){let n=await Ie(cw(),[]);return Array.isArray(n)?n.filter(e=>e?.projectId&&e?.projectPath):[]}async function dj(n,e){let r=(await dd()).filter(s=>s.projectId!==n);r.push({projectId:n,projectPath:e}),await It(I.getStatePath()),await Se(cw(),r)}async function pj(n){let e=await dd();await It(I.getStatePath()),await Se(cw(),e.filter(t=>t.projectId!==n))}var lw=h(()=>{"use strict";be();Y();a(cw,"registryPath");a(dd,"listLinkedProjects");a(dj,"addLinkedProject");a(pj,"removeLinkedProject")});function mj(){return typeof globalThis.WebSocket=="function"}function XG(n,e,t,r){let s=n.replace(/\/$/,"").replace(/^http/,"ws"),o=new URLSearchParams({key:t,device:r,project:e});return`${s}/ws?${o.toString()}`}function zG(n,e,t){let r=Math.min(t,e*2**n);return Math.round(Math.random()*r)}var pd,fj=h(()=>{"use strict";a(mj,"hasGlobalWebSocket");a(XG,"buildRealtimeUrl");a(zG,"backoffDelay");pd=class{static{a(this,"RealtimeClient")}opts;ws=null;_state="idle";attempt=0;stopped=!1;reconnectTimer=null;constructor(e){this.opts={...e,wsFactory:e.wsFactory??(t=>new globalThis.WebSocket(t)),baseDelayMs:e.baseDelayMs??1e3,maxDelayMs:e.maxDelayMs??3e4}}get state(){return this._state}start(){this.stopped||this._state==="connecting"||this._state==="open"||this.connect()}stop(){this.stopped=!0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.closeSocket(),this._state="closed"}connect(){this._state=this.attempt===0?"connecting":"reconnecting";let e=XG(this.opts.apiUrl,this.opts.projectId,this.opts.apiKey,this.opts.deviceId),t;try{t=this.opts.wsFactory(e)}catch{this.scheduleReconnect();return}this.ws=t,t.onopen=()=>{this._state="open",this.attempt=0},t.onmessage=r=>{this.handleMessage(r?.data)},t.onerror=()=>{},t.onclose=()=>{this.stopped||this.scheduleReconnect()}}async handleMessage(e){let t;try{t=typeof e=="string"?JSON.parse(e):e}catch{return}if(!t||typeof t!="object")return;let r=t;if(r.type==="event"&&r.event&&typeof r.event=="object")try{await this.opts.apply(this.opts.projectId,r.event)}catch{}}scheduleReconnect(){if(this.stopped)return;this.closeSocket(),this._state="reconnecting";let e=zG(this.attempt,this.opts.baseDelayMs,this.opts.maxDelayMs);this.attempt+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.stopped||this.connect()},e),this.reconnectTimer?.unref?.()}closeSocket(){if(!this.ws)return;let e=this.ws;e.onopen=null,e.onmessage=null,e.onclose=null,e.onerror=null;try{e.close()}catch{}this.ws=null}}});var uw,md,Us,dw=h(()=>{"use strict";ur();lw();fj();la();uw=class{static{a(this,"RealtimeManager")}clients=new Map;available(){return process.env.PRJCT_IN_DAEMON==="1"&&mj()}async startAll(){if(!this.available())return;let e=await dd();for(let t of e)try{await this.start(t.projectId,t.projectPath)}catch{}}async start(e,t){if(!this.available()||this.clients.has(e))return;let{default:r}=await Promise.resolve().then(()=>(K(),yn)),s=await r.readConfig(t).catch(()=>null);if(!s?.cloud?.enabled||s.cloud.paused)return;let o=await fe.read();if(!o.apiKey)return;let[i,c]=await Promise.all([fe.getApiUrl(),fe.getDeviceId()]),l=new pd({projectId:e,apiUrl:i,apiKey:o.apiKey,deviceId:c,apply:a((u,d)=>Pn.applyRealtimeEvent(u,d),"apply")});this.clients.set(e,l),l.start()}stop(e){let t=this.clients.get(e);t&&(t.stop(),this.clients.delete(e))}stopAll(){for(let e of this.clients.values())e.stop();this.clients.clear()}status(e){return this.clients.get(e)?.state??"disabled"}},md=new uw,Us=md});var gj={};j(gj,{CloudCommands:()=>pw});import KG from"node:path";var YG,pw,hj=h(()=>{"use strict";xi();K();Wg();ur();lw();Tu();dw();ca();la();F();me();Ke();ie();ye();YG=["link","unlink","status","sync","pull","pause","resume"],pw=class extends G{static{a(this,"CloudCommands")}async cloud(e=null,t=process.cwd(),r={}){let o=((e??"").trim().split(/\s+/).filter(Boolean)[0]??"").toLowerCase();if(!o||o==="status"||o==="show")return this.status(t,r);switch(o){case"link":return this.link(t,r);case"unlink":return this.unlink(t,r);case"sync":return this.runSync(t,r);case"pull":return this.runPull(t,r);case"pause":return this.setPaused(!0,t,r);case"resume":return this.setPaused(!1,t,r);default:return L(`Unknown cloud subcommand "${o}". Use: ${YG.join(", ")}.`,r)}}async readProject(e){let t=await x.readConfig(e).catch(()=>null);return t?.projectId?t:null}async link(e,t){let r=await this.readProject(e);if(!r)return A("No prjct project here \u2014 run `prjct init` first.",t);if(!await fe.hasAuth())return A("Not authenticated. Run `prjct login`, then `prjct cloud link`.",t);let s={enabled:!0,paused:!1,linkedAt:r.cloud?.linkedAt??new Date().toISOString(),include:r.cloud?.include},o=await Su(r.projectId).catch(()=>{}),i=await Cu.linkProject(r.projectId,KG.basename(e),o);if(r.cloud=s,await x.writeConfig(e,r),i.syncStatus==="active"){await dj(r.projectId,e),await Us.start(r.projectId,e).catch(()=>{});let c=await Pn.sync(r.projectId,{include:r.cloud.include??{}});return this.reportSync("Linked",c,t,{extra:"Project is now linked. It will also sync on `prjct ship` and at session end."})}return this.subscriptionRequired(i.message,t,{title:i.syncStatus==="payment_pending"?"Cloud sync waiting for payment":"Cloud sync waiting for subscription",prefix:`Repo linked to your prjct account. Billing: ${i.billingUrl}`})}async unlink(e,t){let r=await this.readProject(e);if(!r)return A("No prjct project here \u2014 run `prjct init` first.",t);if(!r.cloud?.enabled){let o="Already local-only \u2014 nothing to unlink.";return console.log(t.md?_("## Cloud",`> ${o}`):o),{success:!0,linked:!1}}r.cloud={...r.cloud,enabled:!1,paused:!1},await x.writeConfig(e,r),Us.stop(r.projectId),await pj(r.projectId);let s="Unlinked \u2014 this project is local-only again. Local data was not touched.";return t.md?console.log(_("## Cloud",`> ${s}`)):g.done(s),{success:!0,linked:!1}}async runSync(e,t){let r=await this.readProject(e);if(!r)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;let o=await Pn.sync(r.projectId,{include:r.cloud?.include??{}});return this.reportSync("Synced",o,t)}async runPull(e,t){let r=await this.readProject(e);if(!r)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=this.gate(r,t);if(s)return s;try{let o=await Pn.pull(r.projectId);if(!o.success)return o.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(o.error,t):L(`Pull failed: ${o.error??"unknown error"}`,t);let i=`Pulled ${o.count??0} change(s) (${o.applied??0} applied).`;return t.md?console.log(_("## Cloud pull",`> ${i}`)):g.done(i),{success:!0,pulled:o.count??0,applied:o.applied??0}}catch(o){return A(w(o),t)}}async setPaused(e,t,r){let s=await this.readProject(t);if(!s)return A("No prjct project here \u2014 run `prjct init` first.",r);if(!s.cloud?.enabled)return L("Not linked \u2014 nothing to pause/resume. Run `prjct cloud link` first.",r);s.cloud={...s.cloud,paused:e},await x.writeConfig(t,s),e?Us.stop(s.projectId):await Us.start(s.projectId,t).catch(()=>{});let o=e?"Cloud sync paused. Resume with `prjct cloud resume`.":"Cloud sync resumed.";return r.md?console.log(_("## Cloud",`> ${o}`)):g.done(o),{success:!0,paused:e}}async status(e,t){let r=await this.readProject(e);if(!r)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=await fe.hasAuth(),o=r.cloud,i=!!o?.enabled,c=!!o?.paused,l=(await Jt.getPending(r.projectId)).length,u=await Jt.getLastSync(r.projectId),d={...Eu,...o?.include??{}},p=Object.entries(d).filter(([,y])=>y).map(([y])=>y),m=s?i?c?"linked, paused":"linked, active":"local-only (run `prjct cloud link`)":"not authenticated (run `prjct login`)",f=i?Us.available()?Us.status(r.projectId):"requires daemon":"n/a";return t.md?console.log(_("## Cloud status",`> **State**: ${m}`,[`- Authenticated: ${s?"yes":"no"}`,`- Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,`- Realtime: ${f}`,`- Pending events: ${l}`,`- Last sync: ${u?.timestamp??"never"}`,`- Syncing groups: ${p.join(", ")}`].join(`
|
|
1771
1771
|
`))):g.info([`Cloud \u2014 ${m}`,` Authenticated: ${s?"yes":"no"}`,` Linked: ${i?"yes":"no"}${o?.linkedAt?` (since ${o.linkedAt})`:""}`,` Realtime: ${f}`,` Pending events: ${l}`,` Last sync: ${u?.timestamp??"never"}`,` Syncing groups: ${p.join(", ")}`].join(`
|
|
1772
1772
|
`)),{success:!0,linked:i,paused:c,authed:s,pending:l,realtime:f}}gate(e,t){return e.cloud?.enabled?e.cloud.paused?L("Cloud sync is paused. Run `prjct cloud resume` first.",t):null:L("This project is not linked. Run `prjct cloud link` first.",t)}subscriptionRequired(e,t,r){let s=e??"Cloud sync needs an active prjct subscription. Your local data is safe \u2014 only cloud backup is paused.";return t.md?console.log(_(`## ${r?.title??"Subscription required"}`,`> \u{1F4B3} ${r?.prefix?`${r.prefix}
|
|
1773
1773
|
|
|
1774
|
-
${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"),r?.prefix&&g.info(r.prefix),g.info(s)),{success:!1,paymentRequired:!0,message:s}}reportSync(e,t,r,s){if(!t.success)return t.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(t.error,r):L(`${e} with errors: ${t.error??"unknown error"}`,r);let o=t.pushed?.count??0,i=t.pulled?.count??0,c=`${e} \u2014 ${o} pushed, ${i} pulled.`;return r.md?console.log(_("## Cloud",`> ${c}`,...s?.extra?[s.extra]:[])):(g.done(c),s?.extra&&g.info(s.extra)),{success:!0,pushed:o,pulled:i}}}});var yj={};j(yj,{NotifyCommands:()=>mw});var mw,wj=h(()=>{"use strict";K();
|
|
1774
|
+
${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"),r?.prefix&&g.info(r.prefix),g.info(s)),{success:!1,paymentRequired:!0,message:s}}reportSync(e,t,r,s){if(!t.success)return t.code==="PAYMENT_REQUIRED"?this.subscriptionRequired(t.error,r):L(`${e} with errors: ${t.error??"unknown error"}`,r);let o=t.pushed?.count??0,i=t.pulled?.count??0,c=`${e} \u2014 ${o} pushed, ${i} pulled.`;return r.md?console.log(_("## Cloud",`> ${c}`,...s?.extra?[s.extra]:[])):(g.done(c),s?.extra&&g.info(s.extra)),{success:!0,pushed:o,pulled:i}}}});var yj={};j(yj,{NotifyCommands:()=>mw});var mw,wj=h(()=>{"use strict";K();me();Ke();Du();ie();ye();mw=class extends G{static{a(this,"NotifyCommands")}async notify(e=null,t=process.cwd(),r={}){let s=(e??"").trim().toLowerCase().split(/\s+/).filter(Boolean)[0]??"";return!s||s==="status"||s==="show"?this.showStatus(t,r):hh.includes(s)?this.setMode(s,t,r):L(`Unknown notify subcommand "${s}". Use: ${hh.join("|")}.`,r)}async showStatus(e,t){let r=await x.readConfig(e).catch(()=>null);if(!r?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",t);let s=Go(r),o=[`Mode: ${s}${s==="on"?" (default)":""}`,"Fires on: Claude waiting for input \xB7 a subagent finishing","Set: prjct notify on|off"];return t.md?console.log(_("## Notify",`> **Mode**: \`${s}\``,o.slice(1).join(`
|
|
1775
1775
|
`))):g.info(`Notify \u2014 ${o.join(`
|
|
1776
1776
|
`)}`),{success:!0,mode:s}}async setMode(e,t,r){let s=await x.readConfig(t).catch(()=>null);if(!s?.projectId)return A("No prjct project here \u2014 run `prjct init` first.",r);s.notify={mode:e},await x.writeConfig(t,s);let o=e==="on"?"Desktop notifications ON \u2014 pings on Claude-waiting + subagent-finished.":"Desktop notifications OFF \u2014 silenced (the per-prompt work-state block stays).";return r.md?console.log(_("## Notify",`> ${o}`)):g.done(o),{success:!0,mode:e}}}});var kj={};j(kj,{AgentsCommands:()=>fw});async function QG(n,e){let t=await se(n,e);if(!t.ok)return t.result;let r=await cn(n);return{success:!0,agentsMd:r.agentsMd.action,ideRules:r.ideRules}}function ZG(n){return n.success===!0&&typeof n.agentsMd=="string"&&Array.isArray(n.ideRules)}function eW(n,e=null){let t=["# Agent Compatibility","","| Agent | Detected | Level | AGENTS.md | MCP | Skills | Hooks | ACP | Rules | Evidence |","|---|---:|---|---:|---:|---:|---:|---:|---:|---|"];for(let r of n){let{runtime:s}=r,o=[s.displayName,r.detected?"yes":"no",r.supportLevel,Ko(s.supports.agentsMd),Ko(s.supports.mcp),Ko(s.supports.skills),Ko(s.supports.hooks),Ko(s.supports.acp),Ko(s.supports.projectRules),r.detectedSignals.join(", ")||s.notes].join(" | ");t.push(`| ${o} |`)}return e?.success&&t.push("","## Repair","",`- AGENTS.md: ${e.agentsMd}`,`- IDE rule adapters: ${e.ideRules.length>0?e.ideRules.join(", "):"none needed"}`),t.push("","Support levels:","- `full`: prjct-maintained native hooks plus MCP/skills or equivalent deep integration.","- `good`: AGENTS.md plus MCP-capable runtime.","- `baseline`: repo instructions only; agents can still run `prjct --md`.","- `hosted`: repo instructions are the portable layer; external platform config may be manual."),t.join(`
|
|
1777
1777
|
`)}function tW(n,e=null){let t=n.filter(s=>s.detected),r=["Agent compatibility",""];e?.success&&r.push(`repair: AGENTS.md ${e.agentsMd}; adapters ${e.ideRules.length>0?e.ideRules.join(", "):"none needed"}`,"");for(let s of n){let o=s.detected?"yes":"no ",i=[s.runtime.supports.agentsMd?"AGENTS.md":null,s.runtime.supports.mcp?"MCP":null,s.runtime.supports.skills?"skills":null,s.runtime.supports.hooks?"hooks":null,s.runtime.supports.acp?"ACP":null,s.runtime.supports.projectRules?"rules":null].filter(Boolean).join(", ");r.push(`${o} ${s.runtime.displayName} [${s.supportLevel}] ${i||"manual"}`),s.detectedSignals.length>0&&r.push(` evidence: ${s.detectedSignals.join(", ")}`)}return r.push("",`${t.length}/${n.length} runtimes detected.`),r.join(`
|
|
1778
|
-
`)}function Ko(n){return n?"yes":"no"}var fw,bj=h(()=>{"use strict";Ao();jo();F();
|
|
1778
|
+
`)}function Ko(n){return n?"yes":"no"}var fw,bj=h(()=>{"use strict";Ao();jo();F();me();ye();Lt();fw=class extends G{static{a(this,"AgentsCommands")}async agents(e=null,t=process.cwd(),r={}){let s=(e??"").trim().toLowerCase().split(/\s+/).filter(Boolean)[0]??"doctor";if(s!=="doctor"&&s!=="status"&&s!=="list")return A("Unknown agents subcommand. Use: prjct agents doctor",r);try{let o=r.fix?await QG(t,r):null;if(o&&!ZG(o))return o;let i=await qr(t);return r.md?console.log(eW(i,o)):console.log(tW(i,o)),{success:!0,runtimes:i.length,detected:i.filter(c=>c.detected).length,fixed:!!o}}catch(o){return A(w(o),r)}}};a(QG,"repairAgentSurfaces");a(ZG,"isAgentRepairResult");a(eW,"formatMarkdown");a(tW,"formatText");a(Ko,"yes")});var Ej={};j(Ej,{ProductCommands:()=>gw});async function Sj(n,e){let t=await qr(e),r={detected:t.filter(c=>c.detected).length,full:t.filter(c=>c.supportLevel==="full").length,good:t.filter(c=>c.supportLevel==="good").length,baseline:t.filter(c=>c.supportLevel==="baseline").length,hosted:t.filter(c=>c.supportLevel==="hosted").length},s={live:Et(n,"SELECT COUNT(*) AS value FROM memories WHERE deleted_at IS NULL"),preventive:Et(n,`SELECT COUNT(*) AS value FROM memories
|
|
1779
1779
|
WHERE deleted_at IS NULL AND type IN ('gotcha', 'anti-pattern', 'learning')`),useful:Et(n,"SELECT COUNT(*) AS value FROM memory_usefulness WHERE score > 0"),surfaced:Et(n,"SELECT COUNT(*) AS value FROM memory_surface_log"),inbox:Et(n,"SELECT COUNT(*) AS value FROM memories WHERE deleted_at IS NULL AND type = 'inbox'")},o={tasks:Et(n,"SELECT COUNT(*) AS value FROM tasks"),completed:Et(n,"SELECT COUNT(*) AS value FROM tasks WHERE status IN ('done', 'completed')"),shippedTasks:Et(n,"SELECT COUNT(*) AS value FROM tasks WHERE shipped_at IS NOT NULL"),shippedFeatures:Et(n,"SELECT COUNT(*) AS value FROM shipped_features"),specs:Et(n,"SELECT COUNT(*) AS value FROM specs"),shippedSpecs:Et(n,"SELECT COUNT(*) AS value FROM specs WHERE status = 'shipped'")},i={syncs:Et(n,"SELECT COALESCE(SUM(syncs), 0) AS value FROM metrics_daily"),tokensSaved:Et(n,"SELECT COALESCE(SUM(tokens_saved), 0) AS value FROM metrics_daily")};return{memories:s,workflow:o,sync:i,agents:r,score:lW(s,o,i,r)}}function sW(n){let e=$a(n,`SELECT COALESCE(type, 'unknown') AS type, COUNT(*) AS value
|
|
1780
1780
|
FROM memories
|
|
1781
1781
|
WHERE deleted_at IS NULL
|
|
@@ -1818,7 +1818,7 @@ ${s}`:s}`)):(g.warn(r?.title??"Cloud backup paused \u2014 subscription required"
|
|
|
1818
1818
|
`):"- No runtime-specific signals detected; AGENTS.md remains the baseline.","","## Context to preserve"];return hw(e,n.memories),e.join(`
|
|
1819
1819
|
`)}function bW(n){return[`Handoff for ${n.target}`,`Active: ${n.active?.description??"none"}`,"Run: prjct status --md; prjct value --md; prjct guardrails --md",`Context entries: ${n.memories.length}`].join(`
|
|
1820
1820
|
`)}function vW(n){let e=["# Risk Guardrails",""];if(e.push(`Changed files checked: ${n.files.length}`),n.hits.length>0){e.push("","## File-specific warnings");for(let t of n.hits)e.push(`- \`${t.file}\`: **[${fs(t.entry)}] ${Oe(t.entry)}** \u2014 ${$r(t.entry.content)} \`${t.entry.id}\``)}else e.push("","No file-specific preventive memory matched the current changeset."),n.fallback.length>0&&(e.push("","## General project traps"),hw(e,n.fallback));return e.push("","_Advisory only. This command does not block or mutate anything._"),e.join(`
|
|
1821
|
-
`)}function SW(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function hw(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${Oe(t)}** \u2014 ${$r(t.content)} \`${t.id}\``)}function vj(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var nW,rW,gw,Tj=h(()=>{"use strict";Ao();Vt();Te();vr();Z();F();pe();
|
|
1821
|
+
`)}function SW(n){return n.hits.length===0?`Risk guardrails: ${n.files.length} files checked, no file-specific hits.`:`Risk guardrails: ${n.hits.length} warning(s) across ${n.files.length} changed file(s).`}function hw(n,e){if(e.length===0){n.push("- None recorded yet.");return}for(let t of e)n.push(`- **[${t.type}] ${Oe(t)}** \u2014 ${$r(t.content)} \`${t.id}\``)}function vj(n,e,t){if(n.push("",`### ${e}`),t.length===0){n.push("- None.");return}for(let r of t)n.push(`- **${r.type??"unknown"}** ${r.title??r.content.slice(0,80)} \`${r.id}\``)}var nW,rW,gw,Tj=h(()=>{"use strict";Ao();Vt();Te();vr();Z();F();pe();me();ye();Lt();nW=["gotcha","anti-pattern","learning"],rW=/^(current work|wip|todo|misc|n\/a|none|latest|unreleased|changelog)$/i,gw=class extends G{static{a(this,"ProductCommands")}async value(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=await Sj(s.value,t);return console.log(r.md?mW(o):fW(o)),{success:!0,...o}}catch(s){return A(w(s),r)}}async memoryDoctor(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=sW(s.value);return console.log(r.md?gW(o):hW(o)),{success:!0,score:o.score,issues:o.issues.length}}catch(s){return A(w(s),r)}}async report(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=uW(e,r.days,7),i=await oW(s.value,t,o);return console.log(r.md?yW(i):wW(i)),{success:!0,days:o,ships:i.ships.length,completed:i.completed.length}}catch(s){return A(w(s),r)}}async handoff(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=(e??"").trim().split(/\s+/).filter(Boolean)[0]??"next agent",i=await iW(s.value,t,o);return console.log(r.md?kW(i):bW(i)),{success:!0,target:o,memories:i.memories.length}}catch(s){return A(w(s),r)}}async guardrails(e=null,t=process.cwd(),r={}){try{let s=await se(t,r);if(!s.ok)return s.result;let o=await aW(s.value,t);return console.log(r.md?vW(o):SW(o)),{success:!0,files:o.files.length,hits:o.hits.length}}catch(s){return A(w(s),r)}}};a(Sj,"buildValueSnapshot");a(sW,"buildMemoryDoctor");a(oW,"buildHumanReport");a(iW,"buildHandoff");a(aW,"buildGuardrails");a(cW,"changedFiles");a(Et,"count");a($a,"query");a(lW,"valueScore");a(uW,"pickDays");a(dW,"sinceIso");a(pW,"isNoise");a(mW,"formatValueMd");a(fW,"formatValueText");a(gW,"formatMemoryDoctorMd");a(hW,"formatMemoryDoctorText");a(yW,"formatReportMd");a(wW,"formatReportText");a(kW,"formatHandoffMd");a(bW,"formatHandoffText");a(vW,"formatGuardrailsMd");a(SW,"formatGuardrailsText");a(hw,"appendEntries");a(vj,"appendMemoryRows")});import{z as N}from"zod";var Cj,EW,yw,Rj,xj=h(()=>{"use strict";Cj=N.object({severity:N.enum(["info","warning","blocking"]),title:N.string(),recommendation:N.string(),files:N.array(N.string()).optional(),command:N.string().optional()}),EW=N.object({id:N.string(),name:N.string(),status:N.enum(["pass","warn","fail"]),score:N.number().min(0).max(100),durationMs:N.number().nonnegative(),metrics:N.record(N.union([N.string(),N.number(),N.boolean()])),actionables:N.array(Cj)}),yw=N.object({schemaVersion:N.literal(1),runId:N.string(),createdAt:N.string(),runner:N.object({source:N.enum(["local","ci","agent"]),user:N.string().optional(),platform:N.string(),node:N.string(),bun:N.string().optional()}),project:N.object({repo:N.string(),branch:N.string().optional(),commit:N.string().optional(),dirty:N.boolean()}),versions:N.object({current:N.string(),baseline:N.string().optional(),candidate:N.string().optional()}),scenarios:N.array(EW),summary:N.object({score:N.number().min(0).max(100),pass:N.number().nonnegative(),warn:N.number().nonnegative(),fail:N.number().nonnegative(),improvements:N.number().nonnegative(),regressions:N.number().nonnegative(),actionables:N.number().nonnegative()}),artifacts:N.object({jsonPath:N.string().optional(),reportPath:N.string().optional()}).optional()}),Rj=N.object({schemaVersion:N.literal(1),comparisonId:N.string(),createdAt:N.string(),baselineRunId:N.string().optional(),candidateRunId:N.string().optional(),baselineVersion:N.string().optional(),candidateVersion:N.string().optional(),summary:N.object({baselineScore:N.number().optional(),candidateScore:N.number().optional(),delta:N.number().optional(),regressions:N.number().nonnegative(),improvements:N.number().nonnegative(),actionables:N.number().nonnegative()}),artifacts:N.object({jsonPath:N.string().optional(),reportPath:N.string().optional()}).optional(),scenarios:N.array(N.object({id:N.string(),baselineScore:N.number().optional(),candidateScore:N.number().optional(),delta:N.number().optional(),status:N.enum(["improved","regressed","unchanged","missing-baseline","missing-candidate"]),actionables:N.array(Cj)}))})});import jj from"node:crypto";import Gt from"node:fs/promises";import et from"node:path";async function _j(n,e={}){let t=new Date().toISOString(),r=await La(n),o=await xW({projectPath:n,git:r}),i=RW(o),c={schemaVersion:fd,runId:FW(t),createdAt:t,runner:{source:e.source??UW(),user:await GW(n),platform:`${process.platform}-${process.arch}`,node:process.version,bun:await WW()},project:{repo:r.repo,branch:r.branch,commit:r.commit,dirty:r.dirty},versions:{current:ss(),baseline:e.baseline,candidate:e.candidate??ss()},scenarios:o,summary:i};return $W(c)}async function Na(n){let e=et.join(gd(await La(n)),"latest.json");return bw(e)}async function Pj(n,e){if(!e)return Na(n);let t=et.join(gd(await La(n)),"runs"),r=[];try{r=await Gt.readdir(t)}catch{return null}return(await Promise.all(r.filter(o=>o.endsWith(".json")).map(o=>bw(et.join(t,o))))).filter(o=>!!o).filter(o=>o.versions.current===e||o.versions.candidate===e).sort((o,i)=>i.createdAt.localeCompare(o.createdAt))[0]??null}async function Ij(n,e={}){let t=await Pj(n,e.baseline),r=e.candidate?await Pj(n,e.candidate):await Na(n),o=[...new Set([...t?.scenarios.map(m=>m.id)??[],...r?.scenarios.map(m=>m.id)??[]])].sort().map(m=>{let f=t?.scenarios.find(P=>P.id===m),y=r?.scenarios.find(P=>P.id===m),v=f&&y?Math.round((y.score-f.score)*10)/10:void 0,k=[],b="unchanged";return f?y?(v??0)<=TW?(b="regressed",k.push({severity:"blocking",title:`${m} regressed by ${Math.abs(v??0)} points`,recommendation:qW(m)})):(v??0)>=CW?(b="improved",k.push({severity:"info",title:`${m} improved by ${v} points`,recommendation:"Keep this scenario in PR checks so the improvement is protected."})):f&&y&&k.push({severity:"info",title:`${m} stayed within the regression threshold`,recommendation:"Keep collecting this scenario so future optimizations have a stable baseline."}):(b="missing-candidate",k.push({severity:"blocking",title:`No candidate result for ${m}`,recommendation:"Run `prjct eval run` for the candidate version before publishing a comparison."})):(b="missing-baseline",k.push({severity:"warning",title:`No baseline result for ${m}`,recommendation:"Run `prjct eval run --candidate <baseline-version>` before comparing releases."})),{id:m,baselineScore:f?.score,candidateScore:y?.score,delta:v,status:b,actionables:k}}),i=o.filter(m=>m.status==="regressed").length,c=o.filter(m=>m.status==="improved").length,l=new Date().toISOString(),u=t?.versions.candidate??t?.versions.current??e.baseline,d=r?.versions.candidate??r?.versions.current??e.candidate,p={schemaVersion:fd,comparisonId:HW(l,u,d),createdAt:l,baselineRunId:t?.runId,candidateRunId:r?.runId,baselineVersion:u,candidateVersion:d,summary:{baselineScore:t?.summary.score,candidateScore:r?.summary.score,delta:t&&r?Math.round((r.summary.score-t.summary.score)*10)/10:void 0,regressions:i,improvements:c,actionables:o.reduce((m,f)=>m+f.actionables.length,0)},scenarios:o};return DW(n,p)}async function kw(n,e={}){let t=Mj(e.target),r=e.file?await MW(e.file):await NW(n),s=await Nj(n,e.dryRun===!0),o={schemaVersion:fd,artifactType:"run",artifactId:r.runId,repo:r.project.repo,createdAt:r.createdAt,run:r,reportMarkdown:Yo(r)};return Oj(s.projectId,t,e.dryRun===!0,o,{artifactType:"run",artifactId:r.runId,runId:r.runId})}async function $j(n,e,t={}){let r=Mj(t.target),s=await Nj(n,t.dryRun===!0),o=await La(n),i={schemaVersion:fd,artifactType:"comparison",artifactId:e.comparisonId,repo:o.repo,createdAt:e.createdAt,comparison:e,reportMarkdown:Oa(e)};return Oj(s.projectId,r,t.dryRun===!0,i,{artifactType:"comparison",artifactId:e.comparisonId,comparisonId:e.comparisonId})}function Yo(n){let e=n.scenarios.flatMap(s=>s.actionables.map(o=>({scenario:s.id,actionable:o}))),t=n.scenarios.map(s=>`| \`${s.id}\` | ${s.status} | ${s.score} | ${s.actionables.length} |`).join(`
|
|
1822
1822
|
`),r=e.length===0?"_No actionables._":e.map(({scenario:s,actionable:o})=>`- **${o.severity}** \`${s}\`: ${o.title}. ${o.recommendation}`).join(`
|
|
1823
1823
|
`);return`# prjct eval run
|
|
1824
1824
|
|
|
@@ -1874,11 +1874,11 @@ ${e||"| _none_ | - | - | - | - |"}
|
|
|
1874
1874
|
|
|
1875
1875
|
${t.length>0?t.join(`
|
|
1876
1876
|
`):"_No actionables._"}
|
|
1877
|
-
`}function RW(n){return{score:n.length===0?0:Math.round(n.reduce((t,r)=>t+r.score,0)/n.length),pass:n.filter(t=>t.status==="pass").length,warn:n.filter(t=>t.status==="warn").length,fail:n.filter(t=>t.status==="fail").length,improvements:0,regressions:n.filter(t=>t.status==="fail").length,actionables:n.reduce((t,r)=>t+r.actionables.length,0)}}async function xW(n){return Promise.all([Da("agent-surface-readiness","Agent surface readiness",()=>PW(n.projectPath)),Da("project-sync-readiness","Project sync readiness",()=>AW(n.projectPath)),Da("stale-command-guidance","Stale command guidance",()=>jW(n.projectPath)),Da("quality-command-readiness","Quality command readiness",()=>_W(n.projectPath)),Da("cloud-benchmark-readiness","Cloud benchmark readiness",()=>IW(n.projectPath))])}async function Da(n,e,t){let r=Date.now(),s=await t();return{id:n,name:e,durationMs:Date.now()-r,...s}}async function PW(n){let e=await ww(et.join(n,"AGENTS.md")),t=await ww(et.join(n,"CLAUDE.md")),r=e?100:t?70:20;return{status:r>=90?"pass":"warn",score:r,metrics:{agentsMd:e,claudeMd:t},actionables:r>=90?[{severity:"info",title:"Portable agent surface is present",recommendation:"Keep `prjct agents doctor --fix` in release smoke checks.",command:"prjct agents doctor --fix"}]:[{severity:"warning",title:"Portable AGENTS.md surface is missing",recommendation:"Run `prjct agents doctor --fix` so future agents start with the same project contract.",command:"prjct agents doctor --fix"}]}}async function AW(n){let e=await ww(et.join(n,".prjct","prjct.config.json"));return{status:e?"pass":"warn",score:e?100:40,metrics:{projectConfig:e},actionables:[e?{severity:"info",title:"Project has a prjct identity",recommendation:"Use `prjct sync --md` in eval smoke runs to keep generated context measurable.",command:"prjct sync --md"}:{severity:"warning",title:"Project is not registered with prjct",recommendation:"Run `prjct sync` before comparing eval runs so metrics map to a stable project id.",command:"prjct sync"}]}}async function jW(n){let e=await BW(n,250),t=/\/p:\s*[a-z][a-z0-9-]*/i,r=[];return await Promise.all(e.map(async s=>{let o=await Gt.readFile(et.join(n,s),"utf-8").catch(()=>"");t.test(o)&&r.push(s)})),{status:r.length===0?"pass":"warn",score:r.length===0?100:Math.max(20,100-r.length*10),metrics:{scannedFiles:e.length,staleHits:r.length},actionables:r.length===0?[{severity:"info",title:"No stale `/p:` command guidance found",recommendation:"Keep this scan in evals to prevent user-facing command drift."}]:[{severity:"warning",title:`Found ${r.length} stale command guidance file(s)`,recommendation:"Replace stale `/p:` examples with `p. <verb>` or `prjct <verb>`.",files:r.slice(0,10)}]}}async function _W(n){let e=et.join(n,"package.json"),t={};try{t=JSON.parse(await Gt.readFile(e,"utf-8")).scripts??{}}catch{}let r=typeof t.test=="string",s=typeof t.check=="string"||typeof t.lint=="string",o=(r?50:0)+(s?50:0);return{status:o>=100?"pass":"warn",score:o,metrics:{hasTest:r,hasCheck:s},actionables:o>=100?[{severity:"info",title:"Quality commands are discoverable",recommendation:"Use these commands as eval scenario gates before publishing results."}]:[{severity:"warning",title:"Quality commands are incomplete",recommendation:"Expose `test` and `check`/`lint` scripts so eval reports can tie regressions to real verification.",files:["package.json"]}]}}async function IW(n){let e=await x.readConfig(n),t=await
|
|
1877
|
+
`}function RW(n){return{score:n.length===0?0:Math.round(n.reduce((t,r)=>t+r.score,0)/n.length),pass:n.filter(t=>t.status==="pass").length,warn:n.filter(t=>t.status==="warn").length,fail:n.filter(t=>t.status==="fail").length,improvements:0,regressions:n.filter(t=>t.status==="fail").length,actionables:n.reduce((t,r)=>t+r.actionables.length,0)}}async function xW(n){return Promise.all([Da("agent-surface-readiness","Agent surface readiness",()=>PW(n.projectPath)),Da("project-sync-readiness","Project sync readiness",()=>AW(n.projectPath)),Da("stale-command-guidance","Stale command guidance",()=>jW(n.projectPath)),Da("quality-command-readiness","Quality command readiness",()=>_W(n.projectPath)),Da("cloud-benchmark-readiness","Cloud benchmark readiness",()=>IW(n.projectPath))])}async function Da(n,e,t){let r=Date.now(),s=await t();return{id:n,name:e,durationMs:Date.now()-r,...s}}async function PW(n){let e=await ww(et.join(n,"AGENTS.md")),t=await ww(et.join(n,"CLAUDE.md")),r=e?100:t?70:20;return{status:r>=90?"pass":"warn",score:r,metrics:{agentsMd:e,claudeMd:t},actionables:r>=90?[{severity:"info",title:"Portable agent surface is present",recommendation:"Keep `prjct agents doctor --fix` in release smoke checks.",command:"prjct agents doctor --fix"}]:[{severity:"warning",title:"Portable AGENTS.md surface is missing",recommendation:"Run `prjct agents doctor --fix` so future agents start with the same project contract.",command:"prjct agents doctor --fix"}]}}async function AW(n){let e=await ww(et.join(n,".prjct","prjct.config.json"));return{status:e?"pass":"warn",score:e?100:40,metrics:{projectConfig:e},actionables:[e?{severity:"info",title:"Project has a prjct identity",recommendation:"Use `prjct sync --md` in eval smoke runs to keep generated context measurable.",command:"prjct sync --md"}:{severity:"warning",title:"Project is not registered with prjct",recommendation:"Run `prjct sync` before comparing eval runs so metrics map to a stable project id.",command:"prjct sync"}]}}async function jW(n){let e=await BW(n,250),t=/\/p:\s*[a-z][a-z0-9-]*/i,r=[];return await Promise.all(e.map(async s=>{let o=await Gt.readFile(et.join(n,s),"utf-8").catch(()=>"");t.test(o)&&r.push(s)})),{status:r.length===0?"pass":"warn",score:r.length===0?100:Math.max(20,100-r.length*10),metrics:{scannedFiles:e.length,staleHits:r.length},actionables:r.length===0?[{severity:"info",title:"No stale `/p:` command guidance found",recommendation:"Keep this scan in evals to prevent user-facing command drift."}]:[{severity:"warning",title:`Found ${r.length} stale command guidance file(s)`,recommendation:"Replace stale `/p:` examples with `p. <verb>` or `prjct <verb>`.",files:r.slice(0,10)}]}}async function _W(n){let e=et.join(n,"package.json"),t={};try{t=JSON.parse(await Gt.readFile(e,"utf-8")).scripts??{}}catch{}let r=typeof t.test=="string",s=typeof t.check=="string"||typeof t.lint=="string",o=(r?50:0)+(s?50:0);return{status:o>=100?"pass":"warn",score:o,metrics:{hasTest:r,hasCheck:s},actionables:o>=100?[{severity:"info",title:"Quality commands are discoverable",recommendation:"Use these commands as eval scenario gates before publishing results."}]:[{severity:"warning",title:"Quality commands are incomplete",recommendation:"Expose `test` and `check`/`lint` scripts so eval reports can tie regressions to real verification.",files:["package.json"]}]}}async function IW(n){let e=await x.readConfig(n),t=await fe.hasAuth(),r=!!e?.projectId,s=!!e?.cloud?.enabled,o=s&&!e?.cloud?.paused,i=(r?34:0)+(t?33:0)+(o?33:0);return{status:i>=100?"pass":"warn",score:i,metrics:{hasProject:r,authenticated:t,cloudLinked:s,cloudActive:o},actionables:i>=100?[{severity:"info",title:"Cloud benchmark publishing is active",recommendation:"Run `prjct eval publish --target cloud` after release evals to store shared benchmark history.",command:"prjct eval publish --target cloud"}]:[{severity:"warning",title:"Cloud benchmark publishing is not active",recommendation:"Run `prjct init`, `prjct login`, and `prjct cloud link` before publishing benchmark results.",command:"prjct cloud status"}]}}async function $W(n){let e=gd({repo:n.project.repo}),t=et.join(e,"runs");await Gt.mkdir(t,{recursive:!0});let r=et.join(t,`${n.runId}.json`),s=et.join(t,`${n.runId}.md`),o={...n,artifacts:{jsonPath:r,reportPath:s}};return yw.parse(o),await Gt.writeFile(r,`${JSON.stringify(o,null,2)}
|
|
1878
1878
|
`,"utf-8"),await Gt.writeFile(s,Yo(o),"utf-8"),await Gt.writeFile(et.join(e,"latest.json"),`${JSON.stringify(o,null,2)}
|
|
1879
1879
|
`,"utf-8"),o}async function DW(n,e){let t=gd(await La(n)),r=et.join(t,"comparisons");await Gt.mkdir(r,{recursive:!0});let s=et.join(r,`${e.comparisonId}.json`),o=et.join(r,`${e.comparisonId}.md`),i={...e,artifacts:{jsonPath:s,reportPath:o}};return Rj.parse(i),await Gt.writeFile(s,`${JSON.stringify(i,null,2)}
|
|
1880
1880
|
`,"utf-8"),await Gt.writeFile(o,Oa(i),"utf-8"),await Gt.writeFile(et.join(t,"latest-comparison.json"),`${JSON.stringify(i,null,2)}
|
|
1881
|
-
`,"utf-8"),i}function gd(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return et.join(ht(),"evals",e)}async function bw(n){try{return yw.parse(JSON.parse(await Gt.readFile(n,"utf-8")))}catch{return null}}async function MW(n){let e=await bw(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function NW(n){let e=await Na(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function La(n){let[e,t,r,s]=await Promise.all([Ma(n,["branch","--show-current"]),Ma(n,["rev-parse","HEAD"]),Ma(n,["config","--get","remote.origin.url"]),Ma(n,["status","--porcelain"])]),o=OW(r);return{repo:o??LW(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ma(n,e){try{let{stdout:t}=await H("git",e,{cwd:n});return String(t).trim()}catch{return""}}function OW(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function LW(n){return`local-${jj.createHash("sha256").update(et.resolve(n)).digest("hex").slice(0,12)}`}function FW(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${jj.randomBytes(4).toString("hex")}`}function HW(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=Aj(e??"missing-baseline"),o=Aj(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function Aj(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function UW(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function GW(n){let e=await Dj("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ma(n,["config","user.email"]);return t?`git:${t}`:void 0}async function WW(){return Dj("bun",["--version"],process.cwd())}async function Dj(n,e,t){try{let{stdout:r}=await H(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function ww(n){try{return await Gt.access(n),!0}catch{return!1}}async function BW(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await Gt.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=et.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(et.relative(n,l))}}return a(s,"walk"),await s(n),t}function qW(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function Mj(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function Nj(n,e){let t=await x.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await
|
|
1881
|
+
`,"utf-8"),i}function gd(n){let e=n.repo.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"")||"unknown";return et.join(ht(),"evals",e)}async function bw(n){try{return yw.parse(JSON.parse(await Gt.readFile(n,"utf-8")))}catch{return null}}async function MW(n){let e=await bw(n);if(!e)throw new Error(`Invalid or missing eval run file: ${n}`);return e}async function NW(n){let e=await Na(n);if(!e)throw new Error("No eval run found. Run `prjct eval run` first.");return e}async function La(n){let[e,t,r,s]=await Promise.all([Ma(n,["branch","--show-current"]),Ma(n,["rev-parse","HEAD"]),Ma(n,["config","--get","remote.origin.url"]),Ma(n,["status","--porcelain"])]),o=OW(r);return{repo:o??LW(n),ownerRepo:o,branch:e||void 0,commit:t||void 0,dirty:s.trim().length>0}}async function Ma(n,e){try{let{stdout:t}=await H("git",e,{cwd:n});return String(t).trim()}catch{return""}}function OW(n){let t=n.trim().match(/github\.com[:/]([^/\s]+)\/([^/\s]+?)(?:\.git)?$/);if(t)return`${t[1]}/${t[2]}`}function LW(n){return`local-${jj.createHash("sha256").update(et.resolve(n)).digest("hex").slice(0,12)}`}function FW(n){return`eval_${n.replace(/[-:.TZ]/g,"").slice(0,14)}_${jj.randomBytes(4).toString("hex")}`}function HW(n,e,t){let r=n.replace(/[-:.TZ]/g,"").slice(0,14),s=Aj(e??"missing-baseline"),o=Aj(t??"missing-candidate");return`comparison_${r}_${s}_to_${o}`}function Aj(n){return n.replace(/[^a-zA-Z0-9_.-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)||"unknown"}function UW(){return process.env.GITHUB_ACTIONS==="true"||process.env.CI==="true"?"ci":process.env.CODEX_SANDBOX||process.env.CLAUDECODE?"agent":"local"}async function GW(n){let e=await Dj("gh",["api","user","--jq",".login"],n);if(e)return`github:${e}`;let t=await Ma(n,["config","user.email"]);return t?`git:${t}`:void 0}async function WW(){return Dj("bun",["--version"],process.cwd())}async function Dj(n,e,t){try{let{stdout:r}=await H(n,e,{cwd:t});return String(r).trim()||void 0}catch{return}}async function ww(n){try{return await Gt.access(n),!0}catch{return!1}}async function BW(n,e){let t=[],r=new Set([".git","node_modules","dist","build","coverage",".prjct","__tests__","__fixtures__","fixtures"]);async function s(o){if(t.length>=e)return;let i=await Gt.readdir(o,{withFileTypes:!0}).catch(()=>[]);for(let c of i){if(t.length>=e)break;if(r.has(c.name))continue;let l=et.join(o,c.name);c.isDirectory()?await s(l):c.isFile()&&!c.name.includes(".test.")&&!c.name.includes(".spec.")&&/\.(md|mdc|txt|toml|json|ya?ml|sh|ts|tsx|js|jsx)$/.test(c.name)&&t.push(et.relative(n,l))}}return a(s,"walk"),await s(n),t}function qW(n){return n.includes("sync")?"Inspect sync incrementality and generated context freshness before shipping.":n.includes("cloud")?"Check cloud auth/link status and benchmark publisher setup.":n.includes("command")?"Audit user-facing command copy and generated templates for stale instructions.":"Open the latest eval report, inspect scenario metrics, and add a focused regression test."}function Mj(n){let e=n??"cloud";if(e==="github")throw new Error("GitHub eval publishing was removed. Use `prjct eval publish --target cloud` after `prjct login` and `prjct cloud link`.");if(e!=="cloud")throw new Error(`Unsupported eval publish target: ${e}. Use --target cloud.`);return"cloud"}async function Nj(n,e){let t=await x.readConfig(n);if(!t?.projectId)throw new Error("Cloud benchmark publish requires a prjct project. Run `prjct init` first.");if(e)return{projectId:t.projectId};if(!await fe.hasAuth())throw new Error("Cloud benchmark publish requires authentication. Run `prjct login`, then `prjct cloud link`.");if(!t.cloud?.enabled)throw new Error("Cloud benchmark publish requires cloud to be active. Run `prjct cloud link`.");if(t.cloud.paused)throw new Error("Cloud sync is paused. Run `prjct cloud resume` before publishing benchmarks.");return{projectId:t.projectId}}async function Oj(n,e,t,r,s){let i=`${await fe.getApiUrl()}/benchmarks/evals`,c={projectId:n,...r},l=Buffer.byteLength(JSON.stringify(c),"utf-8");if(t)return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l};try{let u=await Cu.publishBenchmark(n,r);return{target:e,dryRun:t,...s,projectId:n,repo:r.repo,endpoint:i,payloadBytes:l,remoteId:u.benchmarkId,publishedAt:u.publishedAt??new Date().toISOString(),url:u.url}}catch(u){throw new Error(VW(u))}}function VW(n){if(n instanceof Error)return n.message;if(n&&typeof n=="object"&&"message"in n){let e=n;return e.code==="PAYMENT_REQUIRED"?`${e.message} Run \`prjct cloud status\` for account details.`:e.message}return"Cloud benchmark publish failed."}var fd,TW,CW,Lj=h(()=>{"use strict";xr();K();xj();ur();ca();pe();Ne();fd=1,TW=-5,CW=5;a(_j,"runEval");a(Na,"loadLatestEvalRun");a(Pj,"loadEvalRunByVersion");a(Ij,"compareEvalRuns");a(kw,"publishEvalRun");a($j,"publishEvalComparison");a(Yo,"formatEvalRunMarkdown");a(Oa,"formatEvalComparisonMarkdown");a(RW,"summarizeScenarios");a(xW,"runScenarios");a(Da,"scenario");a(PW,"evalAgentSurface");a(AW,"evalProjectSyncReadiness");a(jW,"evalStaleCommandGuidance");a(_W,"evalQualityCommandReadiness");a(IW,"evalCloudBenchmarkReadiness");a($W,"saveEvalRun");a(DW,"saveEvalComparison");a(gd,"evalProjectDir");a(bw,"readRunFile");a(MW,"readRequiredRunFile");a(NW,"loadLatestRequired");a(La,"detectGit");a(Ma,"git");a(OW,"parseGitHubOwnerRepo");a(LW,"hashedRepo");a(FW,"runId");a(HW,"comparisonId");a(Aj,"slugPart");a(UW,"detectSource");a(GW,"detectRunnerUser");a(WW,"detectBunVersion");a(Dj,"execFileMaybe");a(ww,"exists");a(BW,"collectTextFiles");a(qW,"regressionRecommendation");a(Mj,"normalizePublishTarget");a(Nj,"resolveBenchmarkProject");a(Oj,"publishBenchmarkPayload");a(VW,"cloudPublishErrorMessage")});var Fj={};j(Fj,{EvalCommands:()=>vw});var vw,Hj=h(()=>{"use strict";Lj();F();Ke();ie();ye();vw=class extends G{static{a(this,"EvalCommands")}async eval(e=null,t=process.cwd(),r={}){let[s="run"]=(e??"").trim().split(/\s+/).filter(Boolean);try{switch(s){case"run":return this.run(t,r);case"compare":return this.compare(t,r);case"report":return this.report(t,r);case"publish":return this.publish(t,r);default:return this.unknown(s,r)}}catch(o){let i=w(o);return r.md?console.log(_(W("Eval failed",i))):g.fail(i),{success:!1,error:i}}}async run(e,t){let r=await _j(e,t);if(t.publish){let s=await kw(e,{target:t.target,dryRun:t.dryRun,file:r.artifacts?.jsonPath});return t.json?console.log(JSON.stringify({run:r,publish:s},null,2)):t.md?console.log(_(Yo(r),W("Published",`Target: \`${s.target}\`
|
|
1882
1882
|
Project: \`${s.projectId}\`
|
|
1883
1883
|
URL: ${s.url??"-"}`))):g.done(`eval run ${r.runId} saved and published to ${s.target}`),{success:!0,runId:r.runId,score:r.summary.score,publish:s}}return t.json?console.log(JSON.stringify(r,null,2)):t.md?console.log(_(Yo(r))):g.done(`eval run ${r.runId} saved \u2014 score ${r.summary.score}/100`),{success:!0,runId:r.runId,score:r.summary.score}}async compare(e,t){let r=await Ij(e,t);if(t.publish){let s=await $j(e,r,{target:t.target,dryRun:t.dryRun});if(t.json)console.log(JSON.stringify({comparison:r,publish:s},null,2));else if(t.md)console.log(_(Oa(r),W("Published",`Target: \`${s.target}\`
|
|
1884
1884
|
Project: \`${s.projectId}\`
|
|
@@ -1887,7 +1887,7 @@ Project: \`${r.projectId}\`
|
|
|
1887
1887
|
Repo: \`${r.repo}\`
|
|
1888
1888
|
Endpoint: \`${r.endpoint}\`
|
|
1889
1889
|
Payload: ${r.payloadBytes} bytes
|
|
1890
|
-
URL: ${r.url??"-"}`))):g.done(r.dryRun?`eval publish dry run prepared cloud benchmark payload (${r.payloadBytes} bytes)`:`eval benchmark ${r.artifactId} published to cloud`),{success:!0,...r}}unknown(e,t){let r=`Unknown eval subcommand: ${e}. Use run, compare, report, publish.`;return t.md?console.log(_(W("Unknown eval subcommand",r))):g.fail(r),{success:!1,error:r}}}});function Gj(){for(let n of Uj)n()}function je(n){let e;return Uj.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}function XW(){for(let[n,e]of Object.entries(ba))Ye.registerCategory(n,e)}function zW(){if(!Ye.has("work")){XW();for(let n of Vn)n.routing&&Ye.registerLazyMethod(n.name,JW[n.routing.group],n.routing.method,n)}}var Uj,JW,Sw=h(()=>{"use strict";qu();Xo();Uj=[];a(Gj,"resetGroupLoaders");a(je,"lazy");JW={workflow:je(async()=>new(await Promise.resolve().then(()=>(dy(),uy))).WorkflowCommands),planning:je(async()=>new(await Promise.resolve().then(()=>(ju(),Au))).PlanningCommands),shipping:je(async()=>new(await Promise.resolve().then(()=>(Pu(),xu))).ShippingCommands),analysis:je(async()=>new(await Promise.resolve().then(()=>(wu(),yu))).AnalysisCommands),setup:je(async()=>new(await Promise.resolve().then(()=>(Zu(),Qu))).SetupCommands),context:je(async()=>new(await Promise.resolve().then(()=>(sd(),rd))).ContextCommands),primitives:je(async()=>new(await Promise.resolve().then(()=>(Cy(),Ty))).PrimitiveCommands),seed:je(async()=>new(await Promise.resolve().then(()=>(id(),od))).SeedCommands),install:je(async()=>new(await Promise.resolve().then(()=>(Aa(),Pa))).InstallCommands),capture:je(async()=>new(await Promise.resolve().then(()=>(jy(),Ay))).CaptureCommands),mcp:je(async()=>new(await Promise.resolve().then(()=>(My(),Dy))).McpCommands),team:je(async()=>new(await Promise.resolve().then(()=>(Hy(),Fy))).TeamCommands),config:je(async()=>new(await Promise.resolve().then(()=>(Wy(),Gy))).ConfigCommands),uninstall:je(async()=>new(await Promise.resolve().then(()=>(iw(),ow))).UninstallCommands),update:je(async()=>new(await Promise.resolve().then(()=>(by(),ky))).UpdateCommands),spec:je(async()=>new(await Promise.resolve().then(()=>(Zy(),Qy))).SpecCommands),embeddings:je(async()=>new(await Promise.resolve().then(()=>(Vy(),qy))).EmbeddingsCommands),guard:je(async()=>new(await Promise.resolve().then(()=>(zy(),Xy))).GuardCommands),lean:je(async()=>new(await Promise.resolve().then(()=>(uj(),lj))).LeanCommands),cloud:je(async()=>new(await Promise.resolve().then(()=>(hj(),gj))).CloudCommands),tdd:je(async()=>new(await Promise.resolve().then(()=>(Gg(),Ug))).TddCommands),sdd:je(async()=>new(await Promise.resolve().then(()=>(vu(),bu))).SddCommands),notify:je(async()=>new(await Promise.resolve().then(()=>(wj(),yj))).NotifyCommands),agents:je(async()=>new(await Promise.resolve().then(()=>(bj(),kj))).AgentsCommands),product:je(async()=>new(await Promise.resolve().then(()=>(Tj(),Ej))).ProductCommands),eval:je(async()=>new(await Promise.resolve().then(()=>(Hj(),Fj))).EvalCommands)};a(XW,"registerCategories");a(zW,"registerAllCommands");zW()});function Fa(n){let e=Ye.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=KW(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}function KW(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][r]}var Ew=h(()=>{"use strict";Xo();a(Fa,"findClosestCommand");a(KW,"editDistance")});function YW(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function hd(n,e){let t=a(s=>n[s]!==void 0?n[s]:n[YW(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;r[s]=Number.isNaN(i)?void 0:i}return r}var Tw=h(()=>{"use strict";a(YW,"kebab");a(hd,"mapOptions")});async function yd(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&ZW.has(o))return n.spec(i,r,l);if(!o||!QW.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var QW,ZW,Cw=h(()=>{"use strict";QW=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),ZW=new Set(["draft","new","create"]);a(yd,"routeSpec")});async function Wj(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Sa(e.command)&&!Ye.getByName(e.command))return{success:!1,error:Yh(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ye.getByName(e.command)&&!(e.args.length===0&&Fa(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=Ye.getByName(e.command);if(o?.optionSchema)return Ye.executeWithOptions(e.command,t,e.cwd,hd(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return yd(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});case"login":return n.login({md:s});case"logout":return n.logout();case"auth":return n.auth(t,{md:s});default:return Ye.execute(e.command,t,e.cwd)}}var Bj=h(()=>{"use strict";Ew();Tw();Xo();Vu();Cw();a(Wj,"executeCommand")});function eB(n){return xw({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}function xw(n){return Array.isArray(n)?`[${n.map(xw).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${xw(r)}`).join(",")}}`:JSON.stringify(n)}function wd(n){return{...n}}var Rw,qj,Vj=h(()=>{"use strict";Rw=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=eB(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(wd(o.response));if(o.promise)return o.promise.then(wd)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=wd(l),i.promise=void 0,wd(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};a(eB,"requestFingerprint");a(xw,"stableStringify");a(wd,"cloneResponse");qj=new Rw});import An from"node:fs";import tB from"node:os";import Xn from"node:path";function Jj(){let n=__dirname;for(let r=0;r<5;r++){if(An.existsSync(Xn.join(n,"package.json"))){let s=Xn.join(n,"dist","daemon","entry.mjs");if(An.existsSync(s))return s;break}n=Xn.dirname(n)}let e=[Xn.join(__dirname,"..","daemon","entry.mjs"),Xn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(An.existsSync(r))return r;let t=process.argv[1];return t&&An.existsSync(t)?t:null}function Xj(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}function Pw(n,e){if(!n||e===null)return!1;try{return An.statSync(n).mtimeMs!==e}catch{return!1}}function zj(){let n=__dirname;for(let e=0;e<6;e++){let t=Xn.join(n,"package.json");try{let s=JSON.parse(An.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=Xn.dirname(n);if(r===n)break;n=r}return null}function Kj(n){if(!n)return!1;let e=tB.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=An.realpathSync(r)}catch{continue}let o=Xn.dirname(s);for(let i=0;i<6;i++){let c=Xn.join(o,"package.json");try{let u=JSON.parse(An.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=Xn.dirname(o);if(l===o)break;o=l}}return!1}function Yj(){let n=We.log();try{if(An.statSync(n).size>nB){let t=`${n}.1`;try{An.unlinkSync(t)}catch{}An.renameSync(n,t)}}catch{}}function Qj(n){try{return process.kill(n,0),!0}catch{return!1}}var nB,Zj=h(()=>{"use strict";ms();a(Jj,"resolveEntryPath");a(Xj,"decideRestart");a(Pw,"isCodeStale");a(zj,"readOwnPackageVersion");a(Kj,"isGlobalVersionDrifted");nB=1024*1024;a(Yj,"rotateLog");a(Qj,"isProcessRunning")});var s_={};j(s_,{startDaemon:()=>iB});import en from"node:fs";import{createServer as rB}from"node:net";async function iB(n){process.env.PRJCT_IN_DAEMON="1";let e=We.socket(),t=We.pid(),r=We.runDir(),s=ar(e);if(en.mkdirSync(r,{recursive:!0}),en.existsSync(t)){let c=parseInt(en.readFileSync(t,"utf-8").trim(),10);Qj(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),en.unlinkSync(t)}!s&&en.existsSync(e)&&en.unlinkSync(e),Yj();let o=Jj(),i=null;if(o)try{i=en.statSync(o).mtimeMs}catch{}if(Qo=zj(),ge={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:_p,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},Qo)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(Fc(),Kp));c(Qo)||await l(Qo)}catch{}if(Ha=new Hs,Zo=rB(c=>aB(c)),Zo.listen(e,()=>{s||en.chmodSync(e,384),en.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),r_(),md.startAll().catch(()=>{})}),Zo.on("error",c=>{console.error("Daemon socket error:",c.message),Gs(1)}),process.on("SIGTERM",()=>Gs(0)),process.on("SIGINT",()=>Gs(0)),process.on("SIGHUP",()=>{Ha=new Hs,Gj(),Ye.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}function aB(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>Ip){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(ps(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
|
|
1890
|
+
URL: ${r.url??"-"}`))):g.done(r.dryRun?`eval publish dry run prepared cloud benchmark payload (${r.payloadBytes} bytes)`:`eval benchmark ${r.artifactId} published to cloud`),{success:!0,...r}}unknown(e,t){let r=`Unknown eval subcommand: ${e}. Use run, compare, report, publish.`;return t.md?console.log(_(W("Unknown eval subcommand",r))):g.fail(r),{success:!1,error:r}}}});function Gj(){for(let n of Uj)n()}function je(n){let e;return Uj.push(()=>{e=void 0}),()=>e??=n().catch(t=>{throw e=void 0,t})}function XW(){for(let[n,e]of Object.entries(ba))Ye.registerCategory(n,e)}function zW(){if(!Ye.has("work")){XW();for(let n of Vn)n.routing&&Ye.registerLazyMethod(n.name,JW[n.routing.group],n.routing.method,n)}}var Uj,JW,Sw=h(()=>{"use strict";qu();Xo();Uj=[];a(Gj,"resetGroupLoaders");a(je,"lazy");JW={workflow:je(async()=>new(await Promise.resolve().then(()=>(dy(),uy))).WorkflowCommands),planning:je(async()=>new(await Promise.resolve().then(()=>(ju(),Au))).PlanningCommands),shipping:je(async()=>new(await Promise.resolve().then(()=>(Pu(),xu))).ShippingCommands),analysis:je(async()=>new(await Promise.resolve().then(()=>(wu(),yu))).AnalysisCommands),setup:je(async()=>new(await Promise.resolve().then(()=>(Zu(),Qu))).SetupCommands),context:je(async()=>new(await Promise.resolve().then(()=>(sd(),rd))).ContextCommands),primitives:je(async()=>new(await Promise.resolve().then(()=>(Cy(),Ty))).PrimitiveCommands),seed:je(async()=>new(await Promise.resolve().then(()=>(id(),od))).SeedCommands),install:je(async()=>new(await Promise.resolve().then(()=>(Aa(),Pa))).InstallCommands),capture:je(async()=>new(await Promise.resolve().then(()=>(jy(),Ay))).CaptureCommands),mcp:je(async()=>new(await Promise.resolve().then(()=>(My(),Dy))).McpCommands),team:je(async()=>new(await Promise.resolve().then(()=>(Hy(),Fy))).TeamCommands),config:je(async()=>new(await Promise.resolve().then(()=>(Wy(),Gy))).ConfigCommands),uninstall:je(async()=>new(await Promise.resolve().then(()=>(iw(),ow))).UninstallCommands),update:je(async()=>new(await Promise.resolve().then(()=>(by(),ky))).UpdateCommands),spec:je(async()=>new(await Promise.resolve().then(()=>(Zy(),Qy))).SpecCommands),embeddings:je(async()=>new(await Promise.resolve().then(()=>(Vy(),qy))).EmbeddingsCommands),guard:je(async()=>new(await Promise.resolve().then(()=>(zy(),Xy))).GuardCommands),lean:je(async()=>new(await Promise.resolve().then(()=>(uj(),lj))).LeanCommands),cloud:je(async()=>new(await Promise.resolve().then(()=>(hj(),gj))).CloudCommands),tdd:je(async()=>new(await Promise.resolve().then(()=>(Gg(),Ug))).TddCommands),sdd:je(async()=>new(await Promise.resolve().then(()=>(vu(),bu))).SddCommands),notify:je(async()=>new(await Promise.resolve().then(()=>(wj(),yj))).NotifyCommands),agents:je(async()=>new(await Promise.resolve().then(()=>(bj(),kj))).AgentsCommands),product:je(async()=>new(await Promise.resolve().then(()=>(Tj(),Ej))).ProductCommands),eval:je(async()=>new(await Promise.resolve().then(()=>(Hj(),Fj))).EvalCommands)};a(XW,"registerCategories");a(zW,"registerAllCommands");zW()});function Fa(n){let e=Ye.getAll().map(s=>s.name),t=null,r=1/0;for(let s of e){let o=KW(n.toLowerCase(),s.toLowerCase());o<r&&(r=o,t=s)}return r<=2?t:null}function KW(n,e){let t=n.length,r=e.length,s=Array.from({length:t+1},()=>Array(r+1).fill(0));for(let o=0;o<=t;o++)s[o][0]=o;for(let o=0;o<=r;o++)s[0][o]=o;for(let o=1;o<=t;o++)for(let i=1;i<=r;i++)s[o][i]=n[o-1]===e[i-1]?s[o-1][i-1]:1+Math.min(s[o-1][i],s[o][i-1],s[o-1][i-1]);return s[t][r]}var Ew=h(()=>{"use strict";Xo();a(Fa,"findClosestCommand");a(KW,"editDistance")});function YW(n){return n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}function hd(n,e){let t=a(s=>n[s]!==void 0?n[s]:n[YW(s)],"pick"),r={md:n.md===!0};for(let s of e.booleans??[])r[s]=t(s)===!0;for(let s of e.strings??[]){let o=t(s);r[s]=o!=null&&o!==!1&&o!==""?String(o):void 0}for(let s of e.numbers??[]){let o=t(s),i=o!=null&&o!==!1&&o!==""?Number(o):Number.NaN;r[s]=Number.isNaN(i)?void 0:i}return r}var Tw=h(()=>{"use strict";a(YW,"kebab");a(hd,"mapOptions")});async function yd(n,e,t,r){let s=t.md===!0,o=e[0],i=e.slice(1).join(" ")||null,c=e.join(" ")||null,l={md:s,goal:t.goal?String(t.goal):void 0,tags:t.tags?String(t.tags):void 0};if(o&&ZW.has(o))return n.spec(i,r,l);if(!o||!QW.has(o))return n.spec(c,r,l);switch(o){case"list":return n.specList(r,{md:s,status:t.status?String(t.status):void 0});case"show":return n.specShow(i,r,{md:s});case"update":return n.specUpdate(i,r,{md:s,json:t.json?String(t.json):void 0});case"set-status":return n.specSetStatus(i,r,{md:s,status:t.status?String(t.status):void 0});case"record-review":return n.specRecordReview(i,r,{md:s,reviewer:t.reviewer?String(t.reviewer):void 0,verdict:t.verdict?String(t.verdict):void 0,notes:t.notes?String(t.notes):void 0});case"link-task":return n.specLinkTask(i,r,{md:s,taskId:t["task-id"]?String(t["task-id"]):void 0});case"ship":return n.specShip(i,r,{md:s,pr:t.pr?String(t.pr):void 0});case"audit":return n.specAudit(i,r,{md:s,lenses:t.lenses?String(t.lenses):void 0});case"breakdown":return n.specBreakdown(i,r,{md:s,force:t.force===!0});case"inventory":return n.specInventory(r,{md:s,json:t.json===!0});default:return{success:!1,error:`unknown spec subverb: ${o}`}}}var QW,ZW,Cw=h(()=>{"use strict";QW=new Set(["list","show","update","set-status","record-review","link-task","ship","audit","breakdown","inventory"]),ZW=new Set(["draft","new","create"]);a(yd,"routeSpec")});async function Wj(n,e){let t=e.args.join(" ")||null,r=e.options,s=r.md===!0;if(Sa(e.command)&&!Ye.getByName(e.command))return{success:!1,error:Yh(e.command)??`'${e.command}' was removed in v2.`};if(e.command&&!Ye.getByName(e.command)&&!(e.args.length===0&&Fa(e.command)!==null)){let i=[e.command,...e.args.filter(c=>!c.startsWith("-"))].join(" ");return n.capture(i,e.cwd,{md:s,tags:r.tags?String(r.tags):void 0,force:r.force===!0})}let o=Ye.getByName(e.command);if(o?.optionSchema)return Ye.executeWithOptions(e.command,t,e.cwd,hd(r,o.optionSchema));switch(e.command){case"sync":return n.sync(e.cwd,{preview:r.preview===!0||r["dry-run"]===!0,yes:r.yes===!0,json:r.json===!0,md:s,package:r.package?String(r.package):void 0,full:r.full===!0});case"spec":return yd(n,e.args,r,e.cwd);case"audit-spec":return t?n.specAudit(t,e.cwd,{md:s,lenses:r.lenses?String(r.lenses):void 0}):{success:!1,error:"audit-spec requires a spec id"};case"analyze":return n.analyze(r,e.cwd);case"analysis-save-llm":return t?n.saveLlmAnalysis(t,e.cwd,{md:s}):{success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"};case"init":return n.init({idea:t,yes:r.yes===!0,pack:r.pack?String(r.pack):void 0,persona:r.persona?String(r.persona):void 0},e.cwd);case"regen":return n.regenVault(e.cwd,{md:s});default:return Ye.execute(e.command,t,e.cwd)}}var Bj=h(()=>{"use strict";Ew();Tw();Xo();Vu();Cw();a(Wj,"executeCommand")});function eB(n){return xw({command:n.command,args:n.args,options:n.options,cwd:n.cwd,stdin:n.stdin})}function xw(n){return Array.isArray(n)?`[${n.map(xw).join(",")}]`:n&&typeof n=="object"?`{${Object.entries(n).sort(([t],[r])=>t.localeCompare(r)).map(([t,r])=>`${JSON.stringify(t)}:${xw(r)}`).join(",")}}`:JSON.stringify(n)}function wd(n){return{...n}}var Rw,qj,Vj=h(()=>{"use strict";Rw=class{static{a(this,"RequestJournal")}ttlMs;maxEntries;now;entries=new Map;constructor(e={}){this.ttlMs=e.ttlMs??12e4,this.maxEntries=e.maxEntries??512,this.now=e.now??Date.now}run(e,t){let r=this.now();this.prune(r);let s=eB(e),o=this.entries.get(e.id);if(o){if(o.fingerprint!==s)return Promise.resolve({id:e.id,success:!1,exitCode:1,stderr:"Duplicate daemon request id reused with different payload"});if(o.response)return Promise.resolve(wd(o.response));if(o.promise)return o.promise.then(wd)}let i={createdAt:r,fingerprint:s},c=t().then(l=>(i.response=wd(l),i.promise=void 0,wd(l))).catch(l=>{throw this.entries.delete(e.id),l});return i.promise=c,this.entries.set(e.id,i),this.enforceMaxEntries(),c}clear(){this.entries.clear()}size(){return this.entries.size}prune(e){for(let[t,r]of this.entries)e-r.createdAt>this.ttlMs&&this.entries.delete(t)}enforceMaxEntries(){for(;this.entries.size>this.maxEntries;){let e=this.entries.keys().next().value;if(!e)break;this.entries.delete(e)}}};a(eB,"requestFingerprint");a(xw,"stableStringify");a(wd,"cloneResponse");qj=new Rw});import An from"node:fs";import tB from"node:os";import Xn from"node:path";function Jj(){let n=__dirname;for(let r=0;r<5;r++){if(An.existsSync(Xn.join(n,"package.json"))){let s=Xn.join(n,"dist","daemon","entry.mjs");if(An.existsSync(s))return s;break}n=Xn.dirname(n)}let e=[Xn.join(__dirname,"..","daemon","entry.mjs"),Xn.join(__dirname,"..","dist","daemon","entry.mjs")];for(let r of e)if(An.existsSync(r))return r;let t=process.argv[1];return t&&An.existsSync(t)?t:null}function Xj(n){return n.codeStale?{restart:!0,lastDriftCheckMs:n.lastDriftCheckMs}:n.ownVersion&&n.command!=="__ping"&&n.now-n.lastDriftCheckMs>=n.driftMinIntervalMs?{restart:n.checkDrift(n.ownVersion),lastDriftCheckMs:n.now}:{restart:!1,lastDriftCheckMs:n.lastDriftCheckMs}}function Pw(n,e){if(!n||e===null)return!1;try{return An.statSync(n).mtimeMs!==e}catch{return!1}}function zj(){let n=__dirname;for(let e=0;e<6;e++){let t=Xn.join(n,"package.json");try{let s=JSON.parse(An.readFileSync(t,"utf-8"));if(s?.name==="prjct-cli"&&typeof s.version=="string")return s.version}catch{}let r=Xn.dirname(n);if(r===n)break;n=r}return null}function Kj(n){if(!n)return!1;let e=tB.homedir(),t=[`${e}/Library/pnpm/prjct`,`${e}/.local/share/pnpm/prjct`,`${e}/.npm-global/bin/prjct`,"/usr/local/bin/prjct","/opt/homebrew/bin/prjct",`${e}/.volta/bin/prjct`,`${e}/.asdf/shims/prjct`];for(let r of t){let s;try{s=An.realpathSync(r)}catch{continue}let o=Xn.dirname(s);for(let i=0;i<6;i++){let c=Xn.join(o,"package.json");try{let u=JSON.parse(An.readFileSync(c,"utf-8"));if(u?.name==="prjct-cli"&&typeof u.version=="string")return u.version!==n}catch{}let l=Xn.dirname(o);if(l===o)break;o=l}}return!1}function Yj(){let n=We.log();try{if(An.statSync(n).size>nB){let t=`${n}.1`;try{An.unlinkSync(t)}catch{}An.renameSync(n,t)}}catch{}}function Qj(n){try{return process.kill(n,0),!0}catch{return!1}}var nB,Zj=h(()=>{"use strict";ms();a(Jj,"resolveEntryPath");a(Xj,"decideRestart");a(Pw,"isCodeStale");a(zj,"readOwnPackageVersion");a(Kj,"isGlobalVersionDrifted");nB=1024*1024;a(Yj,"rotateLog");a(Qj,"isProcessRunning")});var s_={};j(s_,{startDaemon:()=>iB});import en from"node:fs";import{createServer as rB}from"node:net";async function iB(n){process.env.PRJCT_IN_DAEMON="1";let e=We.socket(),t=We.pid(),r=We.runDir(),s=ar(e);if(en.mkdirSync(r,{recursive:!0}),en.existsSync(t)){let c=parseInt(en.readFileSync(t,"utf-8").trim(),10);Qj(c)&&(console.error(`Daemon already running (PID ${c})`),process.exit(1)),en.unlinkSync(t)}!s&&en.existsSync(e)&&en.unlinkSync(e),Yj();let o=Jj(),i=null;if(o)try{i=en.statSync(o).mtimeMs}catch{}if(Qo=zj(),ge={startedAt:Date.now(),commandsServed:0,lastActivity:Date.now(),idleTimeoutMs:_p,idleTimer:null,entryPath:o,entryMtime:i,activeRequests:0,restartPending:!1},Qo)try{let{isSyncCurrent:c,runSelfHeal:l}=await Promise.resolve().then(()=>(Fc(),Kp));c(Qo)||await l(Qo)}catch{}if(Ha=new Hs,Zo=rB(c=>aB(c)),Zo.listen(e,()=>{s||en.chmodSync(e,384),en.writeFileSync(t,String(process.pid)),console.log(`prjct daemon started (PID ${process.pid})`),console.log(` Socket: ${e}`),o&&console.log(` Watching: ${o}`),r_(),md.startAll().catch(()=>{})}),Zo.on("error",c=>{console.error("Daemon socket error:",c.message),Gs(1)}),process.on("SIGTERM",()=>Gs(0)),process.on("SIGINT",()=>Gs(0)),process.on("SIGHUP",()=>{Ha=new Hs,Gj(),Ye.resetLazyResolutions(),console.log("Daemon reloaded (SIGHUP)")}),!n.foreground)try{process.stdin?.unref?.()}catch{}}function aB(n){let e="";n.on("data",async t=>{if(e+=t.toString(),e.length>Ip){let s={id:"unknown",success:!1,exitCode:1,stderr:"Request too large"};n.write(ps(s)),n.destroy(),e="";return}let r;for(;(r=e.indexOf(`
|
|
1891
1891
|
`))!==-1;){let s=e.slice(0,r);if(e=e.slice(r+1),!!s.trim())try{let o=JSON.parse(s),i=await lB(o);n.write(ps(i))}catch(o){let i={id:"unknown",success:!1,exitCode:1,stderr:`Protocol error: ${o.message}`};n.write(ps(i))}}}),n.on("error",()=>{})}function cB(n){if(!ge||ge.restartPending)return;let e=Pw(ge.entryPath,ge.entryMtime),t=Xj({codeStale:e,command:n,ownVersion:Qo,now:Date.now(),lastDriftCheckMs:e_,driftMinIntervalMs:oB,checkDrift:Kj});e_=t.lastDriftCheckMs,t.restart&&(ge.restartPending=!0,console.log(e?"Build change detected \u2014 daemon will restart; request runs on fresh code.":`Version drift detected \u2014 daemon v${Qo} is stale; request runs on fresh code.`))}async function lB(n){return!ge||!Ha?{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"}:(cB(n.command),ge.restartPending&&n.command!=="daemon"&&n.command!=="__ping"?(ge.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Gs(0))),{id:n.id,success:!1,exitCode:1,retry:!0,stderr:"daemon code is stale \u2014 running directly"}):qj.run(n,async()=>{ge.activeRequests++;try{let e=t_.then(()=>n_(n),()=>n_(n));return t_=e.then(()=>{},()=>{}),await e}finally{ge.activeRequests--,ge.restartPending&&ge.activeRequests===0&&(console.log("Daemon shutting down for code reload..."),setImmediate(()=>Gs(0)))}}))}async function n_(n){if(!ge||!Ha)return{id:n.id,success:!1,exitCode:1,stderr:"Daemon not initialized"};if(r_(),ge.commandsServed++,ge.lastActivity=Date.now(),ge.commandsServed%sB===0&&S.checkpointAll(),n.command==="daemon")return dB(n);if(n.command==="hook")return uB(n);if(n.command==="__ping")return{id:n.id,success:!0,exitCode:0,result:{pong:!0,pid:process.pid}};try{let e=[],t=[],r=console.log,s=console.error;console.log=(...o)=>e.push(o.map(String).join(" ")),console.error=(...o)=>t.push(o.map(String).join(" "));try{let o=await Wj(Ha,n);return{id:n.id,success:o.success,exitCode:o.success?0:1,stdout:e.join(`
|
|
1892
1892
|
`)||o.message||void 0,stderr:t.join(`
|
|
1893
1893
|
`)||o.error||void 0,result:o}}finally{console.log=r,console.error=s}}catch(e){return{id:n.id,success:!1,exitCode:1,stderr:e.message}}}async function uB(n){let e=zh(n.args[0]);if(!e)return{id:n.id,success:!0,exitCode:0,stdout:`{}
|
|
@@ -1983,7 +1983,7 @@ ${o.split(`
|
|
|
1983
1983
|
`).map(c=>c.trim()).filter(Boolean),o=(await e(async()=>(await H("git",["diff","--stat"],{cwd:n})).stdout,"")).trim(),i=(await e(async()=>(await J("git log --oneline -10",{cwd:n})).stdout,"")).split(`
|
|
1984
1984
|
`).map(c=>c.trim()).filter(Boolean);return{branch:t||"unknown",head:r||null,statusShort:s,diffStat:o,recentLog:i}}function yB(n,e){let t=[];if(t.push(`Restoring: ${e}`),t.push(`Title: ${n.title}`),t.push(`Branch: ${n.git.branch}`),t.push(`Saved at: ${n.createdAt}`),n.notes&&(t.push(""),t.push("Notes:"),t.push(n.notes)),n.git.statusShort.length>0){t.push(""),t.push("Working tree at save time:");for(let r of n.git.statusShort.slice(0,20))t.push(` ${r}`)}if(n.git.recentLog.length>0){t.push(""),t.push("Recent commits:");for(let r of n.git.recentLog)t.push(` ${r}`)}return t.join(`
|
|
1985
1985
|
`)}function wB(n,e){let t=[];if(t.push(`## context-restore \u2014 \`${e}\``),t.push(""),t.push(`- **Title**: ${n.title}`),t.push(`- **Branch**: ${n.git.branch}`),t.push(`- **Saved at**: ${n.createdAt}`),t.push(""),n.notes&&(t.push("### Notes"),t.push(""),t.push(n.notes),t.push("")),n.git.statusShort.length>0){t.push("### Working tree at save time"),t.push(""),t.push("```");for(let r of n.git.statusShort.slice(0,20))t.push(r);t.push("```"),t.push("")}if(n.git.recentLog.length>0){t.push("### Recent commits"),t.push("");for(let r of n.git.recentLog)t.push(`- ${r}`)}return t.join(`
|
|
1986
|
-
`)}var mB,Dw,Nw=h(()=>{"use strict";be();F();pe();
|
|
1986
|
+
`)}var mB,Dw,Nw=h(()=>{"use strict";be();F();pe();me();ie();ye();Lt();mB=50,Dw=class extends G{static{a(this,"ContextCheckpointCommands")}async save(e,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;let o=(e??"untitled").trim().slice(0,200)||"untitled",i=await hB(t),c={version:1,title:o,createdAt:new Date().toISOString(),git:i,notes:(r.notes??"").trim()},l=k_(s.value);await Ga.mkdir(l,{recursive:!0});let u=fB(c.createdAt,o),d=Ws.join(l,u);return await Ga.writeFile(d,JSON.stringify(c,null,2),"utf-8"),r.md?console.log(`## context-save
|
|
1987
1987
|
|
|
1988
1988
|
- **Title**: ${o}
|
|
1989
1989
|
- **Branch**: ${i.branch}
|
|
@@ -2003,25 +2003,25 @@ ${m}
|
|
|
2003
2003
|
${c}`.split(`
|
|
2004
2004
|
`).map(u=>u.trim()).find(u=>u.length>0);return{dimension:e,status:"fail",durationMs:Date.now()-t,diagnostic:l??w(o)}}}function SB(n){if(n.length===0)return 0;let e=0,t=0;for(let r of n)r.status!=="skipped"&&(t+=r.dimension.weight,r.status==="pass"&&(e+=r.dimension.weight));return t===0?0:Math.round(e/t*100)}function EB(n){return n==="pass"?"\u2713":n==="fail"?"\u2717":"\xB7"}function TB(n,e){if(e.length===0)return"health: no quality dimensions detected (add typecheck/lint/test/knip scripts to package.json)";let t=[];t.push(`health: ${n}/100`);for(let r of e){let s=r.durationMs>1e3?`${(r.durationMs/1e3).toFixed(1)}s`:`${r.durationMs}ms`,o=r.status==="fail"&&r.diagnostic?` \u2014 ${r.diagnostic.slice(0,80)}`:"";t.push(` ${EB(r.status)} ${r.dimension.name.padEnd(10)} ${s}${o}`)}return t.join(`
|
|
2005
2005
|
`)}function CB(n,e){if(e.length===0)return"## Health\n\n_No quality dimensions detected. Add `typecheck`, `lint`, `test`, or `knip` scripts to `package.json`._\n";let t=[];t.push(`## Health \u2014 ${n}/100`),t.push(""),t.push("| Dimension | Status | Duration | Notes |"),t.push("|---|---|---|---|");for(let r of e){let s=r.durationMs>1e3?`${(r.durationMs/1e3).toFixed(1)}s`:`${r.durationMs}ms`,o=r.status==="fail"&&r.diagnostic?r.diagnostic.slice(0,100).replaceAll("|","\\|"):"";t.push(`| ${r.dimension.name} | ${r.status} | ${s} | ${o} |`)}return t.join(`
|
|
2006
|
-
`)}var kB,Ow,S_=h(()=>{"use strict";F();pe();Y();
|
|
2006
|
+
`)}var kB,Ow,S_=h(()=>{"use strict";F();pe();Y();me();ye();kB=[{name:"typecheck",scriptName:"typecheck",description:"TypeScript types",weight:25},{name:"lint",scriptName:"lint",description:"Lint rules",weight:20},{name:"tests",scriptName:"test",description:"Test suite",weight:35},{name:"dead-code",scriptName:"knip",description:"Dead-code scan",weight:20}],Ow=class extends G{static{a(this,"HealthCommands")}async health(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await bB(t),i=[];for(let u of o)i.push(await vB(t,u));let c=SB(i);return r.md?console.log(CB(c,i)):console.log(TB(c,i)),{success:i.every(u=>u.status!=="fail"),score:c,results:i.length}}catch(s){let o=w(s);return A(o)}}};a(bB,"detectDimensions");a(vB,"runDimension");a(SB,"computeScore");a(EB,"statusIcon");a(TB,"formatText");a(CB,"formatMarkdown")});var T_={};j(T_,{RetroCommands:()=>Lw});import RB from"node:path";function xB(n){let t=(n??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let r=Number.parseInt(t[1],10);if(!Number.isFinite(r)||r<=0||r>365)return null;let s=t[2],o=new Date;if(s==="h"){let l=new Date(o.getTime()-r*60*60*1e3);return{label:`${r}h`,sinceIso:E_(l),hours:r}}let i=new Date(o.getFullYear(),o.getMonth(),o.getDate()),c=new Date(i.getTime()-r*24*60*60*1e3);return{label:`${r}d`,sinceIso:E_(c),hours:r*24}}function E_(n){let e=a(t=>`${t}`.padStart(2,"0"),"pad");return`${n.getFullYear()}-${e(n.getMonth()+1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}:${e(n.getSeconds())}`}async function PB(n,e){let t="";try{t=(await H("git",["log",`--since=${e}`,"--pretty=format:%H%x09%an%x09%ae%x09%aI%x09%s"],{cwd:n,maxBuffer:16777216})).stdout}catch(r){let s=r.stderr??r.message??"";if(/does not have any commits|unknown revision|bad revision|HEAD/i.test(s))return[];throw r}return t.split(`
|
|
2007
2007
|
`).filter(Boolean).map(r=>{let[s,o,i,c,...l]=r.split(" ");return{hash:s??"",authorName:o??"unknown",authorEmail:i??"",date:c??"",subject:l.join(" ")??""}}).filter(r=>r.hash)}function AB(n){let e=new Map;for(let t of n){let r=t.authorEmail||t.authorName,s=e.get(r);s||(s={name:t.authorName,email:t.authorEmail,commits:0,insertions:0,deletions:0,files:0,firstCommit:t.date,lastCommit:t.date},e.set(r,s)),s.commits++,t.date<s.firstCommit&&(s.firstCommit=t.date),t.date>s.lastCommit&&(s.lastCommit=t.date)}return Array.from(e.values()).sort((t,r)=>r.commits-t.commits)}function jB(n,e,t){if(e.length===0)return`No commits in the last ${n.label}.`;let r=[];r.push(`Retro \u2014 last ${n.label} \xB7 ${e.length} commits \xB7 ${t.length} contributors`),r.push("");for(let s of t)r.push(` ${s.commits.toString().padStart(3)} ${s.name} <${s.email}>`);r.push(""),r.push("Recent commits:");for(let s of e.slice(0,10))r.push(` ${s.hash.slice(0,7)} ${s.subject}`);return r.join(`
|
|
2008
2008
|
`)}function _B(n,e,t){if(e.length===0)return`## Retro \u2014 last ${n.label}
|
|
2009
2009
|
|
|
2010
2010
|
_No commits in the window._
|
|
2011
2011
|
`;let r=[];r.push(`## Retro \u2014 last ${n.label}`),r.push(""),r.push(`- **Commits**: ${e.length}`),r.push(`- **Contributors**: ${t.length}`),r.push(""),r.push("### Per contributor"),r.push(""),r.push("| Author | Commits | First | Last |"),r.push("|---|---|---|---|");for(let s of t)r.push(`| ${s.name} | ${s.commits} | ${s.firstCommit.slice(0,10)} | ${s.lastCommit.slice(0,10)} |`);r.push(""),r.push("### Recent commits"),r.push("");for(let s of e.slice(0,15))r.push(`- \`${s.hash.slice(0,7)}\` ${s.subject} \u2014 _${s.authorName}_`);return r.join(`
|
|
2012
|
-
`)}var Lw,C_=h(()=>{"use strict";F();pe();Y();
|
|
2012
|
+
`)}var Lw,C_=h(()=>{"use strict";F();pe();Y();me();ie();ye();Lw=class extends G{static{a(this,"RetroCommands")}async retro(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;if(!await E(RB.join(t,".git")))return g.fail("Not in a git repository \u2014 `prjct retro` needs git history."),{success:!1,error:"Not a git repo"};let o=xB(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await PB(t,o.sinceIso),c=AB(i);return r.md?console.log(_B(o,i,c)):console.log(jB(o,i,c)),{success:!0,window:o.label,commits:i.length,contributors:c.length}}catch(s){let o=w(s);return A(o)}}};a(xB,"parseWindow");a(E_,"toLocalIso");a(PB,"readCommits");a(AB,"groupByAuthor");a(jB,"formatText");a(_B,"formatMarkdown")});var R_={};j(R_,{SkillAdherenceCommands:()=>Fw});function IB(n){let t=(n??"7d").trim().toLowerCase().match(/^(\d+)\s*([hd])$/);if(!t)return null;let r=Number.parseInt(t[1],10);return!Number.isFinite(r)||r<=0||r>365?null:t[2]==="h"?{label:`${r}h`,hours:r}:{label:`${r}d`,hours:r*24}}function $B(n){return(n.split(`
|
|
2013
2013
|
`)[0]??"").replace(/^\[skill-miss\]\s*/,"").trim()}function DB(n,e,t,r,s){if(t===0)return`Skill adherence \u2014 last ${n}: no skill-misses captured. Clean.`;let o=[];o.push(`Skill adherence \u2014 last ${n} \xB7 ${t} miss${t===1?"":"es"} \xB7 ${r} resolved \xB7 ${(s*100).toFixed(0)}% addressed`),o.push("");for(let i of e.slice(0,20)){let c=i.resolved?"\u2713":"\xB7",l=i.file?` (${i.file})`:"";o.push(` ${c} ${i.memId}${l} ${i.excerpt.slice(0,100)}`)}return o.join(`
|
|
2014
2014
|
`)}function MB(n,e,t,r,s,o){if(t===0)return`## Skill adherence \u2014 last ${n}
|
|
2015
2015
|
|
|
2016
2016
|
_No skill-misses captured in the window._
|
|
2017
2017
|
`;let i=[];i.push(`## Skill adherence \u2014 last ${n}`),i.push(""),i.push(`- **Skill-misses**: ${t}`),i.push(`- **Resolved**: ${r} (${(s*100).toFixed(0)}% addressed)`),i.push(`- **Resolution decisions logged**: ${o}`),i.push(""),i.push("| State | Memory | File | Signal |"),i.push("|---|---|---|---|");for(let c of e.slice(0,30)){let l=c.resolved?"\u2713 resolved":"\xB7 open",u=c.file||"\u2014",d=c.excerpt.slice(0,110).replace(/\|/g,"\\|");i.push(`| ${l} | ${c.memId} | ${u} | ${d} |`)}return i.join(`
|
|
2018
|
-
`)}var Fw,x_=h(()=>{"use strict";K();Te();F();
|
|
2018
|
+
`)}var Fw,x_=h(()=>{"use strict";K();Te();F();me();ie();ye();Fw=class extends G{static{a(this,"SkillAdherenceCommands")}async skillAdherence(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=IB(e);if(!o)return g.fail(`Invalid window "${e}". Use: 7d, 24h, 14d, 30d (units: h or d).`),{success:!1,error:"Invalid window"};let i=await x.readConfig(t);if(!i?.projectId)return g.fail("No prjct project here \u2014 run `prjct start` first."),{success:!1,error:"No project"};let c=Date.now()-o.hours*60*60*1e3,l=O.recall(i.projectId,{types:["improvement-signal"],tags:{source:"skill-miss-detector"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=c),u=O.recall(i.projectId,{types:["decision"],tags:{resolves:"skill-miss"},limit:300,dedupeByKey:!1}).filter(v=>Date.parse(v.rememberedAt)>=c),d=new Set(u.map(v=>v.tags.relates).filter(v=>!!v)),p=l.map(v=>({memId:v.tags.relates??"\u2014",excerpt:$B(v.content),file:v.tags.file??"",rememberedAt:v.rememberedAt,resolved:v.tags.relates?d.has(v.tags.relates):!1})),m=p.length,f=p.filter(v=>v.resolved).length,y=m===0?1:f/m;return r.md?console.log(MB(o.label,p,m,f,y,u.length)):console.log(DB(o.label,p,m,f,y)),{success:!0,window:o.label,misses:m,resolved:f,adherence:Number(y.toFixed(2))}}catch(s){return A(w(s))}}};a(IB,"parseWindow");a($B,"firstLine");a(DB,"formatText");a(MB,"formatMarkdown")});var j_={};j(j_,{ReviewRiskCommands:()=>Hw,_internal:()=>BB});async function HB(n,e){let{stdout:t}=await H("git",e,{cwd:n});return t.trim()}async function ei(n,e){try{return await HB(n,e)}catch{return null}}async function UB(n){let e="",t=await ei(n,["rev-parse","--abbrev-ref","origin/HEAD"]);if(t&&t!=="origin/HEAD")e=t;else for(let f of["main","master"])if(await ei(n,["rev-parse","--verify","--quiet",f])!==null){e=f;break}if(!e)return null;let r=await ei(n,["merge-base",e,"HEAD"]);if(!r)return null;let s=await ei(n,["rev-parse","HEAD"]);if(!s||s===r)return null;let o=await ei(n,["diff","--shortstat",`${r}..HEAD`]);if(o===null)return null;let i=o.match(/(\d+) files? changed/),c=o.match(/(\d+) insertions?/),l=o.match(/(\d+) deletions?/),u=i?Number.parseInt(i[1],10):0,d=(c?Number.parseInt(c[1],10):0)+(l?Number.parseInt(l[1],10):0),p=await ei(n,["diff","--name-only",`${r}..HEAD`])??"",m=[...new Set(p.split(`
|
|
2019
2019
|
`).filter(Boolean).map(f=>f.includes("/")?f.slice(0,f.indexOf("/")):"."))].sort();return{base:r.slice(0,7),files:u,loc:d,dirs:m}}function P_(n){return n.files<=NB&&n.loc<=OB?"trivial":n.files<=LB&&n.loc<=FB?"normal":"large"}function Uw(n){return n==="trivial"?"direct":n==="normal"?"single":"split"}function A_(n,e){return n==="direct"?"Small + low-risk \u2014 fine to land directly or as one tiny PR.":n==="single"?"Cohesive \u2014 one reviewable PR.":`Large \u2014 hard to review in one pass. Consider stacked PRs.${e.dirs.length>1?` Natural split lines: ${e.dirs.join(", ")}.`:" Consider splitting by concern even within this area."}`}function GB(n,e,t){return[`Review risk: ${e.toUpperCase()} \u2014 ${n.files} files, ${n.loc} LOC vs ${n.base}`,`Delivery: ${t} \u2014 ${A_(t,n)}`,"(advisory \u2014 you decide; nothing was changed)"].join(`
|
|
2020
2020
|
`)}function WB(n,e,t){return["## Review risk","",`- **Tier**: ${e}`,`- **Changeset**: ${n.files} files, ${n.loc} LOC (vs \`${n.base}\`)`,`- **Dirs touched**: ${n.dirs.join(", ")||"\u2014"}`,`- **Suggested delivery**: \`${t}\` \u2014 ${A_(t,n)}`,"","_Advisory only \u2014 no gate, nothing changed._"].join(`
|
|
2021
|
-
`)}var NB,OB,LB,FB,Hw,BB,__=h(()=>{"use strict";F();pe();
|
|
2021
|
+
`)}var NB,OB,LB,FB,Hw,BB,__=h(()=>{"use strict";F();pe();me();ye();NB=2,OB=20,LB=10,FB=400,Hw=class extends G{static{a(this,"ReviewRiskCommands")}async reviewRisk(e=null,t=process.cwd(),r={}){try{let s=await this.ensureProjectInit(t);if(!s.success)return s;let o=await UB(t);if(!o){let l="review-risk: no comparable changeset (no base branch or nothing committed).";return console.log(r.md?`## Review risk
|
|
2022
2022
|
|
|
2023
2023
|
_${l}_
|
|
2024
|
-
`:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Uw("trivial")}}let i=P_(o),c=Uw(i);return console.log(r.md?WB(o,i,c):GB(o,i,c)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:c}}catch(s){return A(w(s))}}};a(HB,"git");a(ei,"safeGit");a(UB,"computeChangeset");a(P_,"tierOf");a(Uw,"geometryOf");a(A_,"suggestion");a(GB,"formatText");a(WB,"formatMd");BB={tierOf:P_,geometryOf:Uw}});function Ww(){return{version:1,entries:{}}}function bd(n){let e=S.getDoc(n,I_);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?Ww():e}function Gw(n,e){S.setDoc(n,I_,e)}function ti(n){return/^[a-zA-Z0-9_-]+$/.test(n)&&n.length>0&&n.length<=80}function $_(n){return qB.includes(n)}var I_,qB,ni,D_=h(()=>{"use strict";Z();I_="prefs:questions",qB=["always-ask","never-ask","auto-decide"];a(Ww,"emptyDoc");a(bd,"read");a(Gw,"write");a(ti,"isValidQuestionId");a($_,"isValidPreference");ni={set(n,e){if(!ti(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},r=bd(n);return r.entries[e.questionId]=t,Gw(n,r),t},get(n,e){return bd(n).entries[e]??null},list(n){let e=bd(n);return Object.values(e.entries).sort((t,r)=>r.setAt.localeCompare(t.setAt))},check(n,e){let t=this.get(n,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(n,e){let t=bd(n);if(!e){let r=Object.keys(t.entries).length;return Gw(n,Ww()),r}return t.entries[e]?(delete t.entries[e],Gw(n,t),1):0}}});var M_={};j(M_,{PreferencesCommands:()=>Bw});var Bw,N_=h(()=>{"use strict";D_();F();
|
|
2024
|
+
`:l),{success:!0,tier:"trivial",files:0,loc:0,geometry:Uw("trivial")}}let i=P_(o),c=Uw(i);return console.log(r.md?WB(o,i,c):GB(o,i,c)),{success:!0,tier:i,files:o.files,loc:o.loc,geometry:c}}catch(s){return A(w(s))}}};a(HB,"git");a(ei,"safeGit");a(UB,"computeChangeset");a(P_,"tierOf");a(Uw,"geometryOf");a(A_,"suggestion");a(GB,"formatText");a(WB,"formatMd");BB={tierOf:P_,geometryOf:Uw}});function Ww(){return{version:1,entries:{}}}function bd(n){let e=S.getDoc(n,I_);return!e||e.version!==1||typeof e.entries!="object"||e.entries===null?Ww():e}function Gw(n,e){S.setDoc(n,I_,e)}function ti(n){return/^[a-zA-Z0-9_-]+$/.test(n)&&n.length>0&&n.length<=80}function $_(n){return qB.includes(n)}var I_,qB,ni,D_=h(()=>{"use strict";Z();I_="prefs:questions",qB=["always-ask","never-ask","auto-decide"];a(Ww,"emptyDoc");a(bd,"read");a(Gw,"write");a(ti,"isValidQuestionId");a($_,"isValidPreference");ni={set(n,e){if(!ti(e.questionId))throw new Error(`Invalid questionId "${e.questionId}". Must be alphanumeric with - or _, 1-80 chars.`);let t={questionId:e.questionId,preference:e.preference,setAt:new Date().toISOString(),reason:e.reason?.trim()||void 0},r=bd(n);return r.entries[e.questionId]=t,Gw(n,r),t},get(n,e){return bd(n).entries[e]??null},list(n){let e=bd(n);return Object.values(e.entries).sort((t,r)=>r.setAt.localeCompare(t.setAt))},check(n,e){let t=this.get(n,e);if(!t)return"ASK_NORMALLY";switch(t.preference){case"never-ask":return"NEVER_ASK";case"auto-decide":return"AUTO_DECIDE";default:return"ASK_NORMALLY"}},clear(n,e){let t=bd(n);if(!e){let r=Object.keys(t.entries).length;return Gw(n,Ww()),r}return t.entries[e]?(delete t.entries[e],Gw(n,t),1):0}}});var M_={};j(M_,{PreferencesCommands:()=>Bw});var Bw,N_=h(()=>{"use strict";D_();F();me();ie();ye();Lt();Bw=class extends G{static{a(this,"PreferencesCommands")}async prefs(e,t=process.cwd(),r={}){try{let s=await se(t);if(!s.ok)return s.result;let o=e[0]??"list",i=e.slice(1);switch(o){case"list":return this.handleList(s.value,r);case"get":return this.handleGet(s.value,i,r);case"check":return this.handleCheck(s.value,i);case"set":return this.handleSet(s.value,i,r);case"clear":return this.handleClear(s.value,i,r);default:return g.fail(`Unknown prefs subcommand: ${o}. Use: list, get, check, set, clear.`),{success:!1,error:`Unknown subcommand: ${o}`}}}catch(s){let o=w(s);return A(o)}}handleList(e,t){let r=ni.list(e);if(t.md)if(r.length===0)console.log(`## Question preferences
|
|
2025
2025
|
|
|
2026
2026
|
_No preferences set._
|
|
2027
2027
|
`);else{let s=r.map(o=>`| ${o.questionId} | ${o.preference} | ${o.setAt} | ${o.reason?o.reason.replaceAll("|","\\|"):""} |`).join(`
|
|
@@ -2055,7 +2055,7 @@ ${o}`}async function zB(){let n=tt(O_);if(!n)throw new Error(`Missing crew templ
|
|
|
2055
2055
|
`}function ZB(n){if(!Ba(n))return n;let e=n.indexOf(zw),t=n.indexOf(Wa)+Wa.length,r=`${n.slice(0,e)}${n.slice(t)}`;return r=r.replace(/\n{3,}/g,`
|
|
2056
2056
|
|
|
2057
2057
|
`).trimEnd(),r.length>0?`${r}
|
|
2058
|
-
`:""}async function Jw(n){let e=un.join(n,Bs);try{return await jn.readFile(e,"utf-8")}catch{return null}}async function eq(n){let e=await Promise.all(Vw.map(async c=>({path:c.destRelative,installed:await E(un.join(n,c.destRelative))}))),t=!1;try{let c=await x.getProjectId(n);c&&(br.get(c),t=!0)}catch{t=!1}let r={path:"kv_store[crew:checkpoints]",installed:t},s=await Jw(n),o={path:Bs,installed:s!==null&&Ba(s)},i=e.every(c=>c.installed)&&r.installed&&o.installed;return{agents:e,checkpoints:r,claudeSnippet:o,complete:i}}async function tq(){let n=[];for await(let e of process.stdin)n.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(n).toString("utf-8")}var zw,Wa,qw,VB,Vw,XB,O_,Bs,Xw,F_=h(()=>{"use strict";mn();K();be();fg();pl();F();Y();
|
|
2058
|
+
`:""}async function Jw(n){let e=un.join(n,Bs);try{return await jn.readFile(e,"utf-8")}catch{return null}}async function eq(n){let e=await Promise.all(Vw.map(async c=>({path:c.destRelative,installed:await E(un.join(n,c.destRelative))}))),t=!1;try{let c=await x.getProjectId(n);c&&(br.get(c),t=!0)}catch{t=!1}let r={path:"kv_store[crew:checkpoints]",installed:t},s=await Jw(n),o={path:Bs,installed:s!==null&&Ba(s)},i=e.every(c=>c.installed)&&r.installed&&o.installed;return{agents:e,checkpoints:r,claudeSnippet:o,complete:i}}async function tq(){let n=[];for await(let e of process.stdin)n.push(typeof e=="string"?Buffer.from(e):e);return Buffer.concat(n).toString("utf-8")}var zw,Wa,qw,VB,Vw,XB,O_,Bs,Xw,F_=h(()=>{"use strict";mn();K();be();fg();pl();F();Y();me();ie();ye();zw="<!-- prjct:crew:start - DO NOT REMOVE THIS MARKER -->",Wa="<!-- prjct:crew:end - DO NOT REMOVE THIS MARKER -->",qw="<!-- prjct:checkpoints:start - DO NOT EDIT (managed by `prjct crew checkpoints set|reset`) -->",VB="<!-- prjct:checkpoints:end -->";a(JB,"spliceCheckpoints");Vw=[{templateKey:"crew/agents/leader.md",destRelative:".claude/agents/leader.md"},{templateKey:"crew/agents/implementer.md",destRelative:".claude/agents/implementer.md"},{templateKey:"crew/agents/reviewer.md",destRelative:".claude/agents/reviewer.md"}],XB={templateKey:"crew/CHECKPOINTS.md",destRelative:".prjct/CHECKPOINTS.md"},O_="crew/CLAUDE-leader-mode.md",Bs="CLAUDE.md";a(zB,"readSnippet");a(KB,"readTemplate");a(YB,"writeFileEnsureDir");a(Ba,"snippetPresent");a(QB,"appendSnippet");a(ZB,"stripSnippet");a(Jw,"readClaudeMd");a(eq,"getStatus");Xw=class extends G{static{a(this,"CrewCommands")}async install(e=null,t=process.cwd(),r={}){try{let s=[],o=[],i=await this.ensureProjectInit(t);if(!i.success)return i;let c=await x.getProjectId(t);if(!c)return A("No prjct project. Run `prjct init` first.",r);let l=br.get(c);for(let k of Vw){let b=un.join(t,k.destRelative),P=await KB(k.templateKey);k.destRelative===".claude/agents/reviewer.md"&&(P=JB(P,l.content));let T=await E(b);await YB(b,P),T?o.push(`${k.destRelative} (overwritten)`):s.push(k.destRelative)}let u=await zB(),d=un.join(t,Bs),p=await Jw(t)??"",m=Ba(p),f=QB(p,u);f!==p?(await jn.writeFile(d,f,"utf-8"),s.push(`${Bs} (${m?"snippet refreshed":"snippet appended"})`)):o.push(`${Bs} (snippet already current)`);let y=`crew installed (${s.length} written, ${o.length} kept)`,v=["Suggested next step \u2014 wire verification hooks into .claude/settings.json:"," PostToolUse(Edit|Write) \u2192 run your test command"," Stop \u2192 run your project test command and record the outcome","Use the /update-config skill or edit settings.json manually."].join(`
|
|
2059
2059
|
`);if(r.md){let k=["# prjct crew installed","",`Wrote to \`${t}\`.`,"","## Files"];for(let b of s)k.push(`- written: \`${b}\``);for(let b of o)k.push(`- kept: \`${b}\``);k.push("","## Next step","",v),console.log(k.join(`
|
|
2060
2060
|
`))}else{g.done(y);for(let k of s)g.info(`written: ${k}`);for(let k of o)g.info(`kept: ${k}`);console.log(""),console.log(v)}return{success:!0,written:s,skipped:o}}catch(s){let o=w(s);return A(o)}}async uninstall(e=null,t=process.cwd(),r={}){try{let s=[],o=[],i=[...Vw,XB];for(let p of i){let m=un.join(t,p.destRelative);await E(m)?(await jn.rm(m),s.push(p.destRelative)):o.push(p.destRelative)}let c=un.join(t,".claude/agents");try{(await jn.readdir(c)).length===0&&await jn.rmdir(c)}catch{}let l=un.join(t,Bs),u=await Jw(t);if(u!==null&&Ba(u)){let p=ZB(u);await jn.writeFile(l,p,"utf-8"),s.push(`${Bs} (snippet stripped)`)}let d=`crew uninstalled (${s.length} removed)`;if(r.md){let p=["# prjct crew uninstalled",""];for(let m of s)p.push(`- removed: \`${m}\``);for(let m of o)p.push(`- not present: \`${m}\``);console.log(p.join(`
|
|
2061
2061
|
`))}else{g.done(d);for(let p of s)g.info(`removed: ${p}`)}return{success:!0,removed:s,missing:o}}catch(s){let o=w(s);return A(o)}}async status(e=null,t=process.cwd(),r={}){try{let s=await eq(t),o=a(i=>i.installed?"installed":"missing","tag");if(r.md){let i=["# prjct crew status","",`Project: \`${t}\``,`Complete: **${s.complete?"yes":"no"}**`,"","## Pieces"];for(let c of s.agents)i.push(`- ${o(c)}: \`${c.path}\``);i.push(`- ${o(s.checkpoints)}: \`${s.checkpoints.path}\``),i.push(`- ${o(s.claudeSnippet)}: \`${s.claudeSnippet.path}\` (snippet)`),console.log(i.join(`
|
|
@@ -2090,7 +2090,7 @@ ${qs.dim("Providers:")}`}var wq,Qw=h(()=>{"use strict";wq={ready:qs.green("\u271
|
|
|
2090
2090
|
${s.dim("Run 'prjct start' to configure global/runtime adapters")}
|
|
2091
2091
|
${s.dim("Run 'prjct init' or 'prjct sync' to refresh AGENTS.md and project-level rules")}
|
|
2092
2092
|
${s.cyan("https://prjct.app")}
|
|
2093
|
-
`)}else return!1;return!0}var K_=h(()=>{"use strict";a(X_,"readOptionValue");a(kq,"runBinCommand")});var Y_=uI((Xhe,bq)=>{bq.exports={name:"prjct-cli",version:"2.
|
|
2093
|
+
`)}else return!1;return!0}var K_=h(()=>{"use strict";a(X_,"readOptionValue");a(kq,"runBinCommand")});var Y_=uI((Xhe,bq)=>{bq.exports={name:"prjct-cli",version:"2.72.0",description:"Project memory and workflow context for AI coding agents.",main:"dist/bin/prjct.mjs",bin:{prjct:"bin/prjct.cjs"},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",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 .",knip:"knip","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 .","test:e2e":"bun test core/__tests__/e2e/"},keywords:["claude-code","gemini-cli","ai-agents","context-layer","developer-tools","ai-assistant","productivity","mcp","llm","coding-agents"],author:"prjct.app",license:"MIT",dependencies:{"@clack/prompts":"1.0.0","@modelcontextprotocol/sdk":"1.29.0",chalk:"4.1.2",chokidar:"5.0.0","jsonc-parser":"3.3.1",zod:"3.25.76"},overrides:{"path-to-regexp":"8.4.0","brace-expansion":"5.0.5","fast-uri":">=3.1.2",hono:"4.12.27","ip-address":">=10.1.1",qs:"6.15.2"},devDependencies:{"@biomejs/biome":"2.3.13","@types/bun":"latest","@types/chokidar":"2.1.7","@types/node":"^22",esbuild:"0.28.1",knip:"6.3.1",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://cli.prjct.app",packageManager:"bun@1.2.23",engines:{bun:">=1.0.0",node:">=22.5.0"},files:["assets/","bin/prjct","bin/prjct.cjs","dist/","templates/","scripts/install.sh","LICENSE","README.md","CHANGELOG.md"],prepublishOnly:"node scripts/build.js"}});var Rq={};import Q_ from"node:os";import Ed from"node:path";import Vs from"chalk";async function vq(){let[n,...e]=process.argv.slice(2);if(["-v","--version","version"].includes(n)){let r=await Promise.resolve().then(()=>dI(Y_()));await Tq(r.version),process.exit(0)}if(["-h","--help",void 0].includes(n)&&(Cq(),process.exit(0)),n&&Sa(n)&&!Ye.getByName(n)){let r=va[n];r&&(g.failWithHint({message:`'prjct ${n}' was removed in v2. ${r.note}`,hint:`Use: ${r.replacement}`}),process.exit(1))}if(n&&!Ye.getByName(n)&&!(e.length===0&&Fa(n)!==null)){let s=[n,...e.filter(i=>!i.startsWith("-"))].join(" "),o=e.filter(i=>i.startsWith("-"));n="capture",e=[s,...o]}let t=e.includes("--md");t||g.start();try{let r=Ye.getByName(n);if(!r){let m=Fa(n),f=m?`Did you mean 'prjct ${m}'? Run 'prjct --help' for all commands`:"Run 'prjct --help' to see available commands";g.failWithHint(gi("UNKNOWN_COMMAND",{message:`Unknown command: ${n}`,hint:f})),t||g.end(),process.exit(1)}if(r.deprecated){let m=r.replacedBy?`Use 'prjct ${r.replacedBy}' instead`:"Run 'prjct --help' to see available commands";g.failWithHint({message:`Command '${n}' is deprecated`,hint:m}),t||g.end(),process.exit(1)}r.implemented||(g.failWithHint({message:`Command '${n}' is not yet implemented`,hint:"Run 'prjct --help' to see available commands",docs:"https://github.com/jlopezlira/prjct-cli"}),t||g.end(),process.exit(1));let{parsedArgs:s,options:o}=Eq(r,e),i=!process.stdin.isTTY||o.md===!0||o.json===!0;r.requiresLlm&&!i&&(g.failWithHint({message:`'prjct ${n}' requires an AI agent to process its output`,hint:`Use 'p. ${n}' inside Claude/Cursor, or add --md flag`}),t||g.end(),process.exit(1));let c=Sq(r,s);c&&(g.failWithHint(c),t||g.end(),process.exit(1));let l=null,u=Date.now();try{l=await x.getProjectId(process.cwd()),l&&(await Ea.expireIfStale(l),await Ea.touch(l))}catch{}let d=new Hs,p;if(n==="analyze")p=await d.analyze(o);else if(n==="setup")p=await d.setup(o);else if(n==="update"||n==="upgrade")p=await d.update(o);else{let m=s.join(" ")||null,f=o.md===!0,y=Ye.getByName(n);if(y?.optionSchema)p=await Ye.executeWithOptions(n,m,process.cwd(),hd(o,y.optionSchema));else{let k={spec:a(b=>yd(d,(b??"").trim().split(/\s+/).filter(Boolean),o,process.cwd()),"spec"),"audit-spec":a(b=>b?d.specAudit(b,process.cwd(),{md:f,lenses:o.lenses?String(o.lenses):void 0}):Promise.resolve({success:!1,error:"audit-spec requires a spec id"}),"audit-spec"),init:a(b=>d.init({idea:b,yes:o.yes===!0,pack:o.pack?String(o.pack):void 0,persona:o.persona?String(o.persona):void 0}),"init"),sync:a(()=>d.sync(process.cwd(),{preview:o.preview===!0||o["dry-run"]===!0,yes:o.yes===!0,json:o.json===!0,md:f,package:o.package?String(o.package):void 0,full:o.full===!0}),"sync"),"analysis-save-llm":a(b=>b?d.saveLlmAnalysis(b,process.cwd(),{md:f}):Promise.resolve({success:!1,error:"analysis-save-llm requires analysis text, JSON, or a file path"}),"analysis-save-llm"),regen:a(()=>d.regenVault(process.cwd(),{md:f}),"regen"),start:a(()=>d.start(),"start"),login:a(()=>d.login({md:f}),"login"),logout:a(()=>d.logout(),"logout"),auth:a(b=>d.auth(b,{md:f}),"auth")}[n];if(k)p=await k(m);else throw new Error(`Command '${n}' has no handler`)}}if(l){let m=Date.now()-u;try{await Ea.trackCommand(l,n,m)}catch{}try{await Ta.recordTiming(l,"command_duration",m,{command:n});let f=globalThis.__perfStartNs;if(f){let y=Number(process.hrtime.bigint()-f)/1e6;await Ta.recordTiming(l,"startup_time",y)}await Ta.recordMemory(l,{command:n})}catch{}}p?.message?console.log(p.message):p?.error&&console.error(p.error),t||g.end(),process.exit(p?.success?0:1)}catch(r){console.error("Error:",w(r)),process.env.DEBUG&&console.error(Nd(r)),t||g.end(),process.exit(1)}}function Sq(n,e){if(!n.params)return null;let r=n.params.replace(/\[[^\]]*\]/g,"").match(/<[^>]+>/g);if(!r||r.length===0)return null;if(e.length<r.length){let s=r.map(i=>i.slice(1,-1)).join(", "),o=n.usage.terminal||`prjct ${n.name} ${n.params}`;return gi("MISSING_PARAM",{message:`Missing required parameter: ${s}`,hint:`Usage: ${o}`})}return null}function Eq(n,e){let t=[],r={};for(let s=0;s<e.length;s++){let o=e[s];if(o.startsWith("--")){let i=o.slice(2);s+1<e.length&&!e[s+1].startsWith("--")?r[i]=e[++s]:r[i]=!0}else t.push(o)}return{parsedArgs:t,options:r}}async function Tq(n){let e=await us(),t=Ed.join(Q_.homedir(),".claude","commands","p.md"),r=Ed.join(Q_.homedir(),".gemini","commands","p.toml"),[s,o,i,c]=await Promise.all([E(t),E(r),E(Ed.join(process.cwd(),".cursor","commands","sync.md")),E(Ed.join(process.cwd(),".cursor"))]),l=await yi();console.log(Yw(n)),console.log(ri("Claude Code",e.claude.installed?s?"ready":"installed":"missing",e.claude.version?Vs.dim(` (v${e.claude.version})`):"")),console.log(ri("Gemini CLI",e.gemini.installed?o?"ready":"installed":"missing",e.gemini.version?Vs.dim(` (v${e.gemini.version})`):"")),console.log(ri("Antigravity",l.installed?l.skillInstalled?"ready":"detected":"missing",l.installed&&!l.skillInstalled?` ${Vs.dim("(run prjct start)")}`:"")),console.log(ri("Cursor IDE",i?"ready":c?"detected":"missing",i?` ${Vs.dim("(use prjct router)")}`:c?` ${Vs.dim("(run prjct init)")}`:"","\u25CB no .cursor/ folder")),console.log(`
|
|
2094
2094
|
${Vs.dim("Run 'prjct start' for Claude/Gemini, 'prjct init' for Cursor")}
|
|
2095
2095
|
${Vs.cyan("https://prjct.app")}
|
|
2096
2096
|
`)}function Cq(){console.log(`
|