@a-company/paradigm 7.1.0 → 7.3.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/dist/{accept-orchestration-WMGFGYDK.js → accept-orchestration-JA3A3TSU.js} +1 -1
- package/dist/add-CBDU23S2.js +12 -0
- package/dist/{aggregate-KZICPVT3.js → aggregate-H7SB2UYT.js} +1 -1
- package/dist/{ambient-HAXPDIWK.js → ambient-TFLZFV5Y.js} +1 -1
- package/dist/ambient-VCTUHHIG.js +2 -0
- package/dist/arch-loader-YVOS3QRY.js +2 -0
- package/dist/{beacon-52EWNZPK.js → beacon-WVN264OT.js} +1 -1
- package/dist/calibrate-SH6PRZFD.js +2 -0
- package/dist/calibration-aggregate-5IVXSBDP.js +2 -0
- package/dist/calibration-aggregate-DUEE3LL2.js +4 -0
- package/dist/captain-ILBN2IKJ.js +2 -0
- package/dist/captain-J4FZ5PRU.js +2 -0
- package/dist/{chunk-QDP4G53M.js → chunk-27EK3OQZ.js} +4 -4
- package/dist/{chunk-KP5VOYAH.js → chunk-3F4QP2Z5.js} +1 -1
- package/dist/{chunk-VPNJL4LS.js → chunk-5VR7FKS5.js} +1 -1
- package/dist/{chunk-S3UVQ5RV.js → chunk-6VZSOQ7Y.js} +1 -1
- package/dist/chunk-7BZPDOOQ.js +25 -0
- package/dist/{chunk-YQK3XU63.js → chunk-7HUPVOAY.js} +12 -12
- package/dist/chunk-A5EEY6NO.js +3 -0
- package/dist/{chunk-4GC35IFF.js → chunk-D6BSCELB.js} +1 -1
- package/dist/{chunk-G6DK3ND3.js → chunk-DH7QVZDI.js} +9 -0
- package/dist/chunk-FG3M6VVO.js +30 -0
- package/dist/chunk-FNYYQNJY.js +2 -0
- package/dist/{chunk-RDWWSQGH.js → chunk-IBKCMLOW.js} +14 -14
- package/dist/chunk-K6TLYNRQ.js +7 -0
- package/dist/{chunk-W4BW7GXA.js → chunk-KA6QEI3C.js} +1 -1
- package/dist/chunk-L3AOKDMU.js +93 -0
- package/dist/chunk-M7JHVVDW.js +6 -0
- package/dist/chunk-MBKTVQS2.js +2 -0
- package/dist/chunk-NFN5UUJB.js +2 -0
- package/dist/chunk-O4ADSTSY.js +504 -0
- package/dist/chunk-RPGSQQTS.js +2 -0
- package/dist/chunk-RQHZUPLO.js +4 -0
- package/dist/chunk-SD3KVW5Q.js +2 -0
- package/dist/chunk-VKVVIN6J.js +25 -0
- package/dist/chunk-VOPJ47QY.js +2 -0
- package/dist/chunk-VR2LLUYE.js +17 -0
- package/dist/chunk-WMTES556.js +2 -0
- package/dist/chunk-XBK244QR.js +6 -0
- package/dist/{chunk-MBSY57RN.js → chunk-Y76OIMDO.js} +1 -1
- package/dist/{chunk-EG22HDXI.js → chunk-YNFF7XHV.js} +12 -12
- package/dist/chunk-YYRP7FLC.js +2 -0
- package/dist/{compliance-4P3EE5OA.js → compliance-3M6COUCO.js} +3 -3
- package/dist/{constellation-RHZAEFV7.js → constellation-TIKNCZWR.js} +1 -1
- package/dist/{cost-24UZSS2P.js → cost-VTHZQKO4.js} +2 -2
- package/dist/{diff-VBVIUNL5.js → diff-NZSJW3V3.js} +1 -1
- package/dist/dist-6TDAY6TQ-HMSTBL57.js +39 -0
- package/dist/{dist-TNE4GFT7.js → dist-PW5YPGFF.js} +1 -1
- package/dist/{docs-NTP6UENF.js → docs-DWU3T2BV.js} +1 -1
- package/dist/github-GI3HX3N5.js +4 -0
- package/dist/{habits-BX2IRSUI.js → habits-UA7YT3CG.js} +3 -3
- package/dist/{hooks-AXBWYJ5V.js → hooks-XXJ7CSGJ.js} +1 -1
- package/dist/index.js +9 -9
- package/dist/{init-F4MSKZIW.js → init-QPMLEQWQ.js} +1 -1
- package/dist/{integrity-7TKX3DZ4.js → integrity-FRGF5BFS.js} +1 -1
- package/dist/lint-Y4P3MHBV.js +26 -0
- package/dist/list-5XRLWD7K.js +12 -0
- package/dist/mcp.js +1 -1
- package/dist/{migrate-5M4KUQ2L.js → migrate-LIVXILOO.js} +1 -1
- package/dist/nomination-engine-EFXDEPZN.js +2 -0
- package/dist/{orchestrate-MLUGQOEJ.js → orchestrate-C7SI4J7C.js} +1 -1
- package/dist/orchestration-4MJKBSGM.js +2 -0
- package/dist/orchestration-S2ESNKSA.js +2 -0
- package/dist/platform-server-IOWHNS7Q.js +25 -0
- package/dist/{probe-27ARJKRO.js → probe-G3TKOJYW.js} +1 -1
- package/dist/quiz-QKIKAVL7.js +10 -0
- package/dist/registry-NEW4OJ44.js +2 -0
- package/dist/{reindex-ZLDQBFUR.js → reindex-G2JLIGOQ.js} +1 -1
- package/dist/reindex-JR3PXYQE.js +2 -0
- package/dist/remember-KZYAY77S.js +14 -0
- package/dist/{review-BRO2UP4M.js → review-WHRNLW2W.js} +1 -1
- package/dist/{ripple-KCVDS3WE.js → ripple-B6U7263T.js} +1 -1
- package/dist/{sentinel-EFPEX246.js → sentinel-RIEQWALQ.js} +1 -1
- package/dist/{sentinel-bridge-UR2MKARY.js → sentinel-bridge-D4LFDFCH.js} +1 -1
- package/dist/{serve-2PKJP65E.js → serve-6RNZYK2I.js} +2 -2
- package/dist/serve-PWAFVYYC.js +9 -0
- package/dist/{server-4D77LCST.js → server-K7G3IHR3.js} +1 -1
- package/dist/{setup-5V2AGLQ6.js → setup-L5OP24US.js} +3 -3
- package/dist/{shift-PM4GI736.js → shift-HGXZ5THV.js} +3 -3
- package/dist/{show-N5LGB5B2.js → show-VXNGIJE4.js} +3 -3
- package/dist/{snapshot-YMX5QRBM.js → snapshot-MT5L6XE4.js} +1 -1
- package/dist/status-45KIG32R.js +6 -0
- package/dist/{status-3GJXI4IK.js → status-4QGKLOP6.js} +4 -4
- package/dist/{summary-RPU2BS3Q.js → summary-6QNVQZJV.js} +1 -1
- package/dist/symphony-KQJ6HIXB.js +53 -0
- package/dist/symphony-VDNDFK7H.js +2 -0
- package/dist/symphony-relay-ASMKPDEE.js +3 -0
- package/dist/sync-layer-C2PF273N.js +2 -0
- package/dist/task-PRLQ4VPK.js +3 -0
- package/dist/task-loader-EIXPKHA3.js +2 -0
- package/dist/task-loader-LFEE6OU7.js +2 -0
- package/dist/task-settlement-A2T6EACG.js +3 -0
- package/dist/task-settlement-ZXOY4YGX.js +3 -0
- package/dist/team-KP4HMUB5.js +2 -0
- package/dist/thread-2A7QKU72.js +41 -0
- package/dist/tools-NOMEIBS7.js +2 -0
- package/dist/tools-YW3Q27UI.js +142 -0
- package/dist/validate-OZTX3FYX.js +13 -0
- package/dist/validate-RIMSY3RP.js +9 -0
- package/dist/{workspace-6POCBPDY.js → workspace-4D4TQ637.js} +1 -1
- package/package.json +2 -6
- package/platform-ui/dist/assets/{AmbientSection-CwatqcBD.js → AmbientSection-xoxr3DQg.js} +1 -1
- package/platform-ui/dist/assets/{DocsSection-BZ2SFJBZ.js → DocsSection-Us2qksna.js} +1 -1
- package/platform-ui/dist/assets/{GitSection-MNNYU1tO.js → GitSection-DIHZyadf.js} +1 -1
- package/platform-ui/dist/assets/{GraphSection-COYjb4Pt.js → GraphSection-9TO0L1IO.js} +1 -1
- package/platform-ui/dist/assets/{LoreSection-B0hUbfsJ.js → LoreSection-DVDit8Aw.js} +1 -1
- package/platform-ui/dist/assets/{SentinelSection-BCxW1DCp.js → SentinelSection-a5_VNYcx.js} +1 -1
- package/platform-ui/dist/assets/{SymphonySection-BsucZRqy.js → SymphonySection-cRHEoJ9t.js} +1 -1
- package/platform-ui/dist/assets/TasksSection-44_gDO3L.css +1 -0
- package/platform-ui/dist/assets/TasksSection-h8x3qRIj.js +1 -0
- package/platform-ui/dist/assets/{TeamSection-C0QNTudW.js → TeamSection-mFoDyNic.js} +1 -1
- package/platform-ui/dist/assets/{UniversitySection-DN1-g9pw.js → UniversitySection-D99YRjmC.js} +1 -1
- package/platform-ui/dist/assets/{index-DwUT8pju.js → index-D_wB2S_2.js} +11 -11
- package/platform-ui/dist/index.html +1 -1
- package/dist/add-V6XR7DU5.js +0 -12
- package/dist/agent-loader-Z753DQWH.js +0 -2
- package/dist/ambient-QB7V4TBR.js +0 -6
- package/dist/calibrate-PHVP7RPH.js +0 -4
- package/dist/captain-3COP6YTD.js +0 -2
- package/dist/chunk-4CGPLLWQ.js +0 -30
- package/dist/chunk-7SWEOPWF.js +0 -2
- package/dist/chunk-CHSU6LTR.js +0 -2
- package/dist/chunk-EKNLG73M.js +0 -6
- package/dist/chunk-H55W26AR.js +0 -3
- package/dist/chunk-HE2NA5QF.js +0 -8
- package/dist/chunk-JIXHEBGK.js +0 -7
- package/dist/chunk-MBPLJKE5.js +0 -3
- package/dist/chunk-OIYJUU6T.js +0 -25
- package/dist/chunk-QO7YPQXC.js +0 -2
- package/dist/chunk-XMAV5AG6.js +0 -2
- package/dist/chunk-XPPFILCM.js +0 -2
- package/dist/chunk-YCDOA5IQ.js +0 -18
- package/dist/dist-GQ42YS5N-4HIJZVBB.js +0 -39
- package/dist/lint-IGKE6UPS.js +0 -26
- package/dist/list-NC3QGT75.js +0 -12
- package/dist/lore-loader-HAZ5FRLP.js +0 -2
- package/dist/lore-server-FC2GMDLT.js +0 -14
- package/dist/nomination-engine-ORHH4L2W.js +0 -2
- package/dist/orchestration-O2OVPTIZ.js +0 -2
- package/dist/platform-server-Y6TLEXR2.js +0 -25
- package/dist/quiz-TNV6APBM.js +0 -10
- package/dist/remember-MJRNTXYS.js +0 -14
- package/dist/serve-L52ZUTU6.js +0 -10
- package/dist/serve-XZ6GBUS3.js +0 -8
- package/dist/session-work-log-FF7CKMWP.js +0 -2
- package/dist/status-ENAI35NL.js +0 -6
- package/dist/symphony-CFAYJGLF.js +0 -2
- package/dist/symphony-L56O5ZG3.js +0 -53
- package/dist/symphony-relay-Y2UR3YNR.js +0 -3
- package/dist/task-loader-H7HQAYGL.js +0 -2
- package/dist/task-loader-YZME4RKE.js +0 -2
- package/dist/task-settlement-HINBVZBE.js +0 -3
- package/dist/task-settlement-XC6E6JNT.js +0 -3
- package/dist/team-25LK6CWM.js +0 -2
- package/dist/thread-HFXK65D4.js +0 -41
- package/dist/tools-GAU5WOEI.js +0 -2
- package/dist/validate-IQG7DBFC.js +0 -9
- package/dist/validate-LSCDOLBO.js +0 -13
- package/dist/work-log-loader-CRVTOMVB.js +0 -2
- package/graph-ui/dist/assets/index-BlgXTl53.css +0 -1
- package/graph-ui/dist/assets/index-Bq5nXK8p.js +0 -63
- package/graph-ui/dist/index.html +0 -13
- package/lore-ui/dist/assets/index-C3EixkjW.css +0 -1
- package/lore-ui/dist/assets/index-DKhNxgtW.js +0 -56
- package/lore-ui/dist/index.html +0 -13
- package/platform-ui/dist/assets/CanvasSection-dFAthehN.js +0 -9
- package/platform-ui/dist/assets/CanvasSection-flMXU19z.css +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b,c as c$
|
|
2
|
+
import {b,c as c$1}from'./chunk-W7C6FFMO.js';import'./chunk-4TXOVRWD.js';import {g}from'./chunk-D6BSCELB.js';import {d as d$2}from'./chunk-K6TLYNRQ.js';import'./chunk-ZJQY5PPP.js';import {d as d$1,b as b$1,a}from'./chunk-VIG5LSGZ.js';import'./chunk-5TAVYPOV.js';import*as n from'fs';import*as c from'path';import*as D from'readline';import e from'chalk';function x(){return D.createInterface({input:process.stdin,output:process.stdout})}async function d(s,r){return new Promise(t=>{s.question(r,o=>{t(o.trim());});})}async function p(s,r,t){console.log(`
|
|
3
3
|
${e.cyan(r)}`),t.forEach((i,u)=>{console.log(e.gray(` ${u+1}) `)+i.name);});let o=await d(s,e.white(`Enter number (1-${t.length}): `)),a=parseInt(o,10)-1;return a>=0&&a<t.length?t[a].value:t[0].value}async function k(s,r,t){return console.log(`
|
|
4
4
|
${e.cyan(r)}`),t.forEach((i,u)=>{console.log(e.gray(` ${u+1}) `)+i.name);}),(await d(s,e.white("Enter numbers separated by commas (e.g., 1,2,3): "))).split(",").map(i=>parseInt(i.trim(),10)-1).filter(i=>i>=0&&i<t.length).map(i=>t[i].value)}function A(s){let r={};for(let t of ["src","app","lib","packages"])if(n.existsSync(c.join(s,t))){r.sourceDir=t;break}if(r.sourceDir){let t=c.join(s,r.sourceDir);try{let o=n.readdirSync(t,{withFileTypes:!0});r.directories=o.filter(a=>a.isDirectory()).map(a=>a.name).filter(a=>!a.startsWith(".")&&!a.startsWith("_"));}catch{}}return r}function I(s,r){let t={version:"1.0","agent-guidelines":{overview:`${r} uses Paradigm for structured AI context management.`,"how-to-use":["Check .purpose files in directories before making changes","Run `paradigm status` to see all symbols in the project","Run `paradigm visualize` to explore the Dreamscape","Reference symbols using @ # $ % ~ ^ ! ? prefixes"],"update-rules":["When adding a feature, create/update the nearest .purpose file","When adding authorization, update portal.yaml","When exploring ideas, add to .premise with ? prefix","Run `paradigm cursorrules` after updating .paradigm"]},"symbol-system":a,states:{},"purpose-required":[],conventions:b$1};if(t.states||(t.states={}),s.hasAuth&&s.hasAuth!=="none"&&(t.states.user={authenticated:{type:"boolean",default:false,description:"User is logged in"},role:{type:"enum",values:["guest","user","admin"],description:"User access level"}},s.hasAuth==="session"&&(t.states.user.sessionExpiry={type:"string",description:"Session expiration time"})),s.hasSubscription&&s.hasSubscription!=="none"&&(t.states.user||(t.states.user={}),s.hasSubscription==="tiers"?t.states.user.subscription={type:"enum",values:["free","trial","pro","enterprise"],description:"Subscription tier"}:t.states.user.isPremium={type:"boolean",default:false,description:"Has premium access"}),s.hasGates==="yes"&&t["agent-guidelines"]["how-to-use"].push("Check portal.yaml for authorization rules before modifying access control"),s.directories&&s.directories.length>0&&s.sourceDir&&(t["purpose-required"]=s.directories.map(o=>({pattern:`${s.sourceDir}/${o}/*`,depth:1}))),s.customStates){let o=s.customStates.split(",").map(a=>a.trim()).filter(Boolean);for(let a of o){let i=a.split(".");if(i.length>=2){let u=i[0],g=i.slice(1).join(".");t.states[u]||(t.states[u]={}),t.states[u][g]={type:"boolean",description:`Custom state: ${a}`};}}}return t}async function j(s){let r=x(),t={};console.log(e.blue(`
|
|
5
5
|
\u{1F305} Paradigm Setup Wizard
|
|
@@ -18,12 +18,12 @@ ${e.cyan(r)}`),t.forEach((i,u)=>{console.log(e.gray(` ${u+1}) `)+i.name);}),(aw
|
|
|
18
18
|
`)+e.white("> ")),console.log(e.gray(`
|
|
19
19
|
\u2500`.repeat(55))),console.log(e.white(`
|
|
20
20
|
\u{1F916} Cursor Integration
|
|
21
|
-
`)),c$
|
|
21
|
+
`)),c$1(s)?t.cursorMode=await p(r,"A .cursorrules file exists. How should we handle it?",[{name:"Append Paradigm section to existing file",value:"append"},{name:"Replace with new .cursorrules",value:"create"},{name:"Skip - do not modify .cursorrules",value:"skip"}]):t.cursorMode=await p(r,"Generate a .cursorrules file for Cursor AI?",[{name:"Yes - create .cursorrules with Paradigm context",value:"create"},{name:"No - skip Cursor integration",value:"skip"}]),r.close(),t}async function W(s,r){let t=s?c.resolve(s):process.cwd(),o=c.basename(t),a=c.join(t,".paradigm");if(n.existsSync(a)&&!r.force){console.log(e.yellow(`
|
|
22
22
|
\u26A0\uFE0F .paradigm already exists in this directory.`)),console.log(e.gray(` Use --force to overwrite, or edit .paradigm directly.
|
|
23
23
|
`));return}let i;r.yes?(i={sourceDir:A(t).sourceDir||"src",directories:["features","components"],hasAuth:"session",hasSubscription:"none",hasGates:"yes",cursorMode:"create"},console.log(e.blue(`
|
|
24
24
|
\u{1F305} Using default configuration...
|
|
25
25
|
`))):i=await j(t);let u=I(i,o);n.writeFileSync(a,d$1(u),"utf8"),console.log(e.green(`
|
|
26
|
-
\u2705 Created .paradigm configuration`));let g$1=c.join(t,".premise");n.existsSync(g$1)||(n.writeFileSync(g$1,g(o),"utf8"),console.log(e.green("\u2705 Created .premise file")));let f=c.join(t,".purpose");n.existsSync(f)||(n.writeFileSync(f,
|
|
26
|
+
\u2705 Created .paradigm configuration`));let g$1=c.join(t,".premise");n.existsSync(g$1)||(n.writeFileSync(g$1,g(o),"utf8"),console.log(e.green("\u2705 Created .premise file")));let f=c.join(t,".purpose");n.existsSync(f)||(n.writeFileSync(f,d$2(),"utf8"),console.log(e.green("\u2705 Created .purpose file")));let h=c.join(t,"portal.yaml");if(i.hasGates==="yes"&&!n.existsSync(h)){let{getDefaultGateConfig:l}=await import('./dist-SE67SOXB.js');n.writeFileSync(h,l(),"utf8"),console.log(e.green("\u2705 Created portal.yaml"));}let m=i.cursorMode||"skip";if(m!=="skip"){let l=b(t,u,m,o);l.success&&l.path&&console.log(e.green(`\u2705 ${l.message}`));}console.log(e.gray(`
|
|
27
27
|
\u2500`.repeat(55))),console.log(e.blue(`
|
|
28
28
|
\u{1F389} Paradigm setup complete!
|
|
29
29
|
`)),console.log(e.white("Files created:")),console.log(e.gray(" \u2022 .paradigm ")+e.white("AI guidelines, symbols, states")),console.log(e.gray(" \u2022 .premise ")+e.white("Project overview & ideas")),console.log(e.gray(" \u2022 .purpose ")+e.white("Root context & features")),i.hasGates==="yes"&&console.log(e.gray(" \u2022 portal.yaml ")+e.white("Authorization topology")),m!=="skip"&&console.log(e.gray(" \u2022 .cursorrules ")+e.white("Cursor AI integration")),console.log(e.white(`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$5,d as d$3,b as b$2,e as e$1,f}from'./chunk-Z72SDTBJ.js';import {
|
|
2
|
+
import {a as a$5,d as d$3,b as b$2,e as e$1,f}from'./chunk-Z72SDTBJ.js';import {b}from'./chunk-KA6QEI3C.js';import'./chunk-YNFF7XHV.js';import'./chunk-TYWB5IQJ.js';import'./chunk-DLMDHS2X.js';import'./chunk-FYDRENK7.js';import'./chunk-ECLUYHAR.js';import {d as d$2}from'./chunk-YXLGVOZO.js';import'./chunk-Y4XFVDZC.js';import {a as a$7}from'./chunk-DH7QVZDI.js';import {d as d$1}from'./chunk-6VZSOQ7Y.js';import {a as a$4,b as b$1}from'./chunk-GE3GQALR.js';import'./chunk-MBKTVQS2.js';import'./chunk-EK4ZRIFJ.js';import {a as a$8}from'./chunk-ZSWXLFN7.js';import'./chunk-EKZDFEJW.js';import {a as a$2}from'./chunk-27EK3OQZ.js';import {b as b$3}from'./chunk-Y76OIMDO.js';import'./chunk-4TXOVRWD.js';import'./chunk-VCKKJDLP.js';import'./chunk-WR6D3SC6.js';import {a as a$3}from'./chunk-UIKLE3WD.js';import {a as a$6}from'./chunk-UZ5H7K6Q.js';import'./chunk-LPBCQM5Y.js';import'./chunk-D6BSCELB.js';import'./chunk-K6TLYNRQ.js';import'./chunk-ZJQY5PPP.js';import'./chunk-YNDPSWOE.js';import'./chunk-VIG5LSGZ.js';import {a as a$1}from'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';import*as a from'fs';import*as ne from'os';import*as d from'path';import e from'chalk';import Se from'ora';import*as h from'js-yaml';import*as C from'fs/promises';var ae=[{path:".paradigm/config.yaml",defaultContent:['version: "2.0"','project: ""','description: ""','initialized: ""'].join(`
|
|
3
3
|
`)+`
|
|
4
4
|
`},{path:".paradigm/agents.yaml",defaultContent:['version: "1.0"',"agents: []"].join(`
|
|
5
5
|
`)+`
|
|
@@ -51,10 +51,10 @@ Generated by paradigm shift.
|
|
|
51
51
|
`)}async function de(o){let n=d.join(o,".purpose");try{let l=await C.readFile(n,"utf-8");if(l.trim().length<se)return {id:"empty-purpose",priority:1,message:"Edit `.purpose` to define your project's features",command:void 0,type:"action"};if(ce.some(f=>l.includes(f)))return {id:"empty-purpose",priority:1,message:"Edit `.purpose` to define your project's features",command:void 0,type:"action"}}catch{return {id:"empty-purpose",priority:1,message:"Edit `.purpose` to define your project's features",command:void 0,type:"action"}}return null}async function pe(o){let n=["src","packages","apps"];for(let r of n){let f=d.join(o,r);if(!a.existsSync(f))continue;if(await te(f))return null}return n.some(r=>a.existsSync(d.join(o,r)))?{id:"no-sub-purpose",priority:2,message:"Add `.purpose` files to feature directories",command:void 0,type:"action"}:null}async function fe(o){let n=d.join(o,"portal.yaml");try{let l=await C.readFile(n,"utf-8"),r=l.includes("gates:")&&!l.match(/gates:\s*(\[\]|\{\})\s*$/m)&&!l.match(/gates:\s*(\[\]|\{\})\s*\n/),f=l.includes("routes:")&&!l.match(/routes:\s*(\[\]|\{\})\s*$/m)&&!l.match(/routes:\s*(\[\]|\{\})\s*\n/);if(!r&&!f)return {id:"empty-portal",priority:3,message:"Define auth gates in `portal.yaml` if your project has auth",command:void 0,type:"action"}}catch{return {id:"empty-portal",priority:3,message:"Define auth gates in `portal.yaml` if your project has auth",command:void 0,type:"action"}}return null}async function me(o){let n=d.join(o,".paradigm","agents.yaml");try{let l=await C.readFile(n,"utf-8");if(l.includes("agents: []")||l.trim().length<40)return {id:"agents-unconfigured",priority:4,message:"Review agent roles",command:"paradigm agent list",type:"action"}}catch{return null}return null}async function ue(o){let n=d.join(o,".paradigm",".pending-scope-reviews");return a.existsSync(n)?{id:"pending-scope-reviews",priority:2,message:"Review agent scopes",command:"paradigm agent review",type:"action"}:null}async function ge(o){let n=d.join(o,".paradigm","config.yaml");try{let l=await C.readFile(n,"utf-8");if(!l.includes("model-resolution"))return null;let r=l.match(/tier-1:\s*(\S+)/),f=l.match(/tier-2:\s*(\S+)/),m=l.match(/tier-3:\s*(\S+)/);if(!r||!f||!m)return null;let i=[r[1].replace(/['"]/g,""),f[1].replace(/['"]/g,""),m[1].replace(/['"]/g,"")];if(Object.values(le).some(S=>S[0]===i[0]&&S[1]===i[1]&&S[2]===i[2]))return {id:"model-tiers-default",priority:5,message:"Fine-tune model tiers",command:"paradigm team models",type:"action"}}catch{return null}return null}async function ye(o){let n=d.join(o,".paradigm","lore","entries");try{if((await C.readdir(n)).filter(f=>!f.startsWith(".")).length===0)return {id:"no-lore",priority:8,message:"Lore records automatically as you work",command:void 0,type:"info"}}catch{return {id:"no-lore",priority:8,message:"Lore records automatically as you work",command:void 0,type:"info"}}return null}async function he(o){let n=d.join(o,".paradigm","notebooks");try{if((await C.readdir(n)).filter(f=>!f.startsWith(".")).length===0)return {id:"no-notebooks",priority:8,message:"Agent notebooks build over time",command:void 0,type:"info"}}catch{return {id:"no-notebooks",priority:8,message:"Agent notebooks build over time",command:void 0,type:"info"}}return null}async function we(){return {id:"verify-not-run",priority:6,message:"Verify setup health",command:"paradigm doctor --verify",type:"action"}}async function te(o,n=0){if(n>4)return false;try{let l=await C.readdir(o,{withFileTypes:!0});for(let r of l)if(!(r.isDirectory()&&["node_modules","dist",".git",".next",".paradigm","build","out","target",".turbo"].includes(r.name))&&(r.name===".purpose"&&!r.isDirectory()||r.isDirectory()&&await te(d.join(o,r.name),n+1)))return !0}catch{a$1.operation("shift-recommendations").debug("Could not read directory",{dir:o});}return false}var oe=new Set(["architect","builder","reviewer","security","advocate","tester","compliance","documentor"]),I={architect:{nickname:"Arky",role:"System design, specifications"},builder:{nickname:"Kit",role:"Implementation, tests"},reviewer:{nickname:"Judge",role:"Code quality, compliance"},security:{nickname:"Aegis",role:"Auth flows, vulnerability scanning"},advocate:{nickname:"Jinx",role:"Stress testing, edge cases"},tester:{nickname:"Probe",role:"Unit and integration tests"},compliance:{nickname:"Rune",role:"Symbol compliance enforcement"},documentor:{nickname:"Scribe",role:".purpose, portal.yaml maintenance"}};function ke(o){let n=[],l=d.join(ne.homedir(),".paradigm","agents");for(let[r,f]of Object.entries(o.agents)){let m,i=r,b=d.join(l,`${r}.agent`);if(a.existsSync(b))try{let v=a.readFileSync(b,"utf8"),E=h.load(v);E?.nickname&&(m=E.nickname),E?.role&&(i=E.role);}catch{}!m&&I[r]&&(m=I[r].nickname,i=I[r].role);let S=f.source==="core"||f.source==="ecosystem"?f.source:oe.has(r)?"core":"ecosystem";n.push({id:r,nickname:m,role:i,source:S});}return n}async function be(o,n,l){if(!a.existsSync(n))return;let r;try{r=h.load(a.readFileSync(n,"utf8"))??{active:[]};}catch{return}let f=Array.isArray(r.active)?r.active:[];if(f.includes("compliance"))return;let{isCohortC:m}=await import('./migration-notices-MRZ6PVDS.js');if(!m(o))return;let i=d.join(o,".paradigm",".compliance-nomination-skipped");if(a.existsSync(i)&&!l.force)return;if(!process.stdin.isTTY||l.prompt===false){try{a.writeFileSync(i,"","utf8");}catch{}return}console.log(""),console.log(e.cyan("Step 2c-nominate/6: Symbol enforcement")),console.log(""),console.log(" This project defines ~aspects but no compliance-archetype agent"),console.log(" (Rune) is on the roster."),console.log(""),console.log(" Without a claimant, paradigm 6.0.4 no longer enforces aspect"),console.log(" coverage. You can:"),console.log(""),console.log(` ${e.green("[Y]")} Add Rune (compliance) to the roster \u2014 recommended`),console.log(" Authority defaults will be written to .paradigm/authority.yaml."),console.log(" Default mode: advise (Rune surfaces findings, never blocks)."),console.log(""),console.log(` ${e.yellow("[N]")} Skip \u2014 opt out of aspect enforcement for this project`),console.log(" This decision is remembered. Re-run with --force to revisit."),console.log("");let S=(await import('readline/promises')).createInterface({input:process.stdin,output:process.stdout}),v="";try{v=(await S.question(" Add Rune to roster? [Y/n]: ")).trim().toLowerCase();}catch{v="";}finally{S.close();}if(v===""||v==="y"||v==="yes"){r.active=[...f,"compliance"].sort();try{a.writeFileSync(n,h.dump(r,{lineWidth:-1,noRefs:!0}),"utf8"),console.log(e.green(" \u2713 Rune (compliance) added to roster"));}catch(R){a$1.operation("shift").debug("Roster update failed",{error:R.message});return}try{let{writeArchetypeDefaults:R}=await import('./authority-GCMPX7RW.js');await R(o,"archetype-default"),console.log(e.gray(" \u2713 Authority defaults written to .paradigm/authority.yaml"));}catch(R){a$1.operation("shift").debug("Authority defaults write failed",{error:R.message});}if(a.existsSync(i))try{a.unlinkSync(i);}catch{}}else {try{a.writeFileSync(i,"","utf8");}catch{}console.log(e.gray(" Skipped \u2014 opt out of aspect enforcement for this project"));}}async function Le(o={}){let n=process.cwd(),l=d.basename(n),r=d.join(n,".paradigm"),f$1=a.existsSync(r)&&a.statSync(r).isDirectory();console.log(e.blue(`
|
|
52
52
|
\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510`)),console.log(e.blue("\u2502")+e.white.bold(" paradigm shift ")+e.blue("\u2502")),console.log(e.blue("\u2502")+e.gray(" Full project setup in one command ")+e.blue("\u2502")),console.log(e.blue(`\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518
|
|
53
53
|
`)),console.log(e.white(` \u{1F4C1} Project: ${e.cyan(l)}`)),console.log(e.white(` \u{1F4CD} Status: ${f$1?e.green("Paradigm detected"):e.yellow("New project")}`)),console.log("");let m=a$1.command("shift").start("Running paradigm shift",{project:l}),i=Se();if(!f$1||o.force){i.start("Step 1/6: Initializing Paradigm...");try{await a$2({force:o.force,quick:!0,name:l,stack:o.stack}),i.succeed(e.green("Paradigm initialized"));}catch(t){i.fail(e.red(`Init failed: ${t.message}`)),m.error("Shift failed at init",{error:t.message});return}}else {i.succeed(e.gray("Step 1/6: Already initialized (use --force to reinit)"));let t=d.join(r,"config.yaml");if(a.existsSync(t))try{let s=a.readFileSync(t,"utf8"),c=h.load(s);if(!c.discipline||c.discipline==="auto"){let p=a$3(n);if(p!=="backend"){let u=s.replace(/^discipline:\s*auto\b.*$/m,`discipline: ${p}`);u!==s&&(a.writeFileSync(t,u,"utf8"),console.log(e.green(` \u2713 Detected discipline: ${e.cyan(p)} (updated config.yaml)`)));}else if(!c.discipline){let u=s.replace(/^(project:\s*.+)$/m,`$1
|
|
54
|
-
discipline: ${p}`);u!==s&&(a.writeFileSync(t,u,"utf8"),console.log(e.green(` \u2713 Added discipline: ${e.cyan(p)} to config.yaml`)));}}}catch(s){a$1.operation("shift").debug("Discipline detection failed",{error:s.message});}}if(f$1){i.start("Step 1b/6: Checking for migrations...");try{let{migrateCommand:t}=await import('./migrate-
|
|
54
|
+
discipline: ${p}`);u!==s&&(a.writeFileSync(t,u,"utf8"),console.log(e.green(` \u2713 Added discipline: ${e.cyan(p)} to config.yaml`)));}}}catch(s){a$1.operation("shift").debug("Discipline detection failed",{error:s.message});}}if(f$1){i.start("Step 1b/6: Checking for migrations...");try{let{migrateCommand:t}=await import('./migrate-LIVXILOO.js');await t({apply:!0,quiet:!0,noSync:!0}),i.succeed(e.green("Migrations applied"));}catch(t){i.warn(e.yellow(`Migration warning: ${t.message}`));}}{let t=d.join(r,"config.yaml");if(o.workspace&&a.existsSync(t)){let s=o.workspacePath?d.resolve(n,o.workspacePath):d.join(d.dirname(n),".paradigm-workspace");if(a.existsSync(s))try{let c=h.load(a.readFileSync(s,"utf8")),p=d.basename(n),u=d.dirname(s),g="./"+d.relative(u,n);if(c.members.some(j=>d.resolve(u,j.path)===n))console.log(e.green(` \u2713 Already a member of workspace: ${e.cyan(c.name)}`));else {let j=d$1(p,n);c.members.push({name:p,path:g,...j&&{role:j}}),a.writeFileSync(s,h.dump(c,{indent:2,lineWidth:120,noRefs:!0,sortKeys:!1,quotingType:'"'}),"utf8"),console.log(e.green(` \u2713 Joined workspace: ${e.cyan(c.name)} (added as member)`));}}catch(c){console.log(e.yellow(` \u26A0 Failed to join workspace: ${c.message}`));}else try{let c=d.basename(n),p=d.dirname(s),u="./"+d.relative(p,n),g=d$1(c,n),y={version:"1.0",name:o.workspace,members:[{name:c,path:u,...g&&{role:g}}]};a.mkdirSync(d.dirname(s),{recursive:!0}),a.writeFileSync(s,h.dump(y,{indent:2,lineWidth:120,noRefs:!0,sortKeys:!1,quotingType:'"'}),"utf8"),console.log(e.green(` \u2713 Created workspace: ${e.cyan(o.workspace)} at ${e.gray(d.relative(n,s))}`));}catch(c){console.log(e.yellow(` \u26A0 Failed to create workspace: ${c.message}`));}try{let c=a.readFileSync(t,"utf8"),p=h.load(c),u=d.relative(n,s);if(p.workspace!==u){if(p.workspace){let g=c.replace(/^workspace:\s*.*$/m,`workspace: "${u}"`);a.writeFileSync(t,g,"utf8");}else {let g=c.trimEnd()+`
|
|
55
55
|
workspace: "${u}"
|
|
56
56
|
`;a.writeFileSync(t,g,"utf8");}console.log(e.green(" \u2713 Linked workspace in config.yaml"));}}catch(c){a$1.operation("shift").debug("Workspace config link failed",{error:c.message});}}else if(a.existsSync(t))try{let s=a.readFileSync(t,"utf8");if(!h.load(s).workspace){let p=d.dirname(n);for(let u=0;u<3;u++){let g=d.join(p,".paradigm-workspace");if(a.existsSync(g)){let j=d.relative(n,g),re=s.trimEnd()+`
|
|
57
57
|
workspace: "${j}"
|
|
58
58
|
`;a.writeFileSync(t,re,"utf8"),console.log(e.green(` \u2713 Found workspace: ${e.cyan(j)} (added to config.yaml)`));break}let y=d.dirname(p);if(y===p)break;p=y;}}}catch(s){a$1.operation("shift").debug("Workspace auto-detect failed",{error:s.message});}}if(!d$2(n)||o.force){console.log(e.cyan(" Step 2/6: Initializing team configuration..."));try{await b(n,{force:o.force,json:!1,configureModels:o.configureModels||!1,noConfigureModels:!o.configureModels}),console.log(e.green(` \u2713 Team configuration initialized
|
|
59
59
|
`));}catch(t){console.log(e.yellow(` \u26A0 Team init warning: ${t.message}
|
|
60
|
-
`));}}else i.succeed(e.gray("Step 2/6: Team already configured (use --force to reinit)"));if(o.force){let t=d.join(n,".paradigm",".compliance-nomination-skipped");if(a.existsSync(t))try{a.unlinkSync(t);}catch{}}let S=d.join(n,".paradigm","roster.yaml");if(!a.existsSync(S)||o.force)try{let t=a$4(n),s=b$1[t]||b$1.generic,c={version:"1.0",project:l,type:t,active:s.sort()};a.writeFileSync(S,h.dump(c,{lineWidth:-1,noRefs:!0}),"utf8"),console.log(e.green(` \u2713 Agent roster set: ${e.cyan(s.length)} agents for ${e.cyan(t)}`));}catch(t){a$1.operation("shift").debug("Roster setup failed",{error:t.message});}else try{let s=h.load(a.readFileSync(S,"utf8"))?.active?.length??0;console.log(e.gray(` \u2713 Agent roster exists (${s} agents active)`));}catch{console.log(e.gray(" \u2713 Agent roster exists"));}await be(n,S,o);{let t=d.join(n,".paradigm","adoptions.yaml"),s=a.existsSync(t);try{let c=a$4(n),p=s?await a$5(n):null,u=p&&Object.keys(p.agents).length>0;if(!u&&a.existsSync(S))p=await d$3(n),await b$2(n,p),a$1.operation("shift").debug("Migrated roster to adoptions",{count:Object.keys(p.agents).length});else if(!u){p=e$1(c);let g=a.existsSync(S)?h.load(a.readFileSync(S,"utf8")):{active:[]},y=new Date().toISOString();for(let j of g.active||[])p.agents[j]={adopted:y,source:oe.has(j)?"core":"ecosystem",defaultsAccepted:!0};Object.keys(p.agents).length>0&&await b$2(n,p);}if(p&&Object.keys(p.agents).length>0){let g=ke(p),y=f(g,c);console.log(y),console.log(e.green(` \u2713 ${Object.keys(p.agents).length} agents adopted`));}if(p&&p.agents.compliance){let g=d.join(n,".paradigm","authority.yaml");if(!a.existsSync(g))try{let{writeArchetypeDefaults:y}=await import('./authority-GCMPX7RW.js');await y(n,"archetype-default"),a$1.operation("shift").debug("Wrote archetype-default authority.yaml",{source:"default-adoption"});}catch(y){a$1.operation("shift").debug("Authority defaults write failed",{error:y.message});}}}catch(c){a$1.operation("shift").debug("Adoption ceremony failed",{error:c.message});}}{let t=d.join(r,"config.yaml");if(a.existsSync(t))try{let s=a.readFileSync(t,"utf8"),c=h.load(s);if(!c["model-resolution"]||o.force){let{ModelDiscovery:p}=await import('./model-discovery-HMB3YI4L.js'),g=new p(n).detectEnvironment(),y;g==="claude-code"?y={"tier-1":"opus","tier-2":"sonnet","tier-3":"haiku"}:g==="cursor"?y={"tier-1":"sonnet","tier-2":"sonnet","tier-3":"haiku"}:y={"tier-1":"sonnet","tier-2":"sonnet","tier-3":"sonnet"},c["model-resolution"]=y,a.writeFileSync(t,h.dump(c,{lineWidth:-1,noRefs:!0}),"utf8"),console.log(e.green(` \u2713 Model tiers configured for ${e.cyan(g)}: tier-1=${y["tier-1"]}, tier-2=${y["tier-2"]}, tier-3=${y["tier-3"]}`));}}catch(s){a$1.operation("shift").debug("Model tier config failed",{error:s.message});}}try{let{ensureEnforcementDefaults:t}=await import('./enforcement-VRE3WZOI.js');t(n)&&(console.log(e.green(` \u2713 Enforcement config initialized (${e.cyan("none")} preset)`)),console.log(e.dim(" Enforcement: none \u2014 symbol tracking available when you're ready. Rune will guide you.")));}catch(t){a$1.operation("shift").debug("Enforcement config setup failed",{error:t.message});}{i.start("Ensuring core files...");try{let{created:t,existed:s}=await Q(n);i.succeed(e.green(`Core files ensured: ${e.cyan(String(t.length))} created, ${e.cyan(String(s.length))} already existed`));}catch(t){i.warn(e.yellow(`Guaranteed files warning: ${t.message}`));}}if(o.quick)i.succeed(e.gray("Step 3/6: Skipped scan (--quick mode)"));else {i.start("Step 3/6: Scanning and indexing symbols...");try{await b$3(n,{quiet:!0}),i.succeed(e.green("Symbols indexed"));}catch(t){i.warn(e.yellow(`Scan warning: ${t.message}`));}}{let t=d.join(r,"config.yaml");if(a.existsSync(t))try{if(h.load(a.readFileSync(t,"utf8")).workspace){i.start("Step 3b/6: Reindexing workspace members...");try{let{workspaceReindexCommand:c}=await import('./workspace-
|
|
60
|
+
`));}}else i.succeed(e.gray("Step 2/6: Team already configured (use --force to reinit)"));if(o.force){let t=d.join(n,".paradigm",".compliance-nomination-skipped");if(a.existsSync(t))try{a.unlinkSync(t);}catch{}}let S=d.join(n,".paradigm","roster.yaml");if(!a.existsSync(S)||o.force)try{let t=a$4(n),s=b$1[t]||b$1.generic,c={version:"1.0",project:l,type:t,active:s.sort()};a.writeFileSync(S,h.dump(c,{lineWidth:-1,noRefs:!0}),"utf8"),console.log(e.green(` \u2713 Agent roster set: ${e.cyan(s.length)} agents for ${e.cyan(t)}`));}catch(t){a$1.operation("shift").debug("Roster setup failed",{error:t.message});}else try{let s=h.load(a.readFileSync(S,"utf8"))?.active?.length??0;console.log(e.gray(` \u2713 Agent roster exists (${s} agents active)`));}catch{console.log(e.gray(" \u2713 Agent roster exists"));}await be(n,S,o);{let t=d.join(n,".paradigm","adoptions.yaml"),s=a.existsSync(t);try{let c=a$4(n),p=s?await a$5(n):null,u=p&&Object.keys(p.agents).length>0;if(!u&&a.existsSync(S))p=await d$3(n),await b$2(n,p),a$1.operation("shift").debug("Migrated roster to adoptions",{count:Object.keys(p.agents).length});else if(!u){p=e$1(c);let g=a.existsSync(S)?h.load(a.readFileSync(S,"utf8")):{active:[]},y=new Date().toISOString();for(let j of g.active||[])p.agents[j]={adopted:y,source:oe.has(j)?"core":"ecosystem",defaultsAccepted:!0};Object.keys(p.agents).length>0&&await b$2(n,p);}if(p&&Object.keys(p.agents).length>0){let g=ke(p),y=f(g,c);console.log(y),console.log(e.green(` \u2713 ${Object.keys(p.agents).length} agents adopted`));}if(p&&p.agents.compliance){let g=d.join(n,".paradigm","authority.yaml");if(!a.existsSync(g))try{let{writeArchetypeDefaults:y}=await import('./authority-GCMPX7RW.js');await y(n,"archetype-default"),a$1.operation("shift").debug("Wrote archetype-default authority.yaml",{source:"default-adoption"});}catch(y){a$1.operation("shift").debug("Authority defaults write failed",{error:y.message});}}}catch(c){a$1.operation("shift").debug("Adoption ceremony failed",{error:c.message});}}{let t=d.join(r,"config.yaml");if(a.existsSync(t))try{let s=a.readFileSync(t,"utf8"),c=h.load(s);if(!c["model-resolution"]||o.force){let{ModelDiscovery:p}=await import('./model-discovery-HMB3YI4L.js'),g=new p(n).detectEnvironment(),y;g==="claude-code"?y={"tier-1":"opus","tier-2":"sonnet","tier-3":"haiku"}:g==="cursor"?y={"tier-1":"sonnet","tier-2":"sonnet","tier-3":"haiku"}:y={"tier-1":"sonnet","tier-2":"sonnet","tier-3":"sonnet"},c["model-resolution"]=y,a.writeFileSync(t,h.dump(c,{lineWidth:-1,noRefs:!0}),"utf8"),console.log(e.green(` \u2713 Model tiers configured for ${e.cyan(g)}: tier-1=${y["tier-1"]}, tier-2=${y["tier-2"]}, tier-3=${y["tier-3"]}`));}}catch(s){a$1.operation("shift").debug("Model tier config failed",{error:s.message});}}try{let{ensureEnforcementDefaults:t}=await import('./enforcement-VRE3WZOI.js');t(n)&&(console.log(e.green(` \u2713 Enforcement config initialized (${e.cyan("none")} preset)`)),console.log(e.dim(" Enforcement: none \u2014 symbol tracking available when you're ready. Rune will guide you.")));}catch(t){a$1.operation("shift").debug("Enforcement config setup failed",{error:t.message});}{i.start("Ensuring core files...");try{let{created:t,existed:s}=await Q(n);i.succeed(e.green(`Core files ensured: ${e.cyan(String(t.length))} created, ${e.cyan(String(s.length))} already existed`));}catch(t){i.warn(e.yellow(`Guaranteed files warning: ${t.message}`));}}if(o.quick)i.succeed(e.gray("Step 3/6: Skipped scan (--quick mode)"));else {i.start("Step 3/6: Scanning and indexing symbols...");try{await b$3(n,{quiet:!0}),i.succeed(e.green("Symbols indexed"));}catch(t){i.warn(e.yellow(`Scan warning: ${t.message}`));}}{let t=d.join(r,"config.yaml");if(a.existsSync(t))try{if(h.load(a.readFileSync(t,"utf8")).workspace){i.start("Step 3b/6: Reindexing workspace members...");try{let{workspaceReindexCommand:c}=await import('./workspace-4D4TQ637.js');await c({quiet:!0}),i.succeed(e.green("Workspace members reindexed"));}catch(c){i.warn(e.yellow(`Workspace reindex: ${c.message}`));}}}catch(s){a$1.operation("shift").debug("Workspace config read failed",{error:s.message});}}let v=d.join(n,"portal.yaml");a.existsSync(v)||a.writeFileSync(v,h.dump({version:"1.0.0",gates:{},routes:{}},{lineWidth:-1,noRefs:true}),"utf8");let E=d.join(n,".paradigm","lore");a.existsSync(E)||a.mkdirSync(E,{recursive:true});let R=d.join(n,".paradigm","university");for(let t of ["content/notes","content/policies","content/quizzes","content/paths","diplomas"]){let s=d.join(R,t);a.existsSync(s)||a.mkdirSync(s,{recursive:true});}let N=d.join(R,"config.yaml");if(!a.existsSync(N)){let t="Project";try{let c=d.join(n,".paradigm","config.yaml");if(a.existsSync(c)){let p=h.load(a.readFileSync(c,"utf8"));p.project&&typeof p.project=="string"&&(t=p.project);}}catch{}let s={branding:{name:`${t} University`,tagline:`Learn the ${t} codebase`,institution:t},theme:{primary:"#6366f1",secondary:"#8b5cf6",accent:"#f59e0b",background:"#0f172a",surface:"#1e293b",text:"#f8fafc",textMuted:"#94a3b8",success:"#22c55e",error:"#ef4444",font:"Inter, system-ui, sans-serif"},content:{categories:[],defaultDifficulty:"beginner",requireApproval:false},diplomas:{includeGlobalPLSAT:true}};a.writeFileSync(N,h.dump(s,{lineWidth:-1,noRefs:true}),"utf8");}i.start("Step 4/6: Syncing IDE configurations...");try{let t=o.ide?[o.ide]:["claude","cursor","copilot","windsurf","agents"],s=[];for(let c of t)try{await a$6(c,{quiet:!0,force:!0}),s.push(c);}catch{}s.length>0?i.succeed(e.green(`IDE configs synced: ${s.join(", ")}`)):i.warn(e.yellow("No IDE configs to sync"));}catch(t){i.warn(e.yellow(`Sync warning: ${t.message}`));}i.start("Step 5/6: Installing hooks...");try{await a$7({force:o.force}),i.succeed(e.green("Hooks installed (git + Claude Code + Cursor)"));}catch(t){i.warn(e.yellow(`Hooks warning: ${t.message}`));}if(o.verify){i.start("Step 6/6: Running health checks...");try{await a$8({quiet:!0})?i.succeed(e.green("All health checks passed")):i.warn(e.yellow("Some health checks need attention"));}catch(t){i.warn(e.yellow(`Doctor warning: ${t.message}`));}}else i.succeed(e.gray("Step 6/6: Skipped verify (use --verify to check health)"));console.log(""),console.log(e.blue("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")),console.log(e.blue("\u2502")+e.white.bold(" \u2728 Paradigm shift complete! ")+e.blue("\u2502")),console.log(e.blue("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")),console.log(""),console.log(e.white(" Created/Updated:")),console.log(e.gray(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));let O=[{path:".paradigm/config.yaml",desc:"Project configuration"},{path:".paradigm/navigator.yaml",desc:"Symbol navigation map"},{path:".paradigm/agents.yaml",desc:"Team agent configuration"},{path:".paradigm/adoptions.yaml",desc:"Agent adoption records"},{path:".purpose",desc:"Root feature definitions"},{path:".paradigm/lore/",desc:"Project lore timeline",isDir:true},{path:"portal.yaml",desc:"Authorization gates"},{path:".paradigm/roster.yaml",desc:"Agent roster for this project"},{path:"CLAUDE.md",desc:"Claude Code AI instructions"},{path:"AGENTS.md",desc:"Universal AI agent instructions"},{path:".cursor/rules/",desc:"Cursor AI instructions",isDir:true},{path:".claude/hooks/",desc:"Claude Code enforcement hooks",isDir:true,optional:true},{path:".cursor/hooks/",desc:"Cursor enforcement hooks",isDir:true,optional:true}],W=d.join(r,"config.yaml");if(a.existsSync(W))try{let t=h.load(a.readFileSync(W,"utf8"));if(typeof t.workspace=="string"){let s=d.resolve(n,t.workspace),c=d.relative(n,s);O.push({path:c,desc:"Multi-project workspace",optional:!0});}}catch(t){a$1.operation("shift").debug("Summary config read failed",{error:t.message});}for(let t of O){let s=d.join(n,t.path);a.existsSync(s)?console.log(e.green(" \u2713 ")+e.white(t.path.padEnd(28))+e.gray(t.desc)):t.optional||console.log(e.yellow(" \u25CB ")+e.gray(t.path.padEnd(28))+e.gray(`(${t.desc})`));}try{let t=await Z(n),s=ee(t);s&&console.log(s);}catch(t){a$1.operation("shift").debug("Recommendations engine failed",{error:t.message}),console.log(""),console.log(e.white(" Next steps:")),console.log(e.gray(" "+"\u2500".repeat(49))),console.log(e.white(" 1. ")+e.gray("Edit ")+e.cyan(".purpose")+e.gray(" to define your features")),console.log(e.white(" 2. ")+e.gray("Run ")+e.cyan("paradigm shift --verify")+e.gray(" to check health")),console.log("");}try{let{captureSnapshot:t,seedMetricsConsent:s}=await import('./metrics-UESGUHTA.js');s(n),t(n);}catch(t){a$1.operation("shift").debug("metrics snapshot failed",{error:t.message});}m.success("Paradigm shift complete",{project:l});}export{be as runComplianceNominationStep,Le as shiftCommand};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
${e.frontmatter.title}`)),console.log(o.gray(` ${e.frontmatter.type} \xB7 ${e.frontmatter.difficulty} \xB7 ${e.frontmatter.author}`)),e.frontmatter.tags.length>0&&console.log(o.gray(` Tags: ${e.frontmatter.tags.join(", ")}`)),e.frontmatter.symbols.length>0&&console.log(o.gray(` Symbols: ${e.frontmatter.symbols.join(", ")}`)),console.log(),console.log(e.body),console.log();return}let n=
|
|
4
|
-
${n.title}`)),console.log(o.gray(` quiz \xB7 ${n.difficulty} \xB7 ${n.questions.length} questions \xB7 pass: ${n.passThreshold*100}%`)),n.description&&console.log(o.gray(` ${n.description}`)),console.log();for(let t of n.questions){console.log(` ${o.cyan(t.id)}: ${t.question}`);for(let[c,d]of Object.entries(t.choices)){let k=c===t.correct?o.green("*"):" ";console.log(` ${k} ${c}: ${d}`);}t.explanation&&console.log(o.gray(` \u2192 ${t.explanation}`)),console.log();}return}let r=
|
|
2
|
+
import {c,d}from'./chunk-YYRP7FLC.js';import {h,j,l}from'./chunk-M7JHVVDW.js';import'./chunk-5TAVYPOV.js';import o from'chalk';function O(l){let s=l.indexOf(":");return s===-1?{entryId:l}:{packId:l.slice(0,s),entryId:l.slice(s+1)}}async function I(l$1,s){let i=process.cwd(),{packId:p,entryId:a}=O(l$1),g={...s};p&&(g.pack=p);let u=c(i,g),f=d(g)?u.subPackRoot??u.packRoot:void 0,e=h(i,a,f);if(e){if(s.json){console.log(JSON.stringify({...e.frontmatter,body:e.body},null,2));return}console.log(o.blue(`
|
|
3
|
+
${e.frontmatter.title}`)),console.log(o.gray(` ${e.frontmatter.type} \xB7 ${e.frontmatter.difficulty} \xB7 ${e.frontmatter.author}`)),e.frontmatter.tags.length>0&&console.log(o.gray(` Tags: ${e.frontmatter.tags.join(", ")}`)),e.frontmatter.symbols.length>0&&console.log(o.gray(` Symbols: ${e.frontmatter.symbols.join(", ")}`)),console.log(),console.log(e.body),console.log();return}let n=j(i,a,f);if(n){if(s.json){console.log(JSON.stringify(n,null,2));return}console.log(o.blue(`
|
|
4
|
+
${n.title}`)),console.log(o.gray(` quiz \xB7 ${n.difficulty} \xB7 ${n.questions.length} questions \xB7 pass: ${n.passThreshold*100}%`)),n.description&&console.log(o.gray(` ${n.description}`)),console.log();for(let t of n.questions){console.log(` ${o.cyan(t.id)}: ${t.question}`);for(let[c,d]of Object.entries(t.choices)){let k=c===t.correct?o.green("*"):" ";console.log(` ${k} ${c}: ${d}`);}t.explanation&&console.log(o.gray(` \u2192 ${t.explanation}`)),console.log();}return}let r=l(i,a,f);if(r){if(s.json){console.log(JSON.stringify(r,null,2));return}console.log(o.blue(`
|
|
5
5
|
${r.title}`)),console.log(o.gray(` learning path \xB7 ${r.steps.length} steps \xB7 ${r.ordered?"ordered":"unordered"}`)),r.description&&console.log(o.gray(` ${r.description}`)),console.log();for(let t=0;t<r.steps.length;t++){let c=r.steps[t],d=c.required?o.red("required"):o.gray("optional");console.log(` ${t+1}. ${o.cyan(c.content)} (${d})`),c.note&&console.log(o.gray(` ${c.note}`));}console.log();return}console.error(o.red(`
|
|
6
6
|
Content "${l$1}" not found
|
|
7
7
|
`)),process.exit(1);}export{I as universityShowCommand};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {c,k,f as f$1}from'./chunk-
|
|
2
|
+
import {c,k,f as f$1}from'./chunk-D6BSCELB.js';import'./chunk-K6TLYNRQ.js';import'./chunk-ZJQY5PPP.js';import'./chunk-5TAVYPOV.js';import*as n from'fs';import*as f from'path';import o from'chalk';import y from'ora';async function w(t,r){let m=process.cwd(),i=f.join(m,".premise");console.log(o.blue(`
|
|
3
3
|
\u{1F4F8} Creating Snapshot...
|
|
4
4
|
`));let e=y("Loading .premise file...").start();try{n.existsSync(i)||(e.fail(".premise file not found"),console.log(o.yellow(`
|
|
5
5
|
Run "paradigm init" first to create a .premise file
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {c,d,f}from'./chunk-YYRP7FLC.js';import {g,n}from'./chunk-M7JHVVDW.js';import'./chunk-5TAVYPOV.js';import t from'chalk';async function C(d$1){let g$1=process.cwd(),n$1=c(g$1,d$1),f$1=d(d$1)?n$1.subPackRoot??n$1.packRoot:void 0,c$1=f$1?f(f$1):g(g$1);if(!c$1||c$1.totalContent===0){console.log(t.yellow(`
|
|
3
|
+
No university content found.`)),console.log(t.gray(` Create content with: paradigm university add note --title "My Note"
|
|
4
|
+
`));return}let s=n(g$1),a={},l={},i={};for(let o of c$1.entries){a[o.type]=(a[o.type]||0)+1,o.difficulty&&(i[o.difficulty]=(i[o.difficulty]||0)+1);for(let e of o.tags)l[e]=(l[e]||0)+1;}if(d$1.json){console.log(JSON.stringify({pack:n$1.subPackId??n$1.packId,totalContent:c$1.totalContent,typeCounts:a,difficultyCounts:i,tagCounts:l,diplomaCount:s.length},null,2));return}console.log(t.blue(`
|
|
5
|
+
University Status \u2014 pack: ${n$1.subPackId??n$1.packId}
|
|
6
|
+
`)),console.log(t.white(` Total content: ${c$1.totalContent}`));for(let[o,e]of Object.entries(a).sort())console.log(` ${t.cyan(o)}: ${e}`);if(Object.keys(i).length>0){console.log(),console.log(t.white(" By difficulty:"));for(let[o,e]of Object.entries(i)){let r=o==="advanced"?t.red:o==="intermediate"?t.yellow:t.green;console.log(` ${r(o)}: ${e}`);}}if(Object.keys(l).length>0){console.log(),console.log(t.white(" Top tags:"));let o=Object.entries(l).sort((e,r)=>r[1]-e[1]).slice(0,8);for(let[e,r]of o)console.log(` ${t.gray(e)}: ${r}`);}if(console.log(),console.log(t.white(` Diplomas earned: ${s.length}`)),s.length>0){for(let o of s.slice(0,5)){let e=o.passed?t.green("PASS"):t.red("FAIL");console.log(` ${e} ${o.source} \u2014 ${o.student} (${o.percentage}%) ${t.gray(o.earnedAt.slice(0,10))}`);}s.length>5&&console.log(t.gray(` ... and ${s.length-5} more`));}console.log();}export{C as universityStatusCommand};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {m,o as o$1,B}from'./chunk-
|
|
2
|
+
import {m,o as o$1,B}from'./chunk-D6BSCELB.js';import {f}from'./chunk-K6TLYNRQ.js';import {e}from'./chunk-ZJQY5PPP.js';import {a as a$1}from'./chunk-LKAT7IAK.js';import'./chunk-5TAVYPOV.js';import*as l from'fs';import*as a from'path';import o from'chalk';import G from'ora';async function D(){let t=process.cwd();console.log(o.blue(`
|
|
3
3
|
\u{1F4CA} Paradigm Status
|
|
4
|
-
`)),console.log(o.gray("\u2500".repeat(40)));let i=a$1.command("status").start("Getting project status"),r=G("Scanning project...").start(),p=l.existsSync(a.join(t,".premise")),m$1=l.existsSync(a.join(t,".purpose")),f=l.existsSync(a.join(t,"portal.yaml"));r.stop(),console.log(o.white(`
|
|
5
|
-
Configuration Files`)),console.log(o.gray("\u2500".repeat(40))),console.log(` .premise: ${p?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),console.log(` .purpose: ${m$1?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),console.log(` portal.yaml: ${f?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),r.start("Counting files...");let u=await
|
|
6
|
-
Source Files`)),console.log(o.gray("\u2500".repeat(40))),console.log(` Purpose files: ${o.cyan(u.length.toString())}`),console.log(` Gate files: ${o.cyan(y.length.toString())}`),p||m$1||f){r.start("Aggregating symbols...");try{let e=await m(t),b=o$1(e),s=B(b);r.stop(),console.log(o.white(`
|
|
4
|
+
`)),console.log(o.gray("\u2500".repeat(40)));let i=a$1.command("status").start("Getting project status"),r=G("Scanning project...").start(),p=l.existsSync(a.join(t,".premise")),m$1=l.existsSync(a.join(t,".purpose")),f$1=l.existsSync(a.join(t,"portal.yaml"));r.stop(),console.log(o.white(`
|
|
5
|
+
Configuration Files`)),console.log(o.gray("\u2500".repeat(40))),console.log(` .premise: ${p?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),console.log(` .purpose: ${m$1?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),console.log(` portal.yaml: ${f$1?o.green("\u2713 Found"):o.yellow("\u25CB Not found")}`),r.start("Counting files...");let u=await f(t),y=await e(t);if(r.stop(),console.log(o.white(`
|
|
6
|
+
Source Files`)),console.log(o.gray("\u2500".repeat(40))),console.log(` Purpose files: ${o.cyan(u.length.toString())}`),console.log(` Gate files: ${o.cyan(y.length.toString())}`),p||m$1||f$1){r.start("Aggregating symbols...");try{let e=await m(t),b=o$1(e),s=B(b);r.stop(),console.log(o.white(`
|
|
7
7
|
Symbol Index`)),console.log(o.gray("\u2500".repeat(40)));let j=[{prefix:"#",name:"Components",count:s.component,color:o.green},{prefix:"$",name:"Flows",count:s.flow,color:o.yellow},{prefix:"^",name:"Gates",count:s.gate,color:o.red},{prefix:"!",name:"Signals",count:s.signal,color:o.cyan},{prefix:"~",name:"Aspects",count:s.aspect,color:o.magenta}];for(let{prefix:n,name:c,count:h,color:C}of j)h>0&&console.log(` ${C(n)} ${c.padEnd(12)} ${o.cyan(h.toString())}`);let d=Object.values(s).reduce((n,c)=>n+c,0);if(console.log(o.gray("\u2500".repeat(40))),console.log(` Total: ${o.cyan(d.toString())}`),i.success("Status retrieved",{symbols:d,files:u.length+y.length}),e.errors.length>0){console.log(o.white(`
|
|
8
8
|
Warnings`)),console.log(o.gray("\u2500".repeat(40)));for(let n of e.errors)console.log(o.yellow(` \u26A0 ${n.source}: ${n.message}`));a$1.command("status").warn("Aggregation had errors",{count:e.errors.length});}}catch(e){r.fail("Failed to aggregate"),i.error("Status failed",{error:e.message}),console.log(o.red(` Error: ${e.message}`));}}console.log("");}export{D as statusCommand};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {m}from'./chunk-
|
|
2
|
+
import {m}from'./chunk-D6BSCELB.js';import'./chunk-K6TLYNRQ.js';import'./chunk-ZJQY5PPP.js';import {c as c$1,a}from'./chunk-YNDPSWOE.js';import'./chunk-VIG5LSGZ.js';import'./chunk-5TAVYPOV.js';import*as n from'fs';import*as c from'path';import o from'chalk';import S from'ora';async function F(){let p=process.cwd(),x=c.basename(p),l=S();console.log(o.blue(`
|
|
3
3
|
\u{1F4CA} Paradigm Summary
|
|
4
4
|
`));let r=c.join(p,".paradigm");(!n.existsSync(r)||!n.statSync(r).isDirectory())&&(console.log(o.red("\u274C No .paradigm/ directory found.")),console.log(o.gray(" Run `paradigm init` first.\n")),process.exit(1)),l.start("Aggregating symbols...");let m$1;try{m$1=await m(p),l.succeed(`Found ${m$1.symbols.length} symbols`);}catch(e){l.fail(o.red("Failed to aggregate symbols")),console.error(o.gray(e.message)),process.exit(1);}let u={components:{count:0,examples:[]},flows:{count:0,examples:[]},gates:{count:0,examples:[]},signals:{count:0,examples:[]},aspects:{count:0,examples:[]}};for(let e of m$1.symbols){let t=e.type,i=t==="component"?"components":t==="flow"?"flows":t==="gate"?"gates":t==="signal"?"signals":t==="aspect"?"aspects":null;i&&u[i]&&(u[i].count++,u[i].examples.length<3&&u[i].examples.push(e.symbol));}let a$1=[];n.existsSync(c.join(r,"config.yaml"))?a$1.push({check:"Config",status:"ok"}):a$1.push({check:"Config",status:"missing"});let k=["logger.md","probe.md","symbols.md"].every(e=>n.existsSync(c.join(r,"specs",e)));a$1.push({check:"Specs",status:k?"ok":"warn"});let j=n.existsSync(c.join(r,"docs"));a$1.push({check:"Docs",status:j?"ok":"warn"});let g=c$1(p);if(g.detected){let e=a(g.detected);e&&n.existsSync(c.join(p,e.outputPath))?a$1.push({check:`IDE (${g.detected})`,status:"ok"}):a$1.push({check:`IDE (${g.detected})`,status:"warn"});}let w=n.existsSync(c.join(r,"scan-index.json"))||n.existsSync(c.join(p,".paradigm-scan-index.json"));a$1.push({check:"Scan index",status:w?"ok":"missing"});let s=[];s.push(`# Project: ${x}`),s.push(""),s.push(`**Generated:** ${new Date().toISOString()}`),s.push("**Paradigm Version:** 0.2.0"),s.push(""),s.push("## Symbol Counts"),s.push(""),s.push("| Type | Count | Examples |"),s.push("|------|-------|----------|");for(let[e,t]of Object.entries(u))if(t.count>0){let i=t.examples.join(", ");s.push(`| ${e} | ${t.count} | ${i} |`);}s.push(""),s.push("## Source Files"),s.push(""),s.push(`- Purpose files: ${m$1.purposeFiles.length}`),s.push(`- Gate files: ${m$1.portalFiles.length}`),s.push(""),s.push("## Health Status"),s.push("");for(let e of a$1){let t=e.status==="ok"?"\u2713":e.status==="warn"?"\u26A0":"\u25CB";s.push(`- ${t} ${e.check}`);}s.push(""),s.push("---"),s.push("*Generated by `paradigm summary`*");let h=c.join(r,"project.md");l.start("Writing project.md...");try{n.writeFileSync(h,s.join(`
|
|
5
5
|
`),"utf8"),l.succeed(o.green("project.md generated"));}catch(e){l.fail(o.red("Failed to write project.md")),console.error(o.gray(e.message)),process.exit(1);}console.log(o.gray(`
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {j,r,q as q$1,n,i,k,l,E,v,m,C,I,J,o,D,z,B,H,G,N,K as K$1,Q as Q$1,L,O,P}from'./chunk-ZUAUFZRJ.js';import'./chunk-3KVVC4WV.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';import e from'chalk';import*as b from'path';import*as p from'fs';import*as q from'os';async function te(s){let o=process.cwd();if(s.remote){await Y(o,s.remote);return}let r$1=j(o);console.log(e.green(`\u2713 Joined as ${e.bold(r$1.id)}`));let i=r().filter(l=>l.id!==r$1.id);if(i.length>0){console.log(e.cyan(`
|
|
3
|
+
Found ${i.length} other session${i.length!==1?"s":""}:`));for(let l of i){let t=q$1(l)?e.yellow("asleep"):e.green("awake");console.log(` ${e.white(l.id)} \u2014 ${l.name} [${t}]`);}}else console.log(e.gray(`
|
|
4
|
+
No other sessions found. Open another terminal and run "paradigm symphony join".`));console.log(e.gray(`
|
|
5
|
+
Tip: Set up polling with: /loop 10s paradigm_symphony_poll`));}async function Y(s,o){let{SymphonyRelay:r}=await import('./symphony-relay-ASMKPDEE.js'),n$1,i;if(o.includes("#")){let c=o.split("#");n$1=c[0],i=c[1];}else n$1=o;n$1.includes(":")||(n$1=`${n$1}:3939`);let l=n(s);l||(l=j(s));let t;if(i)t=i,console.log(e.cyan(`
|
|
6
|
+
Connecting to ${n$1} with embedded pairing code...`));else if(console.log(e.cyan(`
|
|
7
|
+
Connecting to ${n$1}...`)),console.log(e.white(" Enter the 6-digit pairing code shown on the host:")),t=await K(" Code: "),t=t.trim(),!/^\d{6}$/.test(t)){console.log(e.red(" Invalid code. Must be 6 digits."));return}let a=new r({mode:"client",peerId:l.id,events:{onPeerConnected:(c,g)=>{console.log(e.green(` \u2713 Connected to ${e.bold(g)} (${c})`));},onPeerDisconnected:c=>{console.log(e.yellow(` Peer ${c} disconnected. Reconnecting...`));},onMessageRelayed:(c,g,y)=>{console.log(e.gray(` \u2190 Message ${c.slice(0,8)} from ${g} \u2192 ${y}`));},onError:c=>{console.log(e.red(` Error: ${c.message}`));}}});try{await a.connectToServer(n$1,t),console.log(e.green(`
|
|
8
|
+
\u2713 Paired and connected!`)),console.log(e.gray(" Messages from remote agents will appear in your inbox.")),console.log(e.gray(` Press Ctrl+C to disconnect.
|
|
9
|
+
`)),process.on("SIGINT",()=>{console.log(e.yellow(`
|
|
10
|
+
Disconnecting...`)),a.stop(),process.exit(0);}),await new Promise(()=>{});}catch(c){console.log(e.red(` Failed to connect: ${c.message}`)),a.stop();}}function K(s){return new Promise(o=>{process.stdout.write(s);let r="";process.stdin.setEncoding("utf-8"),process.stdin.resume(),process.stdin.once("data",n=>{r=n.toString(),process.stdin.pause(),o(r);});})}async function se(){let s=process.cwd(),o=i(s),r=k(o);console.log(r?e.green(`\u2713 Left the score: ${o}`):e.yellow("No active part found for this project."));}async function re(){let s=process.cwd(),o=n(s);if(!o){console.log(e.yellow('Not joined. Run "paradigm symphony join" first.'));return}let n$1=l().filter(t=>t.id!==o.id),i=E("active"),l$1=v(o.id);console.log(e.cyan(`
|
|
11
|
+
${e.bold(o.id)}`)),console.log(e.gray(` Project: ${o.project}`)),console.log(e.gray(` Role: ${o.role}`)),console.log(e.gray(` PID: ${o.pid}`)),console.log(e.gray(` Started: ${o.startedAt}`)),o.statusBlurb&&console.log(e.white(` Status: ${o.statusBlurb}`)),console.log(`
|
|
12
|
+
${e.white(`${n$1.length} linked peer${n$1.length!==1?"s":""}`)} \u2014 ${e.white(`${i.length} active thread${i.length!==1?"s":""}`)} \u2014 ${e.white(`${l$1.length} unread`)}`);}async function ie(s){m();let o=l(),{loadPeers:r}=await import('./symphony-peers-X5NGWXFP.js'),n=r(),i=[];for(let t of n)if(!t.revoked)for(let a of t.agents||[])i.push({...a,peerId:t.id});let l$1=o.length+i.length;if(s.json){console.log(JSON.stringify({local:o,remote:i},null,2));return}if(l$1===0){console.log(e.yellow('No agents joined. Run "paradigm symphony join" in each terminal.'));return}console.log(e.cyan(`
|
|
13
|
+
Symphony Agents (${l$1})
|
|
14
|
+
`)),console.log(e.gray(` ${"AGENT ID".padEnd(30)} ${"PROJECT".padEnd(15)} ${"ROLE".padEnd(10)} STATUS`)),console.log(e.gray(` ${"\u2500".repeat(30)} ${"\u2500".repeat(15)} ${"\u2500".repeat(10)} ${"\u2500".repeat(8)}`));for(let t of o){let a=q$1(t)?e.yellow("asleep"):e.green("awake");console.log(` ${e.white(t.id.padEnd(30))} ${t.project.padEnd(15)} ${t.role.padEnd(10)} ${a}`),t.statusBlurb&&console.log(` ${e.gray(` \u2514 ${t.statusBlurb}`)}`);}if(i.length>0){console.log(e.gray(`
|
|
15
|
+
${"\u2500".repeat(65)}`)),console.log(e.cyan(` Remote Agents (${i.length})
|
|
16
|
+
`));for(let t of i){let a=t.status==="awake"?e.green("awake"):e.yellow("asleep"),c=e.magenta(`(remote: ${t.peerId})`);console.log(` ${e.white(t.id.padEnd(30))} ${t.project.padEnd(15)} ${t.role.padEnd(10)} ${a} ${c}`);}}console.log();}async function le(s,o){let r=process.cwd(),n$1=n(r);n$1||(n$1=j(r),console.log(e.gray(`Auto-joined as ${n$1.id}`)));let i={id:n$1.id,name:n$1.name,type:"human",project:n$1.project,role:n$1.role},l;o.to&&(l=[{id:o.to,name:o.to,type:"agent"}]);let t=o.thread;if(!t){let g=s.length>60?s.slice(0,60)+"...":s;t=C(g,i).id;}let a=I({sender:i,recipients:l,intent:"context",text:s,threadRoot:t}),c=J(a);console.log(e.green(`\u2713 Sent to ${c} agent${c!==1?"s":""}`)),console.log(e.gray(` Thread: ${t}`)),console.log(e.gray(` Note: ${a.id}`));}async function ce(){let s=process.cwd(),o$1=n(s);if(!o$1){console.log(e.yellow('Not joined. Run "paradigm symphony join" first.'));return}o(o$1.id);let r=v(o$1.id);if(r.length===0){console.log(e.gray(`
|
|
17
|
+
No unread notes.
|
|
18
|
+
`));return}let n$1=new Map;for(let l of r){let t=l.threadRoot||"direct";n$1.has(t)||n$1.set(t,[]),n$1.get(t).push(l);}console.log(e.cyan(`
|
|
19
|
+
${r.length} unread note${r.length!==1?"s":""}
|
|
20
|
+
`));for(let[l,t]of n$1){let a=l;if(l!=="direct"){let c=D(l);c&&(a=`${c.topic} (${l})`);}console.log(e.white(` \u250C\u2500 ${a}`));for(let c=0;c<t.length;c++){let g=t[c],y=c===t.length-1,d=y?" \u2514\u2500":" \u251C\u2500",h=new Date(g.timestamp).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});console.log(`${d} ${e.cyan(g.sender.name)} ${e.gray(`[${g.intent}]`)} ${e.gray(h)}`);let u=g.content.text.split(`
|
|
21
|
+
`),m=y?" ":" \u2502 ";for(let $ of u)console.log(`${m}${$}`);g.symbols.length>0&&console.log(`${m}${e.gray(`Symbols: ${g.symbols.join(", ")}`)}`);}console.log();}let i=r[r.length-1].id;z(o$1.id,i),B(o$1.id);}async function ae(s){let o=E();if(s.json){console.log(JSON.stringify(o,null,2));return}if(o.length===0){console.log(e.gray(`
|
|
22
|
+
No threads.
|
|
23
|
+
`));return}console.log(e.cyan(`
|
|
24
|
+
Threads (${o.length})
|
|
25
|
+
`)),console.log(e.gray(` ${"ID".padEnd(14)} ${"TOPIC".padEnd(35)} ${"MSGS".padEnd(6)} ${"STATUS".padEnd(10)} LAST ACTIVITY`)),console.log(e.gray(` ${"\u2500".repeat(14)} ${"\u2500".repeat(35)} ${"\u2500".repeat(6)} ${"\u2500".repeat(10)} ${"\u2500".repeat(20)}`));for(let r of o){let n=r.topic.length>33?r.topic.slice(0,33)+"..":r.topic,i=r.status==="active"?e.green("active"):e.gray("resolved"),l=new Date(r.lastActivity).toLocaleString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});console.log(` ${e.white(r.id.padEnd(14))} ${n.padEnd(35)} ${String(r.messageCount).padEnd(6)} ${i.padEnd(10)} ${e.gray(l)}`);}console.log();}async function ge(s){let o=D(s);if(!o){console.log(e.red(`Thread not found: ${s}`));return}let r=H(s);console.log(e.cyan(`
|
|
26
|
+
Thread: ${o.topic}`)),console.log(e.gray(` ID: ${o.id} | Status: ${o.status} | Notes: ${o.messageCount}`)),console.log(e.gray(` Participants: ${o.participants.map(n=>n.name).join(", ")}`)),o.decision&&console.log(e.green(` Decision: ${o.decision}`)),console.log(e.gray(`
|
|
27
|
+
${"\u2500".repeat(60)}
|
|
28
|
+
`));for(let n of r){let i=new Date(n.timestamp).toLocaleString(void 0,{month:"short",day:"numeric",hour:"numeric",minute:"2-digit"});console.log(` ${e.cyan(n.sender.name)} ${e.gray(`[${n.intent}]`)} ${e.gray(i)}`);let l=n.content.text.split(`
|
|
29
|
+
`);for(let t of l)console.log(` ${t}`);n.symbols.length>0&&console.log(` ${e.gray(`Symbols: ${n.symbols.join(", ")}`)}`),n.content.decision&&console.log(` ${e.green(`Decision: ${n.content.decision}`)}`),console.log();}}async function de(s,o){let r=D(s);if(!r){console.log(e.red(`Thread not found: ${s}`));return}G(s,o.decision)?(console.log(e.green(`\u2713 Thread resolved: ${r.topic}`)),o.decision&&console.log(e.gray(` Decision: ${o.decision}`)),console.log(e.gray(` Tip: Record this as lore with "paradigm lore record --title 'Thread: ${r.topic}'"`))):console.log(e.red("Failed to resolve thread."));}async function ye(s){m();let o=process.cwd(),r=n(o),n$1=l(),i=E("active"),l$1=N("pending"),t=r?v(r.id):[],{loadPeers:a}=await import('./symphony-peers-X5NGWXFP.js'),g=a().filter(d=>!d.revoked);if(s.json){console.log(JSON.stringify({identity:r?{id:r.id,project:r.project,role:r.role}:null,agents:n$1.map(d=>({id:d.id,status:q$1(d)?"asleep":"awake",statusBlurb:d.statusBlurb})),peers:g.map(d=>({id:d.id,address:d.address,agents:d.agents?.length??0,lastSeen:d.lastSeen})),activeThreads:i.length,unreadMessages:t.length,pendingFileRequests:l$1.length},null,2));return}console.log(e.cyan(`
|
|
30
|
+
Symphony Status
|
|
31
|
+
`)),console.log(r?` ${e.white("Identity:")} ${r.id}`:` ${e.yellow("Not joined.")} Run "paradigm symphony join" to join.`);let y=n$1.filter(d=>!q$1(d)).length;console.log(` ${e.white("Agents:")} ${n$1.length} joined (${y} awake)`);for(let d of n$1){let h=q$1(d)?e.yellow("asleep"):e.green("awake"),u=d.statusBlurb?e.gray(` \u2014 ${d.statusBlurb}`):"";console.log(` ${e.white(d.id)} [${h}]${u}`);}if(g.length>0){let d=g.reduce((h,u)=>h+(u.agents?.length??0),0);console.log(` ${e.white("Peers:")} ${g.length} connected (${d} remote agents)`);for(let h of g){let u=h.agents?.length??0;console.log(` ${e.white(h.id)} at ${h.address} (${u} agent${u!==1?"s":""})`);}}else console.log(` ${e.white("Peers:")} ${e.gray('none (run "paradigm symphony serve" to accept connections)')}`);console.log(` ${e.white("Threads:")} ${i.length} active`),console.log(` ${e.white("Unread:")} ${t.length} note${t.length!==1?"s":""}`),console.log(` ${e.white("File Requests:")} ${l$1.length} pending`),console.log();}async function pe(s){let o=parseInt(s.port||"3939",10),r=process.cwd(),{SymphonyRelay:n$1}=await import('./symphony-relay-ASMKPDEE.js'),i=n(r);i||(i=j(r)),console.log(e.cyan(`
|
|
32
|
+
Starting Symphony relay server...
|
|
33
|
+
`));let l=new n$1({mode:"server",peerId:i.id,port:o,events:{onPeerConnected:(t,a)=>{console.log(e.green(` \u2713 Peer connected: ${e.bold(a)} (${t})`));let c=l.getRemoteAgents();c.length>0&&console.log(e.gray(` Remote agents: ${c.map(g=>g.id).join(", ")}`));},onPeerDisconnected:t=>{console.log(e.yellow(` Peer disconnected: ${t}`));},onPeerAuthFailed:(t,a)=>{console.log(e.red(` Auth failed from ${t}: ${a}`));},onMessageRelayed:(t,a,c)=>{console.log(e.gray(` \u2194 Relayed ${t.slice(0,8)} from ${a} to ${c}`));},onError:t=>{console.log(e.red(` Error: ${t.message}`));}}});try{let t=await l.startServer(),a=Q();if(console.log(e.green(` \u2713 Symphony relay listening on port ${o}`)),console.log(),console.log(e.white(" Pairing Code:")),console.log(),console.log(e.bold.cyan(` ${t.code.slice(0,3)} ${t.code.slice(3)}`)),console.log(),console.log(e.gray(" Share this code with the person connecting.")),console.log(e.gray(` Code rotates every 5 minutes.
|
|
34
|
+
`)),console.log(e.white(" LAN connect:")),console.log(e.gray(` paradigm symphony join --remote ${a}:${o}`)),s.public){let g=`${a}:${o}#${t.code}`;console.log(),console.log(e.white(" Internet connect (connection string):")),console.log(e.cyan(` paradigm symphony join --remote ${g}`)),console.log(e.gray(" (Requires port 3939 reachable: port forward, VPN, or SSH tunnel)"));}console.log(e.gray(`
|
|
35
|
+
Press Ctrl+C to stop.
|
|
36
|
+
`));let c=setInterval(()=>{let g=l.rotatePairingCode();console.log(e.cyan(` Code rotated: ${g.code.slice(0,3)} ${g.code.slice(3)}`));},300*1e3);process.on("SIGINT",()=>{console.log(e.yellow(`
|
|
37
|
+
Shutting down relay...`)),clearInterval(c),l.stop(),process.exit(0);}),await new Promise(()=>{});}catch(t){console.log(e.red(` Failed to start server: ${t.message}`)),l.stop();}}function Q(){let s=q.networkInterfaces();for(let o of Object.keys(s))for(let r of s[o]||[])if(r.family==="IPv4"&&!r.internal)return r.address;return "127.0.0.1"}async function he(s,o){let r=process.cwd(),n$1=n(r);n$1||(n$1=j(r));let i=o.from,l$1=o.reason||"Needed for current task";if(!i){console.log(e.red("--from is required. Specify which agent to request from."));let g=l().filter(y=>y.id!==n$1.id);if(g.length>0){console.log(e.gray(`
|
|
38
|
+
Available agents:`));for(let y of g)console.log(e.gray(` ${y.id}`));}return}let t=K$1();if(Q$1(s,t)){console.log(e.red(`\u2717 "${s}" is on the hard-deny list and cannot be requested.`));return}let a=L({filePath:s,requester:{id:n$1.id,name:n$1.name,type:"agent",project:n$1.project,role:n$1.role},reason:l$1}),c=I({sender:{id:n$1.id,name:n$1.name,type:"agent",project:n$1.project,role:n$1.role},recipients:[{id:i,name:i,type:"agent"}],intent:"fileRequest",text:`File request: ${s}
|
|
39
|
+
Reason: ${l$1}`,symbols:[]});J(c),console.log(e.green(`\u2713 File request created: ${a.request.requestId}`)),console.log(e.gray(` File: ${s}`)),console.log(e.gray(` From: ${i}`)),console.log(e.gray(` Reason: ${l$1}`)),console.log(e.gray(`
|
|
40
|
+
The owning agent's human must approve with:`)),console.log(e.white(` paradigm symphony approve ${a.request.requestId}`));}async function ue(){let s=N("pending");if(s.length===0){console.log(e.gray(`
|
|
41
|
+
No pending file requests.
|
|
42
|
+
`));return}console.log(e.cyan(`
|
|
43
|
+
Pending File Requests (${s.length})
|
|
44
|
+
`));for(let o of s){let r=Date.now()-new Date(o.createdAt).getTime(),n=Math.round(r/6e4);console.log(` ${e.white(o.request.requestId)}`),console.log(` File: ${o.request.filePath}`),console.log(` From: ${o.request.requester.name} (${o.request.requester.id})`),console.log(` Reason: ${o.request.reason}`),console.log(e.gray(` ${n}m ago`)),console.log(e.gray(` \u2192 paradigm symphony approve ${o.request.requestId}`)),console.log(e.gray(` \u2192 paradigm symphony deny ${o.request.requestId}`)),console.log();}}async function me(s,o){let r=process.cwd(),n=O(s,r,o.redact);if(!n.success){console.log(e.red(`\u2717 ${n.error}`));return}let i=o.redact?"approved (redacted)":"approved";console.log(e.green(`\u2713 File request ${i}`)),console.log(e.gray(` File: ${n.delivery?.filePath}`)),console.log(e.gray(` Size: ${n.delivery?.size} bytes`)),console.log(e.gray(` SHA-256: ${n.delivery?.hash?.slice(0,16)}...`));}async function fe(s,o){P(s,o.reason)?(console.log(e.green(`\u2713 File request denied: ${s}`)),o.reason&&console.log(e.gray(` Reason: ${o.reason}`))):console.log(e.red(`\u2717 File request not found or already resolved: ${s}`));}var X={question:e.blue,context:e.gray,clarification:e.blue,proposal:e.cyan,verification:e.blue,action:e.cyan,decision:e.yellow,alert:e.red,approval:e.green,rejection:e.red,reference:e.gray,handoff:e.magenta,fileRequest:e.green,fileApproved:e.green,fileDenied:e.red,fileDelivery:e.green};function Z(s){let o=new Date(s.timestamp).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",second:"2-digit"}),n=(X[s.intent]||e.white)(`[${s.intent}]`),i=e.cyan(s.sender.name),l=s.threadRoot?e.gray(` (${s.threadRoot})`):"",t=[];t.push(` ${e.gray(o)} ${i} ${n}${l}`);let a=s.content.text.split(`
|
|
45
|
+
`);for(let c of a)t.push(` ${c}`);return s.symbols.length>0&&t.push(` ${e.gray(`Symbols: ${s.symbols.join(", ")}`)}`),s.content.decision&&t.push(` ${e.yellow(`Decision: ${s.content.decision}`)}`),s.content.diff&&t.push(` ${e.gray("[diff attached]")}`),t.join(`
|
|
46
|
+
`)}async function $e(s){let o$1=process.cwd(),r=n(o$1);r||(r=j(o$1),console.log(e.gray(`Auto-joined as ${r.id}`)));let n$1=parseInt(s.interval||"2000",10),i=s.thread,l=s.quiet,t=b.join(q.homedir(),".paradigm","score"),a=b.join(t,"agents",...r.id.split("/"),"inbox.jsonl"),c=0,g=0;p.existsSync(a)&&(c=p.readFileSync(a,"utf-8").split(`
|
|
47
|
+
`).filter($=>$.trim().length>0).length,g=p.statSync(a).size),l||(console.log(e.cyan(`
|
|
48
|
+
Symphony Watch`)),console.log(e.gray(` Agent: ${r.id}`)),console.log(e.gray(` Inbox: ${a}`)),console.log(e.gray(` Poll: ${n$1}ms`)),i&&console.log(e.gray(` Filter: thread ${i}`)),console.log(e.gray(` Press Ctrl+C to stop
|
|
49
|
+
`)),console.log(e.gray(` ${"\u2500".repeat(60)}
|
|
50
|
+
`)));let y=b.join(t,"threads"),d=new Set;if(p.existsSync(y))for(let m of p.readdirSync(y))d.add(m);let h=()=>{try{if(p.existsSync(a)){let m=p.statSync(a);if(m.size>g){let w=p.readFileSync(a,"utf-8").split(`
|
|
51
|
+
`).filter(T=>T.trim().length>0);if(w.length>c){let T=w.slice(c);for(let V of T)try{let F=JSON.parse(V);if(i&&F.threadRoot!==i)continue;console.log(Z(F)),console.log();}catch{}c=w.length;}g=m.size;}}if(p.existsSync(y)){let m=p.readdirSync(y);for(let $ of m)if(!d.has($)){d.add($);try{let w=JSON.parse(p.readFileSync(b.join(y,$),"utf-8"));l||(console.log(` ${e.green("+")} ${e.white("New thread:")} ${w.topic||w.id}`),console.log(` ${e.gray(`by ${w.initiator?.name||"unknown"} \u2014 ${w.id}`)}`),console.log());}catch{}}}o(r.id);}catch{}};h();let u=setInterval(h,n$1);process.on("SIGINT",()=>{clearInterval(u),l||console.log(e.gray(`
|
|
52
|
+
Watch stopped.
|
|
53
|
+
`)),process.exit(0);}),await new Promise(()=>{});}export{me as symphonyApproveCommand,fe as symphonyDenyCommand,te as symphonyJoinCommand,se as symphonyLeaveCommand,ie as symphonyListCommand,ce as symphonyReadCommand,he as symphonyRequestCommand,ue as symphonyRequestsCommand,de as symphonyResolveCommand,le as symphonySendCommand,pe as symphonyServeCommand,ye as symphonyStatusCommand,ge as symphonyThreadCommand,ae as symphonyThreadsCommand,$e as symphonyWatchCommand,re as symphonyWhoamiCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {m,l,r,q,n,E,D,H,G as G$1,i,C,I,J,v,S,N,P,O}from'./chunk-ZUAUFZRJ.js';import'./chunk-3KVVC4WV.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';import {Router}from'express';function G(u,p){let d=Router();return d.get("/agents",(i,s)=>{try{m();let e=l(),n=r(),a=new Set(e.map(t=>t.id));for(let t of n)a.has(t.id)||e.push(t);let r$1=e.map(t=>({id:t.id,name:t.name,project:t.project,role:t.role,status:q(t)?"asleep":"awake",lastPoll:t.lastPoll,startedAt:t.startedAt,statusBlurb:t.statusBlurb}));s.json({agents:r$1});}catch(e){s.status(500).json({error:"Failed to list agents",detail:String(e)});}}),d.get("/agents/me",(i,s)=>{try{let e=n(u);s.json({identity:e||null});}catch(e){s.status(500).json({error:"Failed to get identity",detail:String(e)});}}),d.get("/peers",async(i,s)=>{try{let{loadPeers:e}=await import('./symphony-peers-X5NGWXFP.js'),a=e().map(r=>({id:r.id,displayName:r.displayName,address:r.address,connectedAt:r.connectedAt,lastSeen:r.lastSeen,revoked:r.revoked,agents:r.agents||[]}));s.json({peers:a});}catch(e){s.status(500).json({error:"Failed to list peers",detail:String(e)});}}),d.get("/threads",(i,s)=>{try{let e=i.query.status,n;(e==="active"||e==="resolved")&&(n=e);let r=E(n).map(t=>({id:t.id,topic:t.topic,status:t.status,participants:t.participants.map(o=>({id:o.id,name:o.name,type:o.type})),messageCount:t.messageCount,lastActivity:t.lastActivity,decision:t.decision}));s.json({threads:r});}catch(e){s.status(500).json({error:"Failed to list threads",detail:String(e)});}}),d.get("/threads/:threadId",(i,s)=>{try{let{threadId:e}=i.params,n=D(e);if(!n){s.status(404).json({error:`Thread not found: ${e}`});return}let a=H(e),r=new Set;for(let t of a)for(let o of t.symbols)r.add(o);s.json({thread:{id:n.id,topic:n.topic,status:n.status,participants:n.participants.map(t=>({id:t.id,name:t.name,type:t.type})),messageCount:n.messageCount,lastActivity:n.lastActivity,decision:n.decision},messages:a.map(t=>({id:t.id,sender:{id:t.sender.id,name:t.sender.name,type:t.sender.type},intent:t.intent,text:t.content.text,timestamp:t.timestamp,symbols:t.symbols,diff:t.content.diff,decision:t.content.decision,recipients:t.recipients?.map(o=>({id:o.id,name:o.name}))})),symbolsDiscussed:[...r]});}catch(e){s.status(500).json({error:"Failed to load thread",detail:String(e)});}}),d.post("/threads/:threadId/resolve",(i,s)=>{try{let{threadId:e}=i.params,{decision:n}=i.body;if(!G$1(e,n)){s.status(404).json({error:`Thread not found: ${e}`});return}p&&p({type:"symphony:thread_resolved",threadId:e,decision:n}),s.json({resolved:!0,threadId:e,decision:n});}catch(e){s.status(500).json({error:"Failed to resolve thread",detail:String(e)});}}),d.post("/messages",(i$1,s)=>{try{let{intent:e,text:n,threadRoot:a,recipients:r,symbols:t,diff:o,decision:f}=i$1.body;if(!e||!n){s.status(400).json({error:"intent and text are required"});return}let l$1={id:`human/${i(u)}`,name:"Human (Platform UI)",type:"human"},g=a,b=!1;if(!a){let q=n.length>60?n.slice(0,60)+"...":n;g=C(q,l$1).id,b=!0;}let x;if(r&&r.length>0){let q=l();x=r.map(y=>{let R=q.find(H=>H.id===y);return R?{id:R.id,name:R.name,type:"agent"}:{id:y,name:y,type:"agent"}});}let c=I({sender:l$1,recipients:x,intent:e,text:n,threadRoot:g,symbols:t,diff:o,decision:f}),N=J(c);p&&p({type:"symphony:message",message:{id:c.id,sender:{id:l$1.id,name:l$1.name,type:l$1.type},intent:c.intent,text:c.content.text,timestamp:c.timestamp,symbols:c.symbols,diff:c.content.diff,decision:c.content.decision},threadId:g}),s.json({sent:!0,messageId:c.id,threadId:g,threadCreated:b,deliveredTo:N});}catch(e){s.status(500).json({error:"Failed to send message",detail:String(e)});}}),d.get("/inbox",(i$1,s)=>{try{let e=i(u),n=v(e);s.json({agentId:e,messages:n.map(a=>({id:a.id,sender:{id:a.sender.id,name:a.sender.name,type:a.sender.type},intent:a.intent,text:a.content.text,timestamp:a.timestamp,threadRoot:a.threadRoot,symbols:a.symbols}))});}catch(e){s.status(500).json({error:"Failed to read inbox",detail:String(e)});}}),d.get("/file-requests",(i,s)=>{try{S();let e=i.query.status,n;(e==="pending"||e==="approved"||e==="denied"||e==="expired")&&(n=e);let r=N(n).map(t=>({requestId:t.request.requestId,filePath:t.request.filePath,reason:t.request.reason,requester:{id:t.request.requester.id,name:t.request.requester.name},urgency:t.request.urgency,snippet:t.request.snippet,status:t.status,createdAt:t.createdAt,resolvedAt:t.resolvedAt,denyReason:t.denyReason}));s.json({fileRequests:r});}catch(e){s.status(500).json({error:"Failed to list file requests",detail:String(e)});}}),d.post("/file-requests/:requestId/action",(i,s)=>{try{let{requestId:e}=i.params,{action:n,reason:a}=i.body;if(!n){s.status(400).json({error:"action is required"});return}if(n==="deny"){let o=P(e,a);s.json({success:o,requestId:e,action:"denied",reason:a});return}let r=n==="approve-redacted",t=O(e,u,r);if(!t.success){s.status(400).json({success:!1,requestId:e,error:t.error});return}s.json({success:!0,requestId:e,action:r?"approved-redacted":"approved",filePath:t.delivery?.filePath,size:t.delivery?.size});}catch(e){s.status(500).json({error:"Failed to handle file request",detail:String(e)});}}),d.get("/status",(i$1,s)=>{try{m();let e=l(),n=e.filter(f=>!q(f)).length,a=E("active"),r=i(u),t=v(r),o=N("pending");s.json({agentCount:e.length,awakeCount:n,asleepCount:e.length-n,activeThreadCount:a.length,unreadCount:t.length,pendingFileRequests:o.length});}catch(e){s.status(500).json({error:"Failed to get status",detail:String(e)});}}),d}export{G as createSymphonyRouter};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a,b,l as l$1,u,x,q}from'./chunk-ZUAUFZRJ.js';import {k,l,n,f as f$1,m as m$1,c as c$1,j,i}from'./chunk-J32OPJEX.js';import'./chunk-3KVVC4WV.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';import*as v from'fs';import*as m from'path';import*as A from'os';import*as f from'crypto';import {WebSocketServer,WebSocket}from'ws';var J=m.join(A.homedir(),".paradigm","score"),D=2e3,N=3e4,L=1e4,H=3,U=6e4,R=1e3,K=3e4;function c(p,e){p.readyState===WebSocket.OPEN&&p.send(JSON.stringify(e));}function C(p){try{let e=typeof p=="string"?p:String(p);return JSON.parse(e)}catch{return null}}var F=class p{wss=null;wsClient=null;mode;pairingState=null;connectedPeers=new Map;seenMessageIds=new Set;outboxWatchInterval=null;keepaliveInterval=null;reconnectTimer=null;reconnectDelay=R;outboxPositions=new Map;events;myPeerId;port;stopped=false;failedAuthAttempts=new Map;pongTimers=new Map;serverAddress=null;serverCode=null;static MAX_SEEN_IDS=1e4;constructor(e){this.mode=e.mode,this.myPeerId=e.peerId,this.port=e.port??3939,this.events=e.events??{};}async startServer(){if(this.mode!=="server")throw new Error('startServer() requires mode "server"');return this.pairingState=k(),this.wss=new WebSocketServer({port:this.port}),this.wss.on("connection",(e,t)=>{let n=t.socket.remoteAddress??"unknown";if(this.isRateLimited(n)){c(e,{type:"auth_fail",reason:"Too many failed attempts \u2014 try again later"}),e.close();return}let s=f.randomBytes(32).toString("hex");c(e,{type:"hello",version:"1.0",peerId:this.myPeerId,challenge:s});let i=false;e.on("message",r=>{let o=C(r);if(o){if(!i){this.handleServerAuth(e,o,s,n).then(a=>{a&&(i=true,this.registerPeerConnection(a,e));}).catch(a=>{this.events.onError?.(a instanceof Error?a:new Error(String(a)));});return}this.handleAuthenticatedFrame(e,o);}}),e.on("close",()=>{i&&this.handlePeerDisconnect(e);}),e.on("error",r=>{this.events.onError?.(r);});}),this.wss.on("error",e=>{this.events.onError?.(e);}),await new Promise((e,t)=>{this.wss.on("listening",e),this.wss.on("error",t);}),this.startOutboxWatcher(),this.startKeepalive(),this.pairingState}async handleServerAuth(e,t,n$1,s){if(t.type!=="auth")return c(e,{type:"auth_fail",reason:"Expected auth frame"}),e.close(),null;if(!this.pairingState||!l(this.pairingState,t.code)){this.recordFailedAuth(s);let a="Invalid or expired pairing code";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let i=this.pairingState.codeHash;if(!n(n$1,i,t.proof)){this.recordFailedAuth(s);let a="HMAC proof verification failed";return c(e,{type:"auth_fail",reason:a}),this.events.onPeerAuthFailed?.(s,a),e.close(),null}let r=this.getLocalAgentSummaries(),o=this.myPeerId;return c(e,{type:"auth_ok",peerId:this.myPeerId,displayName:o,agents:r}),f$1({id:t.peerId,displayName:t.peerId,address:s,sharedSecret:this.pairingState.sharedSecret,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:[]}),t.peerId}async connectToServer(e,t){if(this.mode!=="client")throw new Error('connectToServer() requires mode "client"');this.serverAddress=e,this.serverCode=t,await this.attemptConnection(e,t);}attemptConnection(e,t){return new Promise((n,s)=>{if(this.stopped){s(new Error("Relay has been stopped"));return}let i=e.includes("://")?e:`ws://${e}`,r=new WebSocket(i),o=false;r.on("open",()=>{this.wsClient=r;}),r.on("message",a=>{let d=C(a);if(d)switch(d.type){case "hello":{let x=f.createHash("sha256").update(t).digest("hex"),O=m$1(d.challenge,x);c(r,{type:"auth",peerId:this.myPeerId,code:t,proof:O});break}case "auth_ok":{f$1({id:d.peerId,displayName:d.displayName,address:e,sharedSecret:t,connectedAt:new Date().toISOString(),lastSeen:new Date().toISOString(),revoked:false,agents:d.agents}),c(r,{type:"agents_sync",agents:this.getLocalAgentSummaries()}),this.registerPeerConnection(d.peerId,r),this.startOutboxWatcher(),this.startKeepalive(),this.reconnectDelay=R,o||(o=true,n());break}case "auth_fail":{o||(o=true,s(new Error(`Auth failed: ${d.reason}`))),r.close();break}default:this.handleAuthenticatedFrame(r,d);break}}),r.on("close",()=>{this.handlePeerDisconnect(r),o?this.stopped||this.scheduleReconnect():(o=true,s(new Error("Connection closed before auth completed")));}),r.on("error",a=>{this.events.onError?.(a),o||(o=true,s(a));});})}handleAuthenticatedFrame(e,t){switch(t.type){case "message":this.handleIncomingMessage(e,t.message,t.origin);break;case "message_ack":break;case "nomination_forward":this.handleNominationForward(e,t.nomination,t.origin);break;case "agents_sync":this.handleAgentsSync(e,t.agents);break;case "agent_joined":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=[...i.agents||[],t.agent];j(n,r);}}break}case "agent_left":{let n=this.peerIdForSocket(e);if(n){let i=c$1().find(r=>r.id===n);if(i){let r=(i.agents||[]).filter(o=>o.id!==t.agentId);j(n,r);}}break}case "peer_leaving":this.handlePeerDisconnect(e),e.close();break;case "ping":c(e,{type:"pong"});break;case "pong":this.handlePong(e);break;}}handleIncomingMessage(e,t,n){if(a(t)){b(t.sender.id,t,"cross-project-transfer"),c(e,{type:"message_ack",messageId:t.id});return}if(this.seenMessageIds.has(t.id)){c(e,{type:"message_ack",messageId:t.id});return}this.addToSeenIds(t.id);let s=l$1();if(t.recipients&&t.recipients.length>0)for(let i of t.recipients){let r=s.find(o=>o.id===i.id);r&&(u(r.id,t),this.events.onMessageRelayed?.(t.id,n,r.id));}else for(let i of s)u(i.id,t),this.events.onMessageRelayed?.(t.id,n,i.id);if(this.mode==="server"){let i=this.peerIdForSocket(e);for(let[r,o]of this.connectedPeers)r!==i&&r!==n&&c(o,{type:"message",message:t,origin:n});}c(e,{type:"message_ack",messageId:t.id});}handleNominationForward(e,t,n){if(!t?.id)return;let s={...t,remote_origin:n,forwarded_at:new Date().toISOString()};try{let i=m.join(A.homedir(),".paradigm","events");v.mkdirSync(i,{recursive:!0});let r=m.join(i,"nominations.jsonl");v.appendFileSync(r,JSON.stringify(s)+`
|
|
3
|
+
`,"utf8");}catch{}if(this.mode==="server")for(let[i,r]of this.connectedPeers)r!==e&&r.readyState===WebSocket.OPEN&&c(r,{type:"nomination_forward",nomination:s,origin:n});c(e,{type:"nomination_ack",nominationId:t.id});}handleAgentsSync(e,t){let n=this.peerIdForSocket(e);n&&(j(n,t),i(n));}startOutboxWatcher(){this.outboxWatchInterval||(this.outboxWatchInterval=setInterval(()=>{if(this.connectedPeers.size!==0)try{let e=l$1();for(let t of e){let n=x(t.id),s=this.outboxPositions.get(t.id)??0;if(n.length<=s){this.outboxPositions.set(t.id,n.length);continue}this.outboxPositions.set(t.id,n.length);let i=n.slice(s);for(let r of i){if(a(r)||this.seenMessageIds.has(r.id))continue;this.addToSeenIds(r.id);let o={type:"message",message:r,origin:this.myPeerId};for(let[a,d]of this.connectedPeers)c(d,o);}}}catch(e){this.events.onError?.(e instanceof Error?e:new Error(String(e)));}},D));}stopOutboxWatcher(){this.outboxWatchInterval&&(clearInterval(this.outboxWatchInterval),this.outboxWatchInterval=null);}startKeepalive(){this.keepaliveInterval||(this.keepaliveInterval=setInterval(()=>{for(let[e,t]of this.connectedPeers){c(t,{type:"ping"});let n=setTimeout(()=>{this.handlePeerDisconnect(t),t.terminate();},L);this.pongTimers.set(e,n);}},N));}stopKeepalive(){this.keepaliveInterval&&(clearInterval(this.keepaliveInterval),this.keepaliveInterval=null);for(let e of this.pongTimers.values())clearTimeout(e);this.pongTimers.clear();}handlePong(e){let t=this.peerIdForSocket(e);if(t){let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),i(t);}}registerPeerConnection(e,t){let n=this.connectedPeers.get(e);n&&n!==t&&n.close(),this.connectedPeers.set(e,t),i(e),this.events.onPeerConnected?.(e,e);}handlePeerDisconnect(e){let t=this.peerIdForSocket(e);if(!t)return;this.connectedPeers.delete(t);let n=this.pongTimers.get(t);n&&(clearTimeout(n),this.pongTimers.delete(t)),this.events.onPeerDisconnected?.(t);}peerIdForSocket(e){for(let[t,n]of this.connectedPeers)if(n===e)return t;return null}scheduleReconnect(){if(this.stopped||this.mode!=="client"||!this.serverAddress||!this.serverCode)return;this.stopOutboxWatcher(),this.stopKeepalive(),this.wsClient=null;let e=this.reconnectDelay;this.reconnectDelay=Math.min(this.reconnectDelay*2,K),this.reconnectTimer=setTimeout(()=>{this.stopped||this.attemptConnection(this.serverAddress,this.serverCode).catch(t=>{this.events.onError?.(t instanceof Error?t:new Error(String(t)));});},e);}isRateLimited(e){let t=this.failedAuthAttempts.get(e);return t?Date.now()<t.cooldownUntil?true:t.count>=H?(t.cooldownUntil=Date.now()+U,true):false:false}recordFailedAuth(e){let t=this.failedAuthAttempts.get(e);t?t.count++:this.failedAuthAttempts.set(e,{count:1,cooldownUntil:0});}addToSeenIds(e){if(this.seenMessageIds.add(e),this.seenMessageIds.size>p.MAX_SEEN_IDS){let t=Array.from(this.seenMessageIds),n=Math.floor(t.length/2);this.seenMessageIds=new Set(t.slice(n));}}getLocalAgentSummaries(){return l$1().map(e=>({id:e.id,project:e.project,role:e.role,status:q(e)?"asleep":"awake"}))}stop(){this.stopped=true;for(let[e,t]of this.connectedPeers)c(t,{type:"peer_leaving"}),t.close();this.connectedPeers.clear(),this.wsClient&&(this.wsClient.close(),this.wsClient=null),this.stopOutboxWatcher(),this.stopKeepalive(),this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.wss&&(this.wss.close(),this.wss=null);}getConnectedPeers(){return Array.from(this.connectedPeers.keys())}getRemoteAgents(){let e=[],t=c$1();for(let n of this.connectedPeers.keys()){let s=t.find(i=>i.id===n);if(s?.agents)for(let i of s.agents)e.push({...i,peerId:n});}return e}rotatePairingCode(){if(this.mode!=="server")throw new Error('rotatePairingCode() requires mode "server"');return this.pairingState=k(),this.pairingState}};export{J as SCORE_DIR,F as SymphonyRelay};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a}from'./chunk-RPGSQQTS.js';import {b as b$1}from'./chunk-NFN5UUJB.js';import {f,d,c,j,k,i}from'./chunk-MBKTVQS2.js';import {b,a as a$1}from'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';b();var v="(blocked on GitHub)";function S(a,e){let t={taskId:a.id,kind:"agree",drift:[]},n=e.labels.map(r=>r.toLowerCase()),i;e.status==="closed"?i=e.closedReason==="not-planned"?"shelved":"done":(a.status==="done"||a.status==="shelved")&&(i="open"),i&&i!==a.status&&(c(a.status,i)?(t.kind="apply",t.targetStatus=i):(t.kind="conflict",t.drift.push(`GitHub implies "${i}" but the task is "${a.status}" \u2014 illegal transition, local wins. `+(i==="done"?"Reopen the task first, or close the issue once the work is really done.":"Resolve manually."))));let s=n.includes("blocked");return s&&!a.blocked_on?(t.blocked={set:v},t.kind==="agree"&&(t.kind="apply")):!s&&a.blocked_on===v&&(t.blocked={clear:true},t.kind==="agree"&&(t.kind="apply")),e.assignees.length>0&&!a.claimant?t.drift.push(`GitHub assignee ${e.assignees.join(", ")} \u2014 not reflected locally (assignee\u2192claimant is advisory; claim it locally to own it).`):e.assignees.length===0&&a.claimant?.kind==="human"&&t.drift.push(`Local claimant ${a.claimant.ref} has no GitHub assignee.`),t}var u="in progress",h="blocked";async function P(a){if(a==="github")try{await import('./github-GI3HX3N5.js');}catch{}return b$1(a)}async function o(a,e,t){try{await t();}catch(n){a$1.component("#task-sync").warn(`sync action failed: ${a}`,{taskId:e,error:n instanceof Error?n.message:String(n)});}}async function G(a$2,e,t,n={}){try{let i=await f(a$2,e),s=i?.external_ref;if(!i||!s?.provider)return;let r=await P(s.provider);if(!r||!r.capabilities().push||!await r.isAvailable())return;switch(t){case "claim":{a(i.claimant).assignee?await o("assignee",e,()=>r.edit?.(s,{addAssignee:"@me"})):i.claimant&&await o("agent-label",e,()=>r.edit?.(s,{addLabels:[`paradigm:${i.claimant.kind}/${i.claimant.ref}`]}));break}case "start":await o("label:in-progress",e,()=>r.edit?.(s,{addLabels:[u]}));break;case "done":await o("label:rm-in-progress",e,()=>r.edit?.(s,{removeLabels:[u]})),await o("close:completed",e,()=>r.close?.(s));break;case "shelved":await o("close:not-planned",e,()=>r.close?.(s,"not-planned"));break;case "reopen":await o("reopen",e,()=>r.reopen?.(s)),await o("label:rm-in-progress",e,()=>r.edit?.(s,{removeLabels:[u]}));break;case "block":await o("label:blocked",e,()=>r.edit?.(s,{addLabels:[h]})),n.reason&&await o("comment:blocked",e,()=>r.comment?.(s,`Blocked: ${n.reason}`));break;case "unblock":await o("label:rm-blocked",e,()=>r.edit?.(s,{removeLabels:[h]}));break}}catch(i){a$1.component("#task-sync").warn("projectTransition failed (non-fatal)",{taskId:e,error:i instanceof Error?i.message:String(i)});}}async function L(a,e,t){let n=false;if(t.targetStatus&&t.targetStatus!==e.status&&(t.targetStatus==="done"?n=await j(a,e.id):t.targetStatus==="shelved"?n=await k(a,e.id):n=await i(a,e.id,{status:t.targetStatus})),t.blocked){let i$1=await i(a,e.id,{blocked_on:t.blocked.clear?void 0:t.blocked.set});n=n||i$1;}return n}async function R(a,e){let t=await f(a,e),n=t?.external_ref;if(!t||!n?.provider)return {taskId:e,status:"unlinked",drift:[]};let i=await P(n.provider);if(!i?.capabilities().pull||!i.pull)return {taskId:e,status:"no-pull",drift:[]};if(!await i.isAvailable())return {taskId:e,status:"offline",drift:[]};let s;try{s=await i.pull(n);}catch(l){return a$1.component("#task-sync").warn("pull failed",{taskId:e,error:l instanceof Error?l.message:String(l)}),{taskId:e,status:"remote-error",drift:[]}}let r=S(t,s);if(r.kind==="conflict")return {taskId:e,status:"conflict",drift:r.drift};if(r.kind==="agree")return {taskId:e,status:"agree",drift:r.drift};let p=await L(a,t,r);return {taskId:e,status:p?"synced":"agree",targetStatus:r.targetStatus,drift:r.drift}}async function O(a){let t=(await d(a,{status:"all",limit:9999})).filter(i=>i.external_ref?.provider==="github"),n=[];for(let i of t)try{n.push(await R(a,i.id));}catch(s){n.push({taskId:i.id,status:"remote-error",drift:[String(s)]});}return n}export{G as projectTransition,O as syncAllLinked,R as syncTask};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {d,h,i,c as c$1,j as j$1,k}from'./chunk-MBKTVQS2.js';import'./chunk-EK4ZRIFJ.js';import {d as d$1,h as h$1,b,e,c,a,f,g}from'./chunk-WR6D3SC6.js';import'./chunk-5TAVYPOV.js';import {execSync}from'child_process';import*as P from'fs';import*as N from'os';import*as O from'path';import*as M from'js-yaml';function y(r){return r.project?O.resolve(r.project):process.cwd()}function j(){try{let r=execSync("git config user.email",{encoding:"utf-8",timeout:3e3}).trim();if(r)return r}catch{}try{let r=N.userInfo().username;if(r)return r}catch{}return "unknown"}function R(){return {kind:"human",ref:j()}}function m(r){let e=r.match(/-(\d+)$/);return e?e[1]:r}function G(r){return r.status==="done"||r.status==="shelved"}function U(r,e){if(!r.claimant)return "";let{kind:n,ref:t}=r.claimant;return n==="human"&&t===e?"you":t}function z(r,e){if(r.blocked_on)return true;for(let n of r.dependsOn||[]){let t=e.get(n);if(t&&!G(t))return true}return false}function H(r){return r.status==="in-progress"?"\u25B8":r.priority==="low"?"\u25CB":"\u25CF"}function E(r){let e=(r.tags||[]).join(", ");return `[${e?`${r.priority} \xB7 ${e}`:r.priority}]`}async function W(r,e){let n=await d(e,{status:"all",limit:9999});if(r==="@last"){let i=j(),c=n.filter(d=>d.claimant?.kind==="human"&&d.claimant.ref===i).sort((d,a)=>(a.created||"").localeCompare(d.created||""));return c.length===0?{errorMessage:"No tasks created by you yet \u2014 `@last` has nothing to resolve."}:{task:c[0]}}if(/^T-\d{4}-\d{2}-\d{2}-\d+$/.test(r)){let i=n.find(c=>c.id===r);return i?{task:i}:{errorMessage:`No task with id ${r}.`}}let t=n.filter(i=>i.status==="open"||i.status==="in-progress");if(/^\d+$/.test(r)){let i=parseInt(r,10),c=t.filter(d=>{let a=d.id.match(/-(\d+)$/);return a&&parseInt(a[1],10)===i});if(c.length===1)return {task:c[0]};if(c.length>1)return {errorMessage:`Suffix "${r}" is ambiguous across dates \u2014 use a full id:`,candidates:c.map(d=>` ${d.id} ${d.blurb}`)}}let o=r.toLowerCase(),s=t.filter(i=>i.blurb.toLowerCase().includes(o));return s.length===1?{task:s[0]}:s.length>1?{errorMessage:`"${r}" matches ${s.length} active tasks \u2014 be more specific:`,candidates:s.map(i=>` ${m(i.id)} ${i.blurb}`)}:{errorMessage:`No active task matches "${r}".`}}async function v(r,e){let n=await W(r,e);if(!n.task){d$1(n.errorMessage||`Could not resolve "${r}".`);for(let t of n.candidates||[])a(t);process.exit(1);}return n.task}async function nt(r,e$1){let n=y(e$1);if(e$1.fromThread){await K(n,e$1);return}let t=r.join(" ").trim();t||(d$1("Nothing to add \u2014 provide a blurb: `paradigm task add fix the parser`"),process.exit(1));let o=F(e$1.priority),s=e$1.tag||[],i$1=await h(n,{blurb:t,priority:o,tags:s,claimant:R()});if(e$1.start&&await i(n,i$1,{status:"in-progress"}),e$1.json){h$1({id:i$1});return}b(`${i$1} added`),e(`${t} ${E({priority:o,tags:s})}`),e$1.start&&e("\u2192 in-progress");}function F(r){return r==="high"||r==="low"?r:"medium"}async function K(r,e$1){let n=await import('fs'),{parseThread:t}=await import('./thread-2A7QKU72.js'),o=O.join(r,".paradigm","thread.md");if(!n.existsSync(o)){c("No thread.md found \u2014 nothing to import.");return}let i=t(n.readFileSync(o,"utf8")).looseEnds||[];if(i.length===0){a("No loose ends in thread.md.");return}let c$1=[];for(let d of i){let a=await h(r,{blurb:d,priority:"medium",tags:["from-thread"],claimant:R()});c$1.push({id:a,blurb:d});}if(e$1.json){h$1({created:c$1.map(d=>d.id)});return}f(`Imported ${c$1.length} loose end${c$1.length===1?"":"s"} as tasks`);for(let d of c$1)b(`${d.id} ${d.blurb}`);e("Thread.md was NOT cleared. Run `paradigm thread clear` once you have verified these.");}var V={active:"active",open:"open",done:"done",shelved:"shelved",all:"all"};async function st(r,e$1){let n=y(e$1);if(e$1.board){await q(n,e$1);return}let t=V[r||"active"];t||(d$1(`Unknown status "${r}" \u2014 use active | open | done | shelved | all.`),process.exit(1));let o=e$1.limit?parseInt(e$1.limit,10):20,s=j(),i=await d(n,{status:t,priority:e$1.priority,tag:e$1.tag,limit:9999});e$1.mine&&(i=i.filter(a=>a.claimant?.kind==="human"&&a.claimant.ref===s));let c=new Map,d$2=await d(n,{status:"all",limit:9999});for(let a of d$2)c.set(a.id,a);if(i=i.slice(0,o),e$1.json){h$1(i);return}if(i.length===0){e("No tasks.");return}if(t==="active"){let a$1=i.filter(l=>l.status==="in-progress"),f$1=i.filter(l=>l.status==="open");if(a$1.length>0){f("IN PROGRESS");for(let l of a$1)a(A(l,s,c));}if(f$1.length>0){f("OPEN");for(let l of f$1)a(A(l,s,c));}return}f(t.toUpperCase());for(let a$1 of i)a(A(a$1,s,c));}function A(r,e,n){let t=H(r),o=m(r.id).padStart(3," "),s=U(r,e),i=s?` (${s})`:"",c=z(r,n)?" \u26D4 blocked":"";return ` ${t} ${o} ${r.blurb}${i} ${E(r)}${c}`}async function q(r,e){let{assembleCaptainBoard:n}=await import('./captain-J4FZ5PRU.js'),t=await n(r,{proposeClaimants:true});if(e.json){h$1(t);return}let o=j();f(`BOARD \u2014 ${t.summary.runs} run(s), ${t.summary.open} open, ${t.summary.inFlight} in flight, ${t.summary.unclaimed} unclaimed`);for(let s of t.runs){f(`\u25B6 ${s.blurb} [${s.runStatus}]`);for(let i of s.nodes){let c=i.stage!==void 0?`s${i.stage} `:"",d=i.claimant?` (${i.claimant.kind==="human"&&i.claimant.ref===o?"you":i.claimant.ref})`:"",a$1=i.fragileSymbols.length>0?` \u26A0 ${i.fragileSymbols.join(", ")}`:"";a(` ${c}${m(i.taskId)} ${i.blurb} [${i.status}]${d}${a$1}`);}}if(t.unclaimed.length>0){f("UNCLAIMED");for(let s of t.unclaimed){let i=s.proposedClaimant?` \u2192 ${s.proposedClaimant.ref}?`:"";a(` ${m(s.taskId)} ${s.blurb} [${s.priority}]${i}`);}}}async function _(r,e,n,t){try{let{projectTransition:o}=await import('./sync-layer-C2PF273N.js');await o(r,e,n,{reason:t});}catch{}}async function it(r,e$1){let n=y(e$1),t=await v(r,n);if(c$1(t.status,"in-progress")||(d$1(`Cannot start ${m(t.id)} \u2014 it is ${t.status}.`),process.exit(1)),await i(n,t.id,{status:"in-progress"}),await _(n,t.id,"start"),e$1.json){h$1({id:t.id,status:"in-progress"});return}b(`${m(t.id)} \u2192 in-progress`),e(t.blurb);}async function ot(r,e$1){let n=y(e$1),t=await v(r,n);c$1(t.status,"done")||(d$1(`Cannot complete ${m(t.id)} \u2014 it is ${t.status}.`),process.exit(1)),await j$1(n,t.id),await _(n,t.id,"done");let o=[];if(e$1.ripple!==false&&(o=await J(t,n)),e$1.json){h$1({id:t.id,status:"done",...o.length?{ripple:o}:{}});return}b(`${m(t.id)} \u2713 done`),e(t.blurb),o.length>0&&e(`\u21AF touches: ${o.join(", ")}`),t.related_lore&&t.related_lore.length>0&&e(`lore: ${t.related_lore.join(", ")}`);}async function J(r,e){let n=(r.tags||[]).filter(t=>/^[#$^!~]/.test(t));if(n.length===0)return [];try{let{aggregateFromDirectory:t,buildSymbolIndex:o,getSymbol:s}=await import('./dist-PW5YPGFF.js'),i=await t(e),c=o(i),d=new Set;for(let a of n){let f=s(c,a);if(f)for(let l of f.referencedBy||[])d.add(l);}return Array.from(d).sort()}catch{return []}}async function at(r,e$1){let n=y(e$1),t=await v(r,n);if(c$1(t.status,"shelved")||(d$1(`Cannot shelve ${m(t.id)} \u2014 it is ${t.status}.`),process.exit(1)),await k(n,t.id),await _(n,t.id,"shelved"),e$1.json){h$1({id:t.id,status:"shelved"});return}b(`${m(t.id)} shelved`),e(t.blurb);}async function ct(r,e$1){let n=y(e$1),{syncTask:t,syncAllLinked:o}=await import('./sync-layer-C2PF273N.js'),s=r?[await t(n,(await v(r,n)).id)]:await o(n);if(e$1.json){h$1({verdicts:s});return}if(s.length===0){e("No GitHub-linked tasks to sync.");return}let i=s.filter(a=>a.status==="synced"),c$1=s.filter(a=>a.status==="conflict");for(let a of i)b(`${m(a.taskId)} synced${a.targetStatus?` \u2192 ${a.targetStatus}`:""}`);for(let a of c$1){c(`${m(a.taskId)} conflict (local wins)`);for(let f of a.drift)e(` ${f}`);}let d=s.filter(a=>["offline","remote-error","unlinked","no-pull"].includes(a.status));d.some(a=>a.status==="offline")&&e("GitHub unavailable for some tasks \u2014 `gh auth login` to enable."),a(""),e(`${i.length} synced \xB7 ${c$1.length} conflict \xB7 ${s.filter(a=>a.status==="agree").length} unchanged \xB7 ${d.length} skipped`);}async function dt(r,e){let n=y(e),t=await v(r,n);if(e.json){h$1(t);return}if(f(t.id),g("blurb",t.blurb),g("status",t.status),g("priority",t.priority),t.tags&&t.tags.length>0&&g("tags",t.tags.join(", ")),t.claimant&&g("claimant",`${t.claimant.kind}:${t.claimant.ref}`),g("created",t.created),t.started_at&&g("started",t.started_at),t.completed&&g("completed",t.completed),t.shelved&&g("shelved",t.shelved),t.parentTaskId&&g("parent",t.parentTaskId),t.dependsOn&&t.dependsOn.length>0&&g("depends",t.dependsOn.join(", ")),t.blocked_on&&g("blocked_on",t.blocked_on),t.related_lore&&t.related_lore.length>0&&g("lore",t.related_lore.join(", ")),t.external_ref){let o=t.external_ref;g("external",`${o.provider}:${o.ref}${o.url?` (${o.url})`:""}`);}}async function lt(r,e$1){let n=y(e$1),t=await v(r,n),o={},s=[];if(e$1.blurb!==void 0&&(o.blurb=e$1.blurb,s.push(`blurb \u2192 "${e$1.blurb}"`)),e$1.priority!==void 0&&(o.priority=F(e$1.priority),s.push(`priority \u2192 ${o.priority}`)),e$1.tag!==void 0&&(o.tags=e$1.tag,s.push(`tags \u2192 [${o.tags.join(", ")}]`)),e$1.addTag!==void 0&&e$1.addTag.length>0){let c=o.tags??t.tags??[],d=Array.from(new Set([...c,...e$1.addTag]));o.tags=d,s.push(`+tags [${e$1.addTag.join(", ")}]`);}if(e$1.reopen&&(c$1(t.status,"open")||(d$1(`Cannot reopen ${m(t.id)} \u2014 it is ${t.status}.`),process.exit(1)),o.status="open",s.push("status \u2192 open")),s.length===0){c("Nothing to edit \u2014 pass -b/-p/-t/--add-tag/--reopen.");return}if(await i(n,t.id,o)||(d$1(`Edit rejected for ${m(t.id)} (illegal transition or task not found).`),process.exit(1)),e$1.reopen&&await _(n,t.id,"reopen"),e$1.json){h$1({id:t.id,changed:s});return}b(`${m(t.id)} edited`);for(let c of s)e(` ${c}`);}function Q(r){let e=r.toLowerCase();return e.includes("github.com")||/^[^/\s]+\/[^/#\s]+#\d+$/.test(r)?"github":(e.startsWith("http://")||e.startsWith("https://"),"url")}async function ut(r,e$1,n){let t=y(n),o=await v(r,t),s=n.provider||Q(e$1),i$1=/^https?:\/\//i.test(e$1),c={provider:s,ref:e$1,...i$1?{url:e$1}:{}};if(await i(t,o.id,{external_ref:c})||(d$1(`Link rejected for ${m(o.id)} (task not found).`),process.exit(1)),n.json){h$1({id:o.id,external_ref:c});return}b(`${m(o.id)} linked`),e(`${s}: ${e$1}`);}function X(r){try{let e=O.join(r,".paradigm","config.yaml");if(!P.existsSync(e))return {};let t=M.load(P.readFileSync(e,"utf8"))?.sync;return t?{provider:t.provider,repo:t.github?.repo}:{}}catch{return {}}}async function ft(r,e$1){let n=y(e$1),t=await v(r,n),o=X(n),s=e$1.provider||o.provider;if(!s){c("No sync provider configured \u2014 task left local-only."),e("Add a `sync:` block to .paradigm/config.yaml (e.g. provider: github, github: { repo: owner/repo }) or pass --provider.");return}let{getProvider:i$1}=await import('./registry-NEW4OJ44.js');s==="github"&&await import('./github-GI3HX3N5.js');let c$1=i$1(s);if(!c$1){c(`No provider registered for "${s}" \u2014 task left local-only.`),e("Known provider at this phase: github.");return}let d=c$1,a=e$1.repo||o.repo;if(s==="github"&&a){let{GithubProvider:l}=await import('./github-GI3HX3N5.js');d=new l({repo:a});}let f=false;try{f=await d.isAvailable();}catch{f=false;}if(!f){c(`${s} is not available \u2014 task left local-only.`),s==="github"&&e("Authenticate with `gh auth login`, then retry.");return}try{let l=await d.push(t),C={provider:s,ref:l.ref,...l.url?{url:l.url}:{},syncedAt:new Date().toISOString()};if(await i(n,t.id,{external_ref:C}),e$1.json){h$1({id:t.id,external_ref:C});return}b(`${m(t.id)} pushed \u2192 ${l.ref}`),l.url&&e(l.url);}catch(l){d$1(`Push to ${s} failed \u2014 task left untouched locally.`),e(l instanceof Error?l.message:String(l)),process.exitCode=1;}}function Y(r){let e=new Set;for(let n of (r||"").split(",")){let t=n.trim();t&&e.add(t);}return e}async function mt(r){try{let e=y(r),n=Y(r.symbols);if(n.size===0)return;let o=(await d(e,{status:"all",limit:9999})).filter(f=>f.external_ref?.provider?(f.tags||[]).some(l=>n.has(l)):!1);if(o.length===0)return;let{getProvider:s}=await import('./registry-NEW4OJ44.js');new Set(o.map(f=>f.external_ref.provider)).has("github")&&await import('./github-GI3HX3N5.js');let c=(r.hash||"").slice(0,7)||"(unknown)",d$1=Array.from(n).join(", "),a=`Commit ${c}: touched ${d$1}`;for(let f of o){let l=f.external_ref;try{let C=s(l.provider);if(!C||!C.capabilities().comment)continue;await C.comment(l,a);}catch{}}}catch{}}
|
|
3
|
+
export{j as currentHumanRef,W as resolveRef,nt as taskAddCommand,ot as taskDoneCommand,lt as taskEditCommand,ut as taskLinkCommand,st as taskLsCommand,ft as taskPushCommand,at as taskShelveCommand,dt as taskShowCommand,it as taskStartCommand,ct as taskSyncCommand,mt as taskSyncCommitCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{c as assertTransition,j as completeTask,h as createTask,b as generateTaskId,f as loadTask,d as loadTasks,a as normalizeTask,l as rebuildTaskIndex,k as shelveTask,e as tasksForClaimant,i as updateTask,g as validateTaskDag}from'./chunk-MBKTVQS2.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{c as assertTransition,j as completeTask,h as createTask,b as generateTaskId,f as loadTask,d as loadTasks,a as normalizeTask,l as rebuildTaskIndex,k as shelveTask,e as tasksForClaimant,i as updateTask,g as validateTaskDag}from'./chunk-SD3KVW5Q.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$1}from'./chunk-VOPJ47QY.js';import {d,f as f$1}from'./chunk-SD3KVW5Q.js';import {b as b$1,a}from'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';import*as f from'fs';import*as h from'path';b$1();var E=".paradigm/events/settlement-liveness.jsonl",b=30,P=new Set(["done","shelved","crashed"]);function _(t){return P.has(t)}function A(t){return _(t.status)||!!t.crashed_at}function T(t,n){try{let s=h.join(t,E);f.mkdirSync(h.dirname(s),{recursive:!0}),f.appendFileSync(s,JSON.stringify(n)+`
|
|
3
|
+
`,"utf8");}catch(s){a.component("#task-settlement").warn("Failed to append liveness record",{parentTaskId:n.parentTaskId,error:s instanceof Error?s.message:String(s)});}}function N(t){return Object.values(t).every(n=>n==="skipped"||n==="ok")}function R(){let t=process.env.PARADIGM_REAPER_STALE_MINUTES;return (t&&!Number.isNaN(Number(t))?Number(t):b)*60*1e3}async function O(t){let n=Date.now(),s=R(),a$1=[],d$1;try{d$1=await d(t,{status:"in-progress",limit:9999});}catch{return a$1}let{updateTask:o}=await import('./task-loader-LFEE6OU7.js');for(let i of d$1){if(i.status!=="in-progress"||i.crashed_at)continue;let u=i.started_at?new Date(i.started_at).getTime():NaN;if(Number.isNaN(u)||n-u<s)continue;let r=new Date().toISOString();await o(t,i.id,{status:"shelved",crashed_at:r,crash_reason:"reaper:stale-in-progress",shelved:r})&&(a$1.push(i.id),a.component("#task-settlement").warn("Reaped stale in-progress task",{taskId:i.id,startedAt:i.started_at,reason:"reaper:stale-in-progress"}));}return a$1}async function M(t,n,s){if(!n)return;try{await O(t);}catch(r){a.component("#task-settlement").warn("Reaper pass failed (non-fatal)",{error:r instanceof Error?r.message:String(r)});}let a$1=await f$1(t,n);if(!a$1){a.component("#task-settlement").warn("Orphan task: parent failed to load",{parentTaskId:n,orphanChildId:s,reason:"orphan:missing-parent"});let r=s?await f$1(t,s):null;if(r&&r.settledAt)return;await v(t,n,"orphan",r??void 0,true);return}if(a$1.settledAt)return;let d$1=(await d(t,{status:"all",limit:9999})).filter(r=>r.parentTaskId===a$1.id);if(d$1.length===0||!d$1.every(A))return;let o=d$1.some(r=>r.crashed_at),i=d$1.some(r=>r.status==="shelved"&&!r.crashed_at),u=o?"crashed":i?"shelved":"done";await v(t,a$1.id,u,a$1);}async function v(t,n,s,a$2,d=false){let o={recordWorkLog:"skipped",runPostflightLearning:"skipped",autoPromoteJournalEntries:"skipped"},i=0,u=0,r=a$2?.claimant?.ref;if(!r||r==="orchestrator")try{let{loadTasks:e}=await import('./task-loader-LFEE6OU7.js'),l=(await e(t,{status:"all",limit:9999})).filter(p=>p.parentTaskId===n&&p.claimant?.kind==="archetype"),c=new Map;for(let p of l)c.set(p.claimant.ref,(c.get(p.claimant.ref)??0)+1);let g=[...c.entries()].sort((p,y)=>y[1]-p[1])[0];g&&(r=g[0]);}catch{}r=r??"orchestrator";try{try{let{recordWorkLog:e}=await import('./work-log-loader-DL5GZ2BQ.js');e(t,{agent:r,task_ref:n,summary:`Settlement of task DAG ${n} (${s})`,outcome:s==="done"?"pass":"partial",symbols_touched:[]}),o.recordWorkLog="ok";}catch(e){o.recordWorkLog="threw",a.component("#task-settlement").warn("Settlement stage threw: recordWorkLog",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{runPostflightLearning:e}=await import('./ambient-OW5M5LVN.js'),l=await e(t,{claimant:r});i=l.journalsWritten??0,u=l.promoted??0,o.runPostflightLearning="ok";}catch(e){o.runPostflightLearning="threw",a.component("#task-settlement").warn("Settlement stage threw: runPostflightLearning",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{autoPromoteJournalEntries:e}=await import('./nomination-engine-YRHZZZUN.js'),l=e(t,r);u+=l.promoted??0,o.autoPromoteJournalEntries="ok";}catch(e){o.autoPromoteJournalEntries="threw",a.component("#task-settlement").warn("Settlement stage threw: autoPromoteJournalEntries",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{rebuildLearnedTable:e}=await import('./calibration-aggregate-DUEE3LL2.js'),l=e(t);l&&a.component("#calibration").info("Calibration refreshed on settle",{parentTaskId:n,samplesRead:l.samplesRead,learnedCells:l.groups.filter(c=>c.learned).length});}catch(e){a.component("#calibration").warn("Aggregate-on-settle failed (non-fatal)",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}}finally{let e=N(o),l={ts:new Date().toISOString(),parentTaskId:n,settledAs:s,stages:o,journalsWritten:i,promoted:u,chainLive:e};if(T(t,l),e){let c=Object.values(o).filter(g=>g==="ok").length;a$1(t,{verdicts:c,source:"settlement"});}if(a$2)try{let{updateTask:c}=await import('./task-loader-LFEE6OU7.js'),g={settledAt:new Date().toISOString()};s==="crashed"&&(g.crash_reason=a$2.crash_reason??"reaper:stale-in-progress"),d&&(g.orphaned=!0),await c(t,a$2.id,g);}catch(c){a.component("#task-settlement").warn("Failed to stamp settledAt",{parentTaskId:n,error:c instanceof Error?c.message:String(c)});}}}export{_ as isTerminal,O as reapStaleInProgress,M as settleParentIfComplete};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a as a$1}from'./chunk-VOPJ47QY.js';import {d,f as f$1}from'./chunk-MBKTVQS2.js';import {b as b$1,a}from'./chunk-EK4ZRIFJ.js';import'./chunk-5TAVYPOV.js';import*as f from'fs';import*as h from'path';b$1();var E=".paradigm/events/settlement-liveness.jsonl",b=30,P=new Set(["done","shelved","crashed"]);function _(t){return P.has(t)}function A(t){return _(t.status)||!!t.crashed_at}function T(t,n){try{let s=h.join(t,E);f.mkdirSync(h.dirname(s),{recursive:!0}),f.appendFileSync(s,JSON.stringify(n)+`
|
|
3
|
+
`,"utf8");}catch(s){a.component("#task-settlement").warn("Failed to append liveness record",{parentTaskId:n.parentTaskId,error:s instanceof Error?s.message:String(s)});}}function N(t){return Object.values(t).every(n=>n==="skipped"||n==="ok")}function R(){let t=process.env.PARADIGM_REAPER_STALE_MINUTES;return (t&&!Number.isNaN(Number(t))?Number(t):b)*60*1e3}async function O(t){let n=Date.now(),s=R(),a$1=[],d$1;try{d$1=await d(t,{status:"in-progress",limit:9999});}catch{return a$1}let{updateTask:o}=await import('./task-loader-EIXPKHA3.js');for(let i of d$1){if(i.status!=="in-progress"||i.crashed_at)continue;let u=i.started_at?new Date(i.started_at).getTime():NaN;if(Number.isNaN(u)||n-u<s)continue;let r=new Date().toISOString();await o(t,i.id,{status:"shelved",crashed_at:r,crash_reason:"reaper:stale-in-progress",shelved:r})&&(a$1.push(i.id),a.component("#task-settlement").warn("Reaped stale in-progress task",{taskId:i.id,startedAt:i.started_at,reason:"reaper:stale-in-progress"}));}return a$1}async function M(t,n,s){if(!n)return;try{await O(t);}catch(r){a.component("#task-settlement").warn("Reaper pass failed (non-fatal)",{error:r instanceof Error?r.message:String(r)});}let a$1=await f$1(t,n);if(!a$1){a.component("#task-settlement").warn("Orphan task: parent failed to load",{parentTaskId:n,orphanChildId:s,reason:"orphan:missing-parent"});let r=s?await f$1(t,s):null;if(r&&r.settledAt)return;await v(t,n,"orphan",r??void 0,true);return}if(a$1.settledAt)return;let d$1=(await d(t,{status:"all",limit:9999})).filter(r=>r.parentTaskId===a$1.id);if(d$1.length===0||!d$1.every(A))return;let o=d$1.some(r=>r.crashed_at),i=d$1.some(r=>r.status==="shelved"&&!r.crashed_at),u=o?"crashed":i?"shelved":"done";await v(t,a$1.id,u,a$1);}async function v(t,n,s,a$2,d=false){let o={recordWorkLog:"skipped",runPostflightLearning:"skipped",autoPromoteJournalEntries:"skipped"},i=0,u=0,r=a$2?.claimant?.ref;if(!r||r==="orchestrator")try{let{loadTasks:e}=await import('./task-loader-EIXPKHA3.js'),l=(await e(t,{status:"all",limit:9999})).filter(p=>p.parentTaskId===n&&p.claimant?.kind==="archetype"),c=new Map;for(let p of l)c.set(p.claimant.ref,(c.get(p.claimant.ref)??0)+1);let g=[...c.entries()].sort((p,y)=>y[1]-p[1])[0];g&&(r=g[0]);}catch{}r=r??"orchestrator";try{try{let{recordWorkLog:e}=await import('./work-log-loader-DL5GZ2BQ.js');e(t,{agent:r,task_ref:n,summary:`Settlement of task DAG ${n} (${s})`,outcome:s==="done"?"pass":"partial",symbols_touched:[]}),o.recordWorkLog="ok";}catch(e){o.recordWorkLog="threw",a.component("#task-settlement").warn("Settlement stage threw: recordWorkLog",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{runPostflightLearning:e}=await import('./ambient-VCTUHHIG.js'),l=await e(t,{claimant:r});i=l.journalsWritten??0,u=l.promoted??0,o.runPostflightLearning="ok";}catch(e){o.runPostflightLearning="threw",a.component("#task-settlement").warn("Settlement stage threw: runPostflightLearning",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{autoPromoteJournalEntries:e}=await import('./nomination-engine-EFXDEPZN.js'),l=e(t,r);u+=l.promoted??0,o.autoPromoteJournalEntries="ok";}catch(e){o.autoPromoteJournalEntries="threw",a.component("#task-settlement").warn("Settlement stage threw: autoPromoteJournalEntries",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}try{let{rebuildLearnedTable:e}=await import('./calibration-aggregate-5IVXSBDP.js'),l=e(t);l&&a.component("#calibration").info("Calibration refreshed on settle",{parentTaskId:n,samplesRead:l.samplesRead,learnedCells:l.groups.filter(c=>c.learned).length});}catch(e){a.component("#calibration").warn("Aggregate-on-settle failed (non-fatal)",{parentTaskId:n,error:e instanceof Error?e.message:String(e)});}}finally{let e=N(o),l={ts:new Date().toISOString(),parentTaskId:n,settledAs:s,stages:o,journalsWritten:i,promoted:u,chainLive:e};if(T(t,l),e){let c=Object.values(o).filter(g=>g==="ok").length;a$1(t,{verdicts:c,source:"settlement"});}if(a$2)try{let{updateTask:c}=await import('./task-loader-EIXPKHA3.js'),g={settledAt:new Date().toISOString()};s==="crashed"&&(g.crash_reason=a$2.crash_reason??"reaper:stale-in-progress"),d&&(g.orphaned=!0),await c(t,a$2.id,g);}catch(c){a.component("#task-settlement").warn("Failed to stamp settledAt",{parentTaskId:n,error:c instanceof Error?c.message:String(c)});}}}export{_ as isTerminal,O as reapStaleInProgress,M as settleParentIfComplete};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{e as teamAcceptCommand,f as teamCheckCommand,d as teamHandoffCommand,g as teamHistoryCommand,b as teamInitCommand,a as teamModelsCommand,h as teamResetCommand,c as teamStatusCommand}from'./chunk-KA6QEI3C.js';import'./chunk-YNFF7XHV.js';import'./chunk-TYWB5IQJ.js';import'./chunk-DLMDHS2X.js';import'./chunk-FYDRENK7.js';import'./chunk-ECLUYHAR.js';import'./chunk-YXLGVOZO.js';import'./chunk-Y4XFVDZC.js';import'./chunk-MBKTVQS2.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-EKZDFEJW.js';import'./chunk-LPBCQM5Y.js';import'./chunk-D6BSCELB.js';import'./chunk-K6TLYNRQ.js';import'./chunk-ZJQY5PPP.js';import'./chunk-5TAVYPOV.js';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import'./chunk-5TAVYPOV.js';import*as o from'fs';import*as f from'path';import i from'chalk';import*as u from'js-yaml';var b=`# Thread - Session Continuity
|
|
3
|
+
|
|
4
|
+
> Pass context between AI agent sessions. Updated by \`paradigm thread save\`.
|
|
5
|
+
|
|
6
|
+
## Last Session: {timestamp}
|
|
7
|
+
|
|
8
|
+
### Trail (What was done)
|
|
9
|
+
{trail}
|
|
10
|
+
|
|
11
|
+
### Loose Ends (Unfinished)
|
|
12
|
+
{looseEnds}
|
|
13
|
+
|
|
14
|
+
### Breadcrumbs (Notes for next agent)
|
|
15
|
+
{breadcrumbs}
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
*Run \`paradigm thread save "message"\` to update*
|
|
19
|
+
*Run \`paradigm thread clear\` to reset*
|
|
20
|
+
`;function p(){try{let t=f.join(process.cwd(),".paradigm","config.yaml");if(o.existsSync(t)){let n=o.readFileSync(t,"utf8"),r=u.load(n)?.limits;if(r?.threadTrailMax&&typeof r.threadTrailMax=="number")return r.threadTrailMax}}catch{}return 10}function m(t){let n={trail:[],looseEnds:[],breadcrumbs:[]},c=t.match(/## Last Session: (.+)/);c&&(n.lastSession=c[1].trim());let r=t.match(/### Trail \(What was done\)\n([\s\S]*?)(?=\n### |$)/);if(r){let e=r[1].split(`
|
|
21
|
+
`).filter(s=>s.startsWith("- "));for(let s of e){let l=s.replace(/^- /,"").trim();if(l&&l!=="_No activity recorded yet_"){let h=l.match(/[@#^!$%~?][\w-]+/g)||[];n.trail.push({timestamp:n.lastSession||new Date().toISOString(),message:l,symbols:h.length>0?h:void 0});}}}let d=t.match(/### Loose Ends \(Unfinished\)\n([\s\S]*?)(?=\n### |$)/);if(d){let e=d[1].split(`
|
|
22
|
+
`).filter(s=>s.startsWith("- "));for(let s of e){let l=s.replace(/^- \[[ x]\] /,"").replace(/^- /,"").trim();l&&l!=="_No pending tasks_"&&n.looseEnds.push(l);}}let a=t.match(/### Breadcrumbs \(Notes for next agent\)\n([\s\S]*?)(?=\n---|$)/);if(a){let e=a[1].split(`
|
|
23
|
+
`).filter(s=>s.startsWith("- "));for(let s of e){let l=s.replace(/^- /,"").trim();l&&l!=="_No notes yet_"&&n.breadcrumbs.push(l);}}return n}function g(t){let n=new Date().toISOString().replace("T"," ").split(".")[0],c="_No activity recorded yet_";t.trail.length>0&&(c=t.trail.slice(-p()).map(a=>`- ${a.message}`).join(`
|
|
24
|
+
`));let r="_No pending tasks_";t.looseEnds.length>0&&(r=t.looseEnds.map(a=>`- [ ] ${a}`).join(`
|
|
25
|
+
`));let d="_No notes yet_";return t.breadcrumbs.length>0&&(d=t.breadcrumbs.slice(-p()).map(a=>`- ${a}`).join(`
|
|
26
|
+
`)),b.replace("{timestamp}",n).replace("{trail}",c).replace("{looseEnds}",r).replace("{breadcrumbs}",d)}async function w(t,n={}){let c=process.cwd(),r=t?f.resolve(c,t):c,d=f.join(r,".paradigm","thread.md");if(!o.existsSync(d)){if(n.json){console.log(JSON.stringify({exists:false,trail:[],looseEnds:[],breadcrumbs:[]},null,2));return}console.log(i.yellow(`
|
|
27
|
+
\u{1F4DC} No thread found.
|
|
28
|
+
`)),console.log(i.gray(' Run `paradigm thread save "message"` to start a thread.\n'));return}let a=o.readFileSync(d,"utf8"),e=m(a);if(n.json){console.log(JSON.stringify({exists:true,lastSession:e.lastSession,trail:e.trail,looseEnds:e.looseEnds,breadcrumbs:e.breadcrumbs},null,2));return}if(console.log(i.blue(`
|
|
29
|
+
\u{1F4DC} Current Thread
|
|
30
|
+
`)),console.log(i.gray("\u2500".repeat(50))),e.lastSession&&(console.log(i.white(`Last Session: ${i.cyan(e.lastSession)}`)),console.log("")),e.trail.length>0){console.log(i.white("Trail (What was done):"));for(let s of e.trail.slice(-5))console.log(i.gray(` - ${s.message}`));e.trail.length>5&&console.log(i.gray(` ... and ${e.trail.length-5} more`)),console.log("");}if(e.looseEnds.length>0){console.log(i.white("Loose Ends (Unfinished):"));for(let s of e.looseEnds)console.log(i.yellow(` \u25A1 ${s}`));console.log("");}if(e.breadcrumbs.length>0){console.log(i.white("Breadcrumbs (Notes):"));for(let s of e.breadcrumbs.slice(-5))console.log(i.gray(` - ${s}`));console.log("");}console.log(i.gray(`Path: ${d}
|
|
31
|
+
`));}async function T(t,n,c={}){let r=process.cwd(),d=n?f.resolve(r,n):r,a=f.join(d,".paradigm"),e=f.join(a,"thread.md");o.existsSync(a)||o.mkdirSync(a,{recursive:true});let s={trail:[],looseEnds:[],breadcrumbs:[]};if(o.existsSync(e)){let y=o.readFileSync(e,"utf8");s=m(y);}let l=t.match(/[@#^!$%~?][\w-]+/g)||[];s.trail.push({timestamp:new Date().toISOString(),message:t,symbols:l.length>0?l:void 0});let h=g(s);o.writeFileSync(e,h,"utf8"),c.quiet||console.log(i.green(`
|
|
32
|
+
\u2713 Thread updated: ${t}
|
|
33
|
+
`));}async function x(t,n,c={}){let r=process.cwd(),d=n?f.resolve(r,n):r,a=f.join(d,".paradigm"),e=f.join(a,"thread.md");o.existsSync(a)||o.mkdirSync(a,{recursive:true});let s={trail:[],looseEnds:[],breadcrumbs:[]};if(c.quiet||console.log(i.yellow("\n\u26A0 `paradigm thread todo` is deprecated. Use `paradigm task add` instead \u2014\n thread is now session-handoff narrative only. (Import existing loose ends\n with `paradigm task add --from-thread`.)\n")),o.existsSync(e)){let h=o.readFileSync(e,"utf8");s=m(h);}s.looseEnds.push(t);let l=g(s);o.writeFileSync(e,l,"utf8"),c.quiet||console.log(i.yellow(`
|
|
34
|
+
\u25A1 Loose end added: ${t}
|
|
35
|
+
`));}async function E(t,n,c={}){let r=process.cwd(),d=n?f.resolve(r,n):r,a=f.join(d,".paradigm"),e=f.join(a,"thread.md");o.existsSync(a)||o.mkdirSync(a,{recursive:true});let s={trail:[],looseEnds:[],breadcrumbs:[]};if(o.existsSync(e)){let h=o.readFileSync(e,"utf8");s=m(h);}s.breadcrumbs.push(t);let l=g(s);o.writeFileSync(e,l,"utf8"),c.quiet||console.log(i.cyan(`
|
|
36
|
+
\u{1F4CC} Breadcrumb added: ${t}
|
|
37
|
+
`));}async function $(t,n={}){let c=process.cwd(),r=t?f.resolve(c,t):c,d=f.join(r,".paradigm","thread.md");if(o.existsSync(d)){let e=g({trail:[],looseEnds:[],breadcrumbs:[]});o.writeFileSync(d,e,"utf8"),n.quiet||console.log(i.green(`
|
|
38
|
+
\u2713 Thread cleared.
|
|
39
|
+
`));}else n.quiet||console.log(i.gray(`
|
|
40
|
+
No thread to clear.
|
|
41
|
+
`));}export{m as parseThread,$ as threadClearCommand,E as threadNoteCommand,T as threadSaveCommand,w as threadShowCommand,x as threadTodoCommand};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
export{b as registerTools}from'./chunk-IBKCMLOW.js';import'./chunk-4UJ4NIEQ.js';import'./chunk-XROULIQN.js';import'./chunk-ZUAUFZRJ.js';import'./chunk-7HUPVOAY.js';import'./chunk-VKVVIN6J.js';import'./chunk-5VR7FKS5.js';import'./chunk-3F4QP2Z5.js';import'./chunk-M4UMM6DC.js';import'./chunk-B5KLSBOZ.js';import'./chunk-HSY75GRR.js';import'./chunk-RVXQNS6K.js';import'./chunk-3KVVC4WV.js';import'./chunk-KAUGQMXU.js';import'./chunk-Q527BPUF.js';import'./chunk-VOPJ47QY.js';import'./chunk-RGSFU2YW.js';import'./chunk-TMDPDIWA.js';import'./chunk-KLBH26PA.js';import'./chunk-GRZQIKST.js';import'./chunk-KAFQA7HV.js';import'./chunk-ACJWUOMA.js';import'./chunk-33ERV2MW.js';import'./chunk-SD3KVW5Q.js';import'./chunk-EK4ZRIFJ.js';import'./chunk-JNSJVCTU.js';import'./chunk-ECO3LHCE.js';import'./chunk-5TAVYPOV.js';
|