@a-company/paradigm 6.0.4 → 6.0.5

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.
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import'./chunk-5TAVYPOV.js';import*as i from'fs/promises';import*as r from'path';import*as m from'js-yaml';async function u(p={}){let l=process.cwd(),a=r.join(l,".paradigm","remediations"),n=[],s;try{s=await i.readdir(a);}catch{process.stdout.write(JSON.stringify(n)+`
3
+ `);return}let f=new Date().toISOString();for(let e of s){if(e.startsWith(".")||!e.endsWith(".yaml")&&!e.endsWith(".yml"))continue;let o=r.join(a,e),c;try{if(!(await i.stat(o)).isFile())continue;c=await i.readFile(o,"utf8");}catch{continue}let t;try{t=m.load(c);}catch(d){process.stderr.write(`paradigm internal active-remediations: skipping ${e}: ${d.message}
4
+ `);continue}!t||typeof t!="object"||t.expires_at&&t.expires_at<f||!t.id||!t.claimant||!t.severity||!t.reason||n.push({id:t.id,claimant:t.claimant,severity:t.severity,reason:t.reason,...t.expires_at?{expires_at:t.expires_at}:{},...t.created?{created:t.created}:{}});}process.stdout.write(JSON.stringify(n)+`
5
+ `);}export{u as activeRemediationsCommand};
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import'./chunk-5TAVYPOV.js';import*as a from'fs/promises';import*as s from'path';import*as n from'js-yaml';var c=s.join(".paradigm","authority.yaml");async function y(e,r){let t=s.join(e,c);try{await a.access(t);return}catch{}await a.mkdir(s.dirname(t),{recursive:true});let i=new Date().toISOString(),m=n.dump({version:"1.0",schema:"v0-experimental",claims:{"aspect-coverage":{claimant:"compliance",severity:"advise",since:i,source:r},"aspect-drift":{claimant:"compliance",severity:"advise",since:i,source:r},"anchor-staleness":{claimant:"compliance",severity:"advise",since:i,source:r}}},{lineWidth:100,sortKeys:false});await a.writeFile(t,m,"utf8");}async function l(e){let r=s.join(e,c),t;try{t=await a.readFile(r,"utf8");}catch(o){if(o.code==="ENOENT")return null;throw o}let i=n.load(t);return i==null||typeof i!="object"?{version:"1.0",schema:"v0-experimental",claims:{}}:((!i.claims||typeof i.claims!="object")&&(i.claims={}),i)}async function h(e){return (await l(e))?.claims??{}}async function u(e,r){let t=s.join(e,c);await a.mkdir(s.dirname(t),{recursive:true});let i=n.dump(r,{lineWidth:100,sortKeys:false});await a.writeFile(t,i,"utf8");}async function f(e,r,t){let i=await l(e)??{version:"1.0",schema:"v0-experimental",claims:{}};i.claims[r]=t,await u(e,i);}async function p(e,r){let t=await l(e);return !t||!(r in t.claims)?false:(delete t.claims[r],await u(e,t),true)}export{h as getActiveClaims,l as readAuthority,p as removeClaim,f as upsertClaim,y as writeArchetypeDefaults};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import*as e from'fs';import*as r from'path';import*as S from'os';import {execSync}from'child_process';import o from'chalk';var y=`#!/bin/sh
2
+ import*as e from'fs';import*as a from'path';import*as S from'os';import {execSync}from'child_process';import o from'chalk';var y=`#!/bin/sh
3
3
  # paradigm-common.sh \u2014 Shared compliance checks for Paradigm stop hooks
4
4
  # Sourced by claude-code-stop.sh and cursor-stop.sh
5
5
  #
