prjct-cli 3.69.0 → 3.69.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/bin/prjct-core.mjs +454 -454
- package/dist/bin/prjct-hooks.mjs +2 -2
- package/dist/daemon/entry.mjs +412 -412
- package/dist/mcp/server.mjs +2 -2
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1278,7 +1278,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1278
1278
|
_No changes detected (clean tree / no base range)._
|
|
1279
1279
|
`;let e=["## Detect changes","",`- **Source**: ${t.source}`,`- **Changed**: ${t.changedFiles.length} file(s)`,`- **Blast radius**: ${t.affectedFiles.length} file(s) (imports + call-graph)`,`- **Risk**: critical ${t.summary.critical} \xB7 high ${t.summary.high} \xB7 medium ${t.summary.medium} \xB7 low ${t.summary.low}`,"","### Per-file risk",""];for(let n of t.changes){let r=n.touchedSymbols.length>0?` \xB7 symbols: ${n.touchedSymbols.slice(0,6).join(", ")}`:"";e.push(`- **${n.risk.toUpperCase()}** \`${n.file}\`${r}`,` - ${n.reasons.join("; ")}`)}if(t.affectedFiles.length>t.changedFiles.length){e.push("","### Affected beyond diff","");let n=t.affectedFiles.filter(r=>!t.changedFiles.includes(r)).slice(0,25);for(let r of n)e.push(`- \`${r}\``);t.affectedFiles.length-t.changedFiles.length>25&&e.push(`- _\u2026+${t.affectedFiles.length-t.changedFiles.length-25} more_`)}return e.push("","_Advisory. Expand with `prjct code trace <symbol>` or MCP `prjct_trace_path`._"),e.join(`
|
|
1280
1280
|
`)}function QC(t){if(t.changedFiles.length===0)return"detect-changes: no changes detected";let e=[`Detect changes (${t.source}): ${t.changedFiles.length} changed \u2192 blast ${t.affectedFiles.length}`,`Risk: critical=${t.summary.critical} high=${t.summary.high} medium=${t.summary.medium} low=${t.summary.low}`];for(let n of t.changes.slice(0,30)){let r=n.touchedSymbols.length?` [${n.touchedSymbols.slice(0,4).join(",")}]`:"";e.push(` [${n.risk.toUpperCase()}] ${n.file}${r} \u2014 ${n.reasons[0]??""}`)}return e.join(`
|
|
1281
|
-
`)}function ZC(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var KC,YC,Yl=h(()=>{"use strict";nn();Mt();pe();a(Et,"safeGit");a(XC,"listWorkingTreeFiles");a(qC,"listCommittedFiles");a(VC,"resolveDiffBase");a($h,"parseChangedLinesFromUnifiedDiff");a(JC,"loadHunkLines");a(Fh,"symbolsTouchedByHunks");KC=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,YC=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(zC,"classifyRisk");a(Jl,"detectChanges");a(Kl,"formatDetectChangesMd");a(QC,"formatDetectChangesText");a(ZC,"shipStructuralRiskCue")});function eA(t){return t instanceof si}function _e(t){return eA(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var si,Xo,ii,rn=h(()=>{"use strict";si=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Xo=class t extends si{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},ii=class t extends si{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(eA,"isPrjctError");a(_e,"getErrorMessage")});function Uh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Uh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Uh(r.host),repoSlug:s}}catch{return{}}}async function tA(t){try{let{stdout:e}=await W("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function nA(t){try{let{stdout:e}=await W("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function er(t){return typeof t=="string"&&t.length>0?t:void 0}function Wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function rA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Bh(t){let e=T.getDoc(t,"project")||{},n=er(e.repoPath),{provider:r,repoSlug:s}=n?zl(await tA(n)||""):{},i=n?await nA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return rA({provider:r,repoSlug:s,currentBranch:er(e.currentBranch),defaultBranch:i,stack:er(e.stack),techStack:o&&o.length>0?o:void 0,version:er(e.version),commitCount:Wh(e.commitCount),fileCount:Wh(e.fileCount),lastCommit:er(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:er(e.cliVersion),syncedAt:er(e.lastSync)})}var Ql=h(()=>{"use strict";O();pe();a(Uh,"providerForHost");a(zl,"parseRemote");a(tA,"gitRemoteUrl");a(nA,"gitDefaultBranch");a(er,"str");a(Wh,"num");a(rA,"compact");a(Bh,"buildProjectMeta")});import{execFile as sA}from"node:child_process";import iA from"node:crypto";import{promisify as oA}from"node:util";function lA(t,e=cA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=iA.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function uA(t){let e;try{let{stdout:s}=await aA("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Gh(t){let e=await uA(t);return e?lA(e):null}var aA,cA,Xh=h(()=>{"use strict";Ql();aA=oA(sA),cA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(lA,"uuidv5");a(uA,"repoKey");a(Gh,"deriveProjectId")});var tu={};P(tu,{PACKAGE_ROOT:()=>Nn,VERSION:()=>An,getPackageRoot:()=>eu,getVersion:()=>Vo,resetPackageRoot:()=>dA});import Zl from"node:fs";import qo from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=qo.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=qo.dirname(t)}return Wr=qo.join(__dirname,"..","..",".."),Wr}function Vo(){if(tr)return tr;let t="3.69.
|
|
1281
|
+
`)}function ZC(t){return t.changedFiles.length===0?null:t.summary.critical>0?`\u26A0\uFE0F Structural risk CRITICAL (${t.summary.critical} file(s), blast ${t.affectedFiles.length}). Review: \`prjct code impact --md\`.`:t.summary.high>0?`\u26A0\uFE0F Structural risk HIGH (${t.summary.high} file(s), blast ${t.affectedFiles.length}). Consider \`prjct code impact --md\`.`:null}var KC,YC,Yl=h(()=>{"use strict";nn();Mt();pe();a(Et,"safeGit");a(XC,"listWorkingTreeFiles");a(qC,"listCommittedFiles");a(VC,"resolveDiffBase");a($h,"parseChangedLinesFromUnifiedDiff");a(JC,"loadHunkLines");a(Fh,"symbolsTouchedByHunks");KC=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,YC=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(zC,"classifyRisk");a(Jl,"detectChanges");a(Kl,"formatDetectChangesMd");a(QC,"formatDetectChangesText");a(ZC,"shipStructuralRiskCue")});function eA(t){return t instanceof si}function _e(t){return eA(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var si,Xo,ii,rn=h(()=>{"use strict";si=class extends Error{static{a(this,"PrjctError")}code;isOperational;constructor(e,n="PRJCT_ERROR"){super(e),this.name="PrjctError",this.code=n,this.isOperational=!0,Error.captureStackTrace?.(this,this.constructor)}},Xo=class t extends si{static{a(this,"ProjectError")}constructor(e,n="PROJECT_ERROR"){super(e,n),this.name="ProjectError"}static notInitialized(){return new t("Project not initialized. Run p. init first.","PROJECT_NOT_INIT")}static notFound(e){return new t(`Project not found: ${e}`,"PROJECT_NOT_FOUND")}static invalidId(e){return new t(`Invalid project ID: ${e}`,"PROJECT_INVALID_ID")}},ii=class t extends si{static{a(this,"AgentError")}constructor(e,n="AGENT_ERROR"){super(e,n),this.name="AgentError"}static notSupported(e){return new t(`Unsupported agent type: ${e}`,"AGENT_NOT_SUPPORTED")}static initFailed(e){return new t(`Agent initialization failed: ${e}`,"AGENT_INIT_FAILED")}};a(eA,"isPrjctError");a(_e,"getErrorMessage")});function Uh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function zl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Uh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Uh(r.host),repoSlug:s}}catch{return{}}}async function tA(t){try{let{stdout:e}=await W("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function nA(t){try{let{stdout:e}=await W("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function er(t){return typeof t=="string"&&t.length>0?t:void 0}function Wh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function rA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function Bh(t){let e=T.getDoc(t,"project")||{},n=er(e.repoPath),{provider:r,repoSlug:s}=n?zl(await tA(n)||""):{},i=n?await nA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return rA({provider:r,repoSlug:s,currentBranch:er(e.currentBranch),defaultBranch:i,stack:er(e.stack),techStack:o&&o.length>0?o:void 0,version:er(e.version),commitCount:Wh(e.commitCount),fileCount:Wh(e.fileCount),lastCommit:er(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:er(e.cliVersion),syncedAt:er(e.lastSync)})}var Ql=h(()=>{"use strict";O();pe();a(Uh,"providerForHost");a(zl,"parseRemote");a(tA,"gitRemoteUrl");a(nA,"gitDefaultBranch");a(er,"str");a(Wh,"num");a(rA,"compact");a(Bh,"buildProjectMeta")});import{execFile as sA}from"node:child_process";import iA from"node:crypto";import{promisify as oA}from"node:util";function lA(t,e=cA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=iA.createHash("sha1").update(n).update(t,"utf8").digest().subarray(0,16);s[6]=s[6]&15|80,s[8]=s[8]&63|128;let i=s.toString("hex");return`${i.slice(0,8)}-${i.slice(8,12)}-${i.slice(12,16)}-${i.slice(16,20)}-${i.slice(20,32)}`}async function uA(t){let e;try{let{stdout:s}=await aA("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=zl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function Gh(t){let e=await uA(t);return e?lA(e):null}var aA,cA,Xh=h(()=>{"use strict";Ql();aA=oA(sA),cA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(lA,"uuidv5");a(uA,"repoKey");a(Gh,"deriveProjectId")});var tu={};P(tu,{PACKAGE_ROOT:()=>Nn,VERSION:()=>An,getPackageRoot:()=>eu,getVersion:()=>Vo,resetPackageRoot:()=>dA});import Zl from"node:fs";import qo from"node:path";function eu(){if(Wr)return Wr;let t=__dirname;for(let e=0;e<5;e++){let n=qo.join(t,"package.json");if(Zl.existsSync(n))try{if(JSON.parse(Zl.readFileSync(n,"utf-8")).name==="prjct-cli")return Wr=t,t}catch{}t=qo.dirname(t)}return Wr=qo.join(__dirname,"..","..",".."),Wr}function Vo(){if(tr)return tr;let t="3.69.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return tr=t,tr;try{let e=qo.join(eu(),"package.json");return tr=JSON.parse(Zl.readFileSync(e,"utf-8")).version,tr}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",C(e)),"0.0.0"}}function dA(t){Wr=t,tr=null}var tr,Wr,An,Nn,sn=h(()=>{"use strict";oe();tr=null,Wr=null;a(eu,"getPackageRoot");a(Vo,"getVersion");a(dA,"resetPackageRoot");An=Vo(),Nn=eu()});async function Jo(t){try{let{stdout:e}=await U(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function pA(){let t=await Jo("gh api user --jq .login");return t.success&&t.output||(t=await Jo("git config --global github.user"),t.success&&t.output)?t.output:null}async function mA(){let t=await Jo("git config user.name");return t.success&&t.output?t.output:null}async function gA(){let t=await Jo("git config user.email");return t.success&&t.output?t.output:null}async function Br(){let[t,e,n]=await Promise.all([pA(),mA(),gA()]);return{github:t,email:n,name:e||t||"Unknown"}}var Ko=h(()=>{"use strict";pe();a(Jo,"execCommand");a(pA,"detectGitHubUsername");a(mA,"detectGitName");a(gA,"detectGitEmail");a(Br,"detect")});var Yo={};P(Yo,{worktreeService:()=>fA});import ru from"node:fs/promises";import $t from"node:path";var qh,su,fA,zo=h(()=>{"use strict";pe();se();qh=".worktrees",su=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=$t.join(s,qh,n),o=r.branch||`feat/${n}`;await ru.mkdir($t.join(s,qh),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await U(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await U("git rev-parse HEAD",{cwd:i});return{path:i,branch:o,commit:l.trim(),isMain:!1,slug:n}}async remove(e,n=!1){let r=await this.getMainWorktree(e),s;if(n)try{let{stdout:i}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await U(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await U(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await U("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await U("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await U("git rev-parse --git-dir",{cwd:e}),s=$t.resolve(e,n.trim()),i=$t.resolve(e,r.trim());if(s!==i){let{stdout:o}=await U("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await U("git rev-parse HEAD",{cwd:e}),{stdout:l}=await U("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=$t.basename(u);return{path:u,branch:o.trim(),commit:c.trim(),isMain:!1,slug:d}}return null}catch{return null}}async getMainWorktree(e){try{let{stdout:r}=await U("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1282
1282
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await U("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=$t.join(n,".env");await I(r)&&await ru.copyFile(r,$t.join(e,".env"));let s=$t.join(n,".prjct"),i=$t.join(e,".prjct");await I(s)&&!await I(i)&&await ru.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await U("git worktree prune",{cwd:s});for(let i of n)i.isMain||await I(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1283
1283
|
|
|
1284
1284
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
|
@@ -1601,7 +1601,7 @@ ${Mn}
|
|
|
1601
1601
|
${Hi}
|
|
1602
1602
|
`;a(Mw,"writeProjectClaudeMd")});import Fw from"node:path";function Hw(){return xD.flatMap(t=>t.projectRuleTargets??[])}var xD,Uw=h(()=>{"use strict";se();Js();qn();xD=[{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:"Benchmark-tier CLI (2026-07): Claude Code + Opus frontier. CLAUDE.md, skills, hooks, 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:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Codex + GPT-5.x (TB leader). AGENTS.md, config.toml MCP (native), hooks opt-in (planned installer)."},{id:"gemini",displayName:"Gemini CLI",kind:"cli",status:"stable",detectsBy:{homeDirs:[".gemini"],commands:["gemini"]},contextFiles:["GEMINI.md","AGENTS.md"],mcpTargets:[{format:"claude-json",pathHint:"~/.gemini/settings.json mcpServers",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier CLI (2026-07): Gemini CLI + Pro/Flash. GEMINI.md; prjct install writes MCP+hooks to ~/.gemini/settings.json."},{id:"antigravity",displayName:"Google Antigravity",kind:"ide",status:"emerging",detectsBy:{homeDirs:[Fw.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:"Benchmark-tier open-source CLI (2026-07): most-starred multi-provider agent. AGENTS.md + plugins + MCP."},{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"],mcpTargets:[{format:"claude-json",pathHint:"~/.kimi/mcp.json",writable:!0}],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:"grok",displayName:"xAI Grok Build",kind:"cli",status:"stable",detectsBy:{homeDirs:[".grok"],commands:["grok"]},contextFiles:["AGENTS.md","CLAUDE.md"],mcpTargets:[{format:"codex-toml",pathHint:"~/.grok/config.toml",writable:!0},{format:"claude-json",pathHint:"~/.claude/mcp.json (Grok Claude-compat fallback)",writable:!0}],supports:{agentsMd:!0,mcp:!0,skills:!0,hooks:!0,acp:!1,projectRules:!1},notes:"Benchmark-tier CLI (2026-07): Grok Build. Native MCP + skill via prjct install (~/.grok/config.toml + ~/.grok/skills/prjct). Hooks still Claude-compat. See harness-surfaces."},{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:!0,acp:!1,projectRules:!0},notes:"Benchmark-tier AI IDE (2026-07): agent mode + CLI. Rules under .cursor/rules; prjct install writes ~/.cursor/hooks.json."},{id:"windsurf",displayName:"Windsurf",kind:"ide",status:"legacy",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:"LEGACY (2026-07): Windsurf is no longer a product focus. Keep AGENTS.md + optional .windsurf/rules for residual installs; do not expand surface area. Prefer Cursor, Claude Code, Codex, Gemini CLI, OpenCode, Cline."},{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:"Benchmark-tier open agent (2026-07): VS Code + multi-model. AGENTS.md, rules, skills, hooks, MCP, ACP."},{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:[Fw.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:"GitHub Copilot coding agent / Copilot CLI (2026-07 benchmark field). Repo AGENTS.md + .github instructions + MCP."},{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(Hw,"listProjectRuleTargets")});import Zd from"node:fs/promises";import Ya from"node:path";async function RD(t){let e=At(t);return e||Zd.readFile(Ya.join(Nn,"templates",t),"utf-8")}async function CD(t,e,n){let r=Ya.join(t,e);await Zd.mkdir(Ya.dirname(r),{recursive:!0}),await Zd.writeFile(r,await RD(n),"utf-8")}async function Ww(t,e={}){let n=new Set(e.agents??[]),r=[];for(let s of Hw())(n.has(s.relativePath.split("/")[0].replace(/^\./,""))||s.detectPath&&await I(Ya.join(t,s.detectPath)))&&(await CD(t,s.relativePath,s.templateKey),r.push(s.relativePath));return{written:r}}var Bw=h(()=>{"use strict";gs();Uw();se();sn();a(RD,"loadTemplate");a(CD,"writeRule");a(Ww,"writeProjectIdeRules")});import Gw from"node:path";async function kr(t,e={}){if(!e.explicit)return{agentsMd:{action:"unchanged",path:Gw.join(t,"AGENTS.md")},ideRules:[]};let n=new Set(e.agents??[]),r=await jw(t),s=await I(Gw.join(t,"CLAUDE.md")),o=n.has("claude")||s?await Mw(t):void 0,c=await Ww(t,e);return{agentsMd:r,...o?{claudeMd:o}:{},ideRules:c.written}}var ep=h(()=>{"use strict";se();Ow();$w();Bw();a(kr,"writeProjectAgentSurfaces")});function Xw(t,e,n){if(n.md){console.log(`> ${e}`);return}D[t](e)}function Wi(t,e={}){return AD(t,e),{success:!1,error:t}}function Fn(t,e={}){return qw(t,e),{success:!1,error:t}}function pt(t,e){let n=C(t);return e&&qw(n,e),{success:!1,error:n}}var AD,qw,qt=h(()=>{"use strict";oe();dt();a(Xw,"notify");AD=a((t,e={})=>Xw("warn",t,e),"notifyWarn"),qw=a((t,e={})=>Xw("fail",t,e),"notifyFail");a(Wi,"failWith");a(Fn,"failHard");a(pt,"failFromError")});var Vw={};P(Vw,{AI_AGENTS:()=>Za,PROJECT_TYPES:()=>fs,detectInstalledAgents:()=>tc,detectProjectType:()=>ec,detectStack:()=>nc});import Qa from"node:fs/promises";import za from"node:os";import Re from"node:path";async function ec(t){try{let e=await Qa.readdir(t);if(e.includes("turbo.json")||e.includes("lerna.json")||e.includes("nx.json"))return"monorepo";if(e.includes("package.json")){let n=Re.join(t,"package.json"),r=JSON.parse(await Qa.readFile(n,"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 tc(t){let e=[];await Me(Re.join(za.homedir(),".claude"))&&e.push("claude"),await I(Re.join(t,".cursorrules"))&&e.push("cursor"),await I(Re.join(t,".windsurfrules"))&&e.push("windsurf"),await I(Re.join(t,".github","copilot-instructions.md"))&&e.push("copilot"),await Me(Re.join(za.homedir(),".gemini"))&&e.push("gemini"),await Me(Re.join(za.homedir(),".gemini","antigravity"))&&e.push("antigravity"),await Me(Re.join(t,".opencode"))&&e.push("opencode"),await Me(Re.join(t,".qwen"))&&e.push("qwen-code"),await Me(Re.join(t,".goose"))&&e.push("goose"),(await I(Re.join(t,".aider.conf.yml"))||await I(Re.join(t,".aider.conf.yaml")))&&e.push("aider"),(await Me(Re.join(t,".cline"))||await Me(Re.join(t,".clinerules"))||await I(Re.join(t,".clinerules")))&&e.push("cline"),await Me(Re.join(t,".roo"))&&e.push("roo-code"),await Me(Re.join(t,".continue"))&&e.push("continue"),await Me(Re.join(t,".kiro"))&&e.push("kiro"),await Me(Re.join(t,".zed"))&&e.push("zed");try{let{execAsync:n}=await Promise.resolve().then(()=>(pe(),Ao));await n("which codex"),e.push("codex")}catch{await Me(Re.join(za.homedir(),".codex"))&&e.push("codex")}return e}async function nc(t){let e={language:"Unknown",technologies:[]};try{let n=await Qa.readdir(t);if(n.includes("package.json")){let r=Re.join(t,"package.json"),s=JSON.parse(await Qa.readFile(r,"utf-8")),i={...s.dependencies,...s.devDependencies};e.language=i.typescript?"TypeScript":"JavaScript",i.next?e.framework="Next.js":i.nuxt?e.framework="Nuxt":i.react?e.framework="React":i.vue?e.framework="Vue":i["@angular/core"]?e.framework="Angular":i.express?e.framework="Express":i.hono?e.framework="Hono":i.fastify?e.framework="Fastify":(i.nestjs||i["@nestjs/core"])&&(e.framework="NestJS"),i.bun||i["@types/bun"]||s.engines?.bun?e.runtime="Bun":e.runtime="Node.js",n.includes("bun.lockb")?e.packageManager="Bun":n.includes("pnpm-lock.yaml")?e.packageManager="pnpm":n.includes("yarn.lock")?e.packageManager="Yarn":n.includes("package-lock.json")&&(e.packageManager="npm"),(i.prisma||i["@prisma/client"])&&e.technologies.push("Prisma"),(i.drizzle||i["drizzle-orm"])&&e.technologies.push("Drizzle"),i.tailwindcss&&e.technologies.push("Tailwind CSS"),i.zod&&e.technologies.push("Zod"),(i.trpc||i["@trpc/server"])&&e.technologies.push("tRPC")}else n.includes("pyproject.toml")||n.includes("requirements.txt")?e.language="Python":n.includes("go.mod")?e.language="Go":n.includes("Cargo.toml")?e.language="Rust":(n.includes("pom.xml")||n.includes("build.gradle"))&&(e.language="Java");return e}catch{return e}}var fs,Za,tp=h(()=>{"use strict";se();fs=[{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."}],Za=[{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(ec,"detectProjectType");a(tc,"detectInstalledAgents");a(nc,"detectStack")});import*as ge from"@clack/prompts";import wr from"chalk";var Bi,Jw=h(()=>{"use strict";dt();tp();Bi=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(){ge.intro(wr.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 n of e)if(!await n.run()||this.aborted)return this.buildResult(!0);return ge.outro(wr.green("Setup complete!")),this.buildResult(!1)}async runNonInteractive(){D.spin("Auto-detecting project configuration..."),this.detectedType=await ec(this.projectPath),this.confirmedType=this.detectedType;let e=await tc(this.projectPath);return this.selectedAgents=e,this.detectedStack=await nc(this.projectPath),this.confirmedStack=this.detectedStack,D.done("Configuration detected"),this.buildResult(!1)}async stepProjectType(){this.detectedType=await ec(this.projectPath);let e=fs.findIndex(r=>r.value===this.detectedType),n=await ge.select({message:this.detectedType!=="unknown"?`Detected: ${this.getProjectTypeLabel(this.detectedType)}. Is this correct?`:"What type of project is this?",options:fs.map(r=>({label:r.title,hint:r.description,value:r.value})),initialValue:e>=0?fs[e].value:void 0});return ge.isCancel(n)?(this.handleCancel(),!1):(this.confirmedType=n||this.detectedType,!0)}async stepAIAgents(){let e=await tc(this.projectPath),n=Za.map(s=>({label:s.title,hint:s.description,value:s.value})),r=await ge.multiselect({message:"Which AI agents do you use?",options:n,initialValues:e,required:!0});return ge.isCancel(r)?(this.handleCancel(),!1):(this.selectedAgents=r,!0)}async stepStack(){this.detectedStack=await nc(this.projectPath);let e=this.formatStackDisplay(this.detectedStack);ge.note(e,"Detected stack");let n=await ge.confirm({message:"Is this stack correct?",initialValue:!0});if(ge.isCancel(n))return this.handleCancel(),!1;if(n)this.confirmedStack=this.detectedStack;else{let r=await ge.group({language:a(()=>ge.text({message:"Primary language:",defaultValue:this.detectedStack.language}),"language"),framework:a(()=>ge.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 ge.group({verbosity:a(()=>ge.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(()=>ge.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=[`${wr.cyan("Project Type:")} ${this.getProjectTypeLabel(this.confirmedType)}`,`${wr.cyan("AI Agents:")} ${this.selectedAgents.map(r=>this.getAgentLabel(r)).join(", ")}`,`${wr.cyan("Stack:")} ${this.formatStackDisplay(this.confirmedStack)}`,`${wr.cyan("Verbosity:")} ${this.preferences.verbosity}`,`${wr.cyan("Auto-sync:")} ${this.preferences.autoSync?"Yes":"No"}`].join(`
|
|
1603
1603
|
`);ge.note(e,"Configuration Summary");let n=await ge.confirm({message:"Generate configuration with these settings?",initialValue:!0});return ge.isCancel(n)||!n?(ge.isCancel(n)&&this.handleCancel(),!1):!0}handleCancel(){this.aborted=!0,ge.cancel("Setup cancelled. Run again anytime.")}getProjectTypeLabel(e){return fs.find(n=>n.value===e)?.title||"Unknown"}getAgentLabel(e){return Za.find(n=>n.value===e)?.title||e}formatStackDisplay(e){let n=[e.language];return e.framework&&n.push(e.framework),e.runtime&&e.runtime!=="Node.js"&&n.push(e.runtime),e.technologies.length>0&&n.push(`+ ${e.technologies.slice(0,3).join(", ")}`),n.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}}});import ND from"node:https";import Kw from"node:path";import Hn from"chalk";function ID(t,e){let n=`Update available! ${t} \u2192 ${e}`,r="prjct upgrade",s=Math.max(n.length,`Run: ${r}`.length)+4,i=`\u250C${"\u2500".repeat(s)}\u2510`,o=`\u2514${"\u2500".repeat(s)}\u2518`,c=a(l=>`\u2502 ${l}${" ".repeat(s-l.length-2)}\u2502`,"pad");return["",Hn.yellow(i),Hn.yellow(c("")),Hn.yellow(`\u2502 ${Hn.bold(n)}${" ".repeat(s-n.length-2)}\u2502`),Hn.yellow(`\u2502 Run: ${Hn.cyan(r)}${" ".repeat(s-r.length-7)}\u2502`),Hn.yellow(c("")),Hn.yellow(o),""].join(`
|
|
1604
|
-
`)}var np,Yw,jK,zw=h(()=>{"use strict";oe();se();sn();Xe();np=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=z.globalConfigDir,this.cacheFile=Kw.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Kw.join(__dirname,"..","..","package.json");return(await Ue(e))?.version??null}catch(e){return console.error("Error reading package version:",C(e)),null}}async getLatestVersion(){return new Promise((e,n)=>{let r={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json"}},
|
|
1604
|
+
`)}var np,Yw,jK,zw=h(()=>{"use strict";oe();se();sn();Xe();np=class{static{a(this,"UpdateChecker")}packageName;cacheDir;cacheFile;checkInterval;constructor(){this.packageName="prjct-cli",this.cacheDir=z.globalConfigDir,this.cacheFile=Kw.join(this.cacheDir,"update-cache.json"),this.checkInterval=1440*60*1e3}async getCurrentVersion(){try{let e=Kw.join(__dirname,"..","..","package.json");return(await Ue(e))?.version??null}catch(e){return console.error("Error reading package version:",C(e)),null}}async getLatestVersion(){return new Promise((e,n)=>{let r=Date.now(),s={hostname:"registry.npmjs.org",path:`/${this.packageName}/latest?prjct_bust=${r}`,method:"GET",headers:{"User-Agent":"prjct-cli-update-checker",Accept:"application/json","Cache-Control":"no-cache, no-store",Pragma:"no-cache"}},i=ND.request(s,o=>{let c="";o.on("data",l=>{c+=l}),o.on("end",()=>{try{if(o.statusCode===200){let l=JSON.parse(c),u=typeof l.version=="string"?l.version.trim():"";if(!/^\d+\.\d+\.\d+/.test(u)){n(new Error(`npm registry returned invalid version: ${u||"(empty)"}`));return}e(u)}else n(new Error(`npm registry returned status ${o.statusCode}`))}catch(l){n(l)}})});i.on("error",o=>{n(o)}),i.setTimeout(5e3,()=>{i.destroy(),n(new Error("Request timeout"))}),i.end()})}compareVersions(e,n){let r=e.split(".").map(Number),s=n.split(".").map(Number);for(let i=0;i<3;i++){let o=r[i]||0,c=s[i]||0;if(o>c)return 1;if(o<c)return-1}return 0}async readCache(){try{if(await I(this.cacheFile))return await Ue(this.cacheFile)}catch{}return null}async writeCache(e){try{await De(this.cacheFile,e)}catch{}}async checkForUpdates(){try{let e=await this.getCurrentVersion();if(!e)return null;let n=await this.readCache(),r=Date.now();if(n?.lastCheck&&r-n.lastCheck<this.checkInterval)return n.latestVersion&&this.compareVersions(n.latestVersion,e)>0?{updateAvailable:!0,currentVersion:e,latestVersion:n.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:ID(e.currentVersion,e.latestVersion)}},Yw=np,jK=1440*60*1e3;a(ID,"formatUpdateBanner")});import Qw from"node:path";async function LD(){if(process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||global.mcp||process.env.MCP_AVAILABLE)return!0;let t=process.cwd();if(await I(Qw.join(t,"CLAUDE.md")))return!0;let e=process.env.HOME||process.env.USERPROFILE||"";if(await I(Qw.join(e,".claude")))return!0;let n=process.cwd();return!!(n.includes("/.claude/")||n.includes("/claude-workspace/"))}function jD(){return{...PD}}function OD(){return{...DD}}function MD(){return!!(process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1")}async function Zw(){if(rc)return rc;let t=await LD()?jD():OD();return t.environment={...t.environment,sandboxed:MD()},rc=t,rc}var rc,PD,DD,eT=h(()=>{"use strict";se();rc=null,PD={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}},DD={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(LD,"isClaudeEnvironment");a(jD,"getClaudeAgent");a(OD,"getTerminalAgent");a(MD,"isSandboxed");a(Zw,"detect")});import sc from"node:fs/promises";var rp,tT,nT=h(()=>{"use strict";oe();se();rp=class{static{a(this,"RuntimeClaude")}name;type;constructor(){this.name="Claude Code",this.type="claude"}formatResponse(e,n="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[n]||r.info} ${e}`}async readFile(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.read(e)}catch(n){console.warn(`MCP readFile failed, falling back to fs: ${C(n)}`)}return await sc.readFile(e,"utf8")}async writeFile(e,n){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.write(e,n)}catch(r){console.warn(`MCP writeFile failed, falling back to fs: ${C(r)}`)}await sc.writeFile(e,n,"utf8")}async listDirectory(e){try{if(global.mcp?.filesystem)return await global.mcp.filesystem.list(e)}catch(n){console.warn(`MCP listDirectory failed, falling back to fs: ${C(n)}`)}return await sc.readdir(e)}async fileExists(e){return I(e)}async createDirectory(e){await sc.mkdir(e,{recursive:!0})}getTimestamp(){return new Date().toISOString()}formatTaskList(e){return!e||e.length===0?"\u{1F4CB} No tasks queued":`\u{1F4CB} Queue:
|
|
1605
1605
|
${e.map((n,r)=>`${r+1}. ${n}`).join(`
|
|
1606
1606
|
`)}`}formatRecap(e){return`\u{1F4CA} Recap
|
|
1607
1607
|
|
package/package.json
CHANGED