prjct-cli 3.80.0 → 3.80.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 +5 -0
- package/dist/bin/prjct-core.mjs +511 -511
- package/dist/bin/prjct-hooks.mjs +219 -219
- package/dist/daemon/entry.mjs +396 -396
- package/dist/mcp/server.mjs +1 -1
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1282,7 +1282,7 @@ ${o}`)}function wy(t,e,n){let r=rr(t,e);if(r.length===0)return[];if(!n||n.size==
|
|
|
1282
1282
|
_No changes detected (clean tree / no base range)._
|
|
1283
1283
|
`;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(`
|
|
1284
1284
|
`)}function iN(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(`
|
|
1285
|
-
`)}function oN(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 nN,rN,fu=h(()=>{"use strict";an();Ut();ue();a(St,"safeGit");a(QA,"listWorkingTreeFiles");a(ZA,"listCommittedFiles");a(eN,"resolveDiffBase");a(ky,"parseChangedLinesFromUnifiedDiff");a(tN,"loadHunkLines");a(wy,"symbolsTouchedByHunks");nN=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,rN=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(sN,"classifyRisk");a(mu,"detectChanges");a(gu,"formatDetectChangesMd");a(iN,"formatDetectChangesText");a(oN,"shipStructuralRiskCue")});function aN(t){return t instanceof li}function _e(t){return aN(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var li,na,ui,cn=h(()=>{"use strict";li=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)}},na=class t extends li{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")}},ui=class t extends li{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(aN,"isPrjctError");a(_e,"getErrorMessage")});function Sy(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function hu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Sy(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Sy(r.host),repoSlug:s}}catch{return{}}}async function cN(t){try{let{stdout:e}=await te("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function lN(t){try{let{stdout:e}=await te("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function sr(t){return typeof t=="string"&&t.length>0?t:void 0}function by(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function uN(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function vy(t){let e=w.getDoc(t,"project")||{},n=sr(e.repoPath),{provider:r,repoSlug:s}=n?hu(await cN(n)||""):{},i=n?await lN(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return uN({provider:r,repoSlug:s,currentBranch:sr(e.currentBranch),defaultBranch:i,stack:sr(e.stack),techStack:o&&o.length>0?o:void 0,version:sr(e.version),commitCount:by(e.commitCount),fileCount:by(e.fileCount),lastCommit:sr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:sr(e.cliVersion),syncedAt:sr(e.lastSync)})}var yu=h(()=>{"use strict";O();ue();a(Sy,"providerForHost");a(hu,"parseRemote");a(cN,"gitRemoteUrl");a(lN,"gitDefaultBranch");a(sr,"str");a(by,"num");a(uN,"compact");a(vy,"buildProjectMeta")});import dN from"node:crypto";function mN(t,e=pN){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=dN.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 gN(t){let e;try{let{stdout:s}=await te("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=hu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function _y(t){let e=await gN(t);return e?mN(e):null}var pN,xy=h(()=>{"use strict";ue();yu();pN="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(mN,"uuidv5");a(gN,"repoKey");a(_y,"deriveProjectId")});var wu={};D(wu,{PACKAGE_ROOT:()=>or,VERSION:()=>Ln,getPackageRoot:()=>ku,getVersion:()=>sa,resetPackageRoot:()=>fN});import Eu from"node:fs";import ra from"node:path";function ku(){if(Yr)return Yr;let t=__dirname;for(let e=0;e<5;e++){let n=ra.join(t,"package.json");if(Eu.existsSync(n))try{if(JSON.parse(Eu.readFileSync(n,"utf-8")).name==="prjct-cli")return Yr=t,t}catch{}t=ra.dirname(t)}return Yr=ra.join(__dirname,"..","..",".."),Yr}function sa(){if(ir)return ir;let t="3.80.
|
|
1285
|
+
`)}function oN(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 nN,rN,fu=h(()=>{"use strict";an();Ut();ue();a(St,"safeGit");a(QA,"listWorkingTreeFiles");a(ZA,"listCommittedFiles");a(eN,"resolveDiffBase");a(ky,"parseChangedLinesFromUnifiedDiff");a(tN,"loadHunkLines");a(wy,"symbolsTouchedByHunks");nN=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,rN=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(sN,"classifyRisk");a(mu,"detectChanges");a(gu,"formatDetectChangesMd");a(iN,"formatDetectChangesText");a(oN,"shipStructuralRiskCue")});function aN(t){return t instanceof li}function _e(t){return aN(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var li,na,ui,cn=h(()=>{"use strict";li=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)}},na=class t extends li{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")}},ui=class t extends li{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(aN,"isPrjctError");a(_e,"getErrorMessage")});function Sy(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function hu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:Sy(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:Sy(r.host),repoSlug:s}}catch{return{}}}async function cN(t){try{let{stdout:e}=await te("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function lN(t){try{let{stdout:e}=await te("git",["symbolic-ref","--short","refs/remotes/origin/HEAD"],{cwd:t});return e.trim().replace(/^origin\//,"")||void 0}catch{return}}function sr(t){return typeof t=="string"&&t.length>0?t:void 0}function by(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function uN(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function vy(t){let e=w.getDoc(t,"project")||{},n=sr(e.repoPath),{provider:r,repoSlug:s}=n?hu(await cN(n)||""):{},i=n?await lN(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return uN({provider:r,repoSlug:s,currentBranch:sr(e.currentBranch),defaultBranch:i,stack:sr(e.stack),techStack:o&&o.length>0?o:void 0,version:sr(e.version),commitCount:by(e.commitCount),fileCount:by(e.fileCount),lastCommit:sr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:sr(e.cliVersion),syncedAt:sr(e.lastSync)})}var yu=h(()=>{"use strict";O();ue();a(Sy,"providerForHost");a(hu,"parseRemote");a(cN,"gitRemoteUrl");a(lN,"gitDefaultBranch");a(sr,"str");a(by,"num");a(uN,"compact");a(vy,"buildProjectMeta")});import dN from"node:crypto";function mN(t,e=pN){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=dN.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 gN(t){let e;try{let{stdout:s}=await te("git",["remote","get-url","origin"],{cwd:t});e=s.trim()||void 0}catch{return null}if(!e)return null;let{provider:n,repoSlug:r}=hu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function _y(t){let e=await gN(t);return e?mN(e):null}var pN,xy=h(()=>{"use strict";ue();yu();pN="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(mN,"uuidv5");a(gN,"repoKey");a(_y,"deriveProjectId")});var wu={};D(wu,{PACKAGE_ROOT:()=>or,VERSION:()=>Ln,getPackageRoot:()=>ku,getVersion:()=>sa,resetPackageRoot:()=>fN});import Eu from"node:fs";import ra from"node:path";function ku(){if(Yr)return Yr;let t=__dirname;for(let e=0;e<5;e++){let n=ra.join(t,"package.json");if(Eu.existsSync(n))try{if(JSON.parse(Eu.readFileSync(n,"utf-8")).name==="prjct-cli")return Yr=t,t}catch{}t=ra.dirname(t)}return Yr=ra.join(__dirname,"..","..",".."),Yr}function sa(){if(ir)return ir;let t="3.80.1";if(t&&/^\d+\.\d+\.\d+/.test(t))return ir=t,ir;try{let e=ra.join(ku(),"package.json");return ir=JSON.parse(Eu.readFileSync(e,"utf-8")).version,ir}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",I(e)),"0.0.0"}}function fN(t){Yr=t,ir=null}var ir,Yr,Ln,or,jn=h(()=>{"use strict";ce();ir=null,Yr=null;a(ku,"getPackageRoot");a(sa,"getVersion");a(fN,"resetPackageRoot");Ln=sa(),or=ku()});async function ia(t){try{let{stdout:e}=await z(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function hN(){let t=await ia("gh api user --jq .login");return t.success&&t.output||(t=await ia("git config --global github.user"),t.success&&t.output)?t.output:null}async function yN(){let t=await ia("git config user.name");return t.success&&t.output?t.output:null}async function EN(){let t=await ia("git config user.email");return t.success&&t.output?t.output:null}async function zr(){let[t,e,n]=await Promise.all([hN(),yN(),EN()]);return{github:t,email:n,name:e||t||"Unknown"}}var oa=h(()=>{"use strict";ue();a(ia,"execCommand");a(hN,"detectGitHubUsername");a(yN,"detectGitName");a(EN,"detectGitEmail");a(zr,"detect")});var aa={};D(aa,{worktreeService:()=>kN});import Su from"node:fs/promises";import Wt from"node:path";var Ry,bu,kN,ca=h(()=>{"use strict";ue();le();Ry=".worktrees",bu=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Wt.join(s,Ry,n),o=r.branch||`feat/${n}`;await Su.mkdir(Wt.join(s,Ry),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await z(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await z("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 z("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await z(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await z(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await z("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await z("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await z("git rev-parse --git-dir",{cwd:e}),s=Wt.resolve(e,n.trim()),i=Wt.resolve(e,r.trim());if(s!==i){let{stdout:o}=await z("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await z("git rev-parse HEAD",{cwd:e}),{stdout:l}=await z("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Wt.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 z("git worktree list --porcelain",{cwd:e}),s=r.split(`
|
|
1286
1286
|
`)[0];if(s?.startsWith("worktree "))return s.replace("worktree ","").trim()}catch{}let{stdout:n}=await z("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Wt.join(n,".env");await j(r)&&await Su.copyFile(r,Wt.join(e,".env"));let s=Wt.join(n,".prjct"),i=Wt.join(e,".prjct");await j(s)&&!await j(i)&&await Su.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await z("git worktree prune",{cwd:s});for(let i of n)i.isMain||await j(i.path)||r.push(i.slug);return r}parsePorcelainOutput(e,n){let r=[],s=e.trim().split(`
|
|
1287
1287
|
|
|
1288
1288
|
`);for(let i of s){if(!i.trim())continue;let o=i.trim().split(`
|
package/package.json
CHANGED