@@ -32,6 +32,7 @@ import*as e from'fs';import*as r from'path';import*as S from'os';import {execSyn
32
32
  # 11. Portal gate implementation compliance (from unified compliance-check)
33
33
  # 12. Graduation failure tracking (auto-demotion)
34
34
  # 13. Orchestration required for complex tasks
35
+ # 14. Active remediations from agent-authored .paradigm/remediations/ (v6.1)
35
36
 
36
37
  VIOLATIONS=""
37
38
  VIOLATION_COUNT=0
@@ -84,6 +85,15 @@ if [ -f "$_ROSTER_FILE" ]; then
84
85
  fi
85
86
  fi
86
87
 
88
+ # --- Cache active remediations JSON (v6.1, consumed by Check 14) ---
89
+ # Single shell-out per stop-hook run. Helper outputs \`[]\` on every error path
90
+ # (missing dir, parse failure, missing binary) so this never breaks the hook.
91
+ _REMEDIATIONS_JSON="[]"
92
+ if command -v paradigm >/dev/null 2>&1; then
93
+ _REMEDIATIONS_JSON=$(paradigm internal active-remediations --json 2>/dev/null) || _REMEDIATIONS_JSON="[]"
94
+ [ -z "$_REMEDIATIONS_JSON" ] && _REMEDIATIONS_JSON="[]"
95
+ fi
96
+
87
97
  # --- Cache .purpose file paths (avoid repeated find scans) ---
88
98
  PURPOSE_CACHE=".paradigm/.purpose-paths"
89
99
  if [ -f "$PURPOSE_CACHE" ]; then
@@ -896,6 +906,59 @@ if [ "$_SEV" != "off" ]; then
896
906
  fi
897
907
  fi
898
908
 
909
+ # --- Check 14: Active remediations (v6.1 soft-block primitive) ---
910
+ # Iterates the cached _REMEDIATIONS_JSON array. severity=guard adds to
911
+ # VIOLATIONS (block); advise|auto-author goes to ADVISORY. PARADIGM_OVERRIDE
912
+ # (comma-separated id list) skips matching remediations and writes an
913
+ # override audit row to .paradigm/events/overrides.jsonl.
914
+ #
915
+ # Iteration uses a temp file + redirect (NOT pipe) so VIOLATION_COUNT
916
+ # increments propagate out of the loop (POSIX subshell-safe \u2014 spec \xA712 #4).
917
+ if [ "$_REMEDIATIONS_JSON" != "[]" ] && [ -n "$_REMEDIATIONS_JSON" ]; then
918
+ _RMD_TMP="/tmp/.paradigm-rmds-$$"
919
+ # Split JSON array into one record per line: strip outer brackets, split on \`},{\`.
920
+ echo "$_REMEDIATIONS_JSON" | sed 's/^\\[//; s/\\]$//; s/},{/}\\n{/g' > "$_RMD_TMP"
921
+ _OVERRIDE_LIST=",\${PARADIGM_OVERRIDE:-},"
922
+ while IFS= read -r _line; do
923
+ [ -z "$_line" ] && continue
924
+ case "$_line" in
925
+ *'"id":"'*) ;;
926
+ *) continue ;;
927
+ esac
928
+ _RID=$(echo "$_line" | grep -o '"id":"[^"]*"' | head -1 | sed 's/^"id":"//; s/"$//')
929
+ _RSEV=$(echo "$_line" | grep -o '"severity":"[^"]*"' | head -1 | sed 's/^"severity":"//; s/"$//')
930
+ _RCLAIM=$(echo "$_line" | grep -o '"claimant":"[^"]*"' | head -1 | sed 's/^"claimant":"//; s/"$//')
931
+ _RREASON=$(echo "$_line" | grep -o '"reason":"[^"]*"' | head -1 | sed 's/^"reason":"//; s/"$//')
932
+ [ -z "$_RID" ] && continue
933
+
934
+ # PARADIGM_OVERRIDE check \u2014 comma-separated list, exact id match.
935
+ case "$_OVERRIDE_LIST" in
936
+ *",$_RID,"*)
937
+ # Write override audit event (mirror compliance-snapshot pattern, line 906).
938
+ _ts=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date +"%Y-%m-%dT%H:%M:%SZ")
939
+ mkdir -p ".paradigm/events" 2>/dev/null || true
940
+ printf '{"timestamp":"%s","remediation_id":"%s","claimant":"%s","mechanism":"env","unblock_predicate_matched":false}\\n' \\
941
+ "$_ts" "$_RID" "$_RCLAIM" >> ".paradigm/events/overrides.jsonl" 2>/dev/null || true
942
+ continue
943
+ ;;
944
+ esac
945
+
946
+ case "$_RSEV" in
947
+ guard)
948
+ VIOLATIONS="$VIOLATIONS
949
+ - [$_RID] ($_RCLAIM) $_RREASON
950
+ Override: paradigm override $_RID (or PARADIGM_OVERRIDE=$_RID <cmd>)"
951
+ VIOLATION_COUNT=$((VIOLATION_COUNT + 1))
952
+ ;;
953
+ advise|auto-author)
954
+ ADVISORY="$ADVISORY
955
+ - (remediation:$_RSEV) [$_RID] ($_RCLAIM) $_RREASON"
956
+ ;;
957
+ esac
958
+ done < "$_RMD_TMP"
959
+ rm -f "$_RMD_TMP"
960
+ fi
961
+
899
962
  # --- Compliance snapshot (non-fatal, fire-and-forget) ---
900
963
  # Record this stop-hook run to .paradigm/events/compliance-history.jsonl for trend analysis.
901
964
  # VIOLATION_COUNT and SOURCE_COUNT are now final at this point.
@@ -909,7 +972,7 @@ _compliance_snapshot() {
909
972
  "$_ts" "$VIOLATION_COUNT" "$_checks" >> "$_dir/compliance-history.jsonl" 2>/dev/null || true
910
973
  }
911
974
  _compliance_snapshot
912
- `,U=`#!/bin/sh
975
+ `,v=`#!/bin/sh
913
976
  # Paradigm Claude Code Stop Hook (v2)
914
977
  # Validates paradigm compliance before allowing the agent to finish.
915
978
  # Installed by: paradigm hooks install --claude-code
