prjct-cli 3.63.1 → 3.63.2
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 +7 -0
- package/dist/bin/prjct-core.mjs +519 -519
- package/dist/bin/prjct-hooks.mjs +211 -211
- package/dist/bin/prjct.mjs +4 -1
- package/dist/daemon/entry.mjs +347 -347
- package/dist/mcp/server.mjs +1 -1
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1260,7 +1260,7 @@ CREATE TABLE velocity_sprints (
|
|
|
1260
1260
|
_No changes detected (clean tree / no base range)._
|
|
1261
1261
|
`;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(`
|
|
1262
1262
|
`)}function zR(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(`
|
|
1263
|
-
`)}function QR(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 JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=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)}},Po=class t extends Ks{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")}},Ys=class t extends Ks{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(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.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 lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.
|
|
1263
|
+
`)}function QR(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 JR,KR,xl=h(()=>{"use strict";tn();Mt();le();a(ht,"safeGit");a(GR,"listWorkingTreeFiles");a(XR,"listCommittedFiles");a(qR,"resolveDiffBase");a(Zf,"parseChangedLinesFromUnifiedDiff");a(VR,"loadHunkLines");a(eh,"symbolsTouchedByHunks");JR=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,KR=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(YR,"classifyRisk");a(vl,"detectChanges");a(_l,"formatDetectChangesMd");a(zR,"formatDetectChangesText");a(QR,"shipStructuralRiskCue")});function ZR(t){return t instanceof Ks}function Se(t){return ZR(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var Ks,Po,Ys,nn=h(()=>{"use strict";Ks=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)}},Po=class t extends Ks{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")}},Ys=class t extends Ks{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(ZR,"isPrjctError");a(Se,"getErrorMessage")});function nh(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function Rl(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:nh(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:nh(r.host),repoSlug:s}}catch{return{}}}async function eC(t){try{let{stdout:e}=await U("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function tC(t){try{let{stdout:e}=await U("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function Yn(t){return typeof t=="string"&&t.length>0?t:void 0}function rh(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function nC(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function sh(t){let e=w.getDoc(t,"project")||{},n=Yn(e.repoPath),{provider:r,repoSlug:s}=n?Rl(await eC(n)||""):{},i=n?await tC(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return nC({provider:r,repoSlug:s,currentBranch:Yn(e.currentBranch),defaultBranch:i,stack:Yn(e.stack),techStack:o&&o.length>0?o:void 0,version:Yn(e.version),commitCount:rh(e.commitCount),fileCount:rh(e.fileCount),lastCommit:Yn(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:Yn(e.cliVersion),syncedAt:Yn(e.lastSync)})}var Cl=h(()=>{"use strict";O();le();a(nh,"providerForHost");a(Rl,"parseRemote");a(eC,"gitRemoteUrl");a(tC,"gitDefaultBranch");a(Yn,"str");a(rh,"num");a(nC,"compact");a(sh,"buildProjectMeta")});import{execFile as rC}from"node:child_process";import sC from"node:crypto";import{promisify as iC}from"node:util";function cC(t,e=aC){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=sC.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 lC(t){let e;try{let{stdout:s}=await oC("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=Rl(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function ih(t){let e=await lC(t);return e?cC(e):null}var oC,aC,oh=h(()=>{"use strict";Cl();oC=iC(rC),aC="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(cC,"uuidv5");a(lC,"repoKey");a(ih,"deriveProjectId")});var Il={};L(Il,{PACKAGE_ROOT:()=>An,VERSION:()=>Cn,getPackageRoot:()=>Nl,getVersion:()=>Lo,resetPackageRoot:()=>uC});import Al from"node:fs";import Do from"node:path";function Nl(){if(jr)return jr;let t=__dirname;for(let e=0;e<5;e++){let n=Do.join(t,"package.json");if(Al.existsSync(n))try{if(JSON.parse(Al.readFileSync(n,"utf-8")).name==="prjct-cli")return jr=t,t}catch{}t=Do.dirname(t)}return jr=Do.join(__dirname,"..","..",".."),jr}function Lo(){if(zn)return zn;let t="3.63.2";if(t&&/^\d+\.\d+\.\d+/.test(t))return zn=t,zn;try{let e=Do.join(Nl(),"package.json");return zn=JSON.parse(Al.readFileSync(e,"utf-8")).version,zn}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",x(e)),"0.0.0"}}function uC(t){jr=t,zn=null}var zn,jr,Cn,An,rn=h(()=>{"use strict";ie();zn=null,jr=null;a(Nl,"getPackageRoot");a(Lo,"getVersion");a(uC,"resetPackageRoot");Cn=Lo(),An=Nl()});async function Oo(t){try{let{stdout:e}=await H(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function dC(){let t=await Oo("gh api user --jq .login");return t.success&&t.output||(t=await Oo("git config --global github.user"),t.success&&t.output)?t.output:null}async function pC(){let t=await Oo("git config user.name");return t.success&&t.output?t.output:null}async function mC(){let t=await Oo("git config user.email");return t.success&&t.output?t.output:null}async function Mr(){let[t,e,n]=await Promise.all([dC(),pC(),mC()]);return{github:t,email:n,name:e||t||"Unknown"}}var jo=h(()=>{"use strict";le();a(Oo,"execCommand");a(dC,"detectGitHubUsername");a(pC,"detectGitName");a(mC,"detectGitEmail");a(Mr,"detect")});var Mo={};L(Mo,{worktreeService:()=>gC});import Dl from"node:fs/promises";import $t from"node:path";var ah,Ll,gC,$o=h(()=>{"use strict";le();se();ah=".worktrees",Ll=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=$t.join(s,ah,n),o=r.branch||`feat/${n}`;await Dl.mkdir($t.join(s,ah),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await H(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await H("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 H("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await H(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await H(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await H("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await H("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await H("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 H("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await H("git rev-parse HEAD",{cwd:e}),{stdout:l}=await H("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 H("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1264
1264
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await H("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=$t.join(n,".env");await N(r)&&await Dl.copyFile(r,$t.join(e,".env"));let s=$t.join(n,".prjct"),i=$t.join(e,".prjct");await N(s)&&!await N(i)&&await Dl.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await H("git worktree prune",{cwd:s});for(let i of n)i.isMain||await N(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1265
1265
|
|
|
1266
1266
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
package/package.json
CHANGED