prjct-cli 3.74.0 → 3.75.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 +7 -0
- package/dist/bin/prjct-core.mjs +604 -600
- package/dist/bin/prjct-hooks.mjs +1 -1
- package/dist/daemon/entry.mjs +526 -522
- package/dist/mcp/server.mjs +1 -1
- package/package.json +1 -1
package/dist/mcp/server.mjs
CHANGED
|
@@ -1278,7 +1278,7 @@ ${o}`)}function ly(t,e,n){let r=rr(t,e);if(r.length===0)return[];if(!n||n.size==
|
|
|
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 UA(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 WA(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 $A,FA,au=h(()=>{"use strict";sn();Ft();ue();a(wt,"safeGit");a(LA,"listWorkingTreeFiles");a(jA,"listCommittedFiles");a(OA,"resolveDiffBase");a(cy,"parseChangedLinesFromUnifiedDiff");a(MA,"loadHunkLines");a(ly,"symbolsTouchedByHunks");$A=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,FA=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(HA,"classifyRisk");a(iu,"detectChanges");a(ou,"formatDetectChangesMd");a(UA,"formatDetectChangesText");a(WA,"shipStructuralRiskCue")});function BA(t){return t instanceof ci}function Ce(t){return BA(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var ci,Zo,li,on=h(()=>{"use strict";ci=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)}},Zo=class t extends ci{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")}},li=class t extends ci{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(BA,"isPrjctError");a(Ce,"getErrorMessage")});function dy(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function cu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:dy(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:dy(r.host),repoSlug:s}}catch{return{}}}async function GA(t){try{let{stdout:e}=await te("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function XA(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 py(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function qA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function my(t){let e=w.getDoc(t,"project")||{},n=sr(e.repoPath),{provider:r,repoSlug:s}=n?cu(await GA(n)||""):{},i=n?await XA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return qA({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:py(e.commitCount),fileCount:py(e.fileCount),lastCommit:sr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:sr(e.cliVersion),syncedAt:sr(e.lastSync)})}var lu=h(()=>{"use strict";O();ue();a(dy,"providerForHost");a(cu,"parseRemote");a(GA,"gitRemoteUrl");a(XA,"gitDefaultBranch");a(sr,"str");a(py,"num");a(qA,"compact");a(my,"buildProjectMeta")});import VA from"node:crypto";function KA(t,e=JA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=VA.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 YA(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}=cu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function gy(t){let e=await YA(t);return e?KA(e):null}var JA,fy=h(()=>{"use strict";ue();lu();JA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(KA,"uuidv5");a(YA,"repoKey");a(gy,"deriveProjectId")});var pu={};D(pu,{PACKAGE_ROOT:()=>Dn,VERSION:()=>Pn,getPackageRoot:()=>du,getVersion:()=>ta,resetPackageRoot:()=>zA});import uu from"node:fs";import ea from"node:path";function du(){if(qr)return qr;let t=__dirname;for(let e=0;e<5;e++){let n=ea.join(t,"package.json");if(uu.existsSync(n))try{if(JSON.parse(uu.readFileSync(n,"utf-8")).name==="prjct-cli")return qr=t,t}catch{}t=ea.dirname(t)}return qr=ea.join(__dirname,"..","..",".."),qr}function ta(){if(ir)return ir;let t="3.
|
|
1281
|
+
`)}function WA(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 $A,FA,au=h(()=>{"use strict";sn();Ft();ue();a(wt,"safeGit");a(LA,"listWorkingTreeFiles");a(jA,"listCommittedFiles");a(OA,"resolveDiffBase");a(cy,"parseChangedLinesFromUnifiedDiff");a(MA,"loadHunkLines");a(ly,"symbolsTouchedByHunks");$A=/(?:^|\/)(?:auth|security|crypto|billing|payment|migrate|schema|migrations?)(?:\/|$)/i,FA=/(?:^|\/)(?:storage|database|db|sync|daemon|mcp|hooks?|session)(?:\/|$)/i;a(HA,"classifyRisk");a(iu,"detectChanges");a(ou,"formatDetectChangesMd");a(UA,"formatDetectChangesText");a(WA,"shipStructuralRiskCue")});function BA(t){return t instanceof ci}function Ce(t){return BA(t)||t instanceof Error?t.message:typeof t=="string"?t:"Unknown error"}var ci,Zo,li,on=h(()=>{"use strict";ci=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)}},Zo=class t extends ci{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")}},li=class t extends ci{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(BA,"isPrjctError");a(Ce,"getErrorMessage")});function dy(t){let e=t.toLowerCase();return e.includes("github")?"github":e.includes("gitlab")?"gitlab":e.includes("bitbucket")?"bitbucket":"other"}function cu(t){let e=t.trim();if(!e)return{};let n=e.match(/^[^/@]+@([^:/]+):(.+?)(?:\.git)?\/?$/);if(n)return{provider:dy(n[1]),repoSlug:n[2]};try{let r=new URL(e),s=r.pathname.replace(/^\/+/,"").replace(/\.git$/,"").replace(/\/+$/,"");return!r.host||!s?{}:{provider:dy(r.host),repoSlug:s}}catch{return{}}}async function GA(t){try{let{stdout:e}=await te("git",["remote","get-url","origin"],{cwd:t});return e.trim()||void 0}catch{return}}async function XA(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 py(t){return typeof t=="number"&&Number.isFinite(t)?t:void 0}function qA(t){return Object.fromEntries(Object.entries(t).filter(([,e])=>e!==void 0))}async function my(t){let e=w.getDoc(t,"project")||{},n=sr(e.repoPath),{provider:r,repoSlug:s}=n?cu(await GA(n)||""):{},i=n?await XA(n):void 0,o=Array.isArray(e.techStack)?e.techStack.filter(c=>typeof c=="string"):void 0;return qA({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:py(e.commitCount),fileCount:py(e.fileCount),lastCommit:sr(e.lastSyncCommit),hasUncommitted:typeof e.hasUncommittedChanges=="boolean"?e.hasUncommittedChanges:void 0,cliVersion:sr(e.cliVersion),syncedAt:sr(e.lastSync)})}var lu=h(()=>{"use strict";O();ue();a(dy,"providerForHost");a(cu,"parseRemote");a(GA,"gitRemoteUrl");a(XA,"gitDefaultBranch");a(sr,"str");a(py,"num");a(qA,"compact");a(my,"buildProjectMeta")});import VA from"node:crypto";function KA(t,e=JA){let n=Buffer.from(e.replace(/-/g,""),"hex"),s=VA.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 YA(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}=cu(e);return!n||!r?null:`${n}:${r}`.toLowerCase()}async function gy(t){let e=await YA(t);return e?KA(e):null}var JA,fy=h(()=>{"use strict";ue();lu();JA="6f9b2c1a-3d4e-5f60-8a7b-1c2d3e4f5a6b";a(KA,"uuidv5");a(YA,"repoKey");a(gy,"deriveProjectId")});var pu={};D(pu,{PACKAGE_ROOT:()=>Dn,VERSION:()=>Pn,getPackageRoot:()=>du,getVersion:()=>ta,resetPackageRoot:()=>zA});import uu from"node:fs";import ea from"node:path";function du(){if(qr)return qr;let t=__dirname;for(let e=0;e<5;e++){let n=ea.join(t,"package.json");if(uu.existsSync(n))try{if(JSON.parse(uu.readFileSync(n,"utf-8")).name==="prjct-cli")return qr=t,t}catch{}t=ea.dirname(t)}return qr=ea.join(__dirname,"..","..",".."),qr}function ta(){if(ir)return ir;let t="3.75.0";if(t&&/^\d+\.\d+\.\d+/.test(t))return ir=t,ir;try{let e=ea.join(du(),"package.json");return ir=JSON.parse(uu.readFileSync(e,"utf-8")).version,ir}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",N(e)),"0.0.0"}}function zA(t){qr=t,ir=null}var ir,qr,Pn,Dn,an=h(()=>{"use strict";le();ir=null,qr=null;a(du,"getPackageRoot");a(ta,"getVersion");a(zA,"resetPackageRoot");Pn=ta(),Dn=du()});async function na(t){try{let{stdout:e}=await Y(t,{timeout:5e3});return{success:!0,output:e.trim()}}catch{return{success:!1,output:""}}}async function QA(){let t=await na("gh api user --jq .login");return t.success&&t.output||(t=await na("git config --global github.user"),t.success&&t.output)?t.output:null}async function ZA(){let t=await na("git config user.name");return t.success&&t.output?t.output:null}async function eN(){let t=await na("git config user.email");return t.success&&t.output?t.output:null}async function Vr(){let[t,e,n]=await Promise.all([QA(),ZA(),eN()]);return{github:t,email:n,name:e||t||"Unknown"}}var ra=h(()=>{"use strict";ue();a(na,"execCommand");a(QA,"detectGitHubUsername");a(ZA,"detectGitName");a(eN,"detectGitEmail");a(Vr,"detect")});var sa={};D(sa,{worktreeService:()=>tN});import gu from"node:fs/promises";import Ht from"node:path";var hy,fu,tN,ia=h(()=>{"use strict";ue();ce();hy=".worktrees",fu=class{static{a(this,"WorktreeService")}async create(e,n,r={}){let s=await this.getMainWorktree(e),i=Ht.join(s,hy,n),o=r.branch||`feat/${n}`;await gu.mkdir(Ht.join(s,hy),{recursive:!0});let c=r.baseBranch?` ${r.baseBranch}`:"";await Y(`git worktree add "${i}" -b "${o}"${c}`,{cwd:s});let{stdout:l}=await Y("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 Y("git rev-parse --abbrev-ref HEAD",{cwd:e});s=i.trim()}catch{}if(await Y(`git worktree remove "${e}" --force`,{cwd:r}),n&&s&&s!=="main"&&s!=="master")try{await Y(`git branch -D "${s}"`,{cwd:r})}catch{}}async list(e){let n=await this.getMainWorktree(e),{stdout:r}=await Y("git worktree list --porcelain",{cwd:n});return this.parsePorcelainOutput(r,n)}async detect(e){try{let{stdout:n}=await Y("git rev-parse --git-common-dir",{cwd:e}),{stdout:r}=await Y("git rev-parse --git-dir",{cwd:e}),s=Ht.resolve(e,n.trim()),i=Ht.resolve(e,r.trim());if(s!==i){let{stdout:o}=await Y("git rev-parse --abbrev-ref HEAD",{cwd:e}),{stdout:c}=await Y("git rev-parse HEAD",{cwd:e}),{stdout:l}=await Y("git rev-parse --show-toplevel",{cwd:e}),u=l.trim(),d=Ht.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 Y("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 Y("git rev-parse --show-toplevel",{cwd:e});return n.trim()}async setup(e,n){let r=Ht.join(n,".env");await L(r)&&await gu.copyFile(r,Ht.join(e,".env"));let s=Ht.join(n,".prjct"),i=Ht.join(e,".prjct");await L(s)&&!await L(i)&&await gu.symlink(s,i,"dir")}async teardown(e){}async clean(e){let n=await this.list(e),r=[],s=await this.getMainWorktree(e);await Y("git worktree prune",{cwd:s});for(let i of n)i.isMain||await L(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(`
|
package/package.json
CHANGED