@@ -1026,11 +1089,11 @@ if command -v paradigm >/dev/null 2>&1 && [ -f ".paradigm/events/verdicts.jsonl"
1026
1089
  fi
1027
1090
 
1028
1091
  exit 0
1029
- `,v=`#!/bin/sh
1092
+ `,D=`#!/bin/sh
1030
1093
  # Legacy afterFileEdit hook \u2014 replaced by paradigm-posttooluse.sh (postToolUse)
1031
1094
  # Kept as a no-op because Claude Code expects the file to exist.
1032
1095
  exit 0
1033
- `,D=`#!/bin/sh
1096
+ `,U=`#!/bin/sh
1034
1097
  # Paradigm Claude Code Pre-Commit Hook
1035
1098
  # Intercepts git commit Bash calls and auto-rebuilds the index.
1036
1099
  # Installed by: paradigm hooks install --claude-code
@@ -1153,7 +1216,7 @@ echo " Scan index: $SCAN_INDEX" >&2
1153
1216
  echo " Navigator: $CWD/.paradigm/navigator.yaml" >&2
1154
1217
 
1155
1218
  exit 0
1156
- `,b=`#!/bin/sh
1219
+ `,L=`#!/bin/sh
1157
1220
  # Paradigm Cursor Session Start Hook
1158
1221
  # Fires before the agent does anything \u2014 injects additional_context
1159
1222
  # that acts as a deterministic system prompt (not subject to context compaction).
@@ -1253,7 +1316,7 @@ fi
1253
1316
  printf '{"additional_context":"%s","continue":true}\\n' "$CONTEXT"
1254
1317
 
1255
1318
  exit 0
1256
- `,L=`#!/bin/sh
1319
+ `,b=`#!/bin/sh
1257
1320
  # Paradigm Cursor Stop Hook (v2)
1258
1321
  # Validates paradigm compliance before allowing the agent to finish.
1259
1322
  # Installed by: paradigm hooks install --cursor
@@ -1705,8 +1768,8 @@ if [ "$PENDING_COUNT" -ge 30 ]; then
1705
1768
  fi
1706
1769
 
1707
1770
  exit 0
1708
- `;function F(){try{let i=r.join(S.homedir(),".claude","settings.json");if(!e.existsSync(i))return {active:!1};if(!JSON.parse(e.readFileSync(i,"utf8")).enabledPlugins?.["paradigm@a-paradigm"])return {active:!1};let d=r.join(S.homedir(),".claude","plugins","cache","a-paradigm","paradigm");if(!e.existsSync(d))return {active:!1};let a=e.readdirSync(d).filter(t=>e.statSync(r.join(d,t)).isDirectory()).sort().reverse();if(a.length===0)return {active:!1};let p=r.join(d,a[0]),l=r.join(p,"hooks","hooks.json");return e.existsSync(l)?{active:!0,cacheVersion:a[0]}:{active:!1}}catch{return {active:false}}}function W(){try{let i=F();if(!i.active||!i.cacheVersion)return {compatible:!0};let h=r.join(S.homedir(),".claude","plugins","cache","a-paradigm","paradigm",i.cacheVersion,"hooks.json");if(!e.existsSync(h))return {compatible:!0};let d=JSON.parse(e.readFileSync(h,"utf8")).compatibleVersions;if(!d)return {compatible:!0};let a=q();if(!a)return {compatible:!0};let p=d.split(/\s+/);for(let l of p){let t=l.match(/^(>=?|<=?)\s*(\d+\.\d+\.\d+)/);if(!t)continue;let[,s,n]=t,f=J(a,n);if(s===">="&&f<0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${a}`};if(s===">"&&f<=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${a}`};if(s==="<="&&f>0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${a}`};if(s==="<"&&f>=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${a}`}}return {compatible:!0}}catch{return {compatible:true}}}function q(){try{let i=r.join(r.dirname(new URL(import.meta.url).pathname),"..","..","package.json");return JSON.parse(e.readFileSync(i,"utf8")).version||null}catch{return null}}function J(i,h){let c=i.split(".").map(Number),d=h.split(".").map(Number);for(let a=0;a<3;a++){if((c[a]||0)<(d[a]||0))return -1;if((c[a]||0)>(d[a]||0))return 1}return 0}function B(i){let h=[],c=r.join(i,".claude","hooks");if(e.existsSync(c)){for(let a of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"]){let p=r.join(c,a);e.existsSync(p)&&(e.unlinkSync(p),h.push(a));}try{e.readdirSync(c).length===0&&e.rmdirSync(c);}catch{}}let d=r.join(i,".claude","settings.json");if(e.existsSync(d))try{let a=JSON.parse(e.readFileSync(d,"utf8")),p=a.hooks;if(p){let l=!1;for(let[t,s]of Object.entries(p)){if(!Array.isArray(s))continue;let n=s.filter(f=>!JSON.stringify(f).includes("paradigm-"));n.length!==s.length&&(l=!0,n.length===0?delete p[t]:p[t]=n);}l&&(Object.keys(p).length===0?delete a.hooks:a.hooks=p,e.writeFileSync(d,JSON.stringify(a,null,2)+`
1709
- `,"utf8"),h.push("settings.json hooks"));}}catch{}return {cleaned:h.length>0,removed:h}}function K(i,h){try{let c=r.join(S.tmpdir(),`paradigm-hook-validate-${Date.now()}.sh`);e.writeFileSync(c,i,"utf8");try{return execSync(`bash -n "${c}" 2>&1`,{encoding:"utf-8"}),null}catch(d){return `${h}: bash syntax error \u2014 ${d.message?.split(`
1771
+ `;function F(){try{let i=a.join(S.homedir(),".claude","settings.json");if(!e.existsSync(i))return {active:!1};if(!JSON.parse(e.readFileSync(i,"utf8")).enabledPlugins?.["paradigm@a-paradigm"])return {active:!1};let d=a.join(S.homedir(),".claude","plugins","cache","a-paradigm","paradigm");if(!e.existsSync(d))return {active:!1};let r=e.readdirSync(d).filter(t=>e.statSync(a.join(d,t)).isDirectory()).sort().reverse();if(r.length===0)return {active:!1};let p=a.join(d,r[0]),l=a.join(p,"hooks","hooks.json");return e.existsSync(l)?{active:!0,cacheVersion:r[0]}:{active:!1}}catch{return {active:false}}}function W(){try{let i=F();if(!i.active||!i.cacheVersion)return {compatible:!0};let h=a.join(S.homedir(),".claude","plugins","cache","a-paradigm","paradigm",i.cacheVersion,"hooks.json");if(!e.existsSync(h))return {compatible:!0};let d=JSON.parse(e.readFileSync(h,"utf8")).compatibleVersions;if(!d)return {compatible:!0};let r=J();if(!r)return {compatible:!0};let p=d.split(/\s+/);for(let l of p){let t=l.match(/^(>=?|<=?)\s*(\d+\.\d+\.\d+)/);if(!t)continue;let[,s,n]=t,f=q(r,n);if(s===">="&&f<0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${r}`};if(s===">"&&f<=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${r}`};if(s==="<="&&f>0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${r}`};if(s==="<"&&f>=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${r}`}}return {compatible:!0}}catch{return {compatible:true}}}function J(){try{let i=a.join(a.dirname(new URL(import.meta.url).pathname),"..","..","package.json");return JSON.parse(e.readFileSync(i,"utf8")).version||null}catch{return null}}function q(i,h){let c=i.split(".").map(Number),d=h.split(".").map(Number);for(let r=0;r<3;r++){if((c[r]||0)<(d[r]||0))return -1;if((c[r]||0)>(d[r]||0))return 1}return 0}function B(i){let h=[],c=a.join(i,".claude","hooks");if(e.existsSync(c)){for(let r of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"]){let p=a.join(c,r);e.existsSync(p)&&(e.unlinkSync(p),h.push(r));}try{e.readdirSync(c).length===0&&e.rmdirSync(c);}catch{}}let d=a.join(i,".claude","settings.json");if(e.existsSync(d))try{let r=JSON.parse(e.readFileSync(d,"utf8")),p=r.hooks;if(p){let l=!1;for(let[t,s]of Object.entries(p)){if(!Array.isArray(s))continue;let n=s.filter(f=>!JSON.stringify(f).includes("paradigm-"));n.length!==s.length&&(l=!0,n.length===0?delete p[t]:p[t]=n);}l&&(Object.keys(p).length===0?delete r.hooks:r.hooks=p,e.writeFileSync(d,JSON.stringify(r,null,2)+`
1772
+ `,"utf8"),h.push("settings.json hooks"));}}catch{}return {cleaned:h.length>0,removed:h}}function K(i,h){try{let c=a.join(S.tmpdir(),`paradigm-hook-validate-${Date.now()}.sh`);e.writeFileSync(c,i,"utf8");try{return execSync(`bash -n "${c}" 2>&1`,{encoding:"utf-8"}),null}catch(d){return `${h}: bash syntax error \u2014 ${d.message?.split(`
1710
1773
  `)[0]||"unknown error"}`}finally{try{e.unlinkSync(c);}catch{}}}catch{return null}}var G=`#!/bin/sh
1711
1774
  # Paradigm post-commit hook - captures history from commits
1712
1775
  # Installed by: paradigm hooks install
@@ -1799,25 +1862,25 @@ if [ -d ".paradigm/history" ] && [ -f ".paradigm/history/log.jsonl" ]; then
1799
1862
  echo "[paradigm] Reindexing history..."
1800
1863
  npx paradigm history reindex 2>/dev/null || true
1801
1864
  fi
1802
- `;async function re(i={}){let h=process.cwd(),c=i.dryRun||false;c&&console.log(o.cyan(`
1865
+ `;async function ae(i={}){let h=process.cwd(),c=i.dryRun||false;c&&console.log(o.cyan(`
1803
1866
  [dry-run] Showing what would be installed:
1804
- `));let d=i.claudeCode&&!i.postCommit&&!i.prePush&&!i.cursor,a=i.cursor&&!i.postCommit&&!i.prePush&&!i.claudeCode;if(!c){let t=[{name:"post-commit",content:G},{name:"pre-push",content:Y},{name:"paradigm-common",content:y},{name:"claude-code-stop",content:U},{name:"claude-code-precommit",content:D},{name:"claude-code-postwrite",content:v},{name:"claude-code-navigate-remind",content:P},{name:"cursor-session-start",content:b},{name:"cursor-stop",content:L},{name:"cursor-precommit",content:x},{name:"cursor-postwrite",content:w},{name:"cursor-pretooluse",content:M},{name:"cursor-posttooluse",content:V}];for(let s of t){let n=K(s.content,s.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=W();if(p.compatible||(console.log(o.yellow(`
1867
+ `));let d=i.claudeCode&&!i.postCommit&&!i.prePush&&!i.cursor,r=i.cursor&&!i.postCommit&&!i.prePush&&!i.claudeCode;if(!c){let t=[{name:"post-commit",content:G},{name:"pre-push",content:Y},{name:"paradigm-common",content:y},{name:"claude-code-stop",content:v},{name:"claude-code-precommit",content:U},{name:"claude-code-postwrite",content:D},{name:"claude-code-navigate-remind",content:P},{name:"cursor-session-start",content:L},{name:"cursor-stop",content:b},{name:"cursor-precommit",content:x},{name:"cursor-postwrite",content:w},{name:"cursor-pretooluse",content:M},{name:"cursor-posttooluse",content:V}];for(let s of t){let n=K(s.content,s.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=W();if(p.compatible||(console.log(o.yellow(`
1805
1868
  \u26A0 ${p.message}`)),console.log(o.gray(` Hook installation will continue, but behavior may differ from plugin expectations.
1806
- `))),!d&&!a){let t=r.join(h,".git");if(!e.existsSync(t)){console.log(o.red("Not a git repository."));return}let s=r.join(t,"hooks"),n=!i.postCommit&&!i.prePush&&!i.claudeCode,f=[];if(n||i.postCommit){let u=r.join(s,"post-commit");if(c){let _=e.existsSync(u)&&!i.force?"skip (exists)":"install";console.log(o.gray(` post-commit: ${_} \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(s,{recursive:true}),e.writeFileSync(u,G),e.chmodSync(u,"755"),f.push("post-commit"));}if(n||i.prePush){let u=r.join(s,"pre-push");if(c){let _=e.existsSync(u)&&!i.force?"skip (exists)":"install";console.log(o.gray(` pre-push: ${_} \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(s,{recursive:true}),e.writeFileSync(u,Y),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, paradigm-navigate-remind.sh")),console.log(o.gray(` \u2192 ${r.join(h,".claude","hooks")}/`)),console.log(o.gray(" \u2192 Update .claude/settings.json with hook configuration"))):await z(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 Q(h,i.force)),c&&console.log(o.cyan(`
1869
+ `))),!d&&!r){let t=a.join(h,".git");if(!e.existsSync(t)){console.log(o.red("Not a git repository."));return}let s=a.join(t,"hooks"),n=!i.postCommit&&!i.prePush&&!i.claudeCode,f=[];if(n||i.postCommit){let m=a.join(s,"post-commit");if(c){let _=e.existsSync(m)&&!i.force?"skip (exists)":"install";console.log(o.gray(` post-commit: ${_} \u2192 ${m}`));}else e.existsSync(m)&&!i.force?e.readFileSync(m,"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(s,{recursive:true}),e.writeFileSync(m,G),e.chmodSync(m,"755"),f.push("post-commit"));}if(n||i.prePush){let m=a.join(s,"pre-push");if(c){let _=e.existsSync(m)&&!i.force?"skip (exists)":"install";console.log(o.gray(` pre-push: ${_} \u2192 ${m}`));}else e.existsSync(m)&&!i.force?e.readFileSync(m,"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(s,{recursive:true}),e.writeFileSync(m,Y),e.chmodSync(m,"755"),f.push("pre-push"));}!c&&f.length>0&&console.log(o.green(`Git hooks installed: ${f.join(", ")}`));let O=a.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, paradigm-navigate-remind.sh")),console.log(o.gray(` \u2192 ${a.join(h,".claude","hooks")}/`)),console.log(o.gray(" \u2192 Update .claude/settings.json with hook configuration"))):await z(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 ${a.join(h,".cursor","hooks")}/`)),console.log(o.gray(" \u2192 Update .cursor/hooks.json"))):await Q(h,i.force)),c&&console.log(o.cyan(`
1807
1870
  [dry-run] No changes made.
1808
- `));}async function z(i,h){let c=F();if(c.active){console.log(o.cyan(` Paradigm plugin v${c.cacheVersion} is active \u2014 hooks are managed by the plugin.`));let{cleaned:g,removed:E}=B(i);console.log(g?o.green(` Cleaned up stale project hooks: ${E.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,y,"utf8"),e.chmodSync(p,"755");let l=[{name:"paradigm-stop.sh",content:U},{name:"paradigm-precommit.sh",content:D},{name:"paradigm-postwrite.sh",content:v},{name:"paradigm-navigate-remind.sh",content:P}];for(let g of l){let E=r.join(d,g.name);if(e.existsSync(E)&&!h){console.log(o.gray(` ${g.name}: already installed`));continue}e.writeFileSync(E,g.content,"utf8"),e.chmodSync(E,"755"),a.push(g.name);}let t=r.join(i,".claude","settings.json"),s={};if(e.existsSync(t))try{s=JSON.parse(e.readFileSync(t,"utf8"));}catch{}let n=s.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(g=>JSON.stringify(g).includes("paradigm-stop.sh"))||u.push(f),n.Stop=u;let $=n.PreToolUse||[];$.some(g=>JSON.stringify(g).includes("paradigm-precommit.sh"))||$.push(O),n.PreToolUse=$;let H={matcher:"Glob|Grep",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-navigate-remind.sh"',timeout:5}]};$.some(g=>JSON.stringify(g).includes("paradigm-navigate-remind.sh"))||$.push(H),n.PreToolUse=$;let j={matcher:"Edit,Write",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-postwrite.sh"',timeout:5}]},T=n.PostToolUse||[];T.some(g=>JSON.stringify(g).includes("paradigm-postwrite.sh"))||T.push(j),n.PostToolUse=T,s.hooks=n,e.writeFileSync(t,JSON.stringify(s,null,2)+`
1809
- `,"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 Q(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,y,"utf8"),e.chmodSync(a,"755");let p=[{name:"paradigm-session-start.sh",content:b},{name:"paradigm-stop.sh",content:L},{name:"paradigm-precommit.sh",content:x},{name:"paradigm-postwrite.sh",content:w},{name:"paradigm-pretooluse.sh",content:M},{name:"paradigm-posttooluse.sh",content:V}];for(let m of p){let R=r.join(c,m.name);if(e.existsSync(R)&&!h){console.log(o.gray(` ${m.name}: already installed (Cursor)`));continue}e.writeFileSync(R,m.content,"utf8"),e.chmodSync(R,"755"),d.push(m.name);}let l=r.join(i,".cursor","hooks.json"),t={};if(e.existsSync(l))try{t=JSON.parse(e.readFileSync(l,"utf8"));}catch{}t.version=1;let s=t.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},_=s.sessionStart||[];_.some(m=>JSON.stringify(m).includes("paradigm-session-start.sh"))||_.push(n),s.sessionStart=_;let I=s.stop||[];I.some(m=>JSON.stringify(m).includes("paradigm-stop.sh"))||I.push(f),s.stop=I;let C=s.afterFileEdit||[];C.some(m=>JSON.stringify(m).includes("paradigm-postwrite.sh"))||C.push(O),s.afterFileEdit=C;let T={command:".cursor/hooks/paradigm-pretooluse.sh",matcher:"Edit|Write",timeout:5},N=s.preToolUse||[];N.some(m=>JSON.stringify(m).includes("paradigm-pretooluse.sh"))||N.push(T),s.preToolUse=N;let E={command:".cursor/hooks/paradigm-posttooluse.sh",matcher:"Edit|Write",timeout:5},k=s.postToolUse||[];k.some(m=>JSON.stringify(m).includes("paradigm-posttooluse.sh"))||k.push(E),s.postToolUse=k;let A=s.beforeShellExecution||[];A.some(m=>JSON.stringify(m).includes("paradigm-precommit.sh"))||A.push(u),s.beforeShellExecution=A,t.hooks=s,e.writeFileSync(l,JSON.stringify(t,null,2)+`
1810
- `,"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 ae(i={}){let h=process.cwd(),c=i.dryRun||false;if(c&&console.log(o.cyan(`
1871
+ `));}async function z(i,h){let c=F();if(c.active){console.log(o.cyan(` Paradigm plugin v${c.cacheVersion} is active \u2014 hooks are managed by the plugin.`));let{cleaned:g,removed:E}=B(i);console.log(g?o.green(` Cleaned up stale project hooks: ${E.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=a.join(i,".claude","hooks");e.mkdirSync(d,{recursive:true});let r=[],p=a.join(d,"paradigm-common.sh");e.writeFileSync(p,y,"utf8"),e.chmodSync(p,"755");let l=[{name:"paradigm-stop.sh",content:v},{name:"paradigm-precommit.sh",content:U},{name:"paradigm-postwrite.sh",content:D},{name:"paradigm-navigate-remind.sh",content:P}];for(let g of l){let E=a.join(d,g.name);if(e.existsSync(E)&&!h){console.log(o.gray(` ${g.name}: already installed`));continue}e.writeFileSync(E,g.content,"utf8"),e.chmodSync(E,"755"),r.push(g.name);}let t=a.join(i,".claude","settings.json"),s={};if(e.existsSync(t))try{s=JSON.parse(e.readFileSync(t,"utf8"));}catch{}let n=s.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}]},m=n.Stop||[];m.some(g=>JSON.stringify(g).includes("paradigm-stop.sh"))||m.push(f),n.Stop=m;let $=n.PreToolUse||[];$.some(g=>JSON.stringify(g).includes("paradigm-precommit.sh"))||$.push(O),n.PreToolUse=$;let H={matcher:"Glob|Grep",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-navigate-remind.sh"',timeout:5}]};$.some(g=>JSON.stringify(g).includes("paradigm-navigate-remind.sh"))||$.push(H),n.PreToolUse=$;let j={matcher:"Edit,Write",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-postwrite.sh"',timeout:5}]},T=n.PostToolUse||[];T.some(g=>JSON.stringify(g).includes("paradigm-postwrite.sh"))||T.push(j),n.PostToolUse=T,s.hooks=n,e.writeFileSync(t,JSON.stringify(s,null,2)+`
1872
+ `,"utf8"),r.length>0&&console.log(o.green(`Claude Code hooks installed: ${r.join(", ")}`)),console.log(o.green("Claude Code settings.json updated with hook configuration"));}async function Q(i,h){let c=a.join(i,".cursor","hooks");e.mkdirSync(c,{recursive:true});let d=[],r=a.join(c,"paradigm-common.sh");e.writeFileSync(r,y,"utf8"),e.chmodSync(r,"755");let p=[{name:"paradigm-session-start.sh",content:L},{name:"paradigm-stop.sh",content:b},{name:"paradigm-precommit.sh",content:x},{name:"paradigm-postwrite.sh",content:w},{name:"paradigm-pretooluse.sh",content:M},{name:"paradigm-posttooluse.sh",content:V}];for(let u of p){let R=a.join(c,u.name);if(e.existsSync(R)&&!h){console.log(o.gray(` ${u.name}: already installed (Cursor)`));continue}e.writeFileSync(R,u.content,"utf8"),e.chmodSync(R,"755"),d.push(u.name);}let l=a.join(i,".cursor","hooks.json"),t={};if(e.existsSync(l))try{t=JSON.parse(e.readFileSync(l,"utf8"));}catch{}t.version=1;let s=t.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},m={command:".cursor/hooks/paradigm-precommit.sh",matcher:"git commit",timeout:30},_=s.sessionStart||[];_.some(u=>JSON.stringify(u).includes("paradigm-session-start.sh"))||_.push(n),s.sessionStart=_;let I=s.stop||[];I.some(u=>JSON.stringify(u).includes("paradigm-stop.sh"))||I.push(f),s.stop=I;let N=s.afterFileEdit||[];N.some(u=>JSON.stringify(u).includes("paradigm-postwrite.sh"))||N.push(O),s.afterFileEdit=N;let T={command:".cursor/hooks/paradigm-pretooluse.sh",matcher:"Edit|Write",timeout:5},C=s.preToolUse||[];C.some(u=>JSON.stringify(u).includes("paradigm-pretooluse.sh"))||C.push(T),s.preToolUse=C;let E={command:".cursor/hooks/paradigm-posttooluse.sh",matcher:"Edit|Write",timeout:5},k=s.postToolUse||[];k.some(u=>JSON.stringify(u).includes("paradigm-posttooluse.sh"))||k.push(E),s.postToolUse=k;let A=s.beforeShellExecution||[];A.some(u=>JSON.stringify(u).includes("paradigm-precommit.sh"))||A.push(m),s.beforeShellExecution=A,t.hooks=s,e.writeFileSync(l,JSON.stringify(t,null,2)+`
1873
+ `,"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(`
1811
1874
  [dry-run] Showing what would be removed:
1812
- `)),!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 t=r.join(a,l);e.existsSync(t)&&e.readFileSync(t,"utf8").includes("paradigm")&&(c?console.log(o.gray(` Would remove: ${t}`)):e.unlinkSync(t),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 t=r.join(d,l);e.existsSync(t)&&(c?console.log(o.gray(` Would remove: ${t}`)):e.unlinkSync(t),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")),t=l.hooks||{};for(let s of ["sessionStart","stop","afterFileEdit","beforeShellExecution","preToolUse","postToolUse"])Array.isArray(t[s])&&(t[s]=t[s].filter(n=>!JSON.stringify(n).includes("paradigm-")),t[s].length===0&&delete t[s]);l.hooks=t,e.writeFileSync(p,JSON.stringify(l,null,2)+`
1813
- `,"utf8");}catch{}c?a.length===0&&console.log(o.gray(" No paradigm Cursor hooks to remove")):a.length>0?console.log(o.green(`Cursor hooks removed: ${a.join(", ")}`)):console.log(o.gray("No paradigm Cursor hooks found to remove"));}c&&console.log(o.cyan(`
1875
+ `)),!i.cursor){let d=a.join(h,".git");if(!e.existsSync(d)){console.log(o.red("Not a git repository."));return}let r=a.join(d,"hooks"),p=[];for(let l of ["post-commit","pre-push"]){let t=a.join(r,l);e.existsSync(t)&&e.readFileSync(t,"utf8").includes("paradigm")&&(c?console.log(o.gray(` Would remove: ${t}`)):e.unlinkSync(t),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=a.join(h,".cursor","hooks"),r=[];for(let l of ["paradigm-session-start.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-pretooluse.sh","paradigm-posttooluse.sh"]){let t=a.join(d,l);e.existsSync(t)&&(c?console.log(o.gray(` Would remove: ${t}`)):e.unlinkSync(t),r.push(l));}let p=a.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")),t=l.hooks||{};for(let s of ["sessionStart","stop","afterFileEdit","beforeShellExecution","preToolUse","postToolUse"])Array.isArray(t[s])&&(t[s]=t[s].filter(n=>!JSON.stringify(n).includes("paradigm-")),t[s].length===0&&delete t[s]);l.hooks=t,e.writeFileSync(p,JSON.stringify(l,null,2)+`
1876
+ `,"utf8");}catch{}c?r.length===0&&console.log(o.gray(" No paradigm Cursor hooks to remove")):r.length>0?console.log(o.green(`Cursor hooks removed: ${r.join(", ")}`)):console.log(o.gray("No paradigm Cursor hooks found to remove"));}c&&console.log(o.cyan(`
1814
1877
  [dry-run] No changes made.
1815
- `));}async function ne(){let i=process.cwd(),h=r.join(i,".git");if(e.existsSync(h)){console.log(o.magenta(`
1878
+ `));}async function ne(){let i=process.cwd(),h=a.join(i,".git");if(e.existsSync(h)){console.log(o.magenta(`
1816
1879
  Git Hooks Status
1817
- `));let l=r.join(h,"hooks"),t=["post-commit","pre-push"];for(let n of t){let f=r.join(l,n);e.existsSync(f)?e.readFileSync(f,"utf8").includes("paradigm")?console.log(o.green(` ${n}: installed (paradigm)`)):console.log(o.yellow(` ${n}: exists (other)`)):console.log(o.gray(` ${n}: not installed`));}console.log();let s=r.join(i,".paradigm/history");if(e.existsSync(s)){let n=r.join(s,"log.jsonl");if(e.existsSync(n)){let O=e.readFileSync(n,"utf8").split(`
1818
- `).filter(u=>u.trim()).length;console.log(o.white(` History entries: ${O}`));}}else console.log(o.gray(" History: not initialized")),console.log(o.gray(" Run `paradigm history init` to enable"));}else console.log(o.gray(`
1880
+ `));let l=a.join(h,"hooks"),t=["post-commit","pre-push"];for(let n of t){let f=a.join(l,n);e.existsSync(f)?e.readFileSync(f,"utf8").includes("paradigm")?console.log(o.green(` ${n}: installed (paradigm)`)):console.log(o.yellow(` ${n}: exists (other)`)):console.log(o.gray(` ${n}: not installed`));}console.log();let s=a.join(i,".paradigm/history");if(e.existsSync(s)){let n=a.join(s,"log.jsonl");if(e.existsSync(n)){let O=e.readFileSync(n,"utf8").split(`
1881
+ `).filter(m=>m.trim()).length;console.log(o.white(` History entries: ${O}`));}}else console.log(o.gray(" History: not initialized")),console.log(o.gray(" Run `paradigm history init` to enable"));}else console.log(o.gray(`
1819
1882
  Not a git repository (git hooks N/A)
1820
1883
  `));console.log(o.magenta(` Claude Code Hooks Status
1821
- `));let c=F();if(c.active){console.log(o.cyan(` Plugin: paradigm v${c.cacheVersion} (active)`)),console.log(o.green(" Hooks are managed by the plugin \u2014 auto-updates with each session."));let l=r.join(i,".claude","hooks"),t=[];for(let f of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"])e.existsSync(r.join(l,f))&&t.push(f);let s=r.join(i,".claude","settings.json"),n=false;if(e.existsSync(s))try{let f=JSON.parse(e.readFileSync(s,"utf8"));n=JSON.stringify(f.hooks||{}).includes("paradigm-");}catch{}(t.length>0||n)&&(console.log(o.yellow(` WARNING: Stale project hooks detected (${t.join(", ")}${n?", settings.json entries":""})`)),console.log(o.yellow(" These shadow the plugin hooks and may run outdated logic.")),console.log(o.gray(" Run `paradigm hooks install --claude-code` to clean them up.")));}else {console.log(o.gray(" Plugin: not active (using project-level hooks)"));let l=r.join(i,".claude","hooks"),t=["paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"];for(let n of t){let f=r.join(l,n);e.existsSync(f)?console.log(o.green(` ${n}: installed`)):console.log(o.gray(` ${n}: not installed`));}let s=r.join(i,".claude","settings.json");if(e.existsSync(s))try{let f=JSON.parse(e.readFileSync(s,"utf8")).hooks||{},O=JSON.stringify(f.Stop||[]).includes("paradigm-stop.sh"),u=JSON.stringify(f.PreToolUse||[]).includes("paradigm-precommit.sh"),_=JSON.stringify(f.PostToolUse||[]).includes("paradigm-postwrite.sh");console.log(o.gray(` settings.json Stop hook: ${O?"configured":"missing"}`)),console.log(o.gray(` settings.json PreToolUse hook: ${u?"configured":"missing"}`)),console.log(o.gray(` settings.json PostToolUse hook: ${_?"configured":"missing"}`));}catch{console.log(o.yellow(" settings.json: parse error"));}else console.log(o.gray(" settings.json: not found"));}console.log(o.magenta(`
1884
+ `));let c=F();if(c.active){console.log(o.cyan(` Plugin: paradigm v${c.cacheVersion} (active)`)),console.log(o.green(" Hooks are managed by the plugin \u2014 auto-updates with each session."));let l=a.join(i,".claude","hooks"),t=[];for(let f of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"])e.existsSync(a.join(l,f))&&t.push(f);let s=a.join(i,".claude","settings.json"),n=false;if(e.existsSync(s))try{let f=JSON.parse(e.readFileSync(s,"utf8"));n=JSON.stringify(f.hooks||{}).includes("paradigm-");}catch{}(t.length>0||n)&&(console.log(o.yellow(` WARNING: Stale project hooks detected (${t.join(", ")}${n?", settings.json entries":""})`)),console.log(o.yellow(" These shadow the plugin hooks and may run outdated logic.")),console.log(o.gray(" Run `paradigm hooks install --claude-code` to clean them up.")));}else {console.log(o.gray(" Plugin: not active (using project-level hooks)"));let l=a.join(i,".claude","hooks"),t=["paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh"];for(let n of t){let f=a.join(l,n);e.existsSync(f)?console.log(o.green(` ${n}: installed`)):console.log(o.gray(` ${n}: not installed`));}let s=a.join(i,".claude","settings.json");if(e.existsSync(s))try{let f=JSON.parse(e.readFileSync(s,"utf8")).hooks||{},O=JSON.stringify(f.Stop||[]).includes("paradigm-stop.sh"),m=JSON.stringify(f.PreToolUse||[]).includes("paradigm-precommit.sh"),_=JSON.stringify(f.PostToolUse||[]).includes("paradigm-postwrite.sh");console.log(o.gray(` settings.json Stop hook: ${O?"configured":"missing"}`)),console.log(o.gray(` settings.json PreToolUse hook: ${m?"configured":"missing"}`)),console.log(o.gray(` settings.json PostToolUse hook: ${_?"configured":"missing"}`));}catch{console.log(o.yellow(" settings.json: parse error"));}else console.log(o.gray(" settings.json: not found"));}console.log(o.magenta(`
1822
1885
  Cursor Hooks Status
1823
- `));let d=r.join(i,".cursor","hooks"),a=["paradigm-session-start.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-pretooluse.sh","paradigm-posttooluse.sh"];for(let l of a){let t=r.join(d,l);e.existsSync(t)?console.log(o.green(` ${l}: installed`)):console.log(o.gray(` ${l}: not installed`));}let p=r.join(i,".cursor","hooks.json");if(e.existsSync(p))try{let t=JSON.parse(e.readFileSync(p,"utf8")).hooks||{},s=JSON.stringify(t.sessionStart||[]).includes("paradigm-session-start.sh"),n=JSON.stringify(t.stop||[]).includes("paradigm-stop.sh"),f=JSON.stringify(t.afterFileEdit||[]).includes("paradigm-postwrite.sh"),O=JSON.stringify(t.beforeShellExecution||[]).includes("paradigm-precommit.sh"),u=JSON.stringify(t.preToolUse||[]).includes("paradigm-pretooluse.sh"),_=JSON.stringify(t.postToolUse||[]).includes("paradigm-posttooluse.sh");console.log(o.gray(` hooks.json sessionStart: ${s?"configured":"missing"}`)),console.log(o.gray(` hooks.json stop: ${n?"configured":"missing"}`)),console.log(o.gray(` hooks.json afterFileEdit: ${f?"configured":"missing"}`)),console.log(o.gray(` hooks.json preToolUse: ${u?"configured":"missing"}`)),console.log(o.gray(` hooks.json postToolUse: ${_?"configured":"missing"}`)),console.log(o.gray(` hooks.json beforeShellExecution: ${O?"configured":"missing"}`));}catch{console.log(o.yellow(" hooks.json: parse error"));}else console.log(o.gray(" hooks.json: not found"));console.log();}export{re as a,ae as b,ne as c};
1886
+ `));let d=a.join(i,".cursor","hooks"),r=["paradigm-session-start.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-pretooluse.sh","paradigm-posttooluse.sh"];for(let l of r){let t=a.join(d,l);e.existsSync(t)?console.log(o.green(` ${l}: installed`)):console.log(o.gray(` ${l}: not installed`));}let p=a.join(i,".cursor","hooks.json");if(e.existsSync(p))try{let t=JSON.parse(e.readFileSync(p,"utf8")).hooks||{},s=JSON.stringify(t.sessionStart||[]).includes("paradigm-session-start.sh"),n=JSON.stringify(t.stop||[]).includes("paradigm-stop.sh"),f=JSON.stringify(t.afterFileEdit||[]).includes("paradigm-postwrite.sh"),O=JSON.stringify(t.beforeShellExecution||[]).includes("paradigm-precommit.sh"),m=JSON.stringify(t.preToolUse||[]).includes("paradigm-pretooluse.sh"),_=JSON.stringify(t.postToolUse||[]).includes("paradigm-posttooluse.sh");console.log(o.gray(` hooks.json sessionStart: ${s?"configured":"missing"}`)),console.log(o.gray(` hooks.json stop: ${n?"configured":"missing"}`)),console.log(o.gray(` hooks.json afterFileEdit: ${f?"configured":"missing"}`)),console.log(o.gray(` hooks.json preToolUse: ${m?"configured":"missing"}`)),console.log(o.gray(` hooks.json postToolUse: ${_?"configured":"missing"}`)),console.log(o.gray(` hooks.json beforeShellExecution: ${O?"configured":"missing"}`));}catch{console.log(o.yellow(" hooks.json: parse error"));}else console.log(o.gray(" hooks.json: not found"));console.log();}export{ae as a,re as b,ne as c};