@a-company/paradigm 6.0.2 → 6.0.4

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.
Files changed (70) hide show
  1. package/dist/{accept-orchestration-QQISPINV.js → accept-orchestration-TIXUQQGR.js} +1 -1
  2. package/dist/agent-MB3H5EZA.js +33 -0
  3. package/dist/{agent-loader-2WJHD46U.js → agent-loader-VGBPL3TH.js} +1 -1
  4. package/dist/{agent-loader-YKS2PQWO.js → agent-loader-W3RQJVW7.js} +1 -1
  5. package/dist/{agents-suggest-HYTFMQD3.js → agents-suggest-IKY6VD2R.js} +1 -1
  6. package/dist/{ambient-NVKQCW2A.js → ambient-AI42BOM5.js} +2 -2
  7. package/dist/{ambient-BE3SQXNN.js → ambient-FNNFB4AP.js} +1 -1
  8. package/dist/authority-FA3HLEOA.js +2 -0
  9. package/dist/{chunk-TZDYIPVU.js → chunk-23T6UG73.js} +111 -27
  10. package/dist/{chunk-FEYOQMZ5.js → chunk-2AU5L333.js} +1 -1
  11. package/dist/{chunk-M3PPXJU4.js → chunk-4N56FRNE.js} +1 -1
  12. package/dist/{chunk-TNVWGPCE.js → chunk-6QXBXZF6.js} +1 -1
  13. package/dist/{chunk-WESTEMIM.js → chunk-AMLD7IYC.js} +1 -1
  14. package/dist/{chunk-3DZK54RU.js → chunk-DBEWOKD6.js} +32 -7
  15. package/dist/{chunk-VXIIVMTM.js → chunk-F6E3HW45.js} +1 -1
  16. package/dist/{chunk-TBWWFRL5.js → chunk-GD4F2HC6.js} +1 -1
  17. package/dist/{chunk-6SKSV5B2.js → chunk-IOVHF4SR.js} +1 -1
  18. package/dist/{chunk-M2HKWR25.js → chunk-KAFQA7HV.js} +2 -2
  19. package/dist/{chunk-GAFKOFAV.js → chunk-LAYBUKMB.js} +1 -1
  20. package/dist/{chunk-AO7ZSRME.js → chunk-TQOT2LBO.js} +2 -2
  21. package/dist/{chunk-PHEX6LU4.js → chunk-WXF5VFB4.js} +2 -2
  22. package/dist/chunk-XQLO5URP.js +11 -0
  23. package/dist/{compliance-BNFWQPKM.js → compliance-J3VOV445.js} +1 -1
  24. package/dist/{diff-MF55KQZH.js → diff-75MABOSL.js} +1 -1
  25. package/dist/{docs-O37YLLRN.js → docs-TSAAS4W3.js} +1 -1
  26. package/dist/doctor-L5XZENCF.js +2 -0
  27. package/dist/{hooks-TFMMMB2H.js → hooks-KUEE5KMM.js} +1 -1
  28. package/dist/index.js +4 -4
  29. package/dist/mcp.js +1 -1
  30. package/dist/{migrate-Z5UQN57G.js → migrate-ZPNYDNM4.js} +1 -1
  31. package/dist/migration-notices-BHLEYC4T.js +4 -0
  32. package/dist/{nomination-engine-QPZJH6XO.js → nomination-engine-NCLTGMAK.js} +1 -1
  33. package/dist/{orchestrate-RID7HHHH.js → orchestrate-K4KBTBYK.js} +1 -1
  34. package/dist/{providers-4PXMWA7V.js → providers-TBPOE4DI.js} +1 -1
  35. package/dist/registry-OUTA3DXW.js +20 -0
  36. package/dist/reindex-IZCD2JGD.js +2 -0
  37. package/dist/{serve-MO35XIZE.js → serve-3FMUWW5K.js} +1 -1
  38. package/dist/session-tracker-HHNY6J4I.js +2 -0
  39. package/dist/{session-work-log-EE4UIZ33.js → session-work-log-MEJ33TYD.js} +1 -1
  40. package/dist/{session-work-log-4IEVE4KK.js → session-work-log-ZVVJGO7X.js} +1 -1
  41. package/dist/shift-WGMZGWOC.js +60 -0
  42. package/dist/{spawn-UH5RENSE.js → spawn-KKDDR6UR.js} +1 -1
  43. package/dist/{team-MGT66HZQ.js → team-2LGZQRP4.js} +1 -1
  44. package/dist/tools-4RRFTU5H.js +2 -0
  45. package/dist/university-content/notes/N-para-451-agent-routing.md +117 -0
  46. package/dist/university-content/notes/N-para-451-archetypes-vs-instances.md +82 -0
  47. package/dist/university-content/notes/N-para-451-identity-layers.md +76 -0
  48. package/dist/university-content/notes/N-para-451-orchestration-modes.md +85 -0
  49. package/dist/university-content/notes/N-para-451-paradigm-shift.md +95 -0
  50. package/dist/university-content/notes/N-para-451-partners-primitive.md +107 -0
  51. package/dist/university-content/notes/N-para-451-roster-management.md +132 -0
  52. package/dist/university-content/notes/N-para-451-roster-reference.md +106 -0
  53. package/dist/university-content/notes/N-para-451-the-team-pattern.md +87 -0
  54. package/dist/university-content/notes/N-para-451-tiers.md +81 -0
  55. package/dist/university-content/notes/N-para-451-welcome.md +55 -0
  56. package/dist/university-content/notes/N-para-451-what-is-an-agent.md +73 -0
  57. package/dist/university-content/paths/LP-para-451.yaml +69 -0
  58. package/dist/university-content/quizzes/Q-para-451-foundations.yaml +154 -0
  59. package/dist/university-content/quizzes/Q-para-451-when-to-invoke.yaml +182 -0
  60. package/package.json +1 -1
  61. package/dist/agent-X6I2YWOB.js +0 -33
  62. package/dist/chunk-R5ECMBIV.js +0 -11
  63. package/dist/doctor-IG5XM4C4.js +0 -2
  64. package/dist/registry-KOOKFUWD.js +0 -20
  65. package/dist/reindex-FWPD2VGM.js +0 -2
  66. package/dist/session-tracker-KGORN6B5.js +0 -2
  67. package/dist/shift-TVNY2CQF.js +0 -60
  68. package/dist/tools-QJHAVYI6.js +0 -2
  69. /package/dist/{chunk-IZSBGW6E.js → chunk-HXGYVS2N.js} +0 -0
  70. /package/dist/{platform-server-UD45NTGV.js → platform-server-ANOALDPL.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {a as a$2,b as b$4,c as c$2}from'./chunk-M4UMM6DC.js';import {j,b as b$3,a as a$3}from'./chunk-GRZQIKST.js';import {j as j$1,a,c as c$1,b as b$2,k}from'./chunk-TNVWGPCE.js';import {b as b$1,a as a$1}from'./chunk-EK4ZRIFJ.js';import {c,b,d}from'./chunk-5TAVYPOV.js';import*as w from'fs';import*as P from'path';import*as se from'crypto';import {execSync}from'child_process';import*as z from'js-yaml';import {z as z$1}from'zod';import {glob}from'glob';import*as _e from'os';import Ws from'sql.js';var Qt={};c(Qt,{contentSearch:()=>Hs,detectFileRename:()=>Kt,generateFingerprint:()=>qt,levenshteinDistance:()=>Yt,levenshteinSimilarity:()=>qe,searchSiblingFiles:()=>Jt,slidingWindowSearch:()=>Ie});function qt(t){let e=t.split(`
2
+ import {a as a$2,b as b$4,c as c$2}from'./chunk-M4UMM6DC.js';import {j,b as b$3,a as a$3}from'./chunk-GRZQIKST.js';import {j as j$1,a,c as c$1,b as b$2,k}from'./chunk-6QXBXZF6.js';import {b as b$1,a as a$1}from'./chunk-EK4ZRIFJ.js';import {c,b,d}from'./chunk-5TAVYPOV.js';import*as w from'fs';import*as P from'path';import*as se from'crypto';import {execSync}from'child_process';import*as z from'js-yaml';import {z as z$1}from'zod';import {glob}from'glob';import*as _e from'os';import Ws from'sql.js';var Qt={};c(Qt,{contentSearch:()=>Hs,detectFileRename:()=>Kt,generateFingerprint:()=>qt,levenshteinDistance:()=>Yt,levenshteinSimilarity:()=>qe,searchSiblingFiles:()=>Jt,slidingWindowSearch:()=>Ie});function qt(t){let e=t.split(`
3
3
  `).filter(n=>n.trim()!=="");return {firstLine:Pe(e[0]||""),lastLine:Pe(e[e.length-1]||""),lineCount:e.length,structuralHash:Vt(e)}}function Vt(t){let e=t.map(n=>n.trim()).filter(n=>Bt.test(n)).map(n=>{let s=n.match(Bt);return s?s[1].trim():""}).join("|");return se.createHash("sha256").update(e).digest("hex").slice(0,16)}function Pe(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function Yt(t,e){if(t===e)return 0;if(t.length===0)return e.length;if(e.length===0)return t.length;t.length>e.length&&([t,e]=[e,t]);let n=t.length,s=e.length;if(n>5e3||s>5e3)return Math.abs(n-s);let r=new Array(n+1),o=new Array(n+1);for(let i=0;i<=n;i++)r[i]=i;for(let i=1;i<=s;i++){o[0]=i;for(let a=1;a<=n;a++){let c=t[a-1]===e[i-1]?0:1;o[a]=Math.min(r[a]+1,o[a-1]+1,r[a-1]+c);}[r,o]=[o,r];}return r[n]}function qe(t,e){if(t.length===0&&e.length===0)return 1;let n=Math.max(t.length,e.length);return 1-Yt(t,e)/n}function Ie(t,e,n,s=3){let{lineCount:r}=e,o=Math.max(1,Math.floor(r*.8)),i=Math.ceil(r*1.2),a=[],c=Xe(n);for(let d of [r,o,i])if(!(d>t.length))for(let u=0;u<=t.length-d;u++){let p=t.slice(u,u+d),g=zs(p,e,c);if(g>=.5){let m=p.join(`
4
4
  `);a.push({windowStart:u+1,windowEnd:u+d,similarity:qe(Xe(m),c),score:g});}}let l=new Map;for(let d of a){let u=l.get(d.windowStart);(!u||d.score>u.score)&&l.set(d.windowStart,d);}return Array.from(l.values()).sort((d,u)=>u.score-d.score).slice(0,s)}function zs(t,e,n){let s=t.filter(p=>p.trim()!=="");if(s.length===0)return 0;let r=0,o=Pe(s[0]),i=Pe(s[s.length-1]),a=0;o===e.firstLine&&(a+=.5),i===e.lastLine&&(a+=.5),r+=a*Ns,Vt(s)===e.structuralHash&&(r+=Ds);let l=s.join(`
5
5
  `),d=qe(Xe(l),n);d>=.8&&(r+=(d-.8)/.2*Ms);let u=s.length/e.lineCount;if(u>=.8&&u<=1.2){let p=1-Math.abs(1-u)/.2;r+=p*Us;}return r}function Xe(t){return t.split(`
@@ -21,7 +21,7 @@ ${o.map((T,E)=>`${E+1}. ${T}`).join(`
21
21
  - Modified files: ${a$1.length>0?a$1.join(", "):"(not specified)"}
22
22
  - Symbols touched: ${c.length>0?c.join(", "):"(not specified)"}
23
23
  - Open questions: ${l.length>0?l.join(", "):"(none)"}
24
- `;return Cs(),{handled:true,text:JSON.stringify({handoff:m,markdownSummary:x,persisted:h,recovery:"The next session will automatically receive this handoff via paradigm_session_recover."},null,2)}}if(t==="paradigm_session_stats"){let r=s.getStats(),o=s.getCostBreakdown(),i=s.getDurationMinutes();return {handled:true,text:JSON.stringify({session:{startTime:new Date(r.startTime).toISOString(),durationMinutes:i,lastActivity:new Date(r.lastActivity).toISOString()},model:{name:o.model,id:o.modelId,pricing:{inputPerMillion:`$${o.pricing.input.toFixed(2)}`,outputPerMillion:`$${o.pricing.output.toFixed(2)}`}},interactions:{toolCalls:r.totals.toolCallCount,resourceReads:r.totals.resourceReadCount,totalInteractions:r.totals.toolCallCount+r.totals.resourceReadCount},tokens:{total:r.totals.totalTokens,byCategory:{resources:o.resources.tokens,tools:o.tools.tokens}},cost:{totalUsd:`$${o.total.costUsd.toFixed(4)}`,breakdown:{resources:`$${o.resources.costUsd.toFixed(4)}`,tools:`$${o.tools.costUsd.toFixed(4)}`},note:"Cost is for MCP output tokens only (responses sent to model)"},details:{resourcesByType:o.resources.byType,toolsByName:o.tools.byName}},null,2)}}if(t==="paradigm_session_recover"){let{checkpoint:r,pendingHandoffs:o,previousSession:i}=zt(n.rootDir);if(!i&&o.length===0&&!r)return {handled:true,text:JSON.stringify({found:false,message:"No previous session breadcrumbs, checkpoints, or pending handoffs found.",tip:"Breadcrumbs persist to ~/.paradigm/sessions/ and handoffs persist via paradigm_handoff_prepare. Checkpoints persist via paradigm_session_checkpoint."},null,2)};let a={found:true};if(r){let l=Date.now()-r.timestamp,d=Math.round(l/6e4),u=Math.round(l/36e5);a.checkpoint={phase:r.phase,context:r.context,age:u>1?`${u} hours ago`:`${d} minutes ago`,timestamp:new Date(r.timestamp).toISOString(),sessionId:r.sessionId,plan:r.plan,modifiedFiles:r.modifiedFiles,symbolsTouched:r.symbolsTouched,decisions:r.decisions,recentBreadcrumbs:r.recentBreadcrumbs?.map(p=>({time:new Date(p.timestamp).toISOString(),action:p.action,tool:p.tool,symbol:p.symbol,summary:p.summary}))};}if(i){let l=Date.now()-i.lastActivity,d=Math.round(l/6e4),u=Math.round(l/36e5),g=i.breadcrumbs.slice(-10).map(m=>({time:new Date(m.timestamp).toISOString(),action:m.action,tool:m.tool,symbol:m.symbol,summary:m.summary}));a.previousSession={sessionId:i.sessionId,startTime:new Date(i.startTime).toISOString(),lastActivity:new Date(i.lastActivity).toISOString(),age:u>1?`${u} hours ago`:`${d} minutes ago`},a.context={symbolsModified:i.symbolsModified,filesExplored:i.filesExplored},a.recentActions=g;}if(o.length>0){a.pendingHandoffs=o.map(l=>({id:l.id,timestamp:l.timestamp,from:l.from,to:l.to,summary:l.summary,nextSteps:l.nextSteps,modifiedFiles:l.modifiedFiles,symbolsTouched:l.symbolsTouched,openQuestions:l.openQuestions}));for(let l of o)try{c$1(n.rootDir,l.id);}catch{}}let c="Continue where the previous session left off.";if(r)c=`Previous session was in "${r.phase}" phase: ${r.context}`,r.decisions?.length&&(c+=` Key decisions: ${r.decisions.slice(0,2).join("; ")}`);else if(o.length>0){let l=o[o.length-1];c=`Handoff received: "${l.summary}". `,l.nextSteps.length>0&&(c+=`Start with: ${l.nextSteps[0]}`);}else if(i){let l=i.breadcrumbs.slice(-10);if(l.length>0){let d=l[l.length-1];d.symbol&&(c=`Last work involved ${d.symbol}. Consider checking its current state with paradigm_ripple.`);}}return a.suggestion=c,a.agentInstruction="Present a brief summary of the previous session, then ask the user what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking.",s.markRecovered(),{handled:true,text:JSON.stringify(a,null,2)}}if(t==="paradigm_session_checkpoint"){s.setRootDir(n.rootDir);let r=e.phase,o=e.context,i=e.externalId,a=e.plan,c=e.modifiedFiles,l=e.symbolsTouched,d=e.decisions,{checkpoint:u,persisted:p}=s.saveCheckpoint({phase:r,context:o,externalId:i,plan:a,modifiedFiles:c,symbolsTouched:l,decisions:d}),g=p.local||p.global;return {handled:true,text:JSON.stringify({saved:g,persisted:p,checkpoint:{phase:u.phase,context:u.context,sessionId:u.sessionId,...u.externalId?{externalId:u.externalId}:{},timestamp:new Date(u.timestamp).toISOString(),modifiedFiles:u.modifiedFiles?.length||0,symbolsTouched:u.symbolsTouched?.length||0,decisions:u.decisions?.length||0,recentBreadcrumbs:u.recentBreadcrumbs?.length||0},...g?{note:"Checkpoint saved. Recovery data will be auto-surfaced on the first tool call of the next session."}:{warning:"Checkpoint was NOT persisted to disk. Both local and global writes failed. Check MCP server stderr for details."}},null,2)}}return {handled:false,text:""}}function zt(t){let e=j$1();e.setRootDir(t);let n=e.loadCheckpoint(),s=e.loadPreviousSession(),r=[];try{r=b$2(t);}catch{}return {checkpoint:n,pendingHandoffs:r,previousSession:s}}async function Ro(t){let{checkpoint:e,pendingHandoffs:n}=zt(t);if(!e&&n.length===0)return null;let s=[];if(s.push("--- SESSION RECOVERY ---"),e){let r=Date.now()-e.timestamp,o=Math.round(r/6e4),i=Math.round(r/36e5),a=i>1?`${i}h ago`:`${o}m ago`;s.push(`Previous session was in "${e.phase}" phase (${a}): ${e.context}`),e.modifiedFiles?.length&&s.push(`Modified files: ${e.modifiedFiles.join(", ")}`),e.symbolsTouched?.length&&s.push(`Symbols: ${e.symbolsTouched.join(", ")}`),e.decisions?.length&&s.push(`Decisions: ${e.decisions.join("; ")}`),e.plan&&s.push(`Plan: ${e.plan.slice(0,200)}`);}if(n.length>0){let r=n[n.length-1];s.push(`Pending handoff: "${r.summary}"`),r.nextSteps.length>0&&s.push(`Next steps: ${r.nextSteps.slice(0,3).join(", ")}`);}try{let{loadTasks:r}=await import('./task-loader-NZFDTUQ5.js'),o=await r(t,{status:"open",limit:5});if(o.length>0){s.push(""),s.push("Open tasks:");for(let i of o){let a=i.tags.length>0?` [${i.tags.join(", ")}]`:"";s.push(` [${i.priority}] ${i.id}: ${i.blurb}${a}`);}}}catch{}try{let{loadLoreEntries:r}=await import('./lore-loader-PXFKMKAN.js'),i=(await r(t,{limit:10})).filter(a=>a.tags?.some(c=>c.startsWith("arc:")));if(i.length>0){let a=new Map;for(let d of i){let u=d.tags?.find(p=>p.startsWith("arc:"))||"";a.set(u,(a.get(u)||0)+1);}let c=e?.symbolsTouched||[];if((c.length>0?i.filter(d=>d.symbols_touched?.some(u=>c.includes(u))):i.slice(0,3)).length>0||a.size>0){s.push(""),s.push("Active lore arcs:");for(let[d,u]of a)s.push(` ${d} (${u} entries)`);}}}catch{}try{let{loadNominations:r}=await import('./nomination-engine-QPZJH6XO.js'),o=r(t,{pending_only:!0}).filter(i=>i.urgency==="critical"||i.urgency==="high");if(o.length>0){s.push(""),s.push("Ambient nominations (urgent):");for(let i of o.slice(0,5))s.push(` [${i.urgency}] ${i.brief}`);o.length>5&&s.push(` ... and ${o.length-5} more. Use paradigm_ambient_nominations to see all.`);}}catch{}return s.push(""),s.push("IMPORTANT: Present a brief summary of this recovery data to the user, then ask what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking."),s.push("---"),s.join(`
24
+ `;return Cs(),{handled:true,text:JSON.stringify({handoff:m,markdownSummary:x,persisted:h,recovery:"The next session will automatically receive this handoff via paradigm_session_recover."},null,2)}}if(t==="paradigm_session_stats"){let r=s.getStats(),o=s.getCostBreakdown(),i=s.getDurationMinutes();return {handled:true,text:JSON.stringify({session:{startTime:new Date(r.startTime).toISOString(),durationMinutes:i,lastActivity:new Date(r.lastActivity).toISOString()},model:{name:o.model,id:o.modelId,pricing:{inputPerMillion:`$${o.pricing.input.toFixed(2)}`,outputPerMillion:`$${o.pricing.output.toFixed(2)}`}},interactions:{toolCalls:r.totals.toolCallCount,resourceReads:r.totals.resourceReadCount,totalInteractions:r.totals.toolCallCount+r.totals.resourceReadCount},tokens:{total:r.totals.totalTokens,byCategory:{resources:o.resources.tokens,tools:o.tools.tokens}},cost:{totalUsd:`$${o.total.costUsd.toFixed(4)}`,breakdown:{resources:`$${o.resources.costUsd.toFixed(4)}`,tools:`$${o.tools.costUsd.toFixed(4)}`},note:"Cost is for MCP output tokens only (responses sent to model)"},details:{resourcesByType:o.resources.byType,toolsByName:o.tools.byName}},null,2)}}if(t==="paradigm_session_recover"){let{checkpoint:r,pendingHandoffs:o,previousSession:i}=zt(n.rootDir);if(!i&&o.length===0&&!r)return {handled:true,text:JSON.stringify({found:false,message:"No previous session breadcrumbs, checkpoints, or pending handoffs found.",tip:"Breadcrumbs persist to ~/.paradigm/sessions/ and handoffs persist via paradigm_handoff_prepare. Checkpoints persist via paradigm_session_checkpoint."},null,2)};let a={found:true};if(r){let l=Date.now()-r.timestamp,d=Math.round(l/6e4),u=Math.round(l/36e5);a.checkpoint={phase:r.phase,context:r.context,age:u>1?`${u} hours ago`:`${d} minutes ago`,timestamp:new Date(r.timestamp).toISOString(),sessionId:r.sessionId,plan:r.plan,modifiedFiles:r.modifiedFiles,symbolsTouched:r.symbolsTouched,decisions:r.decisions,recentBreadcrumbs:r.recentBreadcrumbs?.map(p=>({time:new Date(p.timestamp).toISOString(),action:p.action,tool:p.tool,symbol:p.symbol,summary:p.summary}))};}if(i){let l=Date.now()-i.lastActivity,d=Math.round(l/6e4),u=Math.round(l/36e5),g=i.breadcrumbs.slice(-10).map(m=>({time:new Date(m.timestamp).toISOString(),action:m.action,tool:m.tool,symbol:m.symbol,summary:m.summary}));a.previousSession={sessionId:i.sessionId,startTime:new Date(i.startTime).toISOString(),lastActivity:new Date(i.lastActivity).toISOString(),age:u>1?`${u} hours ago`:`${d} minutes ago`},a.context={symbolsModified:i.symbolsModified,filesExplored:i.filesExplored},a.recentActions=g;}if(o.length>0){a.pendingHandoffs=o.map(l=>({id:l.id,timestamp:l.timestamp,from:l.from,to:l.to,summary:l.summary,nextSteps:l.nextSteps,modifiedFiles:l.modifiedFiles,symbolsTouched:l.symbolsTouched,openQuestions:l.openQuestions}));for(let l of o)try{c$1(n.rootDir,l.id);}catch{}}let c="Continue where the previous session left off.";if(r)c=`Previous session was in "${r.phase}" phase: ${r.context}`,r.decisions?.length&&(c+=` Key decisions: ${r.decisions.slice(0,2).join("; ")}`);else if(o.length>0){let l=o[o.length-1];c=`Handoff received: "${l.summary}". `,l.nextSteps.length>0&&(c+=`Start with: ${l.nextSteps[0]}`);}else if(i){let l=i.breadcrumbs.slice(-10);if(l.length>0){let d=l[l.length-1];d.symbol&&(c=`Last work involved ${d.symbol}. Consider checking its current state with paradigm_ripple.`);}}return a.suggestion=c,a.agentInstruction="Present a brief summary of the previous session, then ask the user what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking.",s.markRecovered(),{handled:true,text:JSON.stringify(a,null,2)}}if(t==="paradigm_session_checkpoint"){s.setRootDir(n.rootDir);let r=e.phase,o=e.context,i=e.externalId,a=e.plan,c=e.modifiedFiles,l=e.symbolsTouched,d=e.decisions,{checkpoint:u,persisted:p}=s.saveCheckpoint({phase:r,context:o,externalId:i,plan:a,modifiedFiles:c,symbolsTouched:l,decisions:d}),g=p.local||p.global;return {handled:true,text:JSON.stringify({saved:g,persisted:p,checkpoint:{phase:u.phase,context:u.context,sessionId:u.sessionId,...u.externalId?{externalId:u.externalId}:{},timestamp:new Date(u.timestamp).toISOString(),modifiedFiles:u.modifiedFiles?.length||0,symbolsTouched:u.symbolsTouched?.length||0,decisions:u.decisions?.length||0,recentBreadcrumbs:u.recentBreadcrumbs?.length||0},...g?{note:"Checkpoint saved. Recovery data will be auto-surfaced on the first tool call of the next session."}:{warning:"Checkpoint was NOT persisted to disk. Both local and global writes failed. Check MCP server stderr for details."}},null,2)}}return {handled:false,text:""}}function zt(t){let e=j$1();e.setRootDir(t);let n=e.loadCheckpoint(),s=e.loadPreviousSession(),r=[];try{r=b$2(t);}catch{}return {checkpoint:n,pendingHandoffs:r,previousSession:s}}async function Ro(t){let{checkpoint:e,pendingHandoffs:n}=zt(t);if(!e&&n.length===0)return null;let s=[];if(s.push("--- SESSION RECOVERY ---"),e){let r=Date.now()-e.timestamp,o=Math.round(r/6e4),i=Math.round(r/36e5),a=i>1?`${i}h ago`:`${o}m ago`;s.push(`Previous session was in "${e.phase}" phase (${a}): ${e.context}`),e.modifiedFiles?.length&&s.push(`Modified files: ${e.modifiedFiles.join(", ")}`),e.symbolsTouched?.length&&s.push(`Symbols: ${e.symbolsTouched.join(", ")}`),e.decisions?.length&&s.push(`Decisions: ${e.decisions.join("; ")}`),e.plan&&s.push(`Plan: ${e.plan.slice(0,200)}`);}if(n.length>0){let r=n[n.length-1];s.push(`Pending handoff: "${r.summary}"`),r.nextSteps.length>0&&s.push(`Next steps: ${r.nextSteps.slice(0,3).join(", ")}`);}try{let{loadTasks:r}=await import('./task-loader-NZFDTUQ5.js'),o=await r(t,{status:"open",limit:5});if(o.length>0){s.push(""),s.push("Open tasks:");for(let i of o){let a=i.tags.length>0?` [${i.tags.join(", ")}]`:"";s.push(` [${i.priority}] ${i.id}: ${i.blurb}${a}`);}}}catch{}try{let{loadLoreEntries:r}=await import('./lore-loader-PXFKMKAN.js'),i=(await r(t,{limit:10})).filter(a=>a.tags?.some(c=>c.startsWith("arc:")));if(i.length>0){let a=new Map;for(let d of i){let u=d.tags?.find(p=>p.startsWith("arc:"))||"";a.set(u,(a.get(u)||0)+1);}let c=e?.symbolsTouched||[];if((c.length>0?i.filter(d=>d.symbols_touched?.some(u=>c.includes(u))):i.slice(0,3)).length>0||a.size>0){s.push(""),s.push("Active lore arcs:");for(let[d,u]of a)s.push(` ${d} (${u} entries)`);}}}catch{}try{let{loadNominations:r}=await import('./nomination-engine-NCLTGMAK.js'),o=r(t,{pending_only:!0}).filter(i=>i.urgency==="critical"||i.urgency==="high");if(o.length>0){s.push(""),s.push("Ambient nominations (urgent):");for(let i of o.slice(0,5))s.push(` [${i.urgency}] ${i.brief}`);o.length>5&&s.push(` ... and ${o.length-5} more. Use paradigm_ambient_nominations to see all.`);}}catch{}return s.push(""),s.push("IMPORTANT: Present a brief summary of this recovery data to the user, then ask what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking."),s.push("---"),s.join(`
25
25
  `)}var Be=class{cache=new Map;ttlMs;constructor(e=3e4){this.ttlMs=e;}async getOrCompute(e,n){let s=this.cache.get(e);if(s&&Date.now()-s.createdAt<this.ttlMs)return s.data;let r=await n();return this.cache.set(e,{data:r,createdAt:Date.now()}),r}invalidate(e){this.cache.delete(e);}invalidatePrefix(e){for(let n of this.cache.keys())n.startsWith(e)&&this.cache.delete(n);}clear(){this.cache.clear();}stats(){return {size:this.cache.size,ttlMs:this.ttlMs}}},Ht=new Be(3e4);var Ls=300*1e3,ye=null;function Gt(){ye=null;}function K(t,e){return w.existsSync(P.join(t,e))}function ne(t,e){return w.existsSync(P.join(t,e))}function js(t,e,n){let s=t;try{if(!w.existsSync(s))return !1;let r=w.readdirSync(s,{withFileTypes:!0});for(let o of r){if(o.isFile()&&o.name.endsWith(e))return !0;if(o.isDirectory())try{if(w.readdirSync(P.join(s,o.name)).some(a=>a.endsWith(e)))return !0}catch{}}}catch{}return false}var Os={wisdom:t=>K(t,".paradigm/wisdom"),history:t=>K(t,".paradigm/history"),lore:t=>K(t,".paradigm/lore"),habits:t=>ne(t,".paradigm/habits.yaml"),sentinel:t=>{try{let e=P.join(t,".paradigm","config.yaml");return w.existsSync(e)?w.readFileSync(e,"utf-8").includes("sentinel"):!1}catch{return false}},flows:t=>ne(t,".paradigm/flow-index.json")||ne(t,".paradigm/flows.yaml"),fixtures:t=>ne(t,".paradigm/fixtures.yaml"),orchestration:t=>ne(t,".paradigm/agents.yaml"),tasks:t=>K(t,".paradigm/tasks"),assessment:t=>K(t,".paradigm/lore"),personas:t=>js(t,".persona"),protocols:t=>K(t,".paradigm/protocols"),symphony:()=>{let t=P.join(_e.homedir(),".paradigm","score");return w.existsSync(t)},university:t=>K(t,".paradigm/university"),agents:t=>{let e=P.join(_e.homedir(),".paradigm","agents");return K(t,".paradigm/agents")||w.existsSync(e)},"aspect-graph":t=>ne(t,".paradigm/aspect-graph.db"),pan:t=>ne(t,".pan")||ne(t,"nevr.yaml"),notebooks:t=>{let e=P.join(_e.homedir(),".paradigm","notebooks");return K(t,".paradigm/notebooks")||w.existsSync(e)}},Wt=class{modules=new Map;activatedAdvanced=new Set;rootDir;constructor(e){this.rootDir=e;}register(e){this.modules.set(e.key,e);}registerAll(e){for(let n of e)this.register(n);}detectActiveFeatures(){if(ye&&Date.now()-ye.timestamp<Ls)return ye.features;let e=new Set;for(let[n,s]of this.modules){if(s.tier==="core"){e.add(n);continue}if(s.tier==="advanced"){this.activatedAdvanced.has(n)&&e.add(n);continue}let r=s.detect||Os[n];if(r)try{r(this.rootDir)&&e.add(n);}catch{}else e.add(n);}return ye={features:e,timestamp:Date.now()},e}getActiveTools(){let e=this.detectActiveFeatures(),n=[];for(let[s,r]of this.modules)e.has(s)&&n.push(...r.getToolsList());return n}activateAdvanced(e){let n=this.modules.get(e);return !n||n.tier!=="advanced"?null:(this.activatedAdvanced.add(e),n.getToolsList())}getAvailableAdvanced(){let e=[];for(let[n,s]of this.modules)s.tier==="advanced"&&!this.activatedAdvanced.has(n)&&e.push({key:n,toolCount:s.getToolsList().length});return e}async dispatch(e,n,s,r){let o=this.detectActiveFeatures();for(let[i,a]of this.modules)if(o.has(i))try{let c=await a.handleTool(e,n,s,r);if(c.handled)return c}catch(c){return {handled:true,text:JSON.stringify({error:`Tool handler error in module "${i}"`,message:c.message},null,2)}}return null}get size(){return this.modules.size}getRegistryInfo(){let e=this.detectActiveFeatures(),n={core:0,feature:0,advanced:0};for(let s of this.modules.values())n[s.tier]++;return {total:this.modules.size,byTier:n,activeFeatures:[...e],availableAdvanced:[...this.modules.entries()].filter(([s,r])=>r.tier==="advanced"&&!this.activatedAdvanced.has(s)).map(([s])=>s)}}};var Ve=null;async function Gs(){return Ve||(Ve=await Ws()),Ve}var Bs=[`CREATE TABLE IF NOT EXISTS aspects (
26
26
  id TEXT PRIMARY KEY,
27
27
  description TEXT NOT NULL,
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ import {c,a as a$1}from'./chunk-YNDPSWOE.js';import {e as e$1}from'./chunk-VIG5LSGZ.js';import {a}from'./chunk-LKAT7IAK.js';import*as e from'fs';import*as r from'path';import*as w from'js-yaml';import l from'chalk';async function rs(P={}){let p=P.rootDir||process.cwd(),s=[],S=P.quiet,L=P.context;S||(console.log(l.blue(`
3
+ \u{1FA7A} Paradigm Doctor
4
+ `)),console.log(L?l.gray(`Running context audit checks...
5
+ `):l.gray(`Checking Paradigm setup...
6
+ `)));let N=a.command("doctor").start("Running health checks");if(!L){let E=function(t){let a=[];try{let n=e.readdirSync(t,{withFileTypes:!0});for(let i of n){if(i.name==="node_modules"||i.name==="dist"||i.name===".git")continue;let d=r.join(t,i.name);i.isDirectory()?a.push(...E(d)):i.name===".purpose"&&a.push(d);}}catch{}return a};let o=r.join(p,".paradigm");if(e.existsSync(o))if(e.statSync(o).isFile())s.push({name:".paradigm",status:"warn",message:"Legacy file format (should be directory)",fix:"paradigm upgrade --all"});else {s.push({name:".paradigm/",status:"ok",message:"Directory exists"});let a=r.join(o,"config.yaml");if(e.existsSync(a))try{let u=e.readFileSync(a,"utf8");e$1(u),s.push({name:".paradigm/config.yaml",status:"ok",message:"Valid YAML"});}catch(u){s.push({name:".paradigm/config.yaml",status:"error",message:`Invalid YAML: ${u.message}`,fix:"Check YAML syntax"});}else s.push({name:".paradigm/config.yaml",status:"missing",message:"Config file not found",fix:"paradigm init --force"});let n=["logger.md","probe.md","symbols.md"],i=r.join(o,"specs");if(e.existsSync(i))for(let u of n){let x=r.join(i,u);e.existsSync(x)?s.push({name:`.paradigm/specs/${u}`,status:"ok",message:"Present"}):s.push({name:`.paradigm/specs/${u}`,status:"missing",message:"Spec file not found",fix:"paradigm upgrade --all"});}else s.push({name:".paradigm/specs/",status:"missing",message:"Specs directory not found",fix:"paradigm upgrade --all"});let d=r.join(o,"docs");e.existsSync(d)?s.push({name:".paradigm/docs/",status:"ok",message:"Directory exists"}):s.push({name:".paradigm/docs/",status:"missing",message:"Docs directory not found",fix:"paradigm upgrade --all"});let h=r.join(o,"prompts");e.existsSync(h)?s.push({name:".paradigm/prompts/",status:"ok",message:"Directory exists"}):s.push({name:".paradigm/prompts/",status:"missing",message:"Prompts directory not found",fix:"paradigm upgrade --all"});let g=["specs","implementation-guides","prompts","decisions"],f=[];for(let u of g){let x=r.join(o,u);if(e.existsSync(x)&&e.statSync(x).isDirectory()){let k=r.join(x,".index.yaml");e.existsSync(k)||f.push(`.paradigm/${u}/`);}}f.length>0?s.push({name:"Docs-class indexes",status:"warn",message:`${f.length} director${f.length===1?"y":"ies"} missing .index.yaml: ${f.join(", ")}`,fix:"paradigm docs scaffold"}):s.push({name:"Docs-class indexes",status:"ok",message:"All docs-class directories have .index.yaml"});let y=r.join(o,"scan-index.json"),F=r.join(p,".paradigm-scan-index.json");if(e.existsSync(y)){let u=e.statSync(y),x=Date.now()-u.mtime.getTime(),k=Math.floor(x/(1e3*60*60));k>24?s.push({name:".paradigm/scan-index.json",status:"warn",message:`Stale (${k} hours old)`,fix:"paradigm index"}):s.push({name:".paradigm/scan-index.json",status:"ok",message:k>0?`${k} hours old`:"Fresh"});}else e.existsSync(F)?s.push({name:"scan-index",status:"warn",message:"Using legacy location",fix:"paradigm index"}):s.push({name:".paradigm/scan-index.json",status:"missing",message:"Not generated",fix:"paradigm index"});}else s.push({name:".paradigm/",status:"missing",message:"Not initialized",fix:"paradigm init"});let m=c(p);if(m.detected){let t=a$1(m.detected);if(t){let a=r.join(p,t.outputPath);e.existsSync(a)?s.push({name:t.outputPath,status:"ok",message:`Present (${m.detected})`}):s.push({name:t.outputPath,status:"missing",message:`Not generated for ${m.detected}`,fix:"paradigm sync"});}}let c$1=r.join(p,".premise");e.existsSync(c$1)?s.push({name:".premise",status:"ok",message:"Present"}):s.push({name:".premise",status:"missing",message:"Not found (optional)"});let v=r.join(p,".purpose");e.existsSync(v)?s.push({name:".purpose",status:"ok",message:"Present"}):s.push({name:".purpose",status:"warn",message:"Root .purpose not found",fix:"paradigm init"});let D=r.join(p,".paradigm","config.yaml");if(e.existsSync(D))try{let t=e.readFileSync(D,"utf8"),n=w.load(t)?.["purpose-required"];if(n&&Array.isArray(n)){let i=[];for(let d of n){if(!d.pattern)continue;let{glob:h}=await import('glob'),g=await h(d.pattern,{cwd:p,nodir:!1});for(let f of g){let y=r.join(p,f);try{e.statSync(y).isDirectory()&&!e.existsSync(r.join(y,".purpose"))&&i.push(f);}catch{}}}i.length>0?s.push({name:"Purpose-required",status:"warn",message:`${i.length} director${i.length===1?"y":"ies"} missing .purpose: ${i.join(", ")}`,fix:"Create .purpose files with paradigm_purpose_init + paradigm_purpose_add_component"}):s.push({name:"Purpose-required",status:"ok",message:"All required directories have .purpose files"});}}catch{}let q=/\[NEEDS CLARIFICATION:\s*[^\]]+\]/gi,R=0,Y=E(p);for(let t of Y)try{let n=e.readFileSync(t,"utf8").match(q);n&&(R+=n.length);}catch{}R>0?s.push({name:"Clarification markers",status:"warn",message:`${R} [NEEDS CLARIFICATION] marker${R>1?"s":""} found in .purpose files`,fix:"Resolve open clarification markers before shipping"}):Y.length>0&&s.push({name:"Clarification markers",status:"ok",message:"No unresolved markers"});let I=r.join(p,"portal.yaml");if(e.existsSync(I))try{let t=e.readFileSync(I,"utf8"),a=w.load(t);if(a?.version&&a?.gates){let n=Object.keys(a.gates||{}).length,i=Object.keys(a.routes||{}).length;s.push({name:"portal.yaml",status:"ok",message:`Valid (${n} gates, ${i} routes)`});}else s.push({name:"portal.yaml",status:"warn",message:"Missing version or gates section",fix:'Add version: "1.0" and gates: {} to portal.yaml'});}catch(t){s.push({name:"portal.yaml",status:"error",message:`Invalid YAML: ${t.message}`,fix:"Check YAML syntax in portal.yaml"});}if(e.existsSync(I))try{let{checkPortalCompliance:t,getComplianceSummary:a}=await import('./portal-compliance-JONQ4SOP.js'),n=await t(p),i=a(n);s.push({name:"Portal compliance",status:i.status,message:i.message,fix:i.status!=="ok"?"paradigm portal check":void 0});}catch{}{let t=r.join(p,".paradigm","scan-index.json"),a=r.join(p,".paradigm","roster.yaml");try{if(e.existsSync(t)){let n=e.readFileSync(t,"utf8"),i=JSON.parse(n),d=Object.keys(i.components??{}).length,h=Object.keys(i.aspects??{}).length;if(d>0){let g=!1;if(e.existsSync(a))try{let y=w.load(e.readFileSync(a,"utf8"));g=Array.isArray(y?.active)&&y.active.includes("compliance");}catch{}let f=`${d}:${h} components:aspects`;g?s.push({name:"Aspect coverage",status:"ok",message:`${f} (claimant: rune)`}):h===0?s.push({name:"Aspect coverage",status:"info",message:`${f} ${l.dim("(no aspects defined)")}`}):s.push({name:"Aspect coverage",status:"info",message:`${f} ${l.dim("(no claimant active)")}`});}}}catch{}}let U=r.join(p,".paradigm","flows.yaml");if(e.existsSync(U))try{let t=e.readFileSync(U,"utf8"),a=w.load(t);if(a?.version&&a?.flows){let n=Object.keys(a.flows||{}).length,i=Object.entries(a.flows||{}).filter(([,d])=>!d?.steps||(d.steps?.length??0)===0);i.length>0?s.push({name:".paradigm/flows.yaml",status:"warn",message:`${n} flows defined, ${i.length} have no steps`,fix:"Add steps to empty flow definitions"}):s.push({name:".paradigm/flows.yaml",status:"ok",message:`Valid (${n} flows)`});}else s.push({name:".paradigm/flows.yaml",status:"warn",message:"Missing version or flows section",fix:'Ensure flows.yaml has version: "1.0" and flows: {}'});}catch(t){s.push({name:".paradigm/flows.yaml",status:"error",message:`Invalid YAML: ${t.message}`,fix:"Check YAML syntax in flows.yaml"});}let H=r.join(p,".paradigm","lore");if(e.existsSync(H))try{let t=e.readdirSync(H).filter(a=>a.endsWith(".yaml"));t.length===0?s.push({name:"Lore entries",status:"warn",message:"Lore directory exists but no entries found",fix:"Record a lore entry: paradigm lore record"}):s.push({name:"Lore entries",status:"ok",message:`${t.length} lore file${t.length>1?"s":""}`});}catch{s.push({name:"Lore entries",status:"warn",message:"Could not read lore directory"});}let G=r.join(p,".paradigm","university");if(e.existsSync(G))try{let t=r.join(G,"content"),a=0,n=0;if(e.existsSync(t))for(let i of ["notes","policies","quizzes","paths"]){let d=r.join(t,i);e.existsSync(d)&&(a+=e.readdirSync(d).filter(h=>h.endsWith(".md")||h.endsWith(".yaml")).length);}if(a===0)s.push({name:"University content",status:"warn",message:"University directory exists but no content found",fix:'Add content: paradigm university add note --title "Getting Started"'});else {let i=r.join(t,"quizzes");if(e.existsSync(i))for(let h of e.readdirSync(i).filter(g=>g.endsWith(".yaml")))try{let g=w.load(e.readFileSync(r.join(i,h),"utf8"));if(g?.questions)for(let f of g.questions)f.choices&&f.correct&&!(f.correct in f.choices)&&n++;}catch{}let d=r.join(t,"paths");if(e.existsSync(d))for(let h of e.readdirSync(d).filter(g=>g.endsWith(".yaml")))try{let g=w.load(e.readFileSync(r.join(d,h),"utf8"));if(g?.steps){for(let f of g.steps)if(f.content&&!f.content.startsWith("plsat:")){let y=!1;for(let F of ["notes","policies","quizzes","paths"]){let u=r.join(t,F);if(e.existsSync(u)&&e.readdirSync(u).some(k=>k.startsWith(f.content))){y=!0;break}}y||n++;}}}catch{}n>0?s.push({name:"University content",status:"warn",message:`${a} items, ${n} issue${n>1?"s":""}`,fix:"Run: paradigm university validate --deep"}):s.push({name:"University content",status:"ok",message:`${a} content item${a>1?"s":""}`});}}catch{s.push({name:"University content",status:"warn",message:"Could not read university directory"});}let _=r.join(p,".claude","hooks.json"),ss=r.join(p,"plugins","paradigm","hooks.json");if(e.existsSync(_)){let t=e.statSync(_),a=Date.now()-t.mtime.getTime(),n=Math.floor(a/(1e3*60*60*24));n>30?s.push({name:"Claude Code hooks",status:"warn",message:`Hooks are ${n} days old \u2014 may be outdated`,fix:"paradigm hooks install"}):s.push({name:"Claude Code hooks",status:"ok",message:n>0?`${n} days old`:"Fresh"});}else e.existsSync(ss)?s.push({name:"Claude Code hooks",status:"ok",message:"Using plugin hooks"}):s.push({name:"Claude Code hooks",status:"missing",message:"No hooks installed",fix:"paradigm hooks install"});let V=r.join(p,".paradigm","habits.yaml");if(e.existsSync(V))try{let t=e.readFileSync(V,"utf8"),a=w.load(t);if(a?.version&&Array.isArray(a?.habits)){let n=a.habits.filter(i=>i.enabled!==!1).length;s.push({name:"Habits config",status:"ok",message:`Valid (${n}/${a.habits.length} enabled)`});}else s.push({name:"Habits config",status:"warn",message:"Missing version or habits array",fix:"Regenerate habits.yaml with paradigm habits init"});}catch(t){s.push({name:"Habits config",status:"error",message:`Invalid YAML: ${t.message}`,fix:"Check YAML syntax in habits.yaml"});}let J=r.join(p,"AGENTS.md");if(e.existsSync(J)){let t=e.statSync(J),a=Date.now()-t.mtime.getTime(),n=Math.floor(a/(1e3*60*60*24));n>60?s.push({name:"AGENTS.md",status:"warn",message:`${n} days since last update \u2014 may be stale`,fix:"paradigm sync"}):s.push({name:"AGENTS.md",status:"ok",message:n>0?`Updated ${n} days ago`:"Fresh"});}}let O=0,T=0,$=0;for(let o of s){let m,c;switch(o.status){case "ok":m="\u2713",c=l.green;break;case "warn":m="\u26A0",c=l.yellow,T++;break;case "error":m="\u2717",c=l.red,O++;break;case "missing":m="\u25CB",c=l.gray,$++;break;case "info":m="\u2802",c=l.gray;break}if(!S){let v=o.name.padEnd(30);console.log(` ${c(m)} ${v} ${c(o.message)}`),o.fix&&console.log(l.gray(` \u2514\u2500 Fix: ${o.fix}`));}}let{runContextAudit:Z}=await import('./context-audit-JVCA6GSV.js'),M=await Z(p,{quiet:S}),W=0,z=0,b=0;!S&&M.length>0&&(console.log(""),console.log(l.blue(" Context Audit")),console.log(l.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")));for(let o of M){let m,c;switch(o.status){case "ok":m="\u2713",c=l.green;break;case "warn":m="\u26A0",c=l.yellow,z++;break;case "error":m="\u2717",c=l.red,W++;break;case "advisory":m="\u2139",c=l.cyan,b++;break}if(!S){let v=o.check.padEnd(30);if(console.log(` ${c(m)} ${v} ${c(o.message)}`),o.details&&o.details.length>0){let D=o.details.slice(0,5);for(let q of D)console.log(l.gray(` \u2502 ${q}`));o.details.length>5&&console.log(l.gray(` \u2502 ... and ${o.details.length-5} more`));}o.fix&&console.log(l.gray(` \u2514\u2500 Fix: ${o.fix}`));}}let C=O+W,j=T+z,A=C+j+$===0;if(!S)if(console.log(""),A)console.log(l.green(`\u2728 All checks passed!
7
+ `));else {let o=[];C>0&&o.push(l.red(`${C} error${C>1?"s":""}`)),j>0&&o.push(l.yellow(`${j} warning${j>1?"s":""}`)),$>0&&o.push(l.gray(`${$} missing`)),b>0&&o.push(l.cyan(`${b} advisor${b>1?"ies":"y"}`)),console.log(`${o.join(", ")} found.
8
+ `),console.log(l.gray("Run the suggested commands to fix issues.")),console.log(l.gray(`Troubleshooting guide: .paradigm/docs/troubleshooting.md
9
+ `));}if(!S&&P.explain&&!A)try{let{narrateAllGaps:o}=await import('./gap-narrator-NTXLUI7I.js'),m=[];for(let c of s)c.status!=="ok"&&(c.name===".purpose"||c.name.startsWith("Purpose-required")?m.push({type:"missing-purpose",target:c.name,severity:"improvement"}):c.name===".paradigm/scan-index.json"&&c.status==="warn"?m.push({type:"index-stale",target:c.name,severity:"improvement"}):c.name==="Portal compliance"?m.push({type:"portal-mismatch",target:c.name,severity:c.status==="error"?"blocking":"improvement"}):c.name==="Clarification markers"&&m.push({type:"missing-description",target:c.name,severity:"improvement"}));if(m.length>0){let c=o(m);console.log(l.blue(`
10
+ Gap Narrations (--explain)
11
+ `)),console.log(l.gray(c.narrative)),console.log("");}}catch{}A?N.success("All health checks passed",{total:s.length+M.length}):N.error("Health checks found issues",{errors:C,warnings:j,missing:$,advisories:b});try{let{captureSnapshot:o}=await import('./metrics-UESGUHTA.js');o(p);}catch{}return A}export{rs as a};
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import {a,e,d}from'./chunk-QO7YPQXC.js';import'./chunk-5TAVYPOV.js';import*as u from'fs';import*as m from'path';import {execSync}from'child_process';import n from'chalk';import*as w from'js-yaml';function $(s){return s.match(/(?:^|\s)((?:\/|\.\/|[a-zA-Z0-9_-]+\/)[^\s,;:'"]+\.[a-zA-Z]{1,10})\b/)?.[1]}async function R(s,a$1){try{let r=a(s),d$1=[];try{d$1=execSync("git diff --name-only HEAD",{cwd:s,encoding:"utf8",timeout:5e3}).trim().split(`
3
3
  `).filter(Boolean);}catch{}let l;try{l=execSync("git status --porcelain",{cwd:s,encoding:"utf8",timeout:5e3}).trim()==="";}catch{}let c=m.join(s,"portal.yaml"),f=!1;if(u.existsSync(c))try{let t=u.readFileSync(c,"utf8"),e=w.load(t);f=e?.routes!=null&&Object.keys(e.routes).length>0;}catch{}let i=e({toolsCalled:[],filesModified:d$1,symbolsTouched:[],loreRecorded:!1,hasPortalRoutes:f,taskAddsRoutes:!1,gitClean:l}),o=d(r,a$1,i),g=0;if(o.evaluations.length>0)try{let t=m.join(s,".paradigm","sentinel");if(u.existsSync(t)){let{SentinelStorage:e}=await import('./dist-VGFSP3XM.js'),p=new e(t);for(let b of o.evaluations)p.recordPracticeEvent({habitId:b.habit.id,habitCategory:b.habit.category,result:b.result,engineer:"agent",sessionId:`cli-${Date.now().toString(36)}`,symbolsTouched:[],filesModified:d$1,notes:b.reason}),g++;}}catch{}let h=m.join(s,".paradigm",".habits-blocking");try{if(a$1==="on-stop"&&o.blocksCompletion){let t=o.evaluations.filter(e=>e.result==="skipped"&&e.habit.severity==="block").map(e=>`${e.habit.name}: ${e.reason}`);u.writeFileSync(h,t.join(`
4
- `),"utf8");}else a$1==="on-stop"&&u.existsSync(h)&&u.unlinkSync(h);}catch{}return {trigger:a$1,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:g}}catch{return null}}async function P(s,a){let r=m.join(s,".paradigm","aspect-graph.db");if(!u.existsSync(r))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:d}=await import('./drift-ILZE5BFJ.js'),l="",c=console.log;console.log=f=>{l=f;};try{await d({json:!0,autoHeal:a});}finally{console.log=c;}return l?JSON.parse(l):null}catch{return null}}async function B(s){if(!u.existsSync(m.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:a}=await import('./portal-compliance-JONQ4SOP.js'),r=await a(s);return {status:r.status,declaredButUnusedCount:r.declaredButUnused.length,usedButUndeclaredCount:r.usedButUndeclared.length,properlyDeclaredCount:r.properlyDeclared.length,declaredButUnused:r.declaredButUnused,usedButUndeclared:r.usedButUndeclared,properlyDeclared:r.properlyDeclared,portalError:r.portalError,...r.nearMatches&&r.nearMatches.length>0?{suggestions:r.nearMatches.map(d=>({gate:d.gate,didYouMean:d.didYouMean,distance:d.distance}))}:{}}}catch{return null}}async function j(s){try{let{runPostflightLearning:a}=await import('./ambient-NVKQCW2A.js');return await a(s)}catch{return null}}async function A(s){let a=process.cwd(),r=s.trigger||"on-stop",d=s.autoHeal!==false,l=[],c=[],f=await R(a,r),i=await P(a,d),o=await B(a);if(f?.evaluation.blocksCompletion){let t=f.habits.filter(e=>e.result==="skipped"&&e.severity==="block");for(let e of t){let p=`Blocking habit not satisfied: ${e.name} \u2014 ${e.reason}`;l.push(p),c.push({message:p,source:"habits",file:$(e.reason),severity:"blocking"});}}if(i&&i.driftedCount>0){let t=`${i.driftedCount} aspect anchor(s) have drifted (content genuinely changed). Run paradigm_aspect_check to review.`;l.push(t);for(let e of i.details.filter(p=>p.status==="drifted"))c.push({message:`Aspect ~${e.aspectId} drifted at lines ${e.startLine}-${e.endLine}`,source:"drift",file:e.path,severity:"advisory"});c.filter(e=>e.source==="drift").length===0&&c.push({message:t,source:"drift",severity:"advisory"});}if(o&&o.portalError?.kind==="unparseable"){let e=`portal.yaml unparseable: ${o.portalError.errorClass} \u2014 run 'paradigm doctor' for details`;l.push(e),c.push({message:e,source:"portal",file:"portal.yaml",severity:"blocking"});}else if(o&&o.usedButUndeclaredCount>0){let t=o.usedButUndeclared.filter(e=>e!=="__portal_unparseable__");if(t.length>0){let e=`${t.length} gate(s) used in code but not declared in portal.yaml: ${t.join(", ")}`;l.push(e);for(let p of t)c.push({message:`Gate ^${p} used in code but not declared in portal.yaml`,source:"portal",file:"portal.yaml",severity:"blocking"});}}let g=null;s.learn&&(g=await j(a));let h={habits:f,drift:i,portal:o,violations:l,structuredViolations:c,postflight:s.learn?g:void 0};if(s.json)console.log(JSON.stringify(h));else {if(console.log(n.magenta(`
4
+ `),"utf8");}else a$1==="on-stop"&&u.existsSync(h)&&u.unlinkSync(h);}catch{}return {trigger:a$1,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:g}}catch{return null}}async function P(s,a){let r=m.join(s,".paradigm","aspect-graph.db");if(!u.existsSync(r))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:d}=await import('./drift-ILZE5BFJ.js'),l="",c=console.log;console.log=f=>{l=f;};try{await d({json:!0,autoHeal:a});}finally{console.log=c;}return l?JSON.parse(l):null}catch{return null}}async function B(s){if(!u.existsSync(m.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:a}=await import('./portal-compliance-JONQ4SOP.js'),r=await a(s);return {status:r.status,declaredButUnusedCount:r.declaredButUnused.length,usedButUndeclaredCount:r.usedButUndeclared.length,properlyDeclaredCount:r.properlyDeclared.length,declaredButUnused:r.declaredButUnused,usedButUndeclared:r.usedButUndeclared,properlyDeclared:r.properlyDeclared,portalError:r.portalError,...r.nearMatches&&r.nearMatches.length>0?{suggestions:r.nearMatches.map(d=>({gate:d.gate,didYouMean:d.didYouMean,distance:d.distance}))}:{}}}catch{return null}}async function j(s){try{let{runPostflightLearning:a}=await import('./ambient-AI42BOM5.js');return await a(s)}catch{return null}}async function A(s){let a=process.cwd(),r=s.trigger||"on-stop",d=s.autoHeal!==false,l=[],c=[],f=await R(a,r),i=await P(a,d),o=await B(a);if(f?.evaluation.blocksCompletion){let t=f.habits.filter(e=>e.result==="skipped"&&e.severity==="block");for(let e of t){let p=`Blocking habit not satisfied: ${e.name} \u2014 ${e.reason}`;l.push(p),c.push({message:p,source:"habits",file:$(e.reason),severity:"blocking"});}}if(i&&i.driftedCount>0){let t=`${i.driftedCount} aspect anchor(s) have drifted (content genuinely changed). Run paradigm_aspect_check to review.`;l.push(t);for(let e of i.details.filter(p=>p.status==="drifted"))c.push({message:`Aspect ~${e.aspectId} drifted at lines ${e.startLine}-${e.endLine}`,source:"drift",file:e.path,severity:"advisory"});c.filter(e=>e.source==="drift").length===0&&c.push({message:t,source:"drift",severity:"advisory"});}if(o&&o.portalError?.kind==="unparseable"){let e=`portal.yaml unparseable: ${o.portalError.errorClass} \u2014 run 'paradigm doctor' for details`;l.push(e),c.push({message:e,source:"portal",file:"portal.yaml",severity:"blocking"});}else if(o&&o.usedButUndeclaredCount>0){let t=o.usedButUndeclared.filter(e=>e!=="__portal_unparseable__");if(t.length>0){let e=`${t.length} gate(s) used in code but not declared in portal.yaml: ${t.join(", ")}`;l.push(e);for(let p of t)c.push({message:`Gate ^${p} used in code but not declared in portal.yaml`,source:"portal",file:"portal.yaml",severity:"blocking"});}}let g=null;s.learn&&(g=await j(a));let h={habits:f,drift:i,portal:o,violations:l,structuredViolations:c,postflight:s.learn?g:void 0};if(s.json)console.log(JSON.stringify(h));else {if(console.log(n.magenta(`
5
5
  Paradigm Compliance Check
6
6
  `)),f){let{evaluation:t}=f,e=t.blocksCompletion?n.red:n.green;console.log(n.white(" Habits:")),console.log(` ${e(`${t.followed} followed, ${t.skipped} skipped, ${t.partial} partial`)}`),t.blockingViolations>0&&console.log(n.red(` ${t.blockingViolations} blocking violation(s)`)),console.log();}if(i&&(console.log(n.white(" Drift:")),i.healedCount>0&&console.log(n.green(` Auto-healed: ${i.healedCount} shifted anchor(s)`)),i.cleanCount>0&&console.log(n.green(` Clean: ${i.cleanCount} anchor(s)`)),i.driftedCount>0&&console.log(n.red(` Drifted: ${i.driftedCount} anchor(s)`)),i.missingCount>0&&console.log(n.yellow(` Missing: ${i.missingCount} anchor file(s)`)),console.log()),o){console.log(n.white(" Portal:"));let t=o.status==="compliant"?n.green:o.status==="warnings"?n.yellow:n.red;console.log(` Status: ${t(o.status)}`),o.usedButUndeclaredCount>0&&console.log(n.red(` ${o.usedButUndeclaredCount} undeclared gate(s)`)),console.log();}if(g){if(console.log(n.white(" Postflight Learning:")),g.journalsWritten>0){console.log(n.green(` Journals written: ${g.journalsWritten}`));for(let[t,e]of Object.entries(g.journalsByAgent))e>0&&console.log(n.gray(` ${t}: ${e} entries`));}else console.log(n.gray(" No verdicts to learn from"));g.promoted>0&&console.log(n.green(` Promoted to notebooks: ${g.promoted}`)),console.log();}if(l.length>0){console.log(n.red(` ${l.length} violation(s):`));for(let t of l)console.log(n.red(` - ${t}`));}else console.log(n.green(" All checks passed."));console.log();}l.length>0&&(process.exitCode=1);}export{A as complianceCheckCommand};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {b}from'./chunk-6SKSV5B2.js';import'./chunk-TYWB5IQJ.js';import'./chunk-WESTEMIM.js';import'./chunk-FYDRENK7.js';import'./chunk-IZSBGW6E.js';import'./chunk-AO7ZSRME.js';import'./chunk-EKZDFEJW.js';import'./chunk-LPBCQM5Y.js';import'./chunk-LWAIVOSF.js';import'./chunk-JIXHEBGK.js';import'./chunk-ZJQY5PPP.js';import'./chunk-5TAVYPOV.js';import*as i from'fs';import*as a from'path';import o from'chalk';async function D(l,f,t){let d=f?a.resolve(f):process.cwd();if(!l){t.json?console.log(JSON.stringify({error:"Orchestration ID required"})):(console.log(o.red(`
2
+ import {b}from'./chunk-IOVHF4SR.js';import'./chunk-TYWB5IQJ.js';import'./chunk-AMLD7IYC.js';import'./chunk-FYDRENK7.js';import'./chunk-HXGYVS2N.js';import'./chunk-TQOT2LBO.js';import'./chunk-EKZDFEJW.js';import'./chunk-LPBCQM5Y.js';import'./chunk-LWAIVOSF.js';import'./chunk-JIXHEBGK.js';import'./chunk-ZJQY5PPP.js';import'./chunk-5TAVYPOV.js';import*as i from'fs';import*as a from'path';import o from'chalk';async function D(l,f,t){let d=f?a.resolve(f):process.cwd();if(!l){t.json?console.log(JSON.stringify({error:"Orchestration ID required"})):(console.log(o.red(`
3
3
  Orchestration ID required.`)),console.log(o.gray(`Usage: paradigm team diff <orchestration-id>
4
4
  `)));return}let e=new b(d).getOrchestration(l);if(!e){t.json?console.log(JSON.stringify({error:"Orchestration not found",id:l})):console.log(o.red(`
5
5
  Orchestration not found: ${l}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {a,d,e,f,g,b}from'./chunk-BFD3GFRK.js';import'./chunk-5TAVYPOV.js';import n from'chalk';import*as t from'fs';import*as o from'path';import {fileURLToPath}from'url';async function C(c){let s=process.cwd(),e=parseInt(c.port||"3850",10),p=c.open!==false;console.log(n.cyan(`
3
3
  Starting Paradigm Docs...
4
- `));try{let{startPlatformServer:i}=await import('./platform-server-UD45NTGV.js');await i({projectDir:s,port:e,open:p,sections:["overview","docs"]}),console.log(n.green(` Docs running at ${n.bold(`http://localhost:${e}`)}`)),console.log(n.gray(` Press Ctrl+C to stop
4
+ `));try{let{startPlatformServer:i}=await import('./platform-server-ANOALDPL.js');await i({projectDir:s,port:e,open:p,sections:["overview","docs"]}),console.log(n.green(` Docs running at ${n.bold(`http://localhost:${e}`)}`)),console.log(n.gray(` Press Ctrl+C to stop
5
5
  `)),await new Promise(()=>{});}catch(i){i.code==="EADDRINUSE"?(console.error(n.red(`
6
6
  Error: Port ${e} is already in use.`)),console.log(n.gray(` Try: paradigm docs serve --port ${e+1}
7
7
  `))):console.error(n.red(`
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export{a as doctorCommand}from'./chunk-XQLO5URP.js';import'./chunk-YNDPSWOE.js';import'./chunk-VIG5LSGZ.js';import'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-3DZK54RU.js';import'./chunk-5TAVYPOV.js';
2
+ export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-DBEWOKD6.js';import'./chunk-5TAVYPOV.js';