@a-company/paradigm 5.28.0 → 5.34.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-CLT6SAYW.js → accept-orchestration-MIRBLRUJ.js} +1 -1
- package/dist/agent-loader-5255KNM7.js +2 -0
- package/dist/agent-loader-A5FMBAFJ.js +2 -0
- package/dist/ambient-2JZTNXUL.js +35 -0
- package/dist/chunk-2Q7RGCJH.js +3 -0
- package/dist/chunk-32RBX5YV.js +9 -0
- package/dist/chunk-7SWEOPWF.js +2 -0
- package/dist/{chunk-DG236EXP.js → chunk-A7KFOJ2F.js} +1 -1
- package/dist/chunk-AGSUX2GJ.js +9 -0
- package/dist/chunk-C7ZCCKJT.js +3 -0
- package/dist/chunk-EAZ3EMOZ.js +29 -0
- package/dist/{chunk-VPMJWJ5R.js → chunk-HPAHK4AJ.js} +1 -1
- package/dist/chunk-LKFBDUCV.js +11 -0
- package/dist/chunk-S7K7UPXL.js +3 -0
- package/dist/{chunk-FSOI3CCD.js → chunk-SXO7NC6A.js} +18 -4
- package/dist/{chunk-VNQGILQU.js → chunk-TXBSTT64.js} +4 -4
- package/dist/chunk-TZZNHUAR.js +2 -0
- package/dist/{chunk-WESTEMIM.js → chunk-UDUHSHO4.js} +1 -1
- package/dist/chunk-UHQLYIRI.js +3 -0
- package/dist/{compliance-5OYNHE5D.js → compliance-Q676YALK.js} +1 -1
- package/dist/compliance-health-JNP3P35P.js +4 -0
- package/dist/{diff-YM6ZV3UI.js → diff-QHQWLM3L.js} +1 -1
- package/dist/doctor-R4UGMR5N.js +2 -0
- package/dist/gap-narrator-NTXLUI7I.js +3 -0
- package/dist/{hooks-E7HQQ57M.js → hooks-BNWRGACA.js} +1 -1
- package/dist/index.js +5 -5
- package/dist/mcp.js +92 -53
- package/dist/{migrate-WT56YYAM.js → migrate-YQG2FG3J.js} +1 -1
- package/dist/{nomination-engine-LMSZ2CAS.js → nomination-engine-W6QTQX2P.js} +1 -1
- package/dist/{orchestrate-4L3NJCV5.js → orchestrate-7CJWHLBA.js} +1 -1
- package/dist/{project-type-4Y6CESWP.js → project-type-AGO6VUKF.js} +1 -1
- package/dist/{providers-4PXMWA7V.js → providers-TBPOE4DI.js} +1 -1
- package/dist/reindex-2MRCAIZG.js +2 -0
- package/dist/{roster-K2QILE7K.js → roster-TA2GFDR7.js} +1 -1
- package/dist/scopes-commands-3V5G6NYV.js +3 -0
- package/dist/session-tracker-WSTRV7UP.js +2 -0
- package/dist/session-work-log-5UJTJJ22.js +2 -0
- package/dist/session-work-log-SLAPEP3M.js +2 -0
- package/dist/shift-IKTWYSEQ.js +60 -0
- package/dist/{spawn-UH5RENSE.js → spawn-7TCAMD6H.js} +1 -1
- package/dist/{symphony-ZQ5OHJTP.js → symphony-IS5TYPXY.js} +2 -2
- package/dist/symphony-relay-CIMRXQHI.js +3 -0
- package/dist/{team-MKLPUTW7.js → team-WIJVWLII.js} +1 -1
- package/dist/university-content/courses/.purpose +52 -8
- package/dist/university-content/courses/para-001.json +166 -0
- package/dist/university-content/courses/para-101.json +88 -88
- package/dist/university-content/courses/para-201.json +27 -55
- package/dist/university-content/courses/para-301.json +114 -8
- package/dist/university-content/courses/para-401.json +90 -62
- package/dist/university-content/courses/para-501.json +55 -0
- package/dist/university-ui/assets/{index-CGFJczb1.js → index-DmiLQehB.js} +2 -2
- package/dist/university-ui/assets/{index-CGFJczb1.js.map → index-DmiLQehB.js.map} +1 -1
- package/dist/university-ui/index.html +1 -1
- package/package.json +1 -1
- package/dist/agent-loader-CZFB5BDP.js +0 -2
- package/dist/agent-loader-EBERCNMO.js +0 -2
- package/dist/ambient-S3CXHD7P.js +0 -35
- package/dist/chunk-4DVT5IEY.js +0 -2
- package/dist/chunk-5KSNYRT7.js +0 -29
- package/dist/chunk-AYYS2AMB.js +0 -3
- package/dist/chunk-CSXVL2U7.js +0 -9
- package/dist/chunk-QWL3LERH.js +0 -3
- package/dist/chunk-SL3RZQPW.js +0 -5
- package/dist/chunk-U4J5J7GG.js +0 -3
- package/dist/chunk-VKGY42FP.js +0 -5
- package/dist/doctor-HMQBF2WK.js +0 -2
- package/dist/reindex-BSD7ZIEY.js +0 -2
- package/dist/session-tracker-FDFL4PZI.js +0 -2
- package/dist/session-work-log-5PHOUEQ6.js +0 -2
- package/dist/session-work-log-LWEGZ5CN.js +0 -2
- package/dist/shift-WNP27SPB.js +0 -11
- package/dist/symphony-relay-KBHN3ZMR.js +0 -3
- /package/dist/{chunk-IZSBGW6E.js → chunk-HXGYVS2N.js} +0 -0
|
@@ -817,6 +817,20 @@ if [ "$_SEV" != "off" ]; then
|
|
|
817
817
|
fi
|
|
818
818
|
fi
|
|
819
819
|
fi
|
|
820
|
+
|
|
821
|
+
# --- Compliance snapshot (non-fatal, fire-and-forget) ---
|
|
822
|
+
# Record this stop-hook run to .paradigm/events/compliance-history.jsonl for trend analysis.
|
|
823
|
+
# VIOLATION_COUNT and SOURCE_COUNT are now final at this point.
|
|
824
|
+
_compliance_snapshot() {
|
|
825
|
+
_ts=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date +"%Y-%m-%dT%H:%M:%SZ")
|
|
826
|
+
_checks=$((SOURCE_COUNT + PARADIGM_COUNT))
|
|
827
|
+
[ "$_checks" -eq 0 ] && _checks=1 # Avoid divide-by-zero downstream
|
|
828
|
+
_dir=".paradigm/events"
|
|
829
|
+
mkdir -p "$_dir" 2>/dev/null || return
|
|
830
|
+
printf '{"timestamp":"%s","violations":%d,"warnings":0,"checks":%d}\\n' \\
|
|
831
|
+
"$_ts" "$VIOLATION_COUNT" "$_checks" >> "$_dir/compliance-history.jsonl" 2>/dev/null || true
|
|
832
|
+
}
|
|
833
|
+
_compliance_snapshot
|
|
820
834
|
`,R=`#!/bin/sh
|
|
821
835
|
# Paradigm Claude Code Stop Hook (v2)
|
|
822
836
|
# Validates paradigm compliance before allowing the agent to finish.
|
|
@@ -1077,7 +1091,7 @@ fi
|
|
|
1077
1091
|
printf '{"additional_context":"%s","continue":true}\\n' "$CONTEXT"
|
|
1078
1092
|
|
|
1079
1093
|
exit 0
|
|
1080
|
-
`,
|
|
1094
|
+
`,v=`#!/bin/sh
|
|
1081
1095
|
# Paradigm Cursor Stop Hook (v2)
|
|
1082
1096
|
# Validates paradigm compliance before allowing the agent to finish.
|
|
1083
1097
|
# Installed by: paradigm hooks install --cursor
|
|
@@ -1210,7 +1224,7 @@ rm -f ".paradigm/.purpose-paths"
|
|
|
1210
1224
|
rm -f ".paradigm/.orchestrated"
|
|
1211
1225
|
|
|
1212
1226
|
exit 0
|
|
1213
|
-
`,
|
|
1227
|
+
`,P=`#!/bin/sh
|
|
1214
1228
|
# Legacy afterFileEdit hook \u2014 replaced by paradigm-posttooluse.sh (postToolUse)
|
|
1215
1229
|
# Kept as a no-op because Cursor expects the file to exist.
|
|
1216
1230
|
exit 0
|
|
@@ -1624,12 +1638,12 @@ if [ -d ".paradigm/history" ] && [ -f ".paradigm/history/log.jsonl" ]; then
|
|
|
1624
1638
|
fi
|
|
1625
1639
|
`;async function te(i={}){let h=process.cwd(),c=i.dryRun||false;c&&console.log(o.cyan(`
|
|
1626
1640
|
[dry-run] Showing what would be installed:
|
|
1627
|
-
`));let d=i.claudeCode&&!i.postCommit&&!i.prePush&&!i.cursor,a=i.cursor&&!i.postCommit&&!i.prePush&&!i.claudeCode;if(!c){let s=[{name:"post-commit",content:F},{name:"pre-push",content:V},{name:"paradigm-common",content:N},{name:"claude-code-stop",content:R},{name:"claude-code-precommit",content:U},{name:"claude-code-postwrite",content:A},{name:"cursor-session-start",content:D},{name:"cursor-stop",content:
|
|
1641
|
+
`));let d=i.claudeCode&&!i.postCommit&&!i.prePush&&!i.cursor,a=i.cursor&&!i.postCommit&&!i.prePush&&!i.claudeCode;if(!c){let s=[{name:"post-commit",content:F},{name:"pre-push",content:V},{name:"paradigm-common",content:N},{name:"claude-code-stop",content:R},{name:"claude-code-precommit",content:U},{name:"claude-code-postwrite",content:A},{name:"cursor-session-start",content:D},{name:"cursor-stop",content:v},{name:"cursor-precommit",content:b},{name:"cursor-postwrite",content:P},{name:"cursor-pretooluse",content:L},{name:"cursor-posttooluse",content:w}];for(let t of s){let n=q(t.content,t.name);if(n){console.log(o.red(`Hook syntax error: ${n}`)),console.log(o.gray("Aborting installation. Fix the hook script and try again."));return}}}let p=Y();if(p.compatible||(console.log(o.yellow(`
|
|
1628
1642
|
\u26A0 ${p.message}`)),console.log(o.gray(` Hook installation will continue, but behavior may differ from plugin expectations.
|
|
1629
1643
|
`))),!d&&!a){let s=r.join(h,".git");if(!e.existsSync(s)){console.log(o.red("Not a git repository."));return}let t=r.join(s,"hooks"),n=!i.postCommit&&!i.prePush&&!i.claudeCode,f=[];if(n||i.postCommit){let u=r.join(t,"post-commit");if(c){let g=e.existsSync(u)&&!i.force?"skip (exists)":"install";console.log(o.gray(` post-commit: ${g} \u2192 ${u}`));}else e.existsSync(u)&&!i.force?e.readFileSync(u,"utf8").includes("paradigm")?console.log(o.gray("post-commit hook already installed by paradigm")):console.log(o.yellow("post-commit hook exists. Use --force to overwrite.")):(e.mkdirSync(t,{recursive:true}),e.writeFileSync(u,F),e.chmodSync(u,"755"),f.push("post-commit"));}if(n||i.prePush){let u=r.join(t,"pre-push");if(c){let g=e.existsSync(u)&&!i.force?"skip (exists)":"install";console.log(o.gray(` pre-push: ${g} \u2192 ${u}`));}else e.existsSync(u)&&!i.force?e.readFileSync(u,"utf8").includes("paradigm")?console.log(o.gray("pre-push hook already installed by paradigm")):console.log(o.yellow("pre-push hook exists. Use --force to overwrite.")):(e.mkdirSync(t,{recursive:true}),e.writeFileSync(u,V),e.chmodSync(u,"755"),f.push("pre-push"));}!c&&f.length>0&&console.log(o.green(`Git hooks installed: ${f.join(", ")}`));let O=r.join(h,".paradigm/history");!e.existsSync(O)&&!c&&console.log(o.gray("Tip: Run `paradigm history init` to initialize history tracking"));}let l=!i.postCommit&&!i.prePush&&!i.claudeCode&&!i.cursor;(l||i.claudeCode)&&(c?(console.log(o.gray(" Claude Code hooks: would install paradigm-stop.sh, paradigm-precommit.sh, paradigm-postwrite.sh")),console.log(o.gray(` \u2192 ${r.join(h,".claude","hooks")}/`)),console.log(o.gray(" \u2192 Update .claude/settings.json with hook configuration"))):await B(h,i.force)),(l||i.cursor)&&(c?(console.log(o.gray(" Cursor hooks: would install paradigm-session-start.sh, paradigm-stop.sh, paradigm-precommit.sh, paradigm-postwrite.sh, paradigm-pretooluse.sh, paradigm-posttooluse.sh")),console.log(o.gray(` \u2192 ${r.join(h,".cursor","hooks")}/`)),console.log(o.gray(" \u2192 Update .cursor/hooks.json"))):await K(h,i.force)),c&&console.log(o.cyan(`
|
|
1630
1644
|
[dry-run] No changes made.
|
|
1631
1645
|
`));}async function B(i,h){let c=x();if(c.active){console.log(o.cyan(` Paradigm plugin v${c.cacheVersion} is active \u2014 hooks are managed by the plugin.`));let{cleaned:_,removed:$}=J(i);console.log(_?o.green(` Cleaned up stale project hooks: ${$.join(", ")}`):o.gray(" No stale project hooks to clean up.")),console.log(o.gray(" Plugin hooks auto-update with each session \u2014 no manual install needed."));return}let d=r.join(i,".claude","hooks");e.mkdirSync(d,{recursive:true});let a=[],p=r.join(d,"paradigm-common.sh");e.writeFileSync(p,N,"utf8"),e.chmodSync(p,"755");let l=[{name:"paradigm-stop.sh",content:R},{name:"paradigm-precommit.sh",content:U},{name:"paradigm-postwrite.sh",content:A}];for(let _ of l){let $=r.join(d,_.name);if(e.existsSync($)&&!h){console.log(o.gray(` ${_.name}: already installed`));continue}e.writeFileSync($,_.content,"utf8"),e.chmodSync($,"755"),a.push(_.name);}let s=r.join(i,".claude","settings.json"),t={};if(e.existsSync(s))try{t=JSON.parse(e.readFileSync(s,"utf8"));}catch{}let n=t.hooks||{},f={hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-stop.sh"',timeout:10}]},O={matcher:"Bash",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-precommit.sh"',timeout:30}]},u=n.Stop||[];u.some(_=>JSON.stringify(_).includes("paradigm-stop.sh"))||u.push(f),n.Stop=u;let T=n.PreToolUse||[];T.some(_=>JSON.stringify(_).includes("paradigm-precommit.sh"))||T.push(O),n.PreToolUse=T;let M={matcher:"Edit,Write",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-postwrite.sh"',timeout:5}]},S=n.PostToolUse||[];S.some(_=>JSON.stringify(_).includes("paradigm-postwrite.sh"))||S.push(M),n.PostToolUse=S,t.hooks=n,e.writeFileSync(s,JSON.stringify(t,null,2)+`
|
|
1632
|
-
`,"utf8"),a.length>0&&console.log(o.green(`Claude Code hooks installed: ${a.join(", ")}`)),console.log(o.green("Claude Code settings.json updated with hook configuration"));}async function K(i,h){let c=r.join(i,".cursor","hooks");e.mkdirSync(c,{recursive:true});let d=[],a=r.join(c,"paradigm-common.sh");e.writeFileSync(a,N,"utf8"),e.chmodSync(a,"755");let p=[{name:"paradigm-session-start.sh",content:D},{name:"paradigm-stop.sh",content:
|
|
1646
|
+
`,"utf8"),a.length>0&&console.log(o.green(`Claude Code hooks installed: ${a.join(", ")}`)),console.log(o.green("Claude Code settings.json updated with hook configuration"));}async function K(i,h){let c=r.join(i,".cursor","hooks");e.mkdirSync(c,{recursive:true});let d=[],a=r.join(c,"paradigm-common.sh");e.writeFileSync(a,N,"utf8"),e.chmodSync(a,"755");let p=[{name:"paradigm-session-start.sh",content:D},{name:"paradigm-stop.sh",content:v},{name:"paradigm-precommit.sh",content:b},{name:"paradigm-postwrite.sh",content:P},{name:"paradigm-pretooluse.sh",content:L},{name:"paradigm-posttooluse.sh",content:w}];for(let m of p){let y=r.join(c,m.name);if(e.existsSync(y)&&!h){console.log(o.gray(` ${m.name}: already installed (Cursor)`));continue}e.writeFileSync(y,m.content,"utf8"),e.chmodSync(y,"755"),d.push(m.name);}let l=r.join(i,".cursor","hooks.json"),s={};if(e.existsSync(l))try{s=JSON.parse(e.readFileSync(l,"utf8"));}catch{}s.version=1;let t=s.hooks||{},n={command:".cursor/hooks/paradigm-session-start.sh",timeout:5},f={command:".cursor/hooks/paradigm-stop.sh",timeout:10,loop_limit:3},O={command:".cursor/hooks/paradigm-postwrite.sh",timeout:5},u={command:".cursor/hooks/paradigm-precommit.sh",matcher:"git commit",timeout:30},g=t.sessionStart||[];g.some(m=>JSON.stringify(m).includes("paradigm-session-start.sh"))||g.push(n),t.sessionStart=g;let I=t.stop||[];I.some(m=>JSON.stringify(m).includes("paradigm-stop.sh"))||I.push(f),t.stop=I;let S=t.afterFileEdit||[];S.some(m=>JSON.stringify(m).includes("paradigm-postwrite.sh"))||S.push(O),t.afterFileEdit=S;let _={command:".cursor/hooks/paradigm-pretooluse.sh",matcher:"Edit|Write",timeout:5},$=t.preToolUse||[];$.some(m=>JSON.stringify(m).includes("paradigm-pretooluse.sh"))||$.push(_),t.preToolUse=$;let j={command:".cursor/hooks/paradigm-posttooluse.sh",matcher:"Edit|Write",timeout:5},C=t.postToolUse||[];C.some(m=>JSON.stringify(m).includes("paradigm-posttooluse.sh"))||C.push(j),t.postToolUse=C;let k=t.beforeShellExecution||[];k.some(m=>JSON.stringify(m).includes("paradigm-precommit.sh"))||k.push(u),t.beforeShellExecution=k,s.hooks=t,e.writeFileSync(l,JSON.stringify(s,null,2)+`
|
|
1633
1647
|
`,"utf8"),d.length>0&&console.log(o.green(`Cursor hooks installed: ${d.join(", ")}`)),console.log(o.green("Cursor hooks.json updated with hook configuration"));}async function re(i={}){let h=process.cwd(),c=i.dryRun||false;if(c&&console.log(o.cyan(`
|
|
1634
1648
|
[dry-run] Showing what would be removed:
|
|
1635
1649
|
`)),!i.cursor){let d=r.join(h,".git");if(!e.existsSync(d)){console.log(o.red("Not a git repository."));return}let a=r.join(d,"hooks"),p=[];for(let l of ["post-commit","pre-push"]){let s=r.join(a,l);e.existsSync(s)&&e.readFileSync(s,"utf8").includes("paradigm")&&(c?console.log(o.gray(` Would remove: ${s}`)):e.unlinkSync(s),p.push(l));}c?p.length===0&&console.log(o.gray(" No paradigm git hooks to remove")):p.length>0?console.log(o.green(`Git hooks removed: ${p.join(", ")}`)):console.log(o.gray("No paradigm git hooks found to remove"));}if(i.cursor){let d=r.join(h,".cursor","hooks"),a=[];for(let l of ["paradigm-session-start.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-pretooluse.sh","paradigm-posttooluse.sh"]){let s=r.join(d,l);e.existsSync(s)&&(c?console.log(o.gray(` Would remove: ${s}`)):e.unlinkSync(s),a.push(l));}let p=r.join(h,".cursor","hooks.json");if(e.existsSync(p))if(c)console.log(o.gray(` Would clean paradigm entries from: ${p}`));else try{let l=JSON.parse(e.readFileSync(p,"utf8")),s=l.hooks||{};for(let t of ["sessionStart","stop","afterFileEdit","beforeShellExecution","preToolUse","postToolUse"])Array.isArray(s[t])&&(s[t]=s[t].filter(n=>!JSON.stringify(n).includes("paradigm-")),s[t].length===0&&delete s[t]);l.hooks=s,e.writeFileSync(p,JSON.stringify(l,null,2)+`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$1,b as b$3,c as c$2}from'./chunk-M4UMM6DC.js';import {j,b as b$2,a as a$2}from'./chunk-ODVKPZZ4.js';import {j as j$1,a,b as b$1,c as c$1,k}from'./chunk-
|
|
2
|
+
import {a as a$1,b as b$3,c as c$2}from'./chunk-M4UMM6DC.js';import {j,b as b$2,a as a$2}from'./chunk-ODVKPZZ4.js';import {j as j$1,a,b as b$1,c as c$1,k}from'./chunk-S7K7UPXL.js';import {c,b,d}from'./chunk-5TAVYPOV.js';import*as v from'fs';import*as $ from'path';import*as K from'crypto';import {execSync}from'child_process';import*as O from'js-yaml';import {z as z$1}from'zod';import {glob}from'glob';import*as he from'os';import ms from'sql.js';var Ft={};c(Ft,{contentSearch:()=>gs,detectFileRename:()=>Ot,generateFingerprint:()=>Ct,levenshteinDistance:()=>jt,levenshteinSimilarity:()=>Fe,searchSiblingFiles:()=>Lt,slidingWindowSearch:()=>we});function Ct(t){let e=t.split(`
|
|
3
3
|
`).filter(n=>n.trim()!=="");return {firstLine:ye(e[0]||""),lastLine:ye(e[e.length-1]||""),lineCount:e.length,structuralHash:At(e)}}function At(t){let e=t.map(n=>n.trim()).filter(n=>kt.test(n)).map(n=>{let s=n.match(kt);return s?s[1].trim():""}).join("|");return K.createHash("sha256").update(e).digest("hex").slice(0,16)}function ye(t){return t.trim().replace(/\s+/g," ").toLowerCase()}function jt(t,e){if(t===e)return 0;if(t.length===0)return e.length;if(e.length===0)return t.length;t.length>e.length&&([t,e]=[e,t]);let n=t.length,s=e.length;if(n>5e3||s>5e3)return Math.abs(n-s);let o=new Array(n+1),r=new Array(n+1);for(let i=0;i<=n;i++)o[i]=i;for(let i=1;i<=s;i++){r[0]=i;for(let a=1;a<=n;a++){let l=t[a-1]===e[i-1]?0:1;r[a]=Math.min(o[a]+1,r[a-1]+1,o[a-1]+l);}[o,r]=[r,o];}return o[n]}function Fe(t,e){if(t.length===0&&e.length===0)return 1;let n=Math.max(t.length,e.length);return 1-jt(t,e)/n}function we(t,e,n,s=3){let{lineCount:o}=e,r=Math.max(1,Math.floor(o*.8)),i=Math.ceil(o*1.2),a=[],l=Le(n);for(let d of [o,r,i])if(!(d>t.length))for(let u=0;u<=t.length-d;u++){let p=t.slice(u,u+d),g=fs(p,e,l);if(g>=.5){let m=p.join(`
|
|
4
4
|
`);a.push({windowStart:u+1,windowEnd:u+d,similarity:Fe(Le(m),l),score:g});}}let c=new Map;for(let d of a){let u=c.get(d.windowStart);(!u||d.score>u.score)&&c.set(d.windowStart,d);}return Array.from(c.values()).sort((d,u)=>u.score-d.score).slice(0,s)}function fs(t,e,n){let s=t.filter(p=>p.trim()!=="");if(s.length===0)return 0;let o=0,r=ye(s[0]),i=ye(s[s.length-1]),a=0;r===e.firstLine&&(a+=.5),i===e.lastLine&&(a+=.5),o+=a*ls,At(s)===e.structuralHash&&(o+=ds);let c=s.join(`
|
|
5
5
|
`),d=Fe(Le(c),n);d>=.8&&(o+=(d-.8)/.2*us);let u=s.length/e.lineCount;if(u>=.8&&u<=1.2){let p=1-Math.abs(1-u)/.2;o+=p*ps;}return o}function Le(t){return t.split(`
|
|
@@ -8,7 +8,7 @@ import {a as a$1,b as b$3,c as c$2}from'./chunk-M4UMM6DC.js';import {j,b as b$2,
|
|
|
8
8
|
`);for(let o of s){let r=o.split(" ");if(r.length>=3&&r[0].startsWith("R"))return r[2]}return null}catch{return null}}function Lt(t,e,n,s,o=10){let r=$.isAbsolute(e)?e:$.join(t,e);if(!v.existsSync(r))return [];let i=[];try{let a=v.readdirSync(r).filter(l=>!l.startsWith(".")&&v.statSync($.join(r,l)).isFile()).slice(0,o);for(let l of a)try{let d=v.readFileSync($.join(r,l),"utf8").split(`
|
|
9
9
|
`),u=we(d,n,s,1);if(u.length>0&&u[0].score>=.7){let p=$.relative(t,$.join(r,l));i.push({file:p,score:u[0].score,start:u[0].windowStart,end:u[0].windowEnd});}}catch{}}catch{return []}return i.sort((a,l)=>l.score-a.score)}function gs(t,e,n,s=true){let o=Ct(n),r=$.isAbsolute(e)?e:$.join(t,e);if(v.existsSync(r)){let d=v.readFileSync(r,"utf8").split(`
|
|
10
10
|
`),u=we(d,o,n);if(u.length>0){let p=u[0];return {found:p.score>=.7,score:p.score,suggestedStart:p.windowStart,suggestedEnd:p.windowEnd,similarity:p.similarity}}}let i=Ot(t,e);if(i){let c=$.join(t,i);if(v.existsSync(c)){let u=v.readFileSync(c,"utf8").split(`
|
|
11
|
-
`),p=we(u,o,n);if(p.length>0&&p[0].score>=.7)return {found:true,score:p[0].score,suggestedStart:p[0].windowStart,suggestedEnd:p[0].windowEnd,suggestedPath:i,similarity:p[0].similarity}}}let a=$.dirname(e),l=Lt(t,a,o,n);if(l.length>0&&l[0].score>=.7){let c=l[0];return {found:true,score:c.score,suggestedStart:c.start,suggestedEnd:c.end,suggestedPath:c.file!==e?c.file:void 0,similarity:c.score}}return {found:false,score:0}}var kt,ls,ds,us,ps,Nt=b(()=>{kt=/^\s*(function |class |if |else |for |while |switch |case |return |export |import |const |let |var |async |await |try |catch |throw |struct |enum |protocol |guard |def |fn )/;ls=.4,ds=.3,us=.2,ps=.1;});var Re=z$1.object({description:z$1.string(),type:z$1.string().optional(),parent:z$1.string().optional(),anchors:z$1.array(z$1.string()).optional(),tags:z$1.array(z$1.string()).optional(),endpoints:z$1.array(z$1.string()).optional(),tests:z$1.array(z$1.string()).optional(),rules:z$1.record(z$1.unknown()).optional(),aspects:z$1.array(z$1.string()).optional(),flows:z$1.array(z$1.string()).optional(),gates:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional(),states:z$1.array(z$1.string()).optional(),components:z$1.array(z$1.string()).optional(),location:z$1.string().optional(),locations:z$1.array(z$1.string()).optional(),uses:z$1.array(z$1.string()).optional(),"used-by":z$1.array(z$1.string()).optional(),"used-for":z$1.array(z$1.string()).optional(),exports:z$1.array(z$1.string()).optional(),status:z$1.string().optional(),properties:z$1.record(z$1.unknown()).optional(),handles:z$1.array(z$1.string()).optional()}).passthrough(),nt=Re.extend({id:z$1.string()}),pn=z$1.object({description:z$1.string().optional(),category:z$1.string().optional(),severity:z$1.enum(["info","warn","error"]).optional(),emitters:z$1.array(z$1.string()).optional(),related:z$1.array(z$1.string()).optional(),data:z$1.record(z$1.unknown()).optional()}),fn=z$1.union([pn,z$1.string().transform(t=>({description:t}))]),gn=z$1.object({from:z$1.string(),to:z$1.string(),type:z$1.string(),description:z$1.string().optional()}),mn=z$1.union([gn,z$1.string()]),hn=z$1.object({component:z$1.string(),action:z$1.string(),description:z$1.string().optional()}),it=z$1.union([hn,z$1.string()]),yn=z$1.object({name:z$1.string(),description:z$1.string().optional(),steps:z$1.array(it)}),wn=z$1.object({description:z$1.string().optional(),gates:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional(),components:z$1.array(z$1.string()).optional(),steps:z$1.array(it).optional()}),bn=z$1.object({description:z$1.string().optional(),requires:z$1.array(z$1.string()).optional(),keys:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional()}),Sn=z$1.object({description:z$1.string().optional(),default:z$1.unknown().optional(),type:z$1.string().optional()}),xn=z$1.object({description:z$1.string().optional(),tags:z$1.array(z$1.string()).optional(),anchors:z$1.array(z$1.string()).optional(),"applies-to":z$1.array(z$1.string()).optional(),enforcement:z$1.string().optional()}),vn=z$1.object({target:z$1.string(),type:z$1.string(),path:z$1.string()}),En=z$1.object({version:z$1.string().optional(),description:z$1.string().optional(),apiSpec:z$1.string().optional(),context:z$1.array(z$1.string()).optional(),rules:z$1.record(z$1.unknown()).optional(),features:z$1.union([z$1.array(nt),z$1.record(Re)]).optional(),components:z$1.union([z$1.array(nt),z$1.record(Re)]).optional(),gates:z$1.record(bn).optional(),states:z$1.record(Sn).optional(),signals:z$1.record(fn).optional(),aspects:z$1.record(xn).optional(),relationships:z$1.array(mn).optional(),flows:z$1.union([z$1.array(yn),z$1.record(wn)]).optional(),references:z$1.array(vn).optional()});function Ie(t){let e=Tn(t);return {data:e.data,errors:e.errors}}function Tn(t){let e=[],n=[],s;try{s=v.readFileSync(t,"utf8");}catch(a){let l=`Cannot read file: ${a.message}`;return e.push(l),n.push({message:l,type:"file"}),{data:null,errors:e,detailedErrors:n,rawContent:void 0,isYamlValid:false}}let o=s.replace(/^([#~!$^][\w-]+):/gm,'"$1":').replace(/^(\s*-\s+)([!#][\w-]+)$/gm,'$1"$2"'),r=null;try{r=O.load(o);}catch(a){let l=a,c=l.mark?.line?l.mark.line+1:void 0,d=`YAML syntax error: ${l.reason||a.message}`;return e.push(`${d}${c?` (line ${c})`:""}`),n.push({message:d,line:c,type:"yaml"}),{data:null,errors:e,detailedErrors:n,rawContent:s,isYamlValid:false}}if(r==null)return {data:{},errors:[],detailedErrors:[],rawContent:s,isYamlValid:true};if(typeof r=="object"&&r!==null){let a=r,l={"#":"components",$:"flows","^":"gates","!":"signals","~":"aspects"};for(let c of Object.keys(a)){let d=c[0],u=l[d];if(!u||c.length<2)continue;let p=c.slice(1),g=a[c];if(typeof g!="object"||g===null)continue;let m=a[u]||{};u in a||(a[u]=m),p in m||(m[p]=g),delete a[c];}}let i=En.safeParse(r);if(!i.success){for(let a of i.error.issues){let l=a.path.join("."),c=a.message;e.push(`Schema error at ${l||"/"}: ${c}`),n.push({message:c,path:l||"/",type:"schema"});}return {data:r,errors:e,detailedErrors:n,rawContent:s,isYamlValid:true}}return {data:i.data,errors:[],detailedErrors:[],rawContent:s,isYamlValid:true}}function po(t){return O.dump(t,{indent:2,lineWidth:-1,noRefs:true,sortKeys:false})}function ue(t){return t?Array.isArray(t)?t.map(e=>[e.id,e]):Object.entries(t):[]}async function $n(t){let e=$.resolve(t);return (await glob("**/.purpose",{cwd:e,absolute:true,ignore:["**/node_modules/**","**/dist/**","**/.git/**"]})).sort((s,o)=>{let r=s.split($.sep).length,i=o.split($.sep).length;return r-i})}async function at(t){let e=await $n(t),n=[];for(let s of e){let{data:o,errors:r}=Ie(s);o&&(n.push({filePath:s,data:o}),r.length>0&&console.warn(`Warnings parsing ${s}:`,r));}return n}function ct(t){let e=new Map;for(let{filePath:n,data:s}of t){let o=ue(s.features);for(let[r,i]of o)e.set(r,{item:i,filePath:n});}return e}function lt(t){let e=new Map;for(let{filePath:n,data:s}of t){let o=ue(s.components);for(let[r,i]of o)e.set(r,{item:i,filePath:n});}return e}function dt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.gates)for(let[o,r]of Object.entries(s.gates))e.set(o,{item:r,filePath:n});return e}function ut(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.states)for(let[o,r]of Object.entries(s.states))e.set(o,{item:r,filePath:n});return e}function pt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.flows)if(Array.isArray(s.flows))for(let o of s.flows)e.set(o.name,{item:{id:o.name,description:o.description,steps:o.steps},filePath:n});else for(let[o,r]of Object.entries(s.flows))e.set(o,{item:{id:o,description:r.description,gates:r.gates,signals:r.signals,components:r.components,steps:r.steps},filePath:n});return e}function ft(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.signals)for(let[o,r]of Object.entries(s.signals))e.set(o,{item:r,filePath:n});return e}function gt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.aspects)for(let[o,r]of Object.entries(s.aspects))e.set(o,{item:r,filePath:n});return e}function mt(t){let e=[],n=new Set;for(let{filePath:s,data:o}of t){let r=ue(o.features);for(let[a,l]of r)st(`#${a}`,l,s,e,n);let i=ue(o.components);for(let[a,l]of i)st(`#${a}`,l,s,e,n);}return e}function st(t,e,n,s,o){if(e.flows)for(let r of e.flows){let i=r.startsWith("$")?r:`$${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"flow",sourceSymbol:t,filePath:n}));}if(e.gates)for(let r of e.gates){let i=r.startsWith("^")?r:`^${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"gate",sourceSymbol:t,filePath:n}));}if(e.signals)for(let r of e.signals){let i=r.startsWith("!")?r:`!${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"signal",sourceSymbol:t,filePath:n}));}if(e.states)for(let r of e.states){let i=r.startsWith("#")?r:r.startsWith("%")?`#${r.slice(1)}`:`#${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"component",sourceSymbol:t,filePath:n}));}if(e.components)for(let r of e.components){let i=r.startsWith("#")?r:`#${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"component",sourceSymbol:t,filePath:n}));}if(e.aspects)for(let r of e.aspects){let i=r.startsWith("~")?r:`~${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"aspect",sourceSymbol:t,filePath:n}));}if(e.description){let r=In(e.description);for(let{symbol:i,type:a}of r)o.has(i)||(o.add(i),s.push({symbol:i,type:a,sourceSymbol:t,filePath:n}));}}var Rn=new Set(["$lib","$env","$app","$service-worker","$virtual","$schema","$ref","$id","$type"]);function In(t){let e=[],n=/([$^!#~%])([a-zA-Z][a-zA-Z0-9._-]*)/g,s;for(;(s=n.exec(t))!==null;){let o=s[1],r=s[2],i,a;switch(o){case "#":a="component",i=`#${r}`;break;case "$":a="flow",i=`$${r}`;break;case "^":a="gate",i=`^${r}`;break;case "!":a="signal",i=`!${r}`;break;case "~":a="aspect",i=`~${r}`;break;case "%":a="component",i=`#${r}`;break;default:continue}Rn.has(i)||e.push({symbol:i,type:a});}return e}function se(t){return t?Array.isArray(t)?t.map(e=>[e.id,e]):Object.entries(t):[]}function $e(t){return t?Array.isArray(t)?t.map(e=>e.id):Object.keys(t):[]}function go(t,e){let n=[],s=e?`${e}: `:"",o=se(t.features);for(let[i,a]of o)ot(i,a,"feature",s,n);let r=se(t.components);for(let[i,a]of r)ot(i,a,"component",s,n);if(t.relationships){let i=new Set([...$e(t.features),...$e(t.components)]);for(let a of t.relationships){if(typeof a=="string"||!a||!a.from||!a.to)continue;let l=a.from.replace(/^[@#$%~^!?]/,"");!i.has(l)&&!a.from.includes(".")&&n.push({type:"warning",message:`${s}Relationship references unknown source: "${a.from}"`,path:"relationships"});let c=a.to.replace(/^[@#$%~^!?]/,"");!i.has(c)&&!a.to.includes(".")&&n.push({type:"warning",message:`${s}Relationship references unknown target: "${a.to}"`,path:"relationships"});}}if(t.flows){let i=new Set($e(t.components));if(Array.isArray(t.flows)){for(let a of t.flows)if(!(!a||typeof a!="object")&&(a.name||n.push({type:"error",message:`${s}Flow missing required "name" field`,path:"flows"}),a.steps&&Array.isArray(a.steps)))for(let l of a.steps){if(typeof l=="string"||!l||!l.component)continue;let c=l.component.replace(/^#/,"");i.has(c)||n.push({type:"warning",message:`${s}Flow "${a.name}" references unknown component: "${l.component}"`,path:`flows.${a.name}`});}}else for(let[a,l]of Object.entries(t.flows))if(!(!l||typeof l!="object")&&l.steps&&Array.isArray(l.steps))for(let c of l.steps){if(typeof c=="string"||!c||!c.component)continue;let d=c.component.replace(/^#/,"");i.has(d)||n.push({type:"warning",message:`${s}Flow "${a}" references unknown component: "${c.component}"`,path:`flows.${a}`});}}return {valid:n.filter(i=>i.type==="error").length===0,issues:n}}function ot(t,e,n,s,o){let r=`${n}s.${t}`;if(/^[a-zA-Z][a-zA-Z0-9-]*$/.test(t)||o.push({type:"warning",message:`${s}${n} ID "${t}" should use alphanumeric characters and hyphens`,path:r}),(!e.description||e.description.trim()==="")&&o.push({type:"warning",message:`${s}${n} "${t}" has no description`,path:r}),e.endpoints)for(let i of e.endpoints)/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+\//.test(i)||o.push({type:"warning",message:`${s}Endpoint "${i}" in ${n} "${t}" may not be in standard format (e.g., "GET /api/users")`,path:`${r}.endpoints`});}function ht(t){let e=[],n=new Set;for(let{data:s}of t){let o=se(s.components);for(let[i]of o)n.add(`#${i}`),n.add(i);let r=se(s.features);for(let[i]of r)n.add(`#${i}`),n.add(i);if(s.gates)for(let i of Object.keys(s.gates))n.add(`^${i}`),n.add(i);if(s.signals)for(let i of Object.keys(s.signals))n.add(`!${i}`),n.add(i);if(s.flows)if(Array.isArray(s.flows))for(let i of s.flows)i?.name&&(n.add(`$${i.name}`),n.add(i.name));else for(let i of Object.keys(s.flows))n.add(`$${i}`),n.add(i);if(s.aspects)for(let i of Object.keys(s.aspects))n.add(`~${i}`),n.add(i);if(s.states)for(let i of Object.keys(s.states))n.add(`#${i}`),n.add(i);}for(let{filePath:s,data:o}of t){let r=s?`${s}: `:"",i=[...se(o.components),...se(o.features)];for(let[a,l]of i){if(l.parent){let d=l.parent.replace(/^["']|["']$/g,""),u=d.replace(/^[#$^!~@%?&]/,"");!n.has(d)&&!n.has(u)&&e.push({type:"warning",message:`${r}Component "${a}" references parent "${d}" which is not defined in any .purpose file`,path:`components.${a}.parent`});}let c=[{field:"gates",refs:l.gates},{field:"signals",refs:l.signals},{field:"flows",refs:l.flows},{field:"components",refs:l.components},{field:"aspects",refs:l.aspects}];for(let{field:d,refs:u}of c)if(u)for(let p of u){let g=p.replace(/^[#$^!~@%?&]/,"");!n.has(p)&&!n.has(g)&&e.push({type:"warning",message:`${r}Symbol "${a}" references ${d} "${p}" which is not defined`,path:`components.${a}.${d}`});}}if(o.flows){if(Array.isArray(o.flows)){for(let a of o.flows)if(a?.steps)for(let l of a.steps){if(typeof l=="string"||!l?.component)continue;let c=l.component.replace(/^#/,"");!n.has(l.component)&&!n.has(c)&&e.push({type:"warning",message:`${r}Flow "${a.name}" step references "${l.component}" which is not defined`,path:`flows.${a.name}.steps`});}}else for(let[a,l]of Object.entries(o.flows))if(l?.steps)for(let c of l.steps){if(typeof c=="string"||!c?.component)continue;let d=c.component.replace(/^#/,"");!n.has(c.component)&&!n.has(d)&&e.push({type:"warning",message:`${r}Flow "${a}" step references "${c.component}" which is not defined`,path:`flows.${a}.steps`});}}}return {valid:e.filter(s=>s.type==="error").length===0,issues:e}}var kn={visualizerPort:42195,watcherPort:42196,autoConnect:true};async function ge(t){let e=$.resolve(t),n=$.dirname(e);if(!v.existsSync(e))throw new Error(`Gate config not found: ${e}`);let s=v.readFileSync(e,"utf8"),o=O.load(s);if(!o.version)throw new Error('Gate config missing required "version" field');let r=[],i=o,a=o.gates||i.portals;if(a)for(let[c,d]of Object.entries(a))r.push(ke(c,d));if(o.include)for(let c of o.include){let d=$.join(n,c),u=await glob(d.replace(/\\/g,"/"));for(let p of u){let g=await Pn(p);r.push(...g);}}let l=[];if(o.flows)for(let[c,d]of Object.entries(o.flows))l.push(jn(c,d));return {version:o.version,gates:r,flows:l,settings:{dev:{...kn,...o.settings?.dev}}}}async function Pn(t){let e=v.readFileSync(t,"utf8"),n=O.load(e);if(n.id)return [ke(n.id,n)];if(n.gates){let s=[];for(let[o,r]of Object.entries(n.gates))s.push(ke(o,r));return s}return []}function ke(t,e){let n=[];if(e.locks)for(let o of e.locks)n.push(Cn(o));let s=[];if(e.prizes)for(let o of e.prizes)s.push(An(o));return {id:t,description:e.description,locks:n,prizes:s,position:e.position}}function Cn(t){let e=t,n=[];if(e.keys){for(let s of e.keys)if(typeof s=="string")n.push({expression:s});else if(s.expression){let o=s;n.push({expression:o.expression,description:o.description});}}return {id:e.id,description:e.description,keys:n,mode:e.mode||"all"}}function An(t){let e=t;return {id:e.id,oneTime:e.oneTime??false,metadata:e.metadata}}function jn(t,e){return {id:t,description:e.description,gates:e.gates||[],forkable:e.forkable}}async function wt(t){let e=$.resolve(t);return await glob("**/portal.yaml",{cwd:e,absolute:true,ignore:["**/node_modules/**","**/dist/**","**/.git/**"]})}var On=z$1.object({x:z$1.number(),y:z$1.number()}),Ln=z$1.object({x:z$1.number(),y:z$1.number(),zoom:z$1.number()}),bt=z$1.object({path:z$1.string(),include:z$1.array(z$1.string()).optional(),exclude:z$1.array(z$1.string()).optional()}),xt=z$1.object({id:z$1.string(),symbol:z$1.string(),type:z$1.enum(["feature","component","flow","state","aspect","gate","signal","idea"]),content:z$1.string().optional(),position:On,tags:z$1.array(z$1.string()).optional(),created:z$1.string(),modified:z$1.string().optional()}),vt=z$1.object({from:z$1.string(),to:z$1.string(),label:z$1.string().optional(),type:z$1.string().optional()}),Fn=z$1.object({id:z$1.string(),name:z$1.string(),nodes:z$1.array(z$1.string()),color:z$1.string().optional()}),Et=z$1.object({viewport:Ln,groups:z$1.array(Fn).optional()}),Nn=z$1.object({nodes:z$1.array(xt),connections:z$1.array(vt),layout:Et}),Dn=z$1.object({id:z$1.string(),name:z$1.string(),timestamp:z$1.string(),description:z$1.string().optional(),state:Nn});z$1.object({version:z$1.string(),metadata:z$1.object({name:z$1.string(),created:z$1.string(),modified:z$1.string()}),sources:z$1.object({purpose:z$1.array(bt).optional(),portal:z$1.array(bt).optional()}),nodes:z$1.array(xt),connections:z$1.array(vt),layout:Et,snapshots:z$1.array(Dn).optional()});async function Mn(t,e){let n=[],s=[],o=[],r=[];if(t.sources.purpose)for(let l of t.sources.purpose){let c=$.resolve(e,l.path);try{let d=await at(c);o.push(...d.map(E=>E.filePath));let u=ct(d);for(let[E,{item:x,filePath:S}]of u){let I=["feature",...x.tags||[]];n.push(D({id:`purpose-feature-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:I,componentType:x.type,parentSymbol:x.parent,anchors:x.anchors?.map(q=>Pe(q))}));}let p=lt(d);for(let[E,{item:x,filePath:S}]of p)n.push(D({id:`purpose-component-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:x.tags,componentType:x.type,parentSymbol:x.parent,anchors:x.anchors?.map(I=>Pe(I))}));let g=dt(d);for(let[E,{item:x,filePath:S}]of g)n.push(D({id:`purpose-gate-${E}`,symbol:`^${E}`,type:"gate",source:"purpose",filePath:S,data:x,description:x.description}));let m=ut(d);for(let[E,{item:x,filePath:S}]of m)n.push(D({id:`purpose-state-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:["state"]}));let y=pt(d);for(let[E,{item:x,filePath:S}]of y)n.push(D({id:`purpose-flow-${E}`,symbol:`$${E}`,type:"flow",source:"purpose",filePath:S,data:x,description:x.description}));let h=ft(d);for(let[E,{item:x,filePath:S}]of h)n.push(D({id:`purpose-signal-${E}`,symbol:`!${E}`,type:"signal",source:"purpose",filePath:S,data:x,description:x.description}));let w=gt(d);for(let[E,{item:x,filePath:S}]of w)n.push(D({id:`purpose-aspect-${E}`,symbol:`~${E}`,type:"aspect",source:"purpose",filePath:S,data:x,description:x.description,anchors:x.anchors?.map(I=>Pe(I)),appliesTo:x["applies-to"],tags:x.tags,enforcement:x.enforcement}));let P=mt(d),k=new Set(n.map(E=>E.symbol));for(let E of P)k.has(E.symbol)||(k.add(E.symbol),n.push(D({id:`purpose-ref-${E.type}-${E.symbol.slice(1)}`,symbol:E.symbol,type:E.type,source:"purpose",filePath:E.filePath,data:{referencedFrom:E.sourceSymbol},description:`Referenced from ${E.sourceSymbol}`})));}catch(d){s.push({source:"purpose",filePath:c,message:d.message});}}if(t.sources.portal)for(let l of t.sources.portal){let c=$.resolve(e,l.path);try{let d;if(c.endsWith(".yaml")||c.endsWith(".yml"))d=await ge(c),r.push(c);else {let u=await wt(c);if(r.push(...u),u.length>0){d=await ge(u[0]);for(let p=1;p<u.length;p++){let g=await ge(u[p]);d.gates.push(...g.gates),d.flows.push(...g.flows);}}else continue}for(let u of d.gates){n.push(Un(u,c));for(let p of u.prizes)n.push(D({id:`gate-signal-${u.id}-${p.id}`,symbol:`!${p.id}`,type:"signal",source:"portal",filePath:c,data:p,description:`Signal from gate ${u.id}`}));}for(let u of d.flows)n.push(zn(u,c));}catch(d){s.push({source:"portal",filePath:c,message:d.message});}}for(let l of t.nodes){let c=l.tags?.includes("idea");if(!l.content&&!c){let d=n.find(u=>u.symbol===l.symbol);if(d){d.position=l.position,d.tags=l.tags;continue}}n.push(D({id:l.id,symbol:l.symbol,type:l.type,source:"premise",filePath:".premise",data:l,description:l.content,position:l.position,tags:l.tags,created:l.created,modified:l.modified}));}Wn(n);let i=new Map;for(let l of n){let c=i.get(l.symbol)||[];c.includes(l.filePath)||c.push(l.filePath),i.set(l.symbol,c);}let a=[];for(let[l,c]of i)c.length>1&&a.push({symbol:l,files:c});return {symbols:n,purposeFiles:o,portalFiles:r,errors:s,timestamp:Date.now(),...a.length>0?{duplicateSymbols:a}:{}}}function D(t){return {...t,data:t.data??null,references:t.references??[],referencedBy:t.referencedBy??[]}}function Un(t,e){return D({id:`gate-${t.id}`,symbol:`^${t.id}`,type:"gate",source:"portal",filePath:e,data:t,description:t.description,position:t.position})}function zn(t,e){return D({id:`gate-flow-${t.id}`,symbol:`$${t.id}`,type:"flow",source:"portal",filePath:e,data:t,description:t.description})}function Pe(t){let e=t.lastIndexOf(":");if(e===-1||e===t.length-1)return {path:t,lines:0,raw:t};let n=t.slice(e+1),s=t.slice(0,e);if(!/^[\d,\- ]+$/.test(n))return {path:t,lines:0,raw:t};if(n.includes("-")){let[o,r]=n.split("-").map(Number);return {path:s,lines:[o,r],raw:t}}else if(n.includes(",")){let o=n.split(",").map(Number);return {path:s,lines:o,raw:t}}else return {path:s,lines:Number(n),raw:t}}var Hn=new Set(["$lib","$env","$app","$service-worker","$virtual","$schema","$ref","$id","$type"]);function Wn(t){let e=new Map(t.map(n=>[n.symbol,n]));for(let n of t){let s=JSON.stringify(n.data),o=/(?:\?[@#$%~^!]|[@#$%~^!?])[a-zA-Z][\w-]*/g,r=(s.match(o)||[]).filter(i=>!Hn.has(i));for(let i of r)if(i!==n.symbol&&e.has(i)){n.references.includes(i)||n.references.push(i);let a=e.get(i);a&&!a.referencedBy.includes(n.symbol)&&a.referencedBy.push(n.symbol);}}}async function Tt(t){let e={metadata:{name:$.basename(t),created:new Date().toISOString(),modified:new Date().toISOString()},sources:{purpose:[{path:"./"}],portal:[{path:"./"}]},nodes:[]};return Mn(e,t)}function Gn(){return {entries:new Map,byType:new Map,bySource:new Map,timestamp:0}}function vo(t){let e=Gn();e.timestamp=t.timestamp;for(let n of t.symbols)e.entries.set(n.id,n),e.byType.has(n.type)||e.byType.set(n.type,[]),e.byType.get(n.type).push(n),e.bySource.has(n.source)||e.bySource.set(n.source,[]),e.bySource.get(n.source).push(n);return e}function me(t,e){for(let n of t.entries.values())if(n.symbol===e)return n}function Eo(t,e){return t.byType.get(e)||[]}function To(t,e){let n=e.toLowerCase(),s=[];for(let o of t.entries.values()){if(o.symbol.toLowerCase().includes(n)){s.push(o);continue}if(o.description?.toLowerCase().includes(n)){s.push(o);continue}if(o.tags?.some(r=>r.toLowerCase().includes(n))){s.push(o);continue}if(o.componentType?.toLowerCase().includes(n)){s.push(o);continue}}return s}function _o(t,e){let n=me(t,e);return n?n.referencedBy.map(s=>me(t,s)).filter(s=>s!==void 0):[]}function $o(t,e){let n=me(t,e);return n?n.references.map(s=>me(t,s)).filter(s=>s!==void 0):[]}function Ro(t){let e={component:0,flow:0,gate:0,signal:0,aspect:0};for(let[n,s]of t.byType)n in e&&(e[n]=s.length);return e}function Io(t){return Array.from(t.entries.values())}var Bn="0.1.0",Xn="1.0.0";function Ce(t,e){let n={$meta:qn(e.projectName,t),components:{},features:{},flows:{},state:{},gates:{},signals:{},aspects:{},screens:{},symbolMap:{}};for(let o of t.symbols)Vn(o,n,e);if(e.screenDefinitions)for(let[o,r]of Object.entries(e.screenDefinitions))n.screens[o]||(n.screens[o]={id:o,name:Y(o),route:r.route,path:"",components:r.components,features:r.features});let s={};for(let o of Object.values(n.components))o.componentType&&(s[o.componentType]=(s[o.componentType]||0)+1);for(let o of Object.values(n.features))o.componentType&&(s[o.componentType]=(s[o.componentType]||0)+1);return Object.keys(s).length>0&&(n.$meta.componentTypes=s),ns(n),n}function qn(t,e){return {version:Xn,project:t,generatedAt:new Date().toISOString(),paradigmVersion:Bn,sources:{purposeFiles:e.purposeFiles.length,portalFiles:e.portalFiles.length,premiseFiles:e.symbols.filter(n=>n.source==="premise").length>0?1:0}}}function Vn(t,e,n){let{type:s}=t;switch(s){case "component":Yn(t,e,n);break;case "feature":Jn(t,e,n);break;case "flow":Kn(t,e);break;case "state":Qn(t,e);break;case "gate":Zn(t,e);break;case "signal":es(t,e);break;case "aspect":ts(t,e);break;}}function Yn(t,e,n){let s=ee(t.symbol),o=_t(s,t.data,n.visualTagMappings),r={id:s,name:Y(s),symbol:t.symbol,category:"components",path:t.filePath,description:t.description,visualTags:o,related:t.references,componentType:t.componentType,parent:t.parentSymbol};e.components[s]=r,e.symbolMap[t.symbol]={category:"components",id:s};}function Jn(t,e,n){let s=ee(t.symbol),o=_t(s,t.data,n.visualTagMappings),r={id:s,name:Y(s),symbol:t.symbol,category:"features",path:t.filePath,description:t.description,visualTags:o,related:t.references,componentType:t.componentType,parent:t.parentSymbol};e.features[s]=r,e.symbolMap[t.symbol]={category:"features",id:s};}function Kn(t,e){let n=ee(t.symbol),s=t.data,o=[];if(s?.steps)for(let i=0;i<s.steps.length;i++){let a=s.steps[i];o.push({id:`${n}-step-${i}`,name:a.action||`Step ${i+1}`,target:a.component,description:a.description,order:i});}let r={id:n,name:Y(n),symbol:t.symbol,path:t.filePath,description:t.description,steps:o};e.flows[n]=r,e.symbolMap[t.symbol]={category:"flows",id:n};}function Qn(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,path:t.filePath,description:t.description,consumers:t.referencedBy};e.state[n]=s,e.symbolMap[t.symbol]={category:"state",id:n};}function Zn(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"gates",path:t.filePath,description:t.description,related:t.references};e.gates[n]=s,e.symbolMap[t.symbol]={category:"gates",id:n};}function es(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"signals",path:t.filePath,description:t.description,related:t.references};e.signals[n]=s,e.symbolMap[t.symbol]={category:"signals",id:n};}function ts(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"aspects",path:t.filePath,description:t.description,related:t.references};e.aspects[n]=s,e.symbolMap[t.symbol]={category:"aspects",id:n};}function ns(t){for(let e of Object.values(t.screens))if(e.components)for(let n of e.components){let s=t.components[n];s&&(s.screens=s.screens||[],s.screens.includes(e.id)||s.screens.push(e.id));}}function ee(t){return t.slice(1)}function Y(t){return t.split("-").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function _t(t,e,n){let s=[];if(n?.[t])return n[t];let o=[[/button/i,"button"],[/btn/i,"button"],[/form/i,"form"],[/input/i,"input"],[/field/i,"input"],[/select/i,"input"],[/card/i,"card"],[/list/i,"list"],[/table/i,"list"],[/modal/i,"modal"],[/dialog/i,"modal"],[/drawer/i,"modal"],[/nav/i,"nav"],[/menu/i,"menu"],[/dropdown/i,"menu"],[/header/i,"header"],[/footer/i,"footer"],[/sidebar/i,"sidebar"],[/hero/i,"hero"],[/grid/i,"grid"],[/chart/i,"chart"],[/graph/i,"chart"],[/icon/i,"icon"],[/image/i,"image"],[/avatar/i,"avatar"],[/badge/i,"badge"],[/tag/i,"badge"],[/tab/i,"tab"],[/accordion/i,"accordion"],[/toast/i,"toast"],[/notification/i,"toast"],[/alert/i,"toast"],[/spinner/i,"spinner"],[/loader/i,"spinner"],[/loading/i,"spinner"],[/skeleton/i,"skeleton"]];for(let[r,i]of o)r.test(t)&&s.push(i);return s}function Ae(t){return JSON.stringify(t,null,2)}function je(t,e="unknown"){j$1().trackToolCall(e,t);}function Mo(t,e="paradigm://unknown"){j$1().trackResourceRead(e,t);}function ss(){k();}function os(t,e){switch(t){case "paradigm_search":return {summary:`Searched for "${e.query}"${e.type?` (type: ${e.type})`:""}`,symbol:e.query};case "paradigm_ripple":return {summary:`Ripple analysis on ${e.symbol}${e.depth?` (depth: ${e.depth})`:""}`,symbol:e.symbol};case "paradigm_related":return {summary:`Checked relations for ${e.symbol}`,symbol:e.symbol};case "paradigm_status":return {summary:"Checked project status"};case "paradigm_navigate":{let n=e.intent,s=e.target,o=e.task;return n==="context"&&o?{summary:`Navigate context: "${o}"`}:s?{summary:`Navigate ${n||"find"}: ${s}`,symbol:s}:{summary:`Navigate (${n||"unknown"})`}}case "paradigm_gates_for_route":return {summary:`Gate suggestions for ${e.method||"GET"} ${e.route}`};case "paradigm_wisdom_context":return {summary:`Checked wisdom for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_context":return {summary:`Checked history for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_record":return {summary:`Recorded ${e.type}: ${(e.description||"").slice(0,60)}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_fragility":return {summary:`Checked fragility for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_flows_affected":return {summary:`Checked flows affected by ${e.symbol}`,symbol:e.symbol};case "paradigm_reindex":return {summary:"Rebuilt static index files"};case "paradigm_session_checkpoint":return {summary:`Checkpoint: phase=${e.phase}, ${(e.context||"").slice(0,60)}`};case "paradigm_task_create":return {summary:`Created task: "${(e.blurb||"").slice(0,60)}"`};case "paradigm_task_done":return {summary:`Completed task ${e.id}`};case "paradigm_task_shelve":return {summary:`Shelved task ${e.id}`};case "paradigm_task_list":return {summary:`Listed tasks (status: ${e.status||"open"})`};case "paradigm_task_update":return {summary:`Updated task ${e.id}`};case "paradigm_assessment_record":return {summary:`Assessment: ${(e.title||"").slice(0,60)} \u2192 ${e.arc_id}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_assessment_list":return {summary:e.arc_id?`Listed entries in ${e.arc_id}`:"Listed assessment arcs"};case "paradigm_assessment_search":return {summary:`Searched assessments${e.symbol?` for ${e.symbol}`:""}`,symbol:e.symbol};case "paradigm_assessment_arc_create":return {summary:`Created arc: ${e.id}`};case "paradigm_assessment_arc_close":return {summary:`Closed arc: ${e.arc_id}`};default:{let n=t.replace(/^paradigm_/,""),s=Object.values(e).find(o=>typeof o=="string"&&o.length>0);return {summary:s?`${n}: ${s.slice(0,60)}`:n,symbol:e.symbol||void 0}}}}function Uo(t,e){let n=j$1(),{summary:s,symbol:o}=os(t,e);n.addBreadcrumb("tool-call",s,{tool:t,symbol:o});}function zo(){return [{name:"paradigm_context_check",description:"Check if context handoff is recommended based on session activity. Call this periodically during long sessions. Returns usage percentage and recommendation (continue, consider-handoff, handoff-recommended, handoff-urgent). ~100 tokens.",inputSchema:{type:"object",properties:{estimatedTotalTokens:{type:"number",description:"Optional: Your estimate of total conversation tokens (if available)"},contextWindowSize:{type:"number",description:"Context window size in tokens (default: 200000)"}}},annotations:{readOnlyHint:true,destructiveHint:false}},{name:"paradigm_handoff_prepare",description:"Prepare a handoff summary. Generates a structured handoff file with markdown summary and recovery instructions. Returns structured markdown with summary, modified files, and next steps. ~300 tokens.",inputSchema:{type:"object",properties:{summary:{type:"string",description:"Brief summary of work done in this session"},nextSteps:{type:"array",items:{type:"string"},description:"List of next steps for the continuing session"},agent:{type:"string",description:'Target agent role (e.g., "builder", "architect")'},modifiedFiles:{type:"array",items:{type:"string"},description:"List of files modified in this session"},symbolsTouched:{type:"array",items:{type:"string"},description:"List of symbols (@feature, #component, etc.) touched"},openQuestions:{type:"array",items:{type:"string"},description:"Unresolved questions or decisions needed"}},required:["summary"]},annotations:{readOnlyHint:false,destructiveHint:false}},{name:"paradigm_session_stats",description:"Get current session statistics (MCP interactions, estimated tokens). Returns tool call count, estimated tokens used, and cost breakdown. ~100 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:true,destructiveHint:false}},{name:"paradigm_session_recover",description:"Load previous session breadcrumbs for continuity. Call this at the start of a new session to understand what was done before. Returns symbols modified, files explored, recent actions, and suggestions for continuity. ~200 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:true,destructiveHint:false}},{name:"paradigm_session_checkpoint",description:"Save a cognitive-transition checkpoint for crash recovery. Call when transitioning between phases (planning \u2192 implementing \u2192 validating \u2192 complete). ~100 tokens.",inputSchema:{type:"object",properties:{phase:{type:"string",enum:["planning","implementing","validating","complete"],description:"Current workflow phase"},context:{type:"string",description:"What's top-of-mind right now (1-3 sentences)"},externalId:{type:"string",description:'Optional: deterministic ID from external source for automatic session recovery (e.g. "linear:PROJ-123", "github:owner/repo#42")'},plan:{type:"string",description:"Optional: the current plan or approach"},modifiedFiles:{type:"array",items:{type:"string"},description:"Optional: files modified so far"},symbolsTouched:{type:"array",items:{type:"string"},description:"Optional: symbols touched so far"},decisions:{type:"array",items:{type:"string"},description:"Optional: key decisions made so far"}},required:["phase","context"]},annotations:{readOnlyHint:false,destructiveHint:false}},{name:"paradigm_session_checkpoint",description:"Save a cognitive-transition checkpoint for crash recovery. Call when transitioning between phases (planning \u2192 implementing \u2192 validating \u2192 complete). ~100 tokens.",inputSchema:{type:"object",properties:{phase:{type:"string",enum:["planning","implementing","validating","complete"],description:"Current workflow phase"},context:{type:"string",description:"What's top-of-mind right now (1-3 sentences)"},externalId:{type:"string",description:'Optional: deterministic ID from external source for automatic session recovery (e.g. "linear:PROJ-123", "github:owner/repo#42")'},plan:{type:"string",description:"Optional: the current plan or approach"},modifiedFiles:{type:"array",items:{type:"string"},description:"Optional: files modified so far"},symbolsTouched:{type:"array",items:{type:"string"},description:"Optional: symbols touched so far"},decisions:{type:"array",items:{type:"string"},description:"Optional: key decisions made so far"}},required:["phase","context"]}}]}async function Ho(t,e,n){let s=j$1();if(t==="paradigm_context_check"){let o=e.contextWindowSize||2e5,r=e.estimatedTotalTokens,i=s.getStats(),{recommendation:a,message:l,usagePercent:c,signals:d}=s.getHandoffRecommendation(o,r),u=s.getDurationMinutes();return {handled:true,text:JSON.stringify({recommendation:a,message:l,stats:{sessionDurationMinutes:u,mcpToolCalls:i.totals.toolCallCount,mcpResourceReads:i.totals.resourceReadCount,estimatedMcpTokens:i.totals.totalTokens,estimatedTotalTokens:r||Math.round(i.totals.totalTokens*5),contextWindowSize:o,usagePercent:c},signals:d,action:a==="continue"?null:"Call paradigm_handoff_prepare to create handoff file"},null,2)}}if(t==="paradigm_handoff_prepare"){let o=e.summary,r=e.nextSteps||[],i=e.agent||"builder",a$1=e.modifiedFiles||[],l=e.symbolsTouched||[],c=e.openQuestions||[],d=s.getStats(),u=s.getCostBreakdown(),p=`h${Date.now().toString(36)}`,g=new Date().toISOString(),m={id:p,timestamp:g,from:"current-session",to:i,summary:o,nextSteps:r,modifiedFiles:a$1,symbolsTouched:l,openQuestions:c,sessionStats:{duration:s.getDurationMinutes(),mcpCalls:d.totals.toolCallCount+d.totals.resourceReadCount,estimatedTokens:d.totals.totalTokens,estimatedCostUsd:u.total.costUsd,model:u.model},status:"pending"};try{a(n.rootDir,m);}catch{}let y=`# Handoff: ${g}
|
|
11
|
+
`),p=we(u,o,n);if(p.length>0&&p[0].score>=.7)return {found:true,score:p[0].score,suggestedStart:p[0].windowStart,suggestedEnd:p[0].windowEnd,suggestedPath:i,similarity:p[0].similarity}}}let a=$.dirname(e),l=Lt(t,a,o,n);if(l.length>0&&l[0].score>=.7){let c=l[0];return {found:true,score:c.score,suggestedStart:c.start,suggestedEnd:c.end,suggestedPath:c.file!==e?c.file:void 0,similarity:c.score}}return {found:false,score:0}}var kt,ls,ds,us,ps,Nt=b(()=>{kt=/^\s*(function |class |if |else |for |while |switch |case |return |export |import |const |let |var |async |await |try |catch |throw |struct |enum |protocol |guard |def |fn )/;ls=.4,ds=.3,us=.2,ps=.1;});var Re=z$1.object({description:z$1.string(),type:z$1.string().optional(),parent:z$1.string().optional(),anchors:z$1.array(z$1.string()).optional(),tags:z$1.array(z$1.string()).optional(),endpoints:z$1.array(z$1.string()).optional(),tests:z$1.array(z$1.string()).optional(),rules:z$1.record(z$1.unknown()).optional(),aspects:z$1.array(z$1.string()).optional(),flows:z$1.array(z$1.string()).optional(),gates:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional(),states:z$1.array(z$1.string()).optional(),components:z$1.array(z$1.string()).optional(),location:z$1.string().optional(),locations:z$1.array(z$1.string()).optional(),uses:z$1.array(z$1.string()).optional(),"used-by":z$1.array(z$1.string()).optional(),"used-for":z$1.array(z$1.string()).optional(),exports:z$1.array(z$1.string()).optional(),status:z$1.string().optional(),properties:z$1.record(z$1.unknown()).optional(),handles:z$1.array(z$1.string()).optional()}).passthrough(),nt=Re.extend({id:z$1.string()}),pn=z$1.object({description:z$1.string().optional(),category:z$1.string().optional(),severity:z$1.enum(["info","warn","error"]).optional(),emitters:z$1.array(z$1.string()).optional(),related:z$1.array(z$1.string()).optional(),data:z$1.record(z$1.unknown()).optional()}),fn=z$1.union([pn,z$1.string().transform(t=>({description:t}))]),gn=z$1.object({from:z$1.string(),to:z$1.string(),type:z$1.string(),description:z$1.string().optional()}),mn=z$1.union([gn,z$1.string()]),hn=z$1.object({component:z$1.string(),action:z$1.string(),description:z$1.string().optional()}),it=z$1.union([hn,z$1.string()]),yn=z$1.object({name:z$1.string(),description:z$1.string().optional(),steps:z$1.array(it)}),wn=z$1.object({description:z$1.string().optional(),gates:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional(),components:z$1.array(z$1.string()).optional(),steps:z$1.array(it).optional()}),bn=z$1.object({description:z$1.string().optional(),requires:z$1.array(z$1.string()).optional(),keys:z$1.array(z$1.string()).optional(),signals:z$1.array(z$1.string()).optional()}),Sn=z$1.object({description:z$1.string().optional(),default:z$1.unknown().optional(),type:z$1.string().optional()}),xn=z$1.object({description:z$1.string().optional(),tags:z$1.array(z$1.string()).optional(),anchors:z$1.array(z$1.string()).optional(),"applies-to":z$1.array(z$1.string()).optional(),enforcement:z$1.string().optional()}),vn=z$1.object({target:z$1.string(),type:z$1.string(),path:z$1.string()}),En=z$1.object({version:z$1.string().optional(),description:z$1.string().optional(),apiSpec:z$1.string().optional(),context:z$1.array(z$1.string()).optional(),rules:z$1.record(z$1.unknown()).optional(),features:z$1.union([z$1.array(nt),z$1.record(Re)]).optional(),components:z$1.union([z$1.array(nt),z$1.record(Re)]).optional(),gates:z$1.record(bn).optional(),states:z$1.record(Sn).optional(),signals:z$1.record(fn).optional(),aspects:z$1.record(xn).optional(),relationships:z$1.array(mn).optional(),flows:z$1.union([z$1.array(yn),z$1.record(wn)]).optional(),references:z$1.array(vn).optional()});function Ie(t){let e=Tn(t);return {data:e.data,errors:e.errors}}function Tn(t){let e=[],n=[],s;try{s=v.readFileSync(t,"utf8");}catch(a){let l=`Cannot read file: ${a.message}`;return e.push(l),n.push({message:l,type:"file"}),{data:null,errors:e,detailedErrors:n,rawContent:void 0,isYamlValid:false}}let o=s.replace(/^([#~!$^][\w-]+):/gm,'"$1":').replace(/^(\s*-\s+)([!#][\w-]+)$/gm,'$1"$2"'),r=null;try{r=O.load(o);}catch(a){let l=a,c=l.mark?.line?l.mark.line+1:void 0,d=`YAML syntax error: ${l.reason||a.message}`;return e.push(`${d}${c?` (line ${c})`:""}`),n.push({message:d,line:c,type:"yaml"}),{data:null,errors:e,detailedErrors:n,rawContent:s,isYamlValid:false}}if(r==null)return {data:{},errors:[],detailedErrors:[],rawContent:s,isYamlValid:true};if(typeof r=="object"&&r!==null){let a=r,l={"#":"components",$:"flows","^":"gates","!":"signals","~":"aspects"};for(let c of Object.keys(a)){let d=c[0],u=l[d];if(!u||c.length<2)continue;let p=c.slice(1),g=a[c];if(typeof g!="object"||g===null)continue;let m=a[u]||{};u in a||(a[u]=m),p in m||(m[p]=g),delete a[c];}}let i=En.safeParse(r);if(!i.success){for(let a of i.error.issues){let l=a.path.join("."),c=a.message;e.push(`Schema error at ${l||"/"}: ${c}`),n.push({message:c,path:l||"/",type:"schema"});}return {data:r,errors:e,detailedErrors:n,rawContent:s,isYamlValid:true}}return {data:i.data,errors:[],detailedErrors:[],rawContent:s,isYamlValid:true}}function po(t){return O.dump(t,{indent:2,lineWidth:-1,noRefs:true,sortKeys:false})}function ue(t){return t?Array.isArray(t)?t.map(e=>[e.id,e]):Object.entries(t):[]}async function $n(t){let e=$.resolve(t);return (await glob("**/.purpose",{cwd:e,absolute:true,ignore:["**/node_modules/**","**/dist/**","**/.git/**"]})).sort((s,o)=>{let r=s.split($.sep).length,i=o.split($.sep).length;return r-i})}async function at(t){let e=await $n(t),n=[];for(let s of e){let{data:o,errors:r}=Ie(s);o&&(n.push({filePath:s,data:o}),r.length>0&&console.warn(`Warnings parsing ${s}:`,r));}return n}function ct(t){let e=new Map;for(let{filePath:n,data:s}of t){let o=ue(s.features);for(let[r,i]of o)e.set(r,{item:i,filePath:n});}return e}function lt(t){let e=new Map;for(let{filePath:n,data:s}of t){let o=ue(s.components);for(let[r,i]of o)e.set(r,{item:i,filePath:n});}return e}function dt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.gates)for(let[o,r]of Object.entries(s.gates))e.set(o,{item:r,filePath:n});return e}function ut(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.states)for(let[o,r]of Object.entries(s.states))e.set(o,{item:r,filePath:n});return e}function pt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.flows)if(Array.isArray(s.flows))for(let o of s.flows)e.set(o.name,{item:{id:o.name,description:o.description,steps:o.steps},filePath:n});else for(let[o,r]of Object.entries(s.flows))e.set(o,{item:{id:o,description:r.description,gates:r.gates,signals:r.signals,components:r.components,steps:r.steps},filePath:n});return e}function ft(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.signals)for(let[o,r]of Object.entries(s.signals))e.set(o,{item:r,filePath:n});return e}function gt(t){let e=new Map;for(let{filePath:n,data:s}of t)if(s.aspects)for(let[o,r]of Object.entries(s.aspects))e.set(o,{item:r,filePath:n});return e}function mt(t){let e=[],n=new Set;for(let{filePath:s,data:o}of t){let r=ue(o.features);for(let[a,l]of r)st(`#${a}`,l,s,e,n);let i=ue(o.components);for(let[a,l]of i)st(`#${a}`,l,s,e,n);}return e}function st(t,e,n,s,o){if(e.flows)for(let r of e.flows){let i=r.startsWith("$")?r:`$${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"flow",sourceSymbol:t,filePath:n}));}if(e.gates)for(let r of e.gates){let i=r.startsWith("^")?r:`^${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"gate",sourceSymbol:t,filePath:n}));}if(e.signals)for(let r of e.signals){let i=r.startsWith("!")?r:`!${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"signal",sourceSymbol:t,filePath:n}));}if(e.states)for(let r of e.states){let i=r.startsWith("#")?r:r.startsWith("%")?`#${r.slice(1)}`:`#${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"component",sourceSymbol:t,filePath:n}));}if(e.components)for(let r of e.components){let i=r.startsWith("#")?r:`#${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"component",sourceSymbol:t,filePath:n}));}if(e.aspects)for(let r of e.aspects){let i=r.startsWith("~")?r:`~${r}`;o.has(i)||(o.add(i),s.push({symbol:i,type:"aspect",sourceSymbol:t,filePath:n}));}if(e.description){let r=In(e.description);for(let{symbol:i,type:a}of r)o.has(i)||(o.add(i),s.push({symbol:i,type:a,sourceSymbol:t,filePath:n}));}}var Rn=new Set(["$lib","$env","$app","$service-worker","$virtual","$schema","$ref","$id","$type"]);function In(t){let e=[],n=/([$^!#~%])([a-zA-Z][a-zA-Z0-9._-]*)/g,s;for(;(s=n.exec(t))!==null;){let o=s[1],r=s[2],i,a;switch(o){case "#":a="component",i=`#${r}`;break;case "$":a="flow",i=`$${r}`;break;case "^":a="gate",i=`^${r}`;break;case "!":a="signal",i=`!${r}`;break;case "~":a="aspect",i=`~${r}`;break;case "%":a="component",i=`#${r}`;break;default:continue}Rn.has(i)||e.push({symbol:i,type:a});}return e}function se(t){return t?Array.isArray(t)?t.map(e=>[e.id,e]):Object.entries(t):[]}function $e(t){return t?Array.isArray(t)?t.map(e=>e.id):Object.keys(t):[]}function go(t,e){let n=[],s=e?`${e}: `:"",o=se(t.features);for(let[i,a]of o)ot(i,a,"feature",s,n);let r=se(t.components);for(let[i,a]of r)ot(i,a,"component",s,n);if(t.relationships){let i=new Set([...$e(t.features),...$e(t.components)]);for(let a of t.relationships){if(typeof a=="string"||!a||!a.from||!a.to)continue;let l=a.from.replace(/^[@#$%~^!?]/,"");!i.has(l)&&!a.from.includes(".")&&n.push({type:"warning",message:`${s}Relationship references unknown source: "${a.from}"`,path:"relationships"});let c=a.to.replace(/^[@#$%~^!?]/,"");!i.has(c)&&!a.to.includes(".")&&n.push({type:"warning",message:`${s}Relationship references unknown target: "${a.to}"`,path:"relationships"});}}if(t.flows){let i=new Set($e(t.components));if(Array.isArray(t.flows)){for(let a of t.flows)if(!(!a||typeof a!="object")&&(a.name||n.push({type:"error",message:`${s}Flow missing required "name" field`,path:"flows"}),a.steps&&Array.isArray(a.steps)))for(let l of a.steps){if(typeof l=="string"||!l||!l.component)continue;let c=l.component.replace(/^#/,"");i.has(c)||n.push({type:"warning",message:`${s}Flow "${a.name}" references unknown component: "${l.component}"`,path:`flows.${a.name}`});}}else for(let[a,l]of Object.entries(t.flows))if(!(!l||typeof l!="object")&&l.steps&&Array.isArray(l.steps))for(let c of l.steps){if(typeof c=="string"||!c||!c.component)continue;let d=c.component.replace(/^#/,"");i.has(d)||n.push({type:"warning",message:`${s}Flow "${a}" references unknown component: "${c.component}"`,path:`flows.${a}`});}}return {valid:n.filter(i=>i.type==="error").length===0,issues:n}}function ot(t,e,n,s,o){let r=`${n}s.${t}`;if(/^[a-zA-Z][a-zA-Z0-9-]*$/.test(t)||o.push({type:"warning",message:`${s}${n} ID "${t}" should use alphanumeric characters and hyphens`,path:r}),(!e.description||e.description.trim()==="")&&o.push({type:"warning",message:`${s}${n} "${t}" has no description`,path:r}),e.endpoints)for(let i of e.endpoints)/^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+\//.test(i)||o.push({type:"warning",message:`${s}Endpoint "${i}" in ${n} "${t}" may not be in standard format (e.g., "GET /api/users")`,path:`${r}.endpoints`});}function ht(t){let e=[],n=new Set;for(let{data:s}of t){let o=se(s.components);for(let[i]of o)n.add(`#${i}`),n.add(i);let r=se(s.features);for(let[i]of r)n.add(`#${i}`),n.add(i);if(s.gates)for(let i of Object.keys(s.gates))n.add(`^${i}`),n.add(i);if(s.signals)for(let i of Object.keys(s.signals))n.add(`!${i}`),n.add(i);if(s.flows)if(Array.isArray(s.flows))for(let i of s.flows)i?.name&&(n.add(`$${i.name}`),n.add(i.name));else for(let i of Object.keys(s.flows))n.add(`$${i}`),n.add(i);if(s.aspects)for(let i of Object.keys(s.aspects))n.add(`~${i}`),n.add(i);if(s.states)for(let i of Object.keys(s.states))n.add(`#${i}`),n.add(i);}for(let{filePath:s,data:o}of t){let r=s?`${s}: `:"",i=[...se(o.components),...se(o.features)];for(let[a,l]of i){if(l.parent){let d=l.parent.replace(/^["']|["']$/g,""),u=d.replace(/^[#$^!~@%?&]/,"");!n.has(d)&&!n.has(u)&&e.push({type:"warning",message:`${r}Component "${a}" references parent "${d}" which is not defined in any .purpose file`,path:`components.${a}.parent`});}let c=[{field:"gates",refs:l.gates},{field:"signals",refs:l.signals},{field:"flows",refs:l.flows},{field:"components",refs:l.components},{field:"aspects",refs:l.aspects}];for(let{field:d,refs:u}of c)if(u)for(let p of u){let g=p.replace(/^[#$^!~@%?&]/,"");!n.has(p)&&!n.has(g)&&e.push({type:"warning",message:`${r}Symbol "${a}" references ${d} "${p}" which is not defined`,path:`components.${a}.${d}`});}}if(o.flows){if(Array.isArray(o.flows)){for(let a of o.flows)if(a?.steps)for(let l of a.steps){if(typeof l=="string"||!l?.component)continue;let c=l.component.replace(/^#/,"");!n.has(l.component)&&!n.has(c)&&e.push({type:"warning",message:`${r}Flow "${a.name}" step references "${l.component}" which is not defined`,path:`flows.${a.name}.steps`});}}else for(let[a,l]of Object.entries(o.flows))if(l?.steps)for(let c of l.steps){if(typeof c=="string"||!c?.component)continue;let d=c.component.replace(/^#/,"");!n.has(c.component)&&!n.has(d)&&e.push({type:"warning",message:`${r}Flow "${a}" step references "${c.component}" which is not defined`,path:`flows.${a}.steps`});}}}return {valid:e.filter(s=>s.type==="error").length===0,issues:e}}var kn={visualizerPort:42195,watcherPort:42196,autoConnect:true};async function ge(t){let e=$.resolve(t),n=$.dirname(e);if(!v.existsSync(e))throw new Error(`Gate config not found: ${e}`);let s=v.readFileSync(e,"utf8"),o=O.load(s);if(!o.version)throw new Error('Gate config missing required "version" field');let r=[],i=o,a=o.gates||i.portals;if(a)for(let[c,d]of Object.entries(a))r.push(ke(c,d));if(o.include)for(let c of o.include){let d=$.join(n,c),u=await glob(d.replace(/\\/g,"/"));for(let p of u){let g=await Pn(p);r.push(...g);}}let l=[];if(o.flows)for(let[c,d]of Object.entries(o.flows))l.push(jn(c,d));return {version:o.version,gates:r,flows:l,settings:{dev:{...kn,...o.settings?.dev}}}}async function Pn(t){let e=v.readFileSync(t,"utf8"),n=O.load(e);if(n.id)return [ke(n.id,n)];if(n.gates){let s=[];for(let[o,r]of Object.entries(n.gates))s.push(ke(o,r));return s}return []}function ke(t,e){let n=[];if(e.locks)for(let o of e.locks)n.push(Cn(o));let s=[];if(e.prizes)for(let o of e.prizes)s.push(An(o));return {id:t,description:e.description,locks:n,prizes:s,position:e.position}}function Cn(t){let e=t,n=[];if(e.keys){for(let s of e.keys)if(typeof s=="string")n.push({expression:s});else if(s.expression){let o=s;n.push({expression:o.expression,description:o.description});}}return {id:e.id,description:e.description,keys:n,mode:e.mode||"all"}}function An(t){let e=t;return {id:e.id,oneTime:e.oneTime??false,metadata:e.metadata}}function jn(t,e){return {id:t,description:e.description,gates:e.gates||[],forkable:e.forkable}}async function wt(t){let e=$.resolve(t);return await glob("**/portal.yaml",{cwd:e,absolute:true,ignore:["**/node_modules/**","**/dist/**","**/.git/**"]})}var On=z$1.object({x:z$1.number(),y:z$1.number()}),Ln=z$1.object({x:z$1.number(),y:z$1.number(),zoom:z$1.number()}),bt=z$1.object({path:z$1.string(),include:z$1.array(z$1.string()).optional(),exclude:z$1.array(z$1.string()).optional()}),xt=z$1.object({id:z$1.string(),symbol:z$1.string(),type:z$1.enum(["feature","component","flow","state","aspect","gate","signal","idea"]),content:z$1.string().optional(),position:On,tags:z$1.array(z$1.string()).optional(),created:z$1.string(),modified:z$1.string().optional()}),vt=z$1.object({from:z$1.string(),to:z$1.string(),label:z$1.string().optional(),type:z$1.string().optional()}),Fn=z$1.object({id:z$1.string(),name:z$1.string(),nodes:z$1.array(z$1.string()),color:z$1.string().optional()}),Et=z$1.object({viewport:Ln,groups:z$1.array(Fn).optional()}),Nn=z$1.object({nodes:z$1.array(xt),connections:z$1.array(vt),layout:Et}),Dn=z$1.object({id:z$1.string(),name:z$1.string(),timestamp:z$1.string(),description:z$1.string().optional(),state:Nn});z$1.object({version:z$1.string(),metadata:z$1.object({name:z$1.string(),created:z$1.string(),modified:z$1.string()}),sources:z$1.object({purpose:z$1.array(bt).optional(),portal:z$1.array(bt).optional()}),nodes:z$1.array(xt),connections:z$1.array(vt),layout:Et,snapshots:z$1.array(Dn).optional()});async function Mn(t,e){let n=[],s=[],o=[],r=[];if(t.sources.purpose)for(let l of t.sources.purpose){let c=$.resolve(e,l.path);try{let d=await at(c);o.push(...d.map(E=>E.filePath));let u=ct(d);for(let[E,{item:x,filePath:S}]of u){let I=["feature",...x.tags||[]];n.push(D({id:`purpose-feature-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:I,componentType:x.type,parentSymbol:x.parent,anchors:x.anchors?.map(q=>Pe(q))}));}let p=lt(d);for(let[E,{item:x,filePath:S}]of p)n.push(D({id:`purpose-component-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:x.tags,componentType:x.type,parentSymbol:x.parent,anchors:x.anchors?.map(I=>Pe(I))}));let g=dt(d);for(let[E,{item:x,filePath:S}]of g)n.push(D({id:`purpose-gate-${E}`,symbol:`^${E}`,type:"gate",source:"purpose",filePath:S,data:x,description:x.description}));let m=ut(d);for(let[E,{item:x,filePath:S}]of m)n.push(D({id:`purpose-state-${E}`,symbol:`#${E}`,type:"component",source:"purpose",filePath:S,data:x,description:x.description,tags:["state"]}));let y=pt(d);for(let[E,{item:x,filePath:S}]of y)n.push(D({id:`purpose-flow-${E}`,symbol:`$${E}`,type:"flow",source:"purpose",filePath:S,data:x,description:x.description}));let h=ft(d);for(let[E,{item:x,filePath:S}]of h)n.push(D({id:`purpose-signal-${E}`,symbol:`!${E}`,type:"signal",source:"purpose",filePath:S,data:x,description:x.description}));let w=gt(d);for(let[E,{item:x,filePath:S}]of w)n.push(D({id:`purpose-aspect-${E}`,symbol:`~${E}`,type:"aspect",source:"purpose",filePath:S,data:x,description:x.description,anchors:x.anchors?.map(I=>Pe(I)),appliesTo:x["applies-to"],tags:x.tags,enforcement:x.enforcement}));let P=mt(d),k=new Set(n.map(E=>E.symbol));for(let E of P)k.has(E.symbol)||(k.add(E.symbol),n.push(D({id:`purpose-ref-${E.type}-${E.symbol.slice(1)}`,symbol:E.symbol,type:E.type,source:"purpose",filePath:E.filePath,data:{referencedFrom:E.sourceSymbol},description:`Referenced from ${E.sourceSymbol}`})));}catch(d){s.push({source:"purpose",filePath:c,message:d.message});}}if(t.sources.portal)for(let l of t.sources.portal){let c=$.resolve(e,l.path);try{let d;if(c.endsWith(".yaml")||c.endsWith(".yml"))d=await ge(c),r.push(c);else {let u=await wt(c);if(r.push(...u),u.length>0){d=await ge(u[0]);for(let p=1;p<u.length;p++){let g=await ge(u[p]);d.gates.push(...g.gates),d.flows.push(...g.flows);}}else continue}for(let u of d.gates){n.push(Un(u,c));for(let p of u.prizes)n.push(D({id:`gate-signal-${u.id}-${p.id}`,symbol:`!${p.id}`,type:"signal",source:"portal",filePath:c,data:p,description:`Signal from gate ${u.id}`}));}for(let u of d.flows)n.push(zn(u,c));}catch(d){s.push({source:"portal",filePath:c,message:d.message});}}for(let l of t.nodes){let c=l.tags?.includes("idea");if(!l.content&&!c){let d=n.find(u=>u.symbol===l.symbol);if(d){d.position=l.position,d.tags=l.tags;continue}}n.push(D({id:l.id,symbol:l.symbol,type:l.type,source:"premise",filePath:".premise",data:l,description:l.content,position:l.position,tags:l.tags,created:l.created,modified:l.modified}));}Wn(n);let i=new Map;for(let l of n){let c=i.get(l.symbol)||[];c.includes(l.filePath)||c.push(l.filePath),i.set(l.symbol,c);}let a=[];for(let[l,c]of i)c.length>1&&a.push({symbol:l,files:c});return {symbols:n,purposeFiles:o,portalFiles:r,errors:s,timestamp:Date.now(),...a.length>0?{duplicateSymbols:a}:{}}}function D(t){return {...t,data:t.data??null,references:t.references??[],referencedBy:t.referencedBy??[]}}function Un(t,e){return D({id:`gate-${t.id}`,symbol:`^${t.id}`,type:"gate",source:"portal",filePath:e,data:t,description:t.description,position:t.position})}function zn(t,e){return D({id:`gate-flow-${t.id}`,symbol:`$${t.id}`,type:"flow",source:"portal",filePath:e,data:t,description:t.description})}function Pe(t){let e=t.lastIndexOf(":");if(e===-1||e===t.length-1)return {path:t,lines:0,raw:t};let n=t.slice(e+1),s=t.slice(0,e);if(!/^[\d,\- ]+$/.test(n))return {path:t,lines:0,raw:t};if(n.includes("-")){let[o,r]=n.split("-").map(Number);return {path:s,lines:[o,r],raw:t}}else if(n.includes(",")){let o=n.split(",").map(Number);return {path:s,lines:o,raw:t}}else return {path:s,lines:Number(n),raw:t}}var Hn=new Set(["$lib","$env","$app","$service-worker","$virtual","$schema","$ref","$id","$type"]);function Wn(t){let e=new Map(t.map(n=>[n.symbol,n]));for(let n of t){let s=JSON.stringify(n.data),o=/(?:\?[@#$%~^!]|[@#$%~^!?])[a-zA-Z][\w-]*/g,r=(s.match(o)||[]).filter(i=>!Hn.has(i));for(let i of r)if(i!==n.symbol&&e.has(i)){n.references.includes(i)||n.references.push(i);let a=e.get(i);a&&!a.referencedBy.includes(n.symbol)&&a.referencedBy.push(n.symbol);}}}async function Tt(t){let e={metadata:{name:$.basename(t),created:new Date().toISOString(),modified:new Date().toISOString()},sources:{purpose:[{path:"./"}],portal:[{path:"./"}]},nodes:[]};return Mn(e,t)}function Gn(){return {entries:new Map,byType:new Map,bySource:new Map,timestamp:0}}function vo(t){let e=Gn();e.timestamp=t.timestamp;for(let n of t.symbols)e.entries.set(n.id,n),e.byType.has(n.type)||e.byType.set(n.type,[]),e.byType.get(n.type).push(n),e.bySource.has(n.source)||e.bySource.set(n.source,[]),e.bySource.get(n.source).push(n);return e}function me(t,e){for(let n of t.entries.values())if(n.symbol===e)return n}function Eo(t,e){return t.byType.get(e)||[]}function To(t,e){let n=e.toLowerCase(),s=[];for(let o of t.entries.values()){if(o.symbol.toLowerCase().includes(n)){s.push(o);continue}if(o.description?.toLowerCase().includes(n)){s.push(o);continue}if(o.tags?.some(r=>r.toLowerCase().includes(n))){s.push(o);continue}if(o.componentType?.toLowerCase().includes(n)){s.push(o);continue}}return s}function _o(t,e){let n=me(t,e);return n?n.referencedBy.map(s=>me(t,s)).filter(s=>s!==void 0):[]}function $o(t,e){let n=me(t,e);return n?n.references.map(s=>me(t,s)).filter(s=>s!==void 0):[]}function Ro(t){let e={component:0,flow:0,gate:0,signal:0,aspect:0};for(let[n,s]of t.byType)n in e&&(e[n]=s.length);return e}function Io(t){return Array.from(t.entries.values())}var Bn="0.1.0",Xn="1.0.0";function Ce(t,e){let n={$meta:qn(e.projectName,t),components:{},features:{},flows:{},state:{},gates:{},signals:{},aspects:{},screens:{},symbolMap:{}};for(let o of t.symbols)Vn(o,n,e);if(e.screenDefinitions)for(let[o,r]of Object.entries(e.screenDefinitions))n.screens[o]||(n.screens[o]={id:o,name:Y(o),route:r.route,path:"",components:r.components,features:r.features});let s={};for(let o of Object.values(n.components))o.componentType&&(s[o.componentType]=(s[o.componentType]||0)+1);for(let o of Object.values(n.features))o.componentType&&(s[o.componentType]=(s[o.componentType]||0)+1);return Object.keys(s).length>0&&(n.$meta.componentTypes=s),ns(n),n}function qn(t,e){return {version:Xn,project:t,generatedAt:new Date().toISOString(),paradigmVersion:Bn,sources:{purposeFiles:e.purposeFiles.length,portalFiles:e.portalFiles.length,premiseFiles:e.symbols.filter(n=>n.source==="premise").length>0?1:0}}}function Vn(t,e,n){let{type:s}=t;switch(s){case "component":Yn(t,e,n);break;case "feature":Jn(t,e,n);break;case "flow":Kn(t,e);break;case "state":Qn(t,e);break;case "gate":Zn(t,e);break;case "signal":es(t,e);break;case "aspect":ts(t,e);break;}}function Yn(t,e,n){let s=ee(t.symbol),o=_t(s,t.data,n.visualTagMappings),r={id:s,name:Y(s),symbol:t.symbol,category:"components",path:t.filePath,description:t.description,visualTags:o,related:t.references,componentType:t.componentType,parent:t.parentSymbol};e.components[s]=r,e.symbolMap[t.symbol]={category:"components",id:s};}function Jn(t,e,n){let s=ee(t.symbol),o=_t(s,t.data,n.visualTagMappings),r={id:s,name:Y(s),symbol:t.symbol,category:"features",path:t.filePath,description:t.description,visualTags:o,related:t.references,componentType:t.componentType,parent:t.parentSymbol};e.features[s]=r,e.symbolMap[t.symbol]={category:"features",id:s};}function Kn(t,e){let n=ee(t.symbol),s=t.data,o=[];if(s?.steps)for(let i=0;i<s.steps.length;i++){let a=s.steps[i];o.push({id:`${n}-step-${i}`,name:a.action||`Step ${i+1}`,target:a.component,description:a.description,order:i});}let r={id:n,name:Y(n),symbol:t.symbol,path:t.filePath,description:t.description,steps:o};e.flows[n]=r,e.symbolMap[t.symbol]={category:"flows",id:n};}function Qn(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,path:t.filePath,description:t.description,consumers:t.referencedBy};e.state[n]=s,e.symbolMap[t.symbol]={category:"state",id:n};}function Zn(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"gates",path:t.filePath,description:t.description,related:t.references};e.gates[n]=s,e.symbolMap[t.symbol]={category:"gates",id:n};}function es(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"signals",path:t.filePath,description:t.description,related:t.references};e.signals[n]=s,e.symbolMap[t.symbol]={category:"signals",id:n};}function ts(t,e){let n=ee(t.symbol),s={id:n,name:Y(n),symbol:t.symbol,category:"aspects",path:t.filePath,description:t.description,related:t.references};e.aspects[n]=s,e.symbolMap[t.symbol]={category:"aspects",id:n};}function ns(t){for(let e of Object.values(t.screens))if(e.components)for(let n of e.components){let s=t.components[n];s&&(s.screens=s.screens||[],s.screens.includes(e.id)||s.screens.push(e.id));}}function ee(t){return t.slice(1)}function Y(t){return t.split("-").map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(" ")}function _t(t,e,n){let s=[];if(n?.[t])return n[t];let o=[[/button/i,"button"],[/btn/i,"button"],[/form/i,"form"],[/input/i,"input"],[/field/i,"input"],[/select/i,"input"],[/card/i,"card"],[/list/i,"list"],[/table/i,"list"],[/modal/i,"modal"],[/dialog/i,"modal"],[/drawer/i,"modal"],[/nav/i,"nav"],[/menu/i,"menu"],[/dropdown/i,"menu"],[/header/i,"header"],[/footer/i,"footer"],[/sidebar/i,"sidebar"],[/hero/i,"hero"],[/grid/i,"grid"],[/chart/i,"chart"],[/graph/i,"chart"],[/icon/i,"icon"],[/image/i,"image"],[/avatar/i,"avatar"],[/badge/i,"badge"],[/tag/i,"badge"],[/tab/i,"tab"],[/accordion/i,"accordion"],[/toast/i,"toast"],[/notification/i,"toast"],[/alert/i,"toast"],[/spinner/i,"spinner"],[/loader/i,"spinner"],[/loading/i,"spinner"],[/skeleton/i,"skeleton"]];for(let[r,i]of o)r.test(t)&&s.push(i);return s}function Ae(t){return JSON.stringify(t,null,2)}function je(t,e="unknown"){j$1().trackToolCall(e,t);}function Mo(t,e="paradigm://unknown"){j$1().trackResourceRead(e,t);}function ss(){k();}function os(t,e){switch(t){case "paradigm_search":return {summary:`Searched for "${e.query}"${e.type?` (type: ${e.type})`:""}`,symbol:e.query};case "paradigm_ripple":return {summary:`Ripple analysis on ${e.symbol}${e.depth?` (depth: ${e.depth})`:""}`,symbol:e.symbol};case "paradigm_related":return {summary:`Checked relations for ${e.symbol}`,symbol:e.symbol};case "paradigm_status":return {summary:"Checked project status"};case "paradigm_navigate":{let n=e.intent,s=e.target,o=e.task;return n==="context"&&o?{summary:`Navigate context: "${o}"`}:s?{summary:`Navigate ${n||"find"}: ${s}`,symbol:s}:{summary:`Navigate (${n||"unknown"})`}}case "paradigm_gates_for_route":return {summary:`Gate suggestions for ${e.method||"GET"} ${e.route}`};case "paradigm_wisdom_context":return {summary:`Checked wisdom for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_context":return {summary:`Checked history for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_record":return {summary:`Recorded ${e.type}: ${(e.description||"").slice(0,60)}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_history_fragility":return {summary:`Checked fragility for ${Array.isArray(e.symbols)?e.symbols.join(", "):"symbols"}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_flows_affected":return {summary:`Checked flows affected by ${e.symbol}`,symbol:e.symbol};case "paradigm_reindex":return {summary:"Rebuilt static index files"};case "paradigm_session_checkpoint":return {summary:`Checkpoint: phase=${e.phase}, ${(e.context||"").slice(0,60)}`};case "paradigm_task_create":return {summary:`Created task: "${(e.blurb||"").slice(0,60)}"`};case "paradigm_task_done":return {summary:`Completed task ${e.id}`};case "paradigm_task_shelve":return {summary:`Shelved task ${e.id}`};case "paradigm_task_list":return {summary:`Listed tasks (status: ${e.status||"open"})`};case "paradigm_task_update":return {summary:`Updated task ${e.id}`};case "paradigm_assessment_record":return {summary:`Assessment: ${(e.title||"").slice(0,60)} \u2192 ${e.arc_id}`,symbol:Array.isArray(e.symbols)?e.symbols[0]:void 0};case "paradigm_assessment_list":return {summary:e.arc_id?`Listed entries in ${e.arc_id}`:"Listed assessment arcs"};case "paradigm_assessment_search":return {summary:`Searched assessments${e.symbol?` for ${e.symbol}`:""}`,symbol:e.symbol};case "paradigm_assessment_arc_create":return {summary:`Created arc: ${e.id}`};case "paradigm_assessment_arc_close":return {summary:`Closed arc: ${e.arc_id}`};default:{let n=t.replace(/^paradigm_/,""),s=Object.values(e).find(o=>typeof o=="string"&&o.length>0);return {summary:s?`${n}: ${s.slice(0,60)}`:n,symbol:e.symbol||void 0}}}}function Uo(t,e){let n=j$1(),{summary:s,symbol:o}=os(t,e);n.addBreadcrumb("tool-call",s,{tool:t,symbol:o});}function zo(){return [{name:"paradigm_context_check",description:"Check if context handoff is recommended based on session activity. Call this periodically during long sessions. Returns usage percentage and recommendation (continue, consider-handoff, handoff-recommended, handoff-urgent). ~100 tokens.",inputSchema:{type:"object",properties:{estimatedTotalTokens:{type:"number",description:"Optional: Your estimate of total conversation tokens (if available)"},contextWindowSize:{type:"number",description:"Context window size in tokens (default: 200000)"}}},annotations:{readOnlyHint:true,destructiveHint:false}},{name:"paradigm_handoff_prepare",description:"Prepare a handoff summary. Generates a structured handoff file with markdown summary and recovery instructions. Returns structured markdown with summary, modified files, and next steps. ~300 tokens.",inputSchema:{type:"object",properties:{summary:{type:"string",description:"Brief summary of work done in this session"},nextSteps:{type:"array",items:{type:"string"},description:"List of next steps for the continuing session"},agent:{type:"string",description:'Target agent role (e.g., "builder", "architect")'},modifiedFiles:{type:"array",items:{type:"string"},description:"List of files modified in this session"},symbolsTouched:{type:"array",items:{type:"string"},description:"List of symbols (@feature, #component, etc.) touched"},openQuestions:{type:"array",items:{type:"string"},description:"Unresolved questions or decisions needed"}},required:["summary"]},annotations:{readOnlyHint:false,destructiveHint:false}},{name:"paradigm_session_stats",description:"Get current session statistics (MCP interactions, estimated tokens). Returns tool call count, estimated tokens used, and cost breakdown. ~100 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:true,destructiveHint:false}},{name:"paradigm_session_recover",description:"Load previous session breadcrumbs for continuity. Call this at the start of a new session to understand what was done before. Returns symbols modified, files explored, recent actions, and suggestions for continuity. ~200 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:true,destructiveHint:false},aliases:["resume","pick up","continue","what was I doing","last session","recover"]},{name:"paradigm_session_checkpoint",description:"Save a cognitive-transition checkpoint for crash recovery. Call when transitioning between phases (planning \u2192 implementing \u2192 validating \u2192 complete). ~100 tokens.",inputSchema:{type:"object",properties:{phase:{type:"string",enum:["planning","implementing","validating","complete"],description:"Current workflow phase"},context:{type:"string",description:"What's top-of-mind right now (1-3 sentences)"},externalId:{type:"string",description:'Optional: deterministic ID from external source for automatic session recovery (e.g. "linear:PROJ-123", "github:owner/repo#42")'},plan:{type:"string",description:"Optional: the current plan or approach"},modifiedFiles:{type:"array",items:{type:"string"},description:"Optional: files modified so far"},symbolsTouched:{type:"array",items:{type:"string"},description:"Optional: symbols touched so far"},decisions:{type:"array",items:{type:"string"},description:"Optional: key decisions made so far"}},required:["phase","context"]},annotations:{readOnlyHint:false,destructiveHint:false}},{name:"paradigm_session_checkpoint",description:"Save a cognitive-transition checkpoint for crash recovery. Call when transitioning between phases (planning \u2192 implementing \u2192 validating \u2192 complete). ~100 tokens.",inputSchema:{type:"object",properties:{phase:{type:"string",enum:["planning","implementing","validating","complete"],description:"Current workflow phase"},context:{type:"string",description:"What's top-of-mind right now (1-3 sentences)"},externalId:{type:"string",description:'Optional: deterministic ID from external source for automatic session recovery (e.g. "linear:PROJ-123", "github:owner/repo#42")'},plan:{type:"string",description:"Optional: the current plan or approach"},modifiedFiles:{type:"array",items:{type:"string"},description:"Optional: files modified so far"},symbolsTouched:{type:"array",items:{type:"string"},description:"Optional: symbols touched so far"},decisions:{type:"array",items:{type:"string"},description:"Optional: key decisions made so far"}},required:["phase","context"]}}]}async function Ho(t,e,n){let s=j$1();if(t==="paradigm_context_check"){let o=e.contextWindowSize||2e5,r=e.estimatedTotalTokens,i=s.getStats(),{recommendation:a,message:l,usagePercent:c,signals:d}=s.getHandoffRecommendation(o,r),u=s.getDurationMinutes();return {handled:true,text:JSON.stringify({recommendation:a,message:l,stats:{sessionDurationMinutes:u,mcpToolCalls:i.totals.toolCallCount,mcpResourceReads:i.totals.resourceReadCount,estimatedMcpTokens:i.totals.totalTokens,estimatedTotalTokens:r||Math.round(i.totals.totalTokens*5),contextWindowSize:o,usagePercent:c},signals:d,action:a==="continue"?null:"Call paradigm_handoff_prepare to create handoff file"},null,2)}}if(t==="paradigm_handoff_prepare"){let o=e.summary,r=e.nextSteps||[],i=e.agent||"builder",a$1=e.modifiedFiles||[],l=e.symbolsTouched||[],c=e.openQuestions||[],d=s.getStats(),u=s.getCostBreakdown(),p=`h${Date.now().toString(36)}`,g=new Date().toISOString(),m={id:p,timestamp:g,from:"current-session",to:i,summary:o,nextSteps:r,modifiedFiles:a$1,symbolsTouched:l,openQuestions:c,sessionStats:{duration:s.getDurationMinutes(),mcpCalls:d.totals.toolCallCount+d.totals.resourceReadCount,estimatedTokens:d.totals.totalTokens,estimatedCostUsd:u.total.costUsd,model:u.model},status:"pending"};try{a(n.rootDir,m);}catch{}let y=`# Handoff: ${g}
|
|
12
12
|
|
|
13
13
|
## Session Summary
|
|
14
14
|
${o}
|
|
@@ -21,7 +21,7 @@ ${r.map((h,w)=>`${w+1}. ${h}`).join(`
|
|
|
21
21
|
- Modified files: ${a$1.length>0?a$1.join(", "):"(not specified)"}
|
|
22
22
|
- Symbols touched: ${l.length>0?l.join(", "):"(not specified)"}
|
|
23
23
|
- Open questions: ${c.length>0?c.join(", "):"(none)"}
|
|
24
|
-
`;return ss(),{handled:true,text:JSON.stringify({handoff:m,markdownSummary:y,persisted:true,recovery:"The next session will automatically receive this handoff via paradigm_session_recover."},null,2)}}if(t==="paradigm_session_stats"){let o=s.getStats(),r=s.getCostBreakdown(),i=s.getDurationMinutes();return {handled:true,text:JSON.stringify({session:{startTime:new Date(o.startTime).toISOString(),durationMinutes:i,lastActivity:new Date(o.lastActivity).toISOString()},model:{name:r.model,id:r.modelId,pricing:{inputPerMillion:`$${r.pricing.input.toFixed(2)}`,outputPerMillion:`$${r.pricing.output.toFixed(2)}`}},interactions:{toolCalls:o.totals.toolCallCount,resourceReads:o.totals.resourceReadCount,totalInteractions:o.totals.toolCallCount+o.totals.resourceReadCount},tokens:{total:o.totals.totalTokens,byCategory:{resources:r.resources.tokens,tools:r.tools.tokens}},cost:{totalUsd:`$${r.total.costUsd.toFixed(4)}`,breakdown:{resources:`$${r.resources.costUsd.toFixed(4)}`,tools:`$${r.tools.costUsd.toFixed(4)}`},note:"Cost is for MCP output tokens only (responses sent to model)"},details:{resourcesByType:r.resources.byType,toolsByName:r.tools.byName}},null,2)}}if(t==="paradigm_session_recover"){s.setRootDir(n.rootDir);let o=s.loadPreviousSession(),r=s.loadCheckpoint(),i=[];try{i=b$1(n.rootDir);}catch{}if(!o&&i.length===0&&!r)return {handled:true,text:JSON.stringify({found:false,message:"No previous session breadcrumbs, checkpoints, or pending handoffs found.",tip:"Breadcrumbs persist to ~/.paradigm/sessions/ and handoffs persist via paradigm_handoff_prepare. Checkpoints persist via paradigm_session_checkpoint."},null,2)};let a={found:true};if(r){let c=Date.now()-r.timestamp,d=Math.round(c/6e4),u=Math.round(c/36e5);a.checkpoint={phase:r.phase,context:r.context,age:u>1?`${u} hours ago`:`${d} minutes ago`,timestamp:new Date(r.timestamp).toISOString(),sessionId:r.sessionId,plan:r.plan,modifiedFiles:r.modifiedFiles,symbolsTouched:r.symbolsTouched,decisions:r.decisions,recentBreadcrumbs:r.recentBreadcrumbs?.map(p=>({time:new Date(p.timestamp).toISOString(),action:p.action,tool:p.tool,symbol:p.symbol,summary:p.summary}))};}if(o){let c=Date.now()-o.lastActivity,d=Math.round(c/6e4),u=Math.round(c/36e5),g=o.breadcrumbs.slice(-10).map(m=>({time:new Date(m.timestamp).toISOString(),action:m.action,tool:m.tool,symbol:m.symbol,summary:m.summary}));a.previousSession={sessionId:o.sessionId,startTime:new Date(o.startTime).toISOString(),lastActivity:new Date(o.lastActivity).toISOString(),age:u>1?`${u} hours ago`:`${d} minutes ago`},a.context={symbolsModified:o.symbolsModified,filesExplored:o.filesExplored},a.recentActions=g;}if(i.length>0){a.pendingHandoffs=i.map(c=>({id:c.id,timestamp:c.timestamp,from:c.from,to:c.to,summary:c.summary,nextSteps:c.nextSteps,modifiedFiles:c.modifiedFiles,symbolsTouched:c.symbolsTouched,openQuestions:c.openQuestions}));for(let c of i)try{c$1(n.rootDir,c.id);}catch{}}let l="Continue where the previous session left off.";if(r)l=`Previous session was in "${r.phase}" phase: ${r.context}`,r.decisions?.length&&(l+=` Key decisions: ${r.decisions.slice(0,2).join("; ")}`);else if(i.length>0){let c=i[i.length-1];l=`Handoff received: "${c.summary}". `,c.nextSteps.length>0&&(l+=`Start with: ${c.nextSteps[0]}`);}else if(o){let c=o.breadcrumbs.slice(-10);if(c.length>0){let d=c[c.length-1];d.symbol&&(l=`Last work involved ${d.symbol}. Consider checking its current state with paradigm_ripple.`);}}return a.suggestion=l,a.agentInstruction="Present a brief summary of the previous session, then ask the user what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking.",s.markRecovered(),{handled:true,text:JSON.stringify(a,null,2)}}if(t==="paradigm_session_checkpoint"){s.setRootDir(n.rootDir);let o=e.phase,r=e.context,i=e.externalId,a=e.plan,l=e.modifiedFiles,c=e.symbolsTouched,d=e.decisions,{checkpoint:u,persisted:p}=s.saveCheckpoint({phase:o,context:r,externalId:i,plan:a,modifiedFiles:l,symbolsTouched:c,decisions:d}),g=p.local||p.global;return {handled:true,text:JSON.stringify({saved:g,persisted:p,checkpoint:{phase:u.phase,context:u.context,sessionId:u.sessionId,...u.externalId?{externalId:u.externalId}:{},timestamp:new Date(u.timestamp).toISOString(),modifiedFiles:u.modifiedFiles?.length||0,symbolsTouched:u.symbolsTouched?.length||0,decisions:u.decisions?.length||0,recentBreadcrumbs:u.recentBreadcrumbs?.length||0},...g?{note:"Checkpoint saved. Recovery data will be auto-surfaced on the first tool call of the next session."}:{warning:"Checkpoint was NOT persisted to disk. Both local and global writes failed. Check MCP server stderr for details."}},null,2)}}return {handled:false,text:""}}async function Wo(t){let e=j$1();e.setRootDir(t);let n=e.loadCheckpoint(),s=[];try{s=b$1(t);}catch{}if(!n&&s.length===0)return null;let o=[];if(o.push("--- SESSION RECOVERY ---"),n){let r=Date.now()-n.timestamp,i=Math.round(r/6e4),a=Math.round(r/36e5),l=a>1?`${a}h ago`:`${i}m ago`;o.push(`Previous session was in "${n.phase}" phase (${l}): ${n.context}`),n.modifiedFiles?.length&&o.push(`Modified files: ${n.modifiedFiles.join(", ")}`),n.symbolsTouched?.length&&o.push(`Symbols: ${n.symbolsTouched.join(", ")}`),n.decisions?.length&&o.push(`Decisions: ${n.decisions.join("; ")}`),n.plan&&o.push(`Plan: ${n.plan.slice(0,200)}`);}if(s.length>0){let r=s[s.length-1];o.push(`Pending handoff: "${r.summary}"`),r.nextSteps.length>0&&o.push(`Next steps: ${r.nextSteps.slice(0,3).join(", ")}`);}try{let{loadTasks:r}=await import('./task-loader-NZFDTUQ5.js'),i=await r(t,{status:"open",limit:5});if(i.length>0){o.push(""),o.push("Open tasks:");for(let a of i){let l=a.tags.length>0?` [${a.tags.join(", ")}]`:"";o.push(` [${a.priority}] ${a.id}: ${a.blurb}${l}`);}}}catch{}try{let{loadLoreEntries:r}=await import('./lore-loader-RVQI5GXL.js'),a=(await r(t,{limit:10})).filter(l=>l.tags?.some(c=>c.startsWith("arc:")));if(a.length>0){let l=new Map;for(let u of a){let p=u.tags?.find(g=>g.startsWith("arc:"))||"";l.set(p,(l.get(p)||0)+1);}let c=n?.symbolsTouched||[];if((c.length>0?a.filter(u=>u.symbols_touched?.some(p=>c.includes(p))):a.slice(0,3)).length>0||l.size>0){o.push(""),o.push("Active lore arcs:");for(let[u,p]of l)o.push(` ${u} (${p} entries)`);}}}catch{}try{let{loadNominations:r}=await import('./nomination-engine-
|
|
24
|
+
`;return ss(),{handled:true,text:JSON.stringify({handoff:m,markdownSummary:y,persisted:true,recovery:"The next session will automatically receive this handoff via paradigm_session_recover."},null,2)}}if(t==="paradigm_session_stats"){let o=s.getStats(),r=s.getCostBreakdown(),i=s.getDurationMinutes();return {handled:true,text:JSON.stringify({session:{startTime:new Date(o.startTime).toISOString(),durationMinutes:i,lastActivity:new Date(o.lastActivity).toISOString()},model:{name:r.model,id:r.modelId,pricing:{inputPerMillion:`$${r.pricing.input.toFixed(2)}`,outputPerMillion:`$${r.pricing.output.toFixed(2)}`}},interactions:{toolCalls:o.totals.toolCallCount,resourceReads:o.totals.resourceReadCount,totalInteractions:o.totals.toolCallCount+o.totals.resourceReadCount},tokens:{total:o.totals.totalTokens,byCategory:{resources:r.resources.tokens,tools:r.tools.tokens}},cost:{totalUsd:`$${r.total.costUsd.toFixed(4)}`,breakdown:{resources:`$${r.resources.costUsd.toFixed(4)}`,tools:`$${r.tools.costUsd.toFixed(4)}`},note:"Cost is for MCP output tokens only (responses sent to model)"},details:{resourcesByType:r.resources.byType,toolsByName:r.tools.byName}},null,2)}}if(t==="paradigm_session_recover"){s.setRootDir(n.rootDir);let o=s.loadPreviousSession(),r=s.loadCheckpoint(),i=[];try{i=b$1(n.rootDir);}catch{}if(!o&&i.length===0&&!r)return {handled:true,text:JSON.stringify({found:false,message:"No previous session breadcrumbs, checkpoints, or pending handoffs found.",tip:"Breadcrumbs persist to ~/.paradigm/sessions/ and handoffs persist via paradigm_handoff_prepare. Checkpoints persist via paradigm_session_checkpoint."},null,2)};let a={found:true};if(r){let c=Date.now()-r.timestamp,d=Math.round(c/6e4),u=Math.round(c/36e5);a.checkpoint={phase:r.phase,context:r.context,age:u>1?`${u} hours ago`:`${d} minutes ago`,timestamp:new Date(r.timestamp).toISOString(),sessionId:r.sessionId,plan:r.plan,modifiedFiles:r.modifiedFiles,symbolsTouched:r.symbolsTouched,decisions:r.decisions,recentBreadcrumbs:r.recentBreadcrumbs?.map(p=>({time:new Date(p.timestamp).toISOString(),action:p.action,tool:p.tool,symbol:p.symbol,summary:p.summary}))};}if(o){let c=Date.now()-o.lastActivity,d=Math.round(c/6e4),u=Math.round(c/36e5),g=o.breadcrumbs.slice(-10).map(m=>({time:new Date(m.timestamp).toISOString(),action:m.action,tool:m.tool,symbol:m.symbol,summary:m.summary}));a.previousSession={sessionId:o.sessionId,startTime:new Date(o.startTime).toISOString(),lastActivity:new Date(o.lastActivity).toISOString(),age:u>1?`${u} hours ago`:`${d} minutes ago`},a.context={symbolsModified:o.symbolsModified,filesExplored:o.filesExplored},a.recentActions=g;}if(i.length>0){a.pendingHandoffs=i.map(c=>({id:c.id,timestamp:c.timestamp,from:c.from,to:c.to,summary:c.summary,nextSteps:c.nextSteps,modifiedFiles:c.modifiedFiles,symbolsTouched:c.symbolsTouched,openQuestions:c.openQuestions}));for(let c of i)try{c$1(n.rootDir,c.id);}catch{}}let l="Continue where the previous session left off.";if(r)l=`Previous session was in "${r.phase}" phase: ${r.context}`,r.decisions?.length&&(l+=` Key decisions: ${r.decisions.slice(0,2).join("; ")}`);else if(i.length>0){let c=i[i.length-1];l=`Handoff received: "${c.summary}". `,c.nextSteps.length>0&&(l+=`Start with: ${c.nextSteps[0]}`);}else if(o){let c=o.breadcrumbs.slice(-10);if(c.length>0){let d=c[c.length-1];d.symbol&&(l=`Last work involved ${d.symbol}. Consider checking its current state with paradigm_ripple.`);}}return a.suggestion=l,a.agentInstruction="Present a brief summary of the previous session, then ask the user what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking.",s.markRecovered(),{handled:true,text:JSON.stringify(a,null,2)}}if(t==="paradigm_session_checkpoint"){s.setRootDir(n.rootDir);let o=e.phase,r=e.context,i=e.externalId,a=e.plan,l=e.modifiedFiles,c=e.symbolsTouched,d=e.decisions,{checkpoint:u,persisted:p}=s.saveCheckpoint({phase:o,context:r,externalId:i,plan:a,modifiedFiles:l,symbolsTouched:c,decisions:d}),g=p.local||p.global;return {handled:true,text:JSON.stringify({saved:g,persisted:p,checkpoint:{phase:u.phase,context:u.context,sessionId:u.sessionId,...u.externalId?{externalId:u.externalId}:{},timestamp:new Date(u.timestamp).toISOString(),modifiedFiles:u.modifiedFiles?.length||0,symbolsTouched:u.symbolsTouched?.length||0,decisions:u.decisions?.length||0,recentBreadcrumbs:u.recentBreadcrumbs?.length||0},...g?{note:"Checkpoint saved. Recovery data will be auto-surfaced on the first tool call of the next session."}:{warning:"Checkpoint was NOT persisted to disk. Both local and global writes failed. Check MCP server stderr for details."}},null,2)}}return {handled:false,text:""}}async function Wo(t){let e=j$1();e.setRootDir(t);let n=e.loadCheckpoint(),s=[];try{s=b$1(t);}catch{}if(!n&&s.length===0)return null;let o=[];if(o.push("--- SESSION RECOVERY ---"),n){let r=Date.now()-n.timestamp,i=Math.round(r/6e4),a=Math.round(r/36e5),l=a>1?`${a}h ago`:`${i}m ago`;o.push(`Previous session was in "${n.phase}" phase (${l}): ${n.context}`),n.modifiedFiles?.length&&o.push(`Modified files: ${n.modifiedFiles.join(", ")}`),n.symbolsTouched?.length&&o.push(`Symbols: ${n.symbolsTouched.join(", ")}`),n.decisions?.length&&o.push(`Decisions: ${n.decisions.join("; ")}`),n.plan&&o.push(`Plan: ${n.plan.slice(0,200)}`);}if(s.length>0){let r=s[s.length-1];o.push(`Pending handoff: "${r.summary}"`),r.nextSteps.length>0&&o.push(`Next steps: ${r.nextSteps.slice(0,3).join(", ")}`);}try{let{loadTasks:r}=await import('./task-loader-NZFDTUQ5.js'),i=await r(t,{status:"open",limit:5});if(i.length>0){o.push(""),o.push("Open tasks:");for(let a of i){let l=a.tags.length>0?` [${a.tags.join(", ")}]`:"";o.push(` [${a.priority}] ${a.id}: ${a.blurb}${l}`);}}}catch{}try{let{loadLoreEntries:r}=await import('./lore-loader-RVQI5GXL.js'),a=(await r(t,{limit:10})).filter(l=>l.tags?.some(c=>c.startsWith("arc:")));if(a.length>0){let l=new Map;for(let u of a){let p=u.tags?.find(g=>g.startsWith("arc:"))||"";l.set(p,(l.get(p)||0)+1);}let c=n?.symbolsTouched||[];if((c.length>0?a.filter(u=>u.symbols_touched?.some(p=>c.includes(p))):a.slice(0,3)).length>0||l.size>0){o.push(""),o.push("Active lore arcs:");for(let[u,p]of l)o.push(` ${u} (${p} entries)`);}}}catch{}try{let{loadNominations:r}=await import('./nomination-engine-W6QTQX2P.js'),i=r(t,{pending_only:!0}).filter(a=>a.urgency==="critical"||a.urgency==="high");if(i.length>0){o.push(""),o.push("Ambient nominations (urgent):");for(let a of i.slice(0,5))o.push(` [${a.urgency}] ${a.brief}`);i.length>5&&o.push(` ... and ${i.length-5} more. Use paradigm_ambient_nominations to see all.`);}}catch{}return o.push(""),o.push("IMPORTANT: Present a brief summary of this recovery data to the user, then ask what they would like to do: (1) Continue \u2014 pick up where the last session left off, (2) Discard \u2014 ignore the previous session and start fresh, or (3) let them describe what they want to work on instead. Do NOT automatically continue without asking."),o.push("---"),o.join(`
|
|
25
25
|
`)}var Oe=class{cache=new Map;ttlMs;constructor(e=3e4){this.ttlMs=e;}async getOrCompute(e,n){let s=this.cache.get(e);if(s&&Date.now()-s.createdAt<this.ttlMs)return s.data;let o=await n();return this.cache.set(e,{data:o,createdAt:Date.now()}),o}invalidate(e){this.cache.delete(e);}invalidatePrefix(e){for(let n of this.cache.keys())n.startsWith(e)&&this.cache.delete(n);}clear(){this.cache.clear();}stats(){return {size:this.cache.size,ttlMs:this.ttlMs}}},$t=new Oe(3e4);var rs=300*1e3,ae=null;function It(){ae=null;}function W(t,e){return v.existsSync($.join(t,e))}function J(t,e){return v.existsSync($.join(t,e))}function is(t,e,n){let s=t;try{if(!v.existsSync(s))return !1;let o=v.readdirSync(s,{withFileTypes:!0});for(let r of o){if(r.isFile()&&r.name.endsWith(e))return !0;if(r.isDirectory())try{if(v.readdirSync($.join(s,r.name)).some(a=>a.endsWith(e)))return !0}catch{}}}catch{}return false}var as={wisdom:t=>W(t,".paradigm/wisdom"),history:t=>W(t,".paradigm/history"),lore:t=>W(t,".paradigm/lore"),habits:t=>J(t,".paradigm/habits.yaml"),sentinel:t=>{try{let e=$.join(t,".paradigm","config.yaml");return v.existsSync(e)?v.readFileSync(e,"utf-8").includes("sentinel"):!1}catch{return false}},flows:t=>J(t,".paradigm/flow-index.json")||J(t,".paradigm/flows.yaml"),fixtures:t=>J(t,".paradigm/fixtures.yaml"),orchestration:t=>J(t,".paradigm/agents.yaml"),tasks:t=>W(t,".paradigm/tasks"),assessment:t=>W(t,".paradigm/lore"),personas:t=>is(t,".persona"),protocols:t=>W(t,".paradigm/protocols"),symphony:()=>{let t=$.join(he.homedir(),".paradigm","score");return v.existsSync(t)},university:t=>W(t,".paradigm/university"),agents:t=>{let e=$.join(he.homedir(),".paradigm","agents");return W(t,".paradigm/agents")||v.existsSync(e)},"aspect-graph":t=>J(t,".paradigm/aspect-graph.db"),pan:t=>J(t,".pan")||J(t,"nevr.yaml"),notebooks:t=>{let e=$.join(he.homedir(),".paradigm","notebooks");return W(t,".paradigm/notebooks")||v.existsSync(e)}},Rt=class{modules=new Map;activatedAdvanced=new Set;rootDir;constructor(e){this.rootDir=e;}register(e){this.modules.set(e.key,e);}registerAll(e){for(let n of e)this.register(n);}detectActiveFeatures(){if(ae&&Date.now()-ae.timestamp<rs)return ae.features;let e=new Set;for(let[n,s]of this.modules){if(s.tier==="core"){e.add(n);continue}if(s.tier==="advanced"){this.activatedAdvanced.has(n)&&e.add(n);continue}let o=s.detect||as[n];if(o)try{o(this.rootDir)&&e.add(n);}catch{}else e.add(n);}return ae={features:e,timestamp:Date.now()},e}getActiveTools(){let e=this.detectActiveFeatures(),n=[];for(let[s,o]of this.modules)e.has(s)&&n.push(...o.getToolsList());return n}activateAdvanced(e){let n=this.modules.get(e);return !n||n.tier!=="advanced"?null:(this.activatedAdvanced.add(e),n.getToolsList())}getAvailableAdvanced(){let e=[];for(let[n,s]of this.modules)s.tier==="advanced"&&!this.activatedAdvanced.has(n)&&e.push({key:n,toolCount:s.getToolsList().length});return e}async dispatch(e,n,s,o){let r=this.detectActiveFeatures();for(let[i,a]of this.modules)if(r.has(i))try{let l=await a.handleTool(e,n,s,o);if(l.handled)return l}catch(l){return {handled:true,text:JSON.stringify({error:`Tool handler error in module "${i}"`,message:l.message},null,2)}}return null}get size(){return this.modules.size}getRegistryInfo(){let e=this.detectActiveFeatures(),n={core:0,feature:0,advanced:0};for(let s of this.modules.values())n[s.tier]++;return {total:this.modules.size,byTier:n,activeFeatures:[...e],availableAdvanced:[...this.modules.entries()].filter(([s,o])=>o.tier==="advanced"&&!this.activatedAdvanced.has(s)).map(([s])=>s)}}};var Ne=null;async function hs(){return Ne||(Ne=await ms()),Ne}var ys=[`CREATE TABLE IF NOT EXISTS aspects (
|
|
26
26
|
id TEXT PRIMARY KEY,
|
|
27
27
|
description TEXT NOT NULL,
|
|
@@ -107,5 +107,5 @@ ${r.map((h,w)=>`${w+1}. ${h}`).join(`
|
|
|
107
107
|
${O.dump(t,{lineWidth:-1,noRefs:true,sortKeys:false})}---
|
|
108
108
|
|
|
109
109
|
${e}
|
|
110
|
-
`}function Er(t,e){let n=qe(t,e,".md");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=Kt(s);if(!o)return null;let r=o.frontmatter;return {frontmatter:Ys(r),body:o.body}}catch{return null}}function Tr(t,e,n){let s=e.type==="policy"?be:We,o=$.join(t,X,Q,s);v.mkdirSync(o,{recursive:true});let r=$.join(o,`${e.id}.md`),i=Bs(e,n);return v.writeFileSync(r,i,"utf8"),r}function Xs(t,e){let n=qe(t,e,".yaml");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=O.load(s);return !o||!o.id?null:Js(o)}catch{return null}}function _r(t,e){let n=$.join(t,X,Q,Se);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Qt(t,e){let n=qe(t,e,".yaml");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=O.load(s);return !o||!o.id?null:o}catch{return null}}function $r(t,e){let n=$.join(t,X,Q,xe);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Zt(t,e){let n=$.join(t,X,Ge);if(!v.existsSync(n))return [];let s=[];try{let o=v.readdirSync(n).filter(r=>r.endsWith(".yaml"));for(let r of o)try{let i=v.readFileSync($.join(n,r),"utf8"),a=O.load(i);if(!a||!a.id||e?.student&&a.student!==e.student||e?.type&&a.type!==e.type)continue;s.push(a);}catch{}}catch{}return s.sort((o,r)=>r.earnedAt.localeCompare(o.earnedAt))}function Rr(t,e){let n=$.join(t,X,Ge);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Ir(t,e){let n=ve(t);if(!n)return [];let s=[...n.entries];if(e.type&&(s=s.filter(r=>r.type===e.type)),e.tag&&(s=s.filter(r=>r.tags.some(i=>i.startsWith(e.tag)))),e.difficulty&&(s=s.filter(r=>r.difficulty===e.difficulty)),e.symbol&&(s=s.filter(r=>r.symbols.some(i=>i===e.symbol))),e.author&&(s=s.filter(r=>r.author===e.author)),e.query){let r=e.query.toLowerCase();s=s.filter(i=>i.title.toLowerCase().includes(r)||i.id.toLowerCase().includes(r)||i.tags.some(a=>a.toLowerCase().includes(r)));}if(e.category&&(s=s.filter(r=>r.category===e.category)),e.track){let r=Be(t),i=new Map;for(let a of r.content.categories)i.set(a.id,a.track||"core");s=s.filter(a=>(a.category&&i.get(a.category)||"core")===e.track);}let o=e.limit||20;return s.slice(0,o)}function Xe(t){let e=$.join(t,X),n=$.join(e,Q),s=[];for(let d of [We,be]){let u=$.join(n,d);if(v.existsSync(u))try{for(let p of v.readdirSync(u).filter(g=>g.endsWith(".md")))try{let g=v.readFileSync($.join(u,p),"utf8"),m=Kt(g);if(!m)continue;let y=m.frontmatter;s.push({id:y.id||p.replace(".md",""),title:y.title||p,type:y.type||(d===be?"policy":"note"),author:y.author||"unknown",created:y.created||"",updated:y.updated||"",tags:Array.isArray(y.tags)?y.tags:[],symbols:Array.isArray(y.symbols)?y.symbols:[],difficulty:y.difficulty||"beginner",file:`${Q}/${d}/${p}`,...y.category?{category:y.category}:{}});}catch{}}catch{}}let o=$.join(n,Se);if(v.existsSync(o))try{for(let d of v.readdirSync(o).filter(u=>u.endsWith(".yaml")))try{let u=v.readFileSync($.join(o,d),"utf8"),p=O.load(u);if(!p||!p.id)continue;s.push({id:p.id,title:p.title||d,type:"quiz",author:p.author||"unknown",created:p.created||"",updated:p.updated||"",tags:p.tags||[],symbols:p.symbols||[],difficulty:p.difficulty||"beginner",file:`${Q}/${Se}/${d}`,...p.category?{category:p.category}:{}});}catch{}}catch{}let r=$.join(n,xe);if(v.existsSync(r))try{for(let d of v.readdirSync(r).filter(u=>u.endsWith(".yaml")))try{let u=v.readFileSync($.join(r,d),"utf8"),p=O.load(u);if(!p||!p.id)continue;s.push({id:p.id,title:p.title||d,type:"path",author:p.author||"unknown",created:p.created||"",updated:p.updated||"",tags:p.tags||[],symbols:[],file:`${Q}/${xe}/${d}`,...p.category?{category:p.category}:{}});}catch{}}catch{}let i=0,a=$.join(e,Ge);if(v.existsSync(a))try{i=v.readdirSync(a).filter(d=>d.endsWith(".yaml")).length;}catch{}let l={version:"1.0",generatedAt:new Date().toISOString(),totalContent:s.length,entries:s,diplomaCount:i};v.mkdirSync(e,{recursive:true});let c=$.join(e,Vt);return v.writeFileSync(c,O.dump(l,{lineWidth:-1,noRefs:true}),"utf8"),l}function kr(t,e){let n=ve(t)||Xe(t),s=[],o=n.entries;e?.id&&(o=o.filter(c=>c.id===e.id));let r=null;e?.deep&&(r=en(t));let i=new Set(n.entries.map(c=>c.id));for(let c of o){if(c.title||s.push({contentId:c.id,severity:"error",check:"missing-title",message:"Content is missing a title",fix:"Add a title field to the content frontmatter"}),c.type==="quiz"&&qs(t,c.id,s),c.type==="path"&&Vs(t,c.id,i,s),r&&c.symbols.length>0){Be(t).content.categories.find(g=>g.id===c.category)?.validationStrictness==="relaxed";for(let g of c.symbols)r.has(g)||s.push({contentId:c.id,severity:"warning",check:"broken-symbol-ref",message:`Symbol "${g}" not found in scan-index`,fix:`Remove or update the symbol reference in ${c.id}`});}e?.deep&&c.symbols.length>0&&c.updated&&Qs(t,c,s);}let a=Zt(t);for(let c of a)if(c.total>0&&c.percentage!==Math.round(c.score/c.total*1e4)/100){let d=Math.round(c.score/c.total*1e4)/100;Math.abs(c.percentage-d)>.1&&s.push({contentId:c.id,severity:"warning",check:"diploma-score-mismatch",message:`Diploma percentage ${c.percentage} doesn't match score ${c.score}/${c.total} (expected ${d})`});}let l=Ks(t,n);return {status:s.some(c=>c.severity==="error")?"errors":s.length>0?"warnings":"healthy",totalContent:n.totalContent,checked:o.length,issues:s,symbolCoverage:l}}function qs(t,e,n){let s=Xs(t,e);if(!s){n.push({contentId:e,severity:"error",check:"unreadable-quiz",message:"Quiz file could not be parsed"});return}(!s.passThreshold||s.passThreshold<0||s.passThreshold>1)&&n.push({contentId:e,severity:"warning",check:"invalid-pass-threshold",message:`passThreshold should be between 0 and 1, got ${s.passThreshold}`,fix:"Set passThreshold to a value between 0.0 and 1.0"});for(let o of s.questions){if(!o.choices||typeof o.choices!="object"){n.push({contentId:e,severity:"error",check:"invalid-quiz-choices",message:`Question ${o.id} has no choices defined`});continue}(!o.correct||!(o.correct in o.choices))&&n.push({contentId:e,severity:"error",check:"invalid-quiz-answer",message:`Question ${o.id}: correct answer "${o.correct}" not found in choices [${Object.keys(o.choices).join(", ")}]`,fix:`Set correct to one of: ${Object.keys(o.choices).join(", ")}`});}}function Vs(t,e,n,s){let o=Qt(t,e);if(!o){s.push({contentId:e,severity:"error",check:"unreadable-path",message:"Learning path file could not be parsed"});return}for(let r of o.steps)r.content.startsWith("plsat:")||n.has(r.content)||s.push({contentId:e,severity:"error",check:"broken-path-step",message:`Learning path step references "${r.content}" which doesn't exist`,fix:`Create content with id "${r.content}" or remove this step`});}function Pr(t,e){let n=ve(t);if(!n)return [];let s=[];for(let o of n.entries)if(o.symbols.includes(e)){let r=tn(t,o,e);s.push({id:o.id,title:o.title,type:o.type,stale:r});}return s}function Cr(t,e){let n=ve(t);if(!n)return {paths:[],suggestedContent:[],extracurricular:[],diplomaCount:0,totalContent:0};let s=Be(t),o=new Set;for(let p of s.content.categories)p.excludeFromOnboarding&&o.add(p.id);let r=n.entries.filter(p=>!p.category||!o.has(p.category)),i=n.entries.filter(p=>p.category&&o.has(p.category)),a=r.filter(p=>p.type==="path"),l=e?Zt(t,{student:e}):[],c=new Set(l.map(p=>p.source)),d=a.map(p=>{let g=Qt(t,p.id);return {id:p.id,title:p.title,steps:g?.steps.length||0,completed:c.has(p.id)}}),u=r.filter(p=>p.type!=="path"&&(p.difficulty==="beginner"||p.tags.includes("onboarding"))).slice(0,10);return {paths:d,suggestedContent:u,extracurricular:i,diplomaCount:l.length,totalContent:n.totalContent}}function qe(t,e,n){let s=$.join(t,X,Q);for(let o of [We,be,Se,xe]){let r=$.join(s,o,`${e}${n}`);if(v.existsSync(r))return r}return null}function Ys(t){return {id:t.id||"",title:t.title||"",type:t.type||"note",author:t.author||"unknown",created:t.created||"",updated:t.updated||"",tags:Array.isArray(t.tags)?t.tags:[],symbols:Array.isArray(t.symbols)?t.symbols:[],difficulty:t.difficulty||"beginner",estimatedMinutes:t.estimatedMinutes,prerequisites:Array.isArray(t.prerequisites)?t.prerequisites:[],...t.category?{category:t.category}:{}}}function Js(t){return {...t,tags:t.tags||[],symbols:t.symbols||[],difficulty:t.difficulty||"beginner",passThreshold:t.passThreshold??.7,questions:t.questions||[]}}function en(t){let e=new Set,n=$.join(t,".paradigm","scan-index.json");if(!v.existsSync(n))return e;try{let s=v.readFileSync(n,"utf8"),o=JSON.parse(s);if(o.symbols&&Array.isArray(o.symbols))for(let r of o.symbols)r.symbol&&e.add(r.symbol);}catch{}return e}function Ks(t,e){let n=en(t),s=new Set;for(let r of e.entries)for(let i of r.symbols)n.has(i)&&s.add(i);let o=n.size;return {totalSymbols:o,coveredByContent:s.size,percentage:o>0?Math.round(s.size/o*100):0}}function tn(t,e,n){if(!e.updated)return false;let s=new Date(e.updated).getTime();if(isNaN(s))return false;let o=$.join(t,".paradigm","scan-index.json");if(!v.existsSync(o))return false;try{let r=v.readFileSync(o,"utf8"),i=JSON.parse(r);if(i.symbols&&Array.isArray(i.symbols)){for(let a of i.symbols)if(a.symbol===n&&a.filePath){let l=$.join(t,a.filePath);if(v.existsSync(l)&&v.statSync(l).mtime.getTime()>s)return !0}}}catch{}return false}function Qs(t,e,n){for(let s of e.symbols)if(tn(t,e,s)){n.push({contentId:e.id,severity:"warning",check:"stale-content",message:`Content may be stale: symbol "${s}" was updated after content was last modified`,fix:`Review and update ${e.id} to reflect changes to ${s}`});break}}var Zs={"@":{category:"features",prefix:"@"},"#":{category:"components",prefix:"#"},"^":{category:"gates",prefix:"^"},$:{category:"flows",prefix:"$"},"&":{category:"integrations",prefix:"&"},"!":{category:"signals",prefix:"!"},"%":{category:"state",prefix:"%"}},eo={features:["src/features/","features/","app/","src/app/","src/modules/","modules/"],components:["src/components/","components/","src/lib/","lib/","src/ui/","ui/"],gates:["middleware/","src/middleware/","auth/","src/auth/","guards/","src/guards/"],flows:["flows/","src/flows/","workflows/","src/workflows/","sagas/","src/sagas/"],integrations:["integrations/","src/integrations/","external/","src/external/","vendors/"],signals:["events/","src/events/","handlers/","src/handlers/"],state:["stores/","src/stores/","state/","src/state/","reducers/","src/reducers/"]},to={config:[".paradigm/config.yaml","package.json","tsconfig.json",".env.example"],entry:["src/index.ts","src/index.tsx","src/main.ts","src/main.tsx","index.ts","main.ts","src/app.ts","src/app.tsx"],types:["src/types/","types/","src/types.ts","types.ts"]},Ve={always:["node_modules/","dist/","build/",".git/",".next/",".nuxt/",".cache/","*.lock","*.log"],unless_testing:["**/*.test.ts","**/*.test.tsx","**/*.spec.ts","**/*.spec.tsx","__tests__/","test/","tests/"],unless_docs:["docs/","*.md","README*","CHANGELOG*"]};function Br(){return [{name:"paradigm_reindex",description:"Rebuild scan-index.json, navigator.yaml, and flow-index.json from .purpose files. Call after modifying paradigm files or at the end of a work session to ensure static index files are fresh. Returns counts of indexed symbols, files processed, and any errors. ~150 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:false,destructiveHint:true}}]}async function Xr(t,e,n,s){if(t!=="paradigm_reindex")return {handled:false,text:""};try{let o=await no(n.rootDir,n);await s(),$t.clear(),It();let r=(o.integrityReport?.brokenReferences?.length||0)+(o.integrityReport?.duplicateSymbols?.length||0)+(o.componentAnchorIssues||0)+(o.crossFileIssues||0),i={success:!0,symbolCount:o.symbolCount,breakdown:o.breakdown,flowCount:o.flowCount,filesWritten:o.filesWritten.length,...o.aspectGraphStats?{aspects:o.aspectGraphStats.aspects,loreLinks:o.aspectGraphStats.loreLinks}:{},...o.protocolHealth?{protocols:o.protocolHealth.total,staleProtocols:o.protocolHealth.stale}:{},...r>0?{issues:r}:{}},a=JSON.stringify(i,null,2);return je(a.length,t),{handled:!0,text:a}}catch(o){let r=JSON.stringify({error:o.message},null,2);return je(r.length,t),{handled:true,text:r}}}async function no(t,e){let n=[],s;e?s=e.aggregation:s=await Tt(t);let o=e?.projectName||$.basename(t),r=$.join(t,".paradigm");v.existsSync(r)||v.mkdirSync(r,{recursive:true});let i=Ce({symbols:s.symbols,purposeFiles:s.purposeFiles,portalFiles:s.portalFiles},{projectName:o}),a=$.join(r,"scan-index.json");v.writeFileSync(a,Ae(i),"utf8"),n.push(".paradigm/scan-index.json");let l=so(t,s),c=$.join(r,"navigator.yaml");v.writeFileSync(c,O.dump(l,{indent:2,lineWidth:120,noRefs:true,sortKeys:false}),"utf8"),n.push(".paradigm/navigator.yaml");let d=lo(t,s.purposeFiles),u=0;if(d&&Object.keys(d.flows).length>0){let S=$.join(r,"flow-index.json");v.writeFileSync(S,JSON.stringify(d,null,2),"utf8"),n.push(".paradigm/flow-index.json"),u=Object.keys(d.flows).length;}let p;try{let S=await Mt(t);zt(S,s.symbols,t);let I=await Wt(S,t),q=await Gt(S,t),on=S.exec("SELECT COUNT(*) FROM aspects")[0]?.values[0]?.[0]??0,rn=S.exec("SELECT COUNT(*) FROM anchors")[0]?.values[0]?.[0]??0,an=S.exec("SELECT COUNT(*) FROM edges")[0]?.values[0]?.[0]??0;Ut(S,t),n.push(".paradigm/aspect-graph.db"),p={aspects:on,anchors:rn,edges:an,loreLinks:I};}catch{}let g=0;try{let S=await de(t);g=Object.keys(S.personas).length,g>0&&n.push(".paradigm/personas/index.yaml");}catch{}let m;try{let S=await qt(t);S.health.total>0&&(m=S.health,n.push(".paradigm/protocols/index.yaml"));}catch{}let y;try{let S=$.join(t,".paradigm","university");if(v.existsSync(S)){let I=Xe(t);(I.totalContent>0||I.diplomaCount>0)&&(y={totalContent:I.totalContent,diplomaCount:I.diplomaCount},n.push(".paradigm/university/index.yaml"));}}catch{}let h;try{h=a$1(s,t);}catch{}let w;try{let S=b$3(s.symbols,t),I=S.missing+S.outOfBounds;I>0&&(w=I);}catch{}let P;try{P=c$2(s.purposeFiles,t);}catch{}let k;try{let S=[];for(let I of s.purposeFiles){let q=Ie(I);q.data&&S.push({filePath:I,data:q.data});}if(S.length>0){let q=ht(S).issues.length;q>0&&(k=q);}}catch{}let E={};for(let S of s.symbols)E[S.type]=(E[S.type]||0)+1;let x={};for(let S of s.symbols)S.type==="component"&&S.componentType&&(x[S.componentType]=(x[S.componentType]||0)+1);return {action:"reindex",filesWritten:n,symbolCount:s.symbols.length,breakdown:E,flowCount:u,aspectGraphStats:p,personaCount:g,protocolHealth:m,...Object.keys(x).length>0?{componentTypeBreakdown:x}:{},...y?{universityStats:y}:{},...h?{integrityReport:h}:{},...w!==void 0?{componentAnchorIssues:w}:{},...P?{purposeHealth:P}:{},...k!==void 0?{crossFileIssues:k}:{}}}function so(t,e){let n={};for(let s of e.symbols)if(s.type==="component"&&s.componentType){let o=s.componentType;n[o]||(n[o]=[]),n[o].push(s.symbol);}return {version:"1.0",generated:new Date().toISOString(),structure:oo(t),key_files:ro(t),skip_patterns:io(t),symbols:co(e.symbols,e.purposeFiles),...Object.keys(n).length>0?{symbolsByComponentType:n}:{}}}function oo(t){let e={};for(let[n,s]of Object.entries(eo)){let o=s.filter(r=>v.existsSync($.join(t,r)));if(o.length>0){let r=Object.values(Zs).find(i=>i.category===n);e[n]={paths:o,symbol:r?.prefix||"@"};}}return e}function ro(t){let e={};for(let[n,s]of Object.entries(to)){let o=s.filter(r=>v.existsSync($.join(t,r)));o.length>0&&(e[n]=o);}return e.config||(e.config=[]),e.entry||(e.entry=[]),e.types||(e.types=[]),e}function io(t){let e={always:[...Ve.always],unless_testing:[...Ve.unless_testing],unless_docs:[...Ve.unless_docs]},n=$.join(t,".gitignore");if(v.existsSync(n))try{let o=v.readFileSync(n,"utf8").split(`
|
|
110
|
+
`}function Er(t,e){let n=qe(t,e,".md");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=Kt(s);if(!o)return null;let r=o.frontmatter;return {frontmatter:Ys(r),body:o.body}}catch{return null}}function Tr(t,e,n){let s=e.type==="policy"?be:We,o=$.join(t,X,Q,s);v.mkdirSync(o,{recursive:true});let r=$.join(o,`${e.id}.md`),i=Bs(e,n);return v.writeFileSync(r,i,"utf8"),r}function Xs(t,e){let n=qe(t,e,".yaml");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=O.load(s);return !o||!o.id?null:Js(o)}catch{return null}}function _r(t,e){let n=$.join(t,X,Q,Se);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Qt(t,e){let n=qe(t,e,".yaml");if(!n)return null;try{let s=v.readFileSync(n,"utf8"),o=O.load(s);return !o||!o.id?null:o}catch{return null}}function $r(t,e){let n=$.join(t,X,Q,xe);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Zt(t,e){let n=$.join(t,X,Ge);if(!v.existsSync(n))return [];let s=[];try{let o=v.readdirSync(n).filter(r=>r.endsWith(".yaml"));for(let r of o)try{let i=v.readFileSync($.join(n,r),"utf8"),a=O.load(i);if(!a||!a.id||e?.student&&a.student!==e.student||e?.type&&a.type!==e.type)continue;s.push(a);}catch{}}catch{}return s.sort((o,r)=>r.earnedAt.localeCompare(o.earnedAt))}function Rr(t,e){let n=$.join(t,X,Ge);v.mkdirSync(n,{recursive:true});let s=$.join(n,`${e.id}.yaml`);return v.writeFileSync(s,O.dump(e,{lineWidth:-1,noRefs:true}),"utf8"),s}function Ir(t,e){let n=ve(t);if(!n)return [];let s=[...n.entries];if(e.type&&(s=s.filter(r=>r.type===e.type)),e.tag&&(s=s.filter(r=>r.tags.some(i=>i.startsWith(e.tag)))),e.difficulty&&(s=s.filter(r=>r.difficulty===e.difficulty)),e.symbol&&(s=s.filter(r=>r.symbols.some(i=>i===e.symbol))),e.author&&(s=s.filter(r=>r.author===e.author)),e.query){let r=e.query.toLowerCase();s=s.filter(i=>i.title.toLowerCase().includes(r)||i.id.toLowerCase().includes(r)||i.tags.some(a=>a.toLowerCase().includes(r)));}if(e.category&&(s=s.filter(r=>r.category===e.category)),e.track){let r=Be(t),i=new Map;for(let a of r.content.categories)i.set(a.id,a.track||"core");s=s.filter(a=>(a.category&&i.get(a.category)||"core")===e.track);}let o=e.limit||20;return s.slice(0,o)}function Xe(t){let e=$.join(t,X),n=$.join(e,Q),s=[];for(let d of [We,be]){let u=$.join(n,d);if(v.existsSync(u))try{for(let p of v.readdirSync(u).filter(g=>g.endsWith(".md")))try{let g=v.readFileSync($.join(u,p),"utf8"),m=Kt(g);if(!m)continue;let y=m.frontmatter;s.push({id:y.id||p.replace(".md",""),title:y.title||p,type:y.type||(d===be?"policy":"note"),author:y.author||"unknown",created:y.created||"",updated:y.updated||"",tags:Array.isArray(y.tags)?y.tags:[],symbols:Array.isArray(y.symbols)?y.symbols:[],difficulty:y.difficulty||"beginner",file:`${Q}/${d}/${p}`,...y.category?{category:y.category}:{}});}catch{}}catch{}}let o=$.join(n,Se);if(v.existsSync(o))try{for(let d of v.readdirSync(o).filter(u=>u.endsWith(".yaml")))try{let u=v.readFileSync($.join(o,d),"utf8"),p=O.load(u);if(!p||!p.id)continue;s.push({id:p.id,title:p.title||d,type:"quiz",author:p.author||"unknown",created:p.created||"",updated:p.updated||"",tags:p.tags||[],symbols:p.symbols||[],difficulty:p.difficulty||"beginner",file:`${Q}/${Se}/${d}`,...p.category?{category:p.category}:{}});}catch{}}catch{}let r=$.join(n,xe);if(v.existsSync(r))try{for(let d of v.readdirSync(r).filter(u=>u.endsWith(".yaml")))try{let u=v.readFileSync($.join(r,d),"utf8"),p=O.load(u);if(!p||!p.id)continue;s.push({id:p.id,title:p.title||d,type:"path",author:p.author||"unknown",created:p.created||"",updated:p.updated||"",tags:p.tags||[],symbols:[],file:`${Q}/${xe}/${d}`,...p.category?{category:p.category}:{}});}catch{}}catch{}let i=0,a=$.join(e,Ge);if(v.existsSync(a))try{i=v.readdirSync(a).filter(d=>d.endsWith(".yaml")).length;}catch{}let l={version:"1.0",generatedAt:new Date().toISOString(),totalContent:s.length,entries:s,diplomaCount:i};v.mkdirSync(e,{recursive:true});let c=$.join(e,Vt);return v.writeFileSync(c,O.dump(l,{lineWidth:-1,noRefs:true}),"utf8"),l}function kr(t,e){let n=ve(t)||Xe(t),s=[],o=n.entries;e?.id&&(o=o.filter(c=>c.id===e.id));let r=null;e?.deep&&(r=en(t));let i=new Set(n.entries.map(c=>c.id));for(let c of o){if(c.title||s.push({contentId:c.id,severity:"error",check:"missing-title",message:"Content is missing a title",fix:"Add a title field to the content frontmatter"}),c.type==="quiz"&&qs(t,c.id,s),c.type==="path"&&Vs(t,c.id,i,s),r&&c.symbols.length>0){Be(t).content.categories.find(g=>g.id===c.category)?.validationStrictness==="relaxed";for(let g of c.symbols)r.has(g)||s.push({contentId:c.id,severity:"warning",check:"broken-symbol-ref",message:`Symbol "${g}" not found in scan-index`,fix:`Remove or update the symbol reference in ${c.id}`});}e?.deep&&c.symbols.length>0&&c.updated&&Qs(t,c,s);}let a=Zt(t);for(let c of a)if(c.total>0&&c.percentage!==Math.round(c.score/c.total*1e4)/100){let d=Math.round(c.score/c.total*1e4)/100;Math.abs(c.percentage-d)>.1&&s.push({contentId:c.id,severity:"warning",check:"diploma-score-mismatch",message:`Diploma percentage ${c.percentage} doesn't match score ${c.score}/${c.total} (expected ${d})`});}let l=Ks(t,n);return {status:s.some(c=>c.severity==="error")?"errors":s.length>0?"warnings":"healthy",totalContent:n.totalContent,checked:o.length,issues:s,symbolCoverage:l}}function qs(t,e,n){let s=Xs(t,e);if(!s){n.push({contentId:e,severity:"error",check:"unreadable-quiz",message:"Quiz file could not be parsed"});return}(!s.passThreshold||s.passThreshold<0||s.passThreshold>1)&&n.push({contentId:e,severity:"warning",check:"invalid-pass-threshold",message:`passThreshold should be between 0 and 1, got ${s.passThreshold}`,fix:"Set passThreshold to a value between 0.0 and 1.0"});for(let o of s.questions){if(!o.choices||typeof o.choices!="object"){n.push({contentId:e,severity:"error",check:"invalid-quiz-choices",message:`Question ${o.id} has no choices defined`});continue}(!o.correct||!(o.correct in o.choices))&&n.push({contentId:e,severity:"error",check:"invalid-quiz-answer",message:`Question ${o.id}: correct answer "${o.correct}" not found in choices [${Object.keys(o.choices).join(", ")}]`,fix:`Set correct to one of: ${Object.keys(o.choices).join(", ")}`});}}function Vs(t,e,n,s){let o=Qt(t,e);if(!o){s.push({contentId:e,severity:"error",check:"unreadable-path",message:"Learning path file could not be parsed"});return}for(let r of o.steps)r.content.startsWith("plsat:")||n.has(r.content)||s.push({contentId:e,severity:"error",check:"broken-path-step",message:`Learning path step references "${r.content}" which doesn't exist`,fix:`Create content with id "${r.content}" or remove this step`});}function Pr(t,e){let n=ve(t);if(!n)return [];let s=[];for(let o of n.entries)if(o.symbols.includes(e)){let r=tn(t,o,e);s.push({id:o.id,title:o.title,type:o.type,stale:r});}return s}function Cr(t,e){let n=ve(t);if(!n)return {paths:[],suggestedContent:[],extracurricular:[],diplomaCount:0,totalContent:0};let s=Be(t),o=new Set;for(let p of s.content.categories)p.excludeFromOnboarding&&o.add(p.id);let r=n.entries.filter(p=>!p.category||!o.has(p.category)),i=n.entries.filter(p=>p.category&&o.has(p.category)),a=r.filter(p=>p.type==="path"),l=e?Zt(t,{student:e}):[],c=new Set(l.map(p=>p.source)),d=a.map(p=>{let g=Qt(t,p.id);return {id:p.id,title:p.title,steps:g?.steps.length||0,completed:c.has(p.id)}}),u=r.filter(p=>p.type!=="path"&&(p.difficulty==="beginner"||p.tags.includes("onboarding"))).slice(0,10);return {paths:d,suggestedContent:u,extracurricular:i,diplomaCount:l.length,totalContent:n.totalContent}}function qe(t,e,n){let s=$.join(t,X,Q);for(let o of [We,be,Se,xe]){let r=$.join(s,o,`${e}${n}`);if(v.existsSync(r))return r}return null}function Ys(t){return {id:t.id||"",title:t.title||"",type:t.type||"note",author:t.author||"unknown",created:t.created||"",updated:t.updated||"",tags:Array.isArray(t.tags)?t.tags:[],symbols:Array.isArray(t.symbols)?t.symbols:[],difficulty:t.difficulty||"beginner",estimatedMinutes:t.estimatedMinutes,prerequisites:Array.isArray(t.prerequisites)?t.prerequisites:[],...t.category?{category:t.category}:{}}}function Js(t){return {...t,tags:t.tags||[],symbols:t.symbols||[],difficulty:t.difficulty||"beginner",passThreshold:t.passThreshold??.7,questions:t.questions||[]}}function en(t){let e=new Set,n=$.join(t,".paradigm","scan-index.json");if(!v.existsSync(n))return e;try{let s=v.readFileSync(n,"utf8"),o=JSON.parse(s);if(o.symbols&&Array.isArray(o.symbols))for(let r of o.symbols)r.symbol&&e.add(r.symbol);}catch{}return e}function Ks(t,e){let n=en(t),s=new Set;for(let r of e.entries)for(let i of r.symbols)n.has(i)&&s.add(i);let o=n.size;return {totalSymbols:o,coveredByContent:s.size,percentage:o>0?Math.round(s.size/o*100):0}}function tn(t,e,n){if(!e.updated)return false;let s=new Date(e.updated).getTime();if(isNaN(s))return false;let o=$.join(t,".paradigm","scan-index.json");if(!v.existsSync(o))return false;try{let r=v.readFileSync(o,"utf8"),i=JSON.parse(r);if(i.symbols&&Array.isArray(i.symbols)){for(let a of i.symbols)if(a.symbol===n&&a.filePath){let l=$.join(t,a.filePath);if(v.existsSync(l)&&v.statSync(l).mtime.getTime()>s)return !0}}}catch{}return false}function Qs(t,e,n){for(let s of e.symbols)if(tn(t,e,s)){n.push({contentId:e.id,severity:"warning",check:"stale-content",message:`Content may be stale: symbol "${s}" was updated after content was last modified`,fix:`Review and update ${e.id} to reflect changes to ${s}`});break}}var Zs={"@":{category:"features",prefix:"@"},"#":{category:"components",prefix:"#"},"^":{category:"gates",prefix:"^"},$:{category:"flows",prefix:"$"},"&":{category:"integrations",prefix:"&"},"!":{category:"signals",prefix:"!"},"%":{category:"state",prefix:"%"}},eo={features:["src/features/","features/","app/","src/app/","src/modules/","modules/"],components:["src/components/","components/","src/lib/","lib/","src/ui/","ui/"],gates:["middleware/","src/middleware/","auth/","src/auth/","guards/","src/guards/"],flows:["flows/","src/flows/","workflows/","src/workflows/","sagas/","src/sagas/"],integrations:["integrations/","src/integrations/","external/","src/external/","vendors/"],signals:["events/","src/events/","handlers/","src/handlers/"],state:["stores/","src/stores/","state/","src/state/","reducers/","src/reducers/"]},to={config:[".paradigm/config.yaml","package.json","tsconfig.json",".env.example"],entry:["src/index.ts","src/index.tsx","src/main.ts","src/main.tsx","index.ts","main.ts","src/app.ts","src/app.tsx"],types:["src/types/","types/","src/types.ts","types.ts"]},Ve={always:["node_modules/","dist/","build/",".git/",".next/",".nuxt/",".cache/","*.lock","*.log"],unless_testing:["**/*.test.ts","**/*.test.tsx","**/*.spec.ts","**/*.spec.tsx","__tests__/","test/","tests/"],unless_docs:["docs/","*.md","README*","CHANGELOG*"]};function Br(){return [{name:"paradigm_reindex",description:"Rebuild scan-index.json, navigator.yaml, and flow-index.json from .purpose files. Call after modifying paradigm files or at the end of a work session to ensure static index files are fresh. Returns counts of indexed symbols, files processed, and any errors. ~150 tokens.",inputSchema:{type:"object",properties:{}},annotations:{readOnlyHint:false,destructiveHint:true},aliases:["rebuild","refresh","rescan","regenerate index","update index"]}]}async function Xr(t,e,n,s){if(t!=="paradigm_reindex")return {handled:false,text:""};try{let o=await no(n.rootDir,n);await s(),$t.clear(),It();let r=(o.integrityReport?.brokenReferences?.length||0)+(o.integrityReport?.duplicateSymbols?.length||0)+(o.componentAnchorIssues||0)+(o.crossFileIssues||0),i={success:!0,symbolCount:o.symbolCount,breakdown:o.breakdown,flowCount:o.flowCount,filesWritten:o.filesWritten.length,...o.aspectGraphStats?{aspects:o.aspectGraphStats.aspects,loreLinks:o.aspectGraphStats.loreLinks}:{},...o.protocolHealth?{protocols:o.protocolHealth.total,staleProtocols:o.protocolHealth.stale}:{},...r>0?{issues:r}:{}},a=JSON.stringify(i,null,2);return je(a.length,t),{handled:!0,text:a}}catch(o){let r=JSON.stringify({error:o.message},null,2);return je(r.length,t),{handled:true,text:r}}}async function no(t,e){let n=[],s;e?s=e.aggregation:s=await Tt(t);let o=e?.projectName||$.basename(t),r=$.join(t,".paradigm");v.existsSync(r)||v.mkdirSync(r,{recursive:true});let i=Ce({symbols:s.symbols,purposeFiles:s.purposeFiles,portalFiles:s.portalFiles},{projectName:o}),a=$.join(r,"scan-index.json");v.writeFileSync(a,Ae(i),"utf8"),n.push(".paradigm/scan-index.json");let l=so(t,s),c=$.join(r,"navigator.yaml");v.writeFileSync(c,O.dump(l,{indent:2,lineWidth:120,noRefs:true,sortKeys:false}),"utf8"),n.push(".paradigm/navigator.yaml");let d=lo(t,s.purposeFiles),u=0;if(d&&Object.keys(d.flows).length>0){let S=$.join(r,"flow-index.json");v.writeFileSync(S,JSON.stringify(d,null,2),"utf8"),n.push(".paradigm/flow-index.json"),u=Object.keys(d.flows).length;}let p;try{let S=await Mt(t);zt(S,s.symbols,t);let I=await Wt(S,t),q=await Gt(S,t),on=S.exec("SELECT COUNT(*) FROM aspects")[0]?.values[0]?.[0]??0,rn=S.exec("SELECT COUNT(*) FROM anchors")[0]?.values[0]?.[0]??0,an=S.exec("SELECT COUNT(*) FROM edges")[0]?.values[0]?.[0]??0;Ut(S,t),n.push(".paradigm/aspect-graph.db"),p={aspects:on,anchors:rn,edges:an,loreLinks:I};}catch{}let g=0;try{let S=await de(t);g=Object.keys(S.personas).length,g>0&&n.push(".paradigm/personas/index.yaml");}catch{}let m;try{let S=await qt(t);S.health.total>0&&(m=S.health,n.push(".paradigm/protocols/index.yaml"));}catch{}let y;try{let S=$.join(t,".paradigm","university");if(v.existsSync(S)){let I=Xe(t);(I.totalContent>0||I.diplomaCount>0)&&(y={totalContent:I.totalContent,diplomaCount:I.diplomaCount},n.push(".paradigm/university/index.yaml"));}}catch{}let h;try{h=a$1(s,t);}catch{}let w;try{let S=b$3(s.symbols,t),I=S.missing+S.outOfBounds;I>0&&(w=I);}catch{}let P;try{P=c$2(s.purposeFiles,t);}catch{}let k;try{let S=[];for(let I of s.purposeFiles){let q=Ie(I);q.data&&S.push({filePath:I,data:q.data});}if(S.length>0){let q=ht(S).issues.length;q>0&&(k=q);}}catch{}let E={};for(let S of s.symbols)E[S.type]=(E[S.type]||0)+1;let x={};for(let S of s.symbols)S.type==="component"&&S.componentType&&(x[S.componentType]=(x[S.componentType]||0)+1);return {action:"reindex",filesWritten:n,symbolCount:s.symbols.length,breakdown:E,flowCount:u,aspectGraphStats:p,personaCount:g,protocolHealth:m,...Object.keys(x).length>0?{componentTypeBreakdown:x}:{},...y?{universityStats:y}:{},...h?{integrityReport:h}:{},...w!==void 0?{componentAnchorIssues:w}:{},...P?{purposeHealth:P}:{},...k!==void 0?{crossFileIssues:k}:{}}}function so(t,e){let n={};for(let s of e.symbols)if(s.type==="component"&&s.componentType){let o=s.componentType;n[o]||(n[o]=[]),n[o].push(s.symbol);}return {version:"1.0",generated:new Date().toISOString(),structure:oo(t),key_files:ro(t),skip_patterns:io(t),symbols:co(e.symbols,e.purposeFiles),...Object.keys(n).length>0?{symbolsByComponentType:n}:{}}}function oo(t){let e={};for(let[n,s]of Object.entries(eo)){let o=s.filter(r=>v.existsSync($.join(t,r)));if(o.length>0){let r=Object.values(Zs).find(i=>i.category===n);e[n]={paths:o,symbol:r?.prefix||"@"};}}return e}function ro(t){let e={};for(let[n,s]of Object.entries(to)){let o=s.filter(r=>v.existsSync($.join(t,r)));o.length>0&&(e[n]=o);}return e.config||(e.config=[]),e.entry||(e.entry=[]),e.types||(e.types=[]),e}function io(t){let e={always:[...Ve.always],unless_testing:[...Ve.unless_testing],unless_docs:[...Ve.unless_docs]},n=$.join(t,".gitignore");if(v.existsSync(n))try{let o=v.readFileSync(n,"utf8").split(`
|
|
111
111
|
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")).filter(r=>r.endsWith("/")||r.includes("*")||["node_modules","dist","build",".cache"].some(i=>r.includes(i))).slice(0,20);for(let r of o)e.always.includes(r)||e.always.push(r);}catch{}return e}function ao(t){switch(t){case "feature":return "@";case "component":return "#";case "gate":return "^";case "flow":return "$";case "integration":return "&";case "signal":return "!";case "state":return "%";case "idea":return "?";case "deprecated":return "~";case "aspect":return "~";default:return "@"}}function co(t,e,n){let s={};for(let o of t){let i=`${ao(o.type)}${o.id}`;if(o.filePath)s[i]=o.filePath;else {let a=e.find(l=>$.dirname(l).toLowerCase().includes(o.id.toLowerCase()));a&&(s[i]=$.dirname(a)+"/");}}return s}function lo(t,e){let n={},s={};for(let o of e)try{let r=v.readFileSync(o,"utf8"),i=O.load(r);if(!i?.flows)continue;if(Array.isArray(i.flows))for(let a of i.flows){let l=a;if(!l.name)continue;let c=`$${l.name}`,d=nn(l.steps);d.length>0&&(n[c]={id:c,description:l.description||"",steps:d,definedIn:$.relative(t,o)},sn(c,d,s));}else for(let[a,l]of Object.entries(i.flows)){let c=a.startsWith("$")?a:`$${a}`,d=nn(l.steps);d.length>0&&(n[c]={id:c,description:l.description||"",trigger:l.trigger,steps:d,validation:l.validation,definedIn:$.relative(t,o)},sn(c,d,s));}}catch{}return Object.keys(n).length===0?null:{version:"1.0",generatedAt:new Date().toISOString(),flows:n,symbolToFlows:s}}function nn(t){if(!t||!Array.isArray(t))return [];let e=[];for(let n=0;n<t.length;n++){let s=t[n];if(typeof s=="object"&&s!==null){let o=s,r=o.action||o.description||o.component||"";r&&e.push({id:o.id||`step-${n+1}`,action:r,symbol:o.symbol||o.component,expect:o.expect});}}return e}function sn(t,e,n){for(let s of e)s.symbol&&(n[s.symbol]||(n[s.symbol]=[]),n[s.symbol].includes(t)||n[s.symbol].push(t));}export{Er as $,Qo as A,Zo as B,er as C,tr as D,nr as E,sr as F,ir as G,ce as H,le as I,cr as J,Bt as K,lr as L,dr as M,ur as N,pr as O,fr as P,gr as Q,mr as R,ze as S,Ms as T,yr as U,wr as V,br as W,Sr as X,Us as Y,xr as Z,Be as _,Tn as a,Tr as aa,po as b,Xs as ba,$n as c,_r as ca,go as d,Qt as da,ge as e,$r as ea,Tt as f,Zt as fa,vo as g,Rr as ga,me as h,Ir as ha,Eo as i,Xe as ia,To as j,kr as ja,_o as k,Pr as ka,$o as l,Cr as la,Ro as m,Br as ma,Io as n,Xr as na,je as o,no as oa,Mo as p,Uo as q,zo as r,Ho as s,Wo as t,Rt as u,$t as v,Mt as w,Ut as x,Jo as y,Ko as z};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import*as c from'fs';import*as a from'path';import {Glob}from'glob';function n(t){let e=r=>{if(r.includes("*"))try{return new Glob(r,{cwd:t,nodir:!0}).walkSync().length>0}catch{return false}return c.existsSync(a.join(t,r))};return e("project.godot")||e("Assets/ProjectSettings")?"game":e("Package.swift")&&!e("package.json")?e("Sources/*/App")||e("**/AppDelegate.swift")?"macos-app":"ios-app":e("pubspec.yaml")?"flutter-app":e("supabase")&&(e("next.config.*")||e("vite.config.*"))?"saas-web-app":e("next.config.*")||e("vite.config.*")||e("nuxt.config.*")?"web-app":e("Dockerfile")||e("prisma")||e("drizzle.config.*")?"backend-api":e("Cargo.toml")?"rust-project":e("pyproject.toml")||e("setup.py")||e("requirements.txt")?"python-project":"generic"}var s={"saas-web-app":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","designer","copywriter","performance","devops","dba","e2e","dx","seo","pm","product","sales","legal","a11y","qa","debugger","release","narrator"],"web-app":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","designer","copywriter","performance","devops","e2e","seo","a11y","qa","debugger"],"backend-api":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","devops","dba","performance","dx","qa","debugger","release"],"ios-app":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","designer","mobile","performance","a11y","qa","debugger"],"macos-app":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","designer","performance","qa","debugger"],"flutter-app":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","designer","mobile","performance","a11y","debugger"],game:["advocate","architect","builder","compliance","reviewer","tester","documentor","gamedev","3d","audio","designer","performance","debugger"],"rust-project":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","performance","debugger","qa"],"python-project":["advocate","architect","builder","compliance","reviewer","tester","security","documentor","performance","debugger","qa"],generic:["advocate","architect","builder","compliance","reviewer","tester","security","documentor","debugger","qa"]};export{n as a,s as b};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {a as a$1}from'./chunk-FYDRENK7.js';import {f,a}from'./chunk-
|
|
2
|
+
import {a as a$1}from'./chunk-FYDRENK7.js';import {f,a}from'./chunk-HXGYVS2N.js';import {e}from'./chunk-AO7ZSRME.js';import {b,d,c}from'./chunk-EKZDFEJW.js';import*as h from'fs';import*as A from'path';import*as R from'js-yaml';import {glob}from'glob';import {EventEmitter}from'events';var H=/[#$^!~][a-zA-Z0-9_-]+/g;function V(r){let e=r.match(H)||[];return [...new Set(e)]}function G(r){let e=r.charAt(0);return {"#":"component",$:"flow","^":"gate","!":"signal","~":"aspect"}[e]||"unknown"}async function M(r,e,s,t){let o=A.join(s,".paradigm"),n=V(e),a=K(r,t),c=W(a.include||[],n),l=a.exclude||[],p=await J(s,c,l);return {systemPrompt:await Y(r,o,n),files:p,symbols:n}}function K(r,e){return e?.contextInclude||e?.contextExclude?{include:e.contextInclude,exclude:e.contextExclude}:{architect:{include:["specs/*.md",".purpose","**/.purpose","portal.yaml",".paradigm/config.yaml"],exclude:["src/**","tests/**","node_modules/**","dist/**"]},builder:{include:["src/**","tests/**","{feature}.purpose","specs/{feature}.md"],exclude:["specs/*.md","node_modules/**","dist/**"]},reviewer:{include:["src/**","specs/*.md","portal.yaml",".purpose"],exclude:["tests/**","node_modules/**","dist/**"]},tester:{include:["tests/**","health.yaml","{feature}.purpose"],exclude:["src/**","specs/**","node_modules/**","dist/**"]},security:{include:["portal.yaml","src/middleware/**","src/auth/**",".paradigm/wisdom/antipatterns.yaml"],exclude:["src/routes/**","tests/**","node_modules/**","dist/**"]}}[r.name]||{include:[".purpose","portal.yaml"],exclude:["node_modules/**","dist/**"]}}function W(r,e){let s=[];for(let t of r)if(t.includes("{feature}")||t.includes("{symbol}"))for(let o of e){let n=o.substring(1);s.push(t.replace(/\{feature\}/g,n).replace(/\{symbol\}/g,n));}else s.push(t);return s}async function J(r,e,s){let t=new Set;for(let o of e)try{let n=await glob(o,{cwd:r,ignore:s,nodir:!0,absolute:!1});for(let a of n)t.add(a);}catch{}return Array.from(t)}async function Y(r,e,s){let t=[],o=A.join(e,"config.yaml"),n=null;if(h.existsSync(o))try{n=R.load(h.readFileSync(o,"utf-8"));}catch{}if(t.push(`# ${r.name.charAt(0).toUpperCase()+r.name.slice(1)} Agent Context
|
|
3
3
|
`),n?.project&&(t.push(`> Project: ${n.project}`),n.discipline&&n.discipline!=="auto"&&t.push(`> Discipline: ${n.discipline}`),t.push("")),n?.["agent-guidelines"]?.overview&&(t.push(`## Project Overview
|
|
4
4
|
`),t.push(n["agent-guidelines"].overview),t.push("")),n?.["symbol-system"]){t.push(`## Symbol System
|
|
5
5
|
`),t.push("| Symbol | Meaning | Description |"),t.push("|--------|---------|-------------|");for(let[c,l]of Object.entries(n["symbol-system"]))t.push(`| \`${c}\` | ${l.name} | ${l.description} |`);t.push("");}if(n?.conventions){let c=Z(n.conventions,r.name);if(c.length>0){t.push(`## Conventions
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a}from'./chunk-LKAT7IAK.js';import*as c from'fs/promises';import*as p from'path';import*as g from'crypto';import*as l from'js-yaml';import i from'chalk';var f=".paradigm/adoptions.yaml",y=".paradigm/roster.yaml";function m(s){let r=Object.keys(s).sort(),t={};for(let e of r)t[e]=s[e];let o=JSON.stringify(t);return g.createHash("sha256").update(o).digest("hex")}async function w(s){let r=p.join(s,f);try{let t=await c.readFile(r,"utf-8"),o=l.load(t);if(!o||typeof o!="object")return null;let e=h(o.agents),d=o["integrity-hash"]||o.integrityHash||void 0,n=!0;if(d){let a$1=m(e);a$1!==d&&(n=!1,a.component("adoption").warn("Adoption integrity hash mismatch \u2014 adoptions.yaml may have been tampered with",{expected:d.slice(0,12)+"...",computed:a$1.slice(0,12)+"..."}));}return {version:o.version||"1.0",adoptedAt:o["adopted-at"]||o.adoptedAt||"",projectType:o["project-type"]||o.projectType||"",agents:e,verified:n,integrityHash:d}}catch(t){return t.code==="ENOENT"||a.component("adoption").warn("Failed to parse adoptions.yaml",{error:String(t)}),null}}async function R(s,r){let t=p.join(s,f),o=p.dirname(t);await c.mkdir(o,{recursive:true});let e=m(r.agents),d={version:r.version,"adopted-at":r.adoptedAt,"project-type":r.projectType,"integrity-hash":e,agents:v(r.agents)},n=l.dump(d,{lineWidth:-1,noRefs:true,sortKeys:false,quotingType:'"'});await c.writeFile(t,n,"utf-8");}async function b(s){let r=p.join(s,y),t=new Date().toISOString(),o={active:[]};try{let d=await c.readFile(r,"utf-8"),n=l.load(d);n&&typeof n=="object"&&(o={version:n.version,active:n.active||[],type:n.type});}catch{a.component("adoption").debug("No roster.yaml found for migration");}let e={version:"1.0",adoptedAt:t,projectType:o.type||"unknown",agents:{}};for(let d of o.active||[])e.agents[d]={adopted:t,source:"core",defaultsAccepted:true};return a.component("adoption").debug("Migrated roster to adoptions",{count:Object.keys(e.agents).length}),e}function k(s){return {version:"1.0",adoptedAt:new Date().toISOString(),projectType:s,agents:{}}}function j(s,r){let t=[],o=i.dim("\u2500".repeat(49)),e=s.filter(n=>n.source==="core"),d=s.filter(n=>n.source==="ecosystem");if(t.push(""),t.push(` ${i.bold("Agent Adoption")}`),t.push(` ${o}`),t.push(` ${i.dim("Detected:")} ${r}`),e.length>0){t.push(""),t.push(` ${i.bold(`Core team (${e.length}):`)}`);for(let n of e){let a=n.nickname?`${n.id} (${n.nickname})`:n.id;t.push(` ${i.white(a.padEnd(22))}${i.gray(n.role)}`);}}if(d.length>0){t.push(""),t.push(` ${i.bold(`Ecosystem (${d.length} detected):`)}`);for(let n of d){let a=n.nickname?`${n.id} (${n.nickname})`:n.id;t.push(` ${i.white(a.padEnd(22))}${i.gray(n.role)}`);}}return t.push(""),t.push(` ${i.dim("All using default scopes.")}`),t.push(` ${i.dim("[Enter]")} accept all ${i.dim("|")} ${i.dim("[r]")} review individually ${i.dim("|")} ${i.dim("[c]")} customize`),t.push(""),t.join(`
|
|
3
|
+
`)}function h(s){if(!s||typeof s!="object")return {};let r={};for(let[t,o]of Object.entries(s)){if(!o||typeof o!="object")continue;let e=o;r[t]={adopted:e.adopted||"",source:e.source||"core",defaultsAccepted:e["defaults-accepted"]!=null?!!e["defaults-accepted"]:e.defaultsAccepted!=null?!!e.defaultsAccepted:true,...e.version!=null&&{version:e.version},...e.overrides!=null&&{overrides:e.overrides},...e["scopes-approved"]!=null&&{scopesApproved:e["scopes-approved"]},...e.scopesApproved!=null&&{scopesApproved:e.scopesApproved},...e["detected-from"]!=null&&{detectedFrom:e["detected-from"]},...e.detectedFrom!=null&&{detectedFrom:e.detectedFrom}};}return r}function v(s){let r={};for(let[t,o]of Object.entries(s)){let e={adopted:o.adopted,source:o.source,"defaults-accepted":o.defaultsAccepted};o.version!=null&&(e.version=o.version),o.overrides!=null&&(e.overrides=o.overrides),o.scopesApproved!=null&&(e["scopes-approved"]=o.scopesApproved),o.detectedFrom!=null&&(e["detected-from"]=o.detectedFrom),r[t]=e;}return r}export{w as a,R as b,b as c,k as d,j as e};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {a,e,d}from'./chunk-73R63P7K.js';import'./chunk-5TAVYPOV.js';import*as c from'fs';import*as p from'path';import {execSync}from'child_process';import n from'chalk';import*as w from'js-yaml';function R(s){return s.match(/(?:^|\s)((?:\/|\.\/|[a-zA-Z0-9_-]+\/)[^\s,;:'"]+\.[a-zA-Z]{1,10})\b/)?.[1]}async function $(s,l){try{let a$1=a(s),f=[];try{f=execSync("git diff --name-only HEAD",{cwd:s,encoding:"utf8",timeout:5e3}).trim().split(`
|
|
3
3
|
`).filter(Boolean);}catch{}let i;try{i=execSync("git status --porcelain",{cwd:s,encoding:"utf8",timeout:5e3}).trim()==="";}catch{}let u=p.join(s,"portal.yaml"),g=!1;if(c.existsSync(u))try{let t=c.readFileSync(u,"utf8"),e=w.load(t);g=e?.routes!=null&&Object.keys(e.routes).length>0;}catch{}let r=e({toolsCalled:[],filesModified:f,symbolsTouched:[],loreRecorded:!1,hasPortalRoutes:g,taskAddsRoutes:!1,gitClean:i}),o=d(a$1,l,r),d$1=0;if(o.evaluations.length>0)try{let t=p.join(s,".paradigm","sentinel");if(c.existsSync(t)){let{SentinelStorage:e}=await import('./dist-VGFSP3XM.js'),m=new e(t);for(let b of o.evaluations)m.recordPracticeEvent({habitId:b.habit.id,habitCategory:b.habit.category,result:b.result,engineer:"agent",sessionId:`cli-${Date.now().toString(36)}`,symbolsTouched:[],filesModified:f,notes:b.reason}),d$1++;}}catch{}let h=p.join(s,".paradigm",".habits-blocking");try{if(l==="on-stop"&&o.blocksCompletion){let t=o.evaluations.filter(e=>e.result==="skipped"&&e.habit.severity==="block").map(e=>`${e.habit.name}: ${e.reason}`);c.writeFileSync(h,t.join(`
|
|
4
|
-
`),"utf8");}else l==="on-stop"&&c.existsSync(h)&&c.unlinkSync(h);}catch{}return {trigger:l,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:d$1}}catch{return null}}async function P(s,l){let a=p.join(s,".paradigm","aspect-graph.db");if(!c.existsSync(a))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:f}=await import('./drift-ILZE5BFJ.js'),i="",u=console.log;console.log=g=>{i=g;};try{await f({json:!0,autoHeal:l});}finally{console.log=u;}return i?JSON.parse(i):null}catch{return null}}async function B(s){if(!c.existsSync(p.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:l}=await import('./portal-compliance-4MG5F2GI.js'),a=await l(s);return {status:a.status,declaredButUnusedCount:a.declaredButUnused.length,usedButUndeclaredCount:a.usedButUndeclared.length,properlyDeclaredCount:a.properlyDeclared.length,declaredButUnused:a.declaredButUnused,usedButUndeclared:a.usedButUndeclared,properlyDeclared:a.properlyDeclared}}catch{return null}}async function j(s){try{let{runPostflightLearning:l}=await import('./ambient-
|
|
4
|
+
`),"utf8");}else l==="on-stop"&&c.existsSync(h)&&c.unlinkSync(h);}catch{}return {trigger:l,evaluation:{total:o.summary.total,followed:o.summary.followed,skipped:o.summary.skipped,partial:o.summary.partial,blockingViolations:o.summary.blockingViolations,blocksCompletion:o.blocksCompletion},habits:o.evaluations.map(t=>({id:t.habit.id,name:t.habit.name,category:t.habit.category,severity:t.habit.severity,result:t.result,reason:t.reason,evidence:t.evidence})),recorded:d$1}}catch{return null}}async function P(s,l){let a=p.join(s,".paradigm","aspect-graph.db");if(!c.existsSync(a))return {driftedCount:0,healedCount:0,cleanCount:0,missingCount:0,details:[]};try{let{driftCheckCommand:f}=await import('./drift-ILZE5BFJ.js'),i="",u=console.log;console.log=g=>{i=g;};try{await f({json:!0,autoHeal:l});}finally{console.log=u;}return i?JSON.parse(i):null}catch{return null}}async function B(s){if(!c.existsSync(p.join(s,"portal.yaml")))return null;try{let{checkPortalCompliance:l}=await import('./portal-compliance-4MG5F2GI.js'),a=await l(s);return {status:a.status,declaredButUnusedCount:a.declaredButUnused.length,usedButUndeclaredCount:a.usedButUndeclared.length,properlyDeclaredCount:a.properlyDeclared.length,declaredButUnused:a.declaredButUnused,usedButUndeclared:a.usedButUndeclared,properlyDeclared:a.properlyDeclared}}catch{return null}}async function j(s){try{let{runPostflightLearning:l}=await import('./ambient-2JZTNXUL.js');return await l(s)}catch{return null}}async function A(s){let l=process.cwd(),a=s.trigger||"on-stop",f=s.autoHeal!==false,i=[],u=[],g=await $(l,a),r=await P(l,f),o=await B(l);if(g?.evaluation.blocksCompletion){let t=g.habits.filter(e=>e.result==="skipped"&&e.severity==="block");for(let e of t){let m=`Blocking habit not satisfied: ${e.name} \u2014 ${e.reason}`;i.push(m),u.push({message:m,source:"habits",file:R(e.reason),severity:"blocking"});}}if(r&&r.driftedCount>0){let t=`${r.driftedCount} aspect anchor(s) have drifted (content genuinely changed). Run paradigm_aspect_check to review.`;i.push(t);for(let e of r.details.filter(m=>m.status==="drifted"))u.push({message:`Aspect ~${e.aspectId} drifted at lines ${e.startLine}-${e.endLine}`,source:"drift",file:e.path,severity:"advisory"});u.filter(e=>e.source==="drift").length===0&&u.push({message:t,source:"drift",severity:"advisory"});}if(o&&o.usedButUndeclaredCount>0){let t=`${o.usedButUndeclaredCount} gate(s) used in code but not declared in portal.yaml: ${o.usedButUndeclared.join(", ")}`;i.push(t);for(let e of o.usedButUndeclared)u.push({message:`Gate ^${e} used in code but not declared in portal.yaml`,source:"portal",file:"portal.yaml",severity:"blocking"});}let d=null;s.learn&&(d=await j(l));let h={habits:g,drift:r,portal:o,violations:i,structuredViolations:u,postflight:s.learn?d:void 0};if(s.json)console.log(JSON.stringify(h));else {if(console.log(n.magenta(`
|
|
5
5
|
Paradigm Compliance Check
|
|
6
6
|
`)),g){let{evaluation:t}=g,e=t.blocksCompletion?n.red:n.green;console.log(n.white(" Habits:")),console.log(` ${e(`${t.followed} followed, ${t.skipped} skipped, ${t.partial} partial`)}`),t.blockingViolations>0&&console.log(n.red(` ${t.blockingViolations} blocking violation(s)`)),console.log();}if(r&&(console.log(n.white(" Drift:")),r.healedCount>0&&console.log(n.green(` Auto-healed: ${r.healedCount} shifted anchor(s)`)),r.cleanCount>0&&console.log(n.green(` Clean: ${r.cleanCount} anchor(s)`)),r.driftedCount>0&&console.log(n.red(` Drifted: ${r.driftedCount} anchor(s)`)),r.missingCount>0&&console.log(n.yellow(` Missing: ${r.missingCount} anchor file(s)`)),console.log()),o){console.log(n.white(" Portal:"));let t=o.status==="compliant"?n.green:o.status==="warnings"?n.yellow:n.red;console.log(` Status: ${t(o.status)}`),o.usedButUndeclaredCount>0&&console.log(n.red(` ${o.usedButUndeclaredCount} undeclared gate(s)`)),console.log();}if(d){if(console.log(n.white(" Postflight Learning:")),d.journalsWritten>0){console.log(n.green(` Journals written: ${d.journalsWritten}`));for(let[t,e]of Object.entries(d.journalsByAgent))e>0&&console.log(n.gray(` ${t}: ${e} entries`));}else console.log(n.gray(" No verdicts to learn from"));d.promoted>0&&console.log(n.green(` Promoted to notebooks: ${d.promoted}`)),console.log();}if(i.length>0){console.log(n.red(` ${i.length} violation(s):`));for(let t of i)console.log(n.red(` - ${t}`));}else console.log(n.green(" All checks passed."));console.log();}i.length>0&&(process.exitCode=1);}export{A as complianceCheckCommand};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import'./chunk-5TAVYPOV.js';import*as i from'fs';import*as c from'path';var p=".paradigm/events/compliance-history.jsonl",s=10;function C(t,n){try{let e=c.join(t,p),r=c.dirname(e);i.existsSync(r)||i.mkdirSync(r,{recursive:!0});let o={timestamp:new Date().toISOString(),...n},a=JSON.stringify(o)+`
|
|
3
|
+
`;i.appendFileSync(e,a,"utf8");}catch{}}function d(t,n){try{let e=c.join(t,p);if(!i.existsSync(e))return [];let r=i.readFileSync(e,"utf8").trim().split(`
|
|
4
|
+
`).filter(o=>o.trim()).map(o=>{try{return JSON.parse(o)}catch{return null}}).filter(o=>o!==null);return n&&n>0?r.slice(-n):r}catch{return []}}function l(t){let n=t.reduce((r,o)=>r+o.checks,0),e=t.reduce((r,o)=>r+o.violations,0);return n===0?0:e/n}function g(t,n=s){let e=d(t,n);if(e.length<2)return null;let r=Math.floor(e.length/2),o=e.slice(0,r),a=e.slice(r),f=l(o),u=l(a)-f,m=.05;return u<-m?"improving":u>m?"degrading":"stable"}function h(t,n){if(!t)return "yellow";if(t==="improving")return "green";let e=0;if(n){let r=d(n,Math.ceil(s/2));e=l(r);}return t==="stable"?e===0?"green":"yellow":e>.2?"red":"orange"}function R(t,n=s){let e=g(t,n);return e?{trend:e,dot:h(e,t)}:null}export{R as getComplianceHealthSummary,g as getComplianceTrend,h as getHealthDot,C as recordComplianceSnapshot};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {b}from'./chunk-
|
|
2
|
+
import {b}from'./chunk-A7KFOJ2F.js';import'./chunk-TYWB5IQJ.js';import'./chunk-UDUHSHO4.js';import'./chunk-FYDRENK7.js';import'./chunk-HXGYVS2N.js';import'./chunk-AO7ZSRME.js';import'./chunk-SHD27BQX.js';import'./chunk-EKZDFEJW.js';import'./chunk-T6IDXUUA.js';import'./chunk-JIXHEBGK.js';import'./chunk-QT2LKB3P.js';import'./chunk-5TAVYPOV.js';import*as i from'fs';import*as a from'path';import o from'chalk';async function D(l,f,t){let d=f?a.resolve(f):process.cwd();if(!l){t.json?console.log(JSON.stringify({error:"Orchestration ID required"})):(console.log(o.red(`
|
|
3
3
|
Orchestration ID required.`)),console.log(o.gray(`Usage: paradigm team diff <orchestration-id>
|
|
4
4
|
`)));return}let e=new b(d).getOrchestration(l);if(!e){t.json?console.log(JSON.stringify({error:"Orchestration not found",id:l})):console.log(o.red(`
|
|
5
5
|
Orchestration not found: ${l}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import'./chunk-5TAVYPOV.js';var d={"missing-purpose":e=>`${e.target?`"${e.target}"`:"a directory"} is missing a .purpose file. Without it, agents cannot discover what this directory contains or which components live here. The stop hook will block if source files were modified in a directory with no .purpose. Fix: run paradigm_purpose_init for this directory, then add components with paradigm_purpose_add_component.`,"stale-purpose":e=>{let t=e.target?`"${e.target}"`:"a .purpose file",n=e.context?.ageHours!=null?` (${e.context.ageHours}h old)`:"";return `The .purpose file at ${t}${n} has not been updated since the last code change in its directory. Stale purposes mislead agents about what components exist, causing incorrect context injection. Fix: update the .purpose to reflect any added, removed, or changed components, then run paradigm_reindex.`},"missing-gate":e=>`${e.target?`"${e.target}"`:"a route or endpoint"} appears to require authentication or authorization but has no gate declared in portal.yaml. Gates are how Paradigm tracks security enforcement \u2014 missing gates mean agents cannot verify that the route is protected. Fix: add the gate to portal.yaml using paradigm_portal_add_route or paradigm_purpose_add_component with the appropriate gates array.`,"orphan-signal":e=>`${e.target?`"${e.target}"`:"a signal"} is emitted in code but not declared in any .purpose file. Undeclared signals cannot be traced by agents during ripple analysis, meaning downstream effects may be missed when the signal's emitter changes. Fix: add the signal to the nearest .purpose file under its component's signals array (e.g., signals: ["!${e.target||"event-name"}"]). `,"undocumented-flow":e=>`${e.target?`"${e.target}"`:"a multi-step flow"} spans multiple components but has no $flow declaration. Flows with 3 or more steps should be documented so agents can reason about the sequence end-to-end. Without a flow record, agents may implement duplicate logic or miss ordering constraints. Fix: add a flow entry to .paradigm/flows.yaml with the steps and participants.`,"aspect-drift":e=>`${e.target?`"${e.target}"`:"an aspect anchor"} has drifted \u2014 the code at the anchored location no longer matches the fingerprint recorded when the aspect was first applied. This means the aspect may no longer be enforced correctly at that site. Drift is common after refactors that move or rewrite anchored code. Fix: re-anchor the aspect at its new location using paradigm_aspect_anchor, then delete the stale anchor.`,"portal-mismatch":e=>`${e.target?`"${e.target}"`:"a portal.yaml entry"} has a mismatch between what portal.yaml declares and what the code enforces. This could mean a gate is declared but never applied in middleware, or code enforces a check that is not tracked in portal.yaml. Both directions create audit gaps. Fix: reconcile portal.yaml with actual middleware usage \u2014 run paradigm portal check to see specifics.`,"missing-test":e=>`${e.target?`"${e.target}"`:"a component"} has no associated test file. Agents are expected to write tests alongside every implementation. Missing tests increase regression risk and reduce confidence scores for the affected component. Fix: create a test file alongside the implementation (e.g., ${e.target?e.target.replace(/\.[^.]+$/,".test$&"):"component.test.ts"}).`,"uncovered-route":e=>`${e.target?`"${e.target}"`:"a route"} appears in the codebase but is not listed in portal.yaml. All routes \u2014 protected or public \u2014 should be tracked in portal.yaml so the full API surface is visible to agents and reviewers. Uncovered routes are invisible to ripple analysis and gate audits. Fix: add the route to portal.yaml with paradigm_portal_add_route.`,"broken-reference":e=>`${e.target?`"${e.target}"`:"a symbol reference"} references a symbol or file that no longer exists. Broken references in .purpose files cause agents to load stale context and may indicate a renamed or deleted component. Fix: update the reference to the new symbol name, or remove it if the component was deleted. Run paradigm_reindex after fixing to regenerate the scan index.`,"missing-description":e=>`${e.target?`"${e.target}"`:"a component or gate"} has no description. Descriptions are required for agents to understand purpose and context during context injection. Without descriptions, agents may misapply the component or skip it when it would have been relevant. Fix: add a description field to the component or gate entry in its .purpose or portal.yaml file.`,"enforcement-level-violation":e=>{let t=e.target?`"${e.target}"`:"a data category",n=e.context?.ring,a=e.context?.boundary;return `${t} is being transmitted across a boundary (${a||"unknown boundary"}) that exceeds its trust ring${n?` (Ring: ${n})`:""}. Data policy requires project-locked content to never leave the project boundary. This gap could expose internal compliance data externally. Fix: check the data-policy.yaml configuration and ensure the content category is listed in the deny_content for the relevant stream.`},"index-stale":e=>{let t=e.target?`"${e.target}"`:"the scan index",n=e.context?.ageHours,a=n!=null?` (${n} hours old)`:"";return `${t}${a} is stale. The scan index drives context injection, navigator, and ripple analysis. When the index is out of date, agents work from stale symbol maps and may miss recently added components or references. Fix: run paradigm_reindex (or "paradigm index") to regenerate the index.`}};function g(e,t){let n=d[e];return n?n({...t,type:e}):`Unknown check type "${e}" \u2014 no narration template available.`}function h(e){let t=[],n=[],a=[];for(let r of e){let p=g(r.type,r),i=r.severity??"improvement",c={type:r.type,target:r.target,narration:p,severity:i};i==="blocking"?t.push(c):i==="note"?a.push(c):n.push(c);}let o=t.length+n.length+a.length,s=l(t,n,a);return {gapCount:o,blocking:t,improvement:n,note:a,narrative:s}}function l(e,t,n){let a=[],o=e.length+t.length+n.length;if(o===0)return "No gaps found. All enforcement checks passed.";let s=u(e,t,n);if(a.push(`Found ${o} gap${o!==1?"s":""} across ${s} check type${s!==1?"s":""}.`),a.push(""),e.length>0){a.push(`BLOCKING (${e.length})`),a.push("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let r of e)a.push(`[${r.type}]${r.target?` \u2014 ${r.target}`:""}`),a.push(r.narration),a.push("");}if(t.length>0){a.push(`IMPROVEMENTS (${t.length})`),a.push("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");for(let r of t)a.push(`[${r.type}]${r.target?` \u2014 ${r.target}`:""}`),a.push(r.narration),a.push("");}if(n.length>0){a.push(`NOTES (${n.length})`),a.push("\u2500\u2500\u2500\u2500\u2500\u2500");for(let r of n)a.push(`[${r.type}]${r.target?` \u2014 ${r.target}`:""}`),a.push(r.narration),a.push("");}return a.join(`
|
|
3
|
+
`).trimEnd()}function u(e,t,n){let a=new Set;for(let o of [...e,...t,...n])a.add(o.type);return a.size}export{h as narrateAllGaps,g as narrateGap};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-
|
|
2
|
+
export{a as hooksInstallCommand,c as hooksStatusCommand,b as hooksUninstallCommand}from'./chunk-SXO7NC6A.js';import'./chunk-5TAVYPOV.js';
|