@a-company/paradigm 6.6.6 → 7.0.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.
Files changed (93) hide show
  1. package/dist/{accept-orchestration-JHDCVHB2.js → accept-orchestration-YO2V2WYA.js} +1 -1
  2. package/dist/{agents-suggest-IKY6VD2R.js → agents-suggest-WZEGQT5E.js} +1 -1
  3. package/dist/ambient-7HBJHJL2.js +2 -0
  4. package/dist/{ambient-FNNFB4AP.js → ambient-OX7YJ4PJ.js} +1 -1
  5. package/dist/ambient-SST5CLEC.js +35 -0
  6. package/dist/captain-YUP3KVCA.js +2 -0
  7. package/dist/chunk-33ERV2MW.js +18 -0
  8. package/dist/chunk-3MZ4J2LF.js +2 -0
  9. package/dist/chunk-47YPID6H.js +142 -0
  10. package/dist/chunk-6AKNXD22.js +32 -0
  11. package/dist/chunk-6HVOZANP.js +4 -0
  12. package/dist/chunk-ACJWUOMA.js +3 -0
  13. package/dist/chunk-B5KLSBOZ.js +2 -0
  14. package/dist/chunk-DLMDHS2X.js +10 -0
  15. package/dist/chunk-FRQRREJ6.js +29 -0
  16. package/dist/{chunk-5RFISGUW.js → chunk-G6DK3ND3.js} +250 -25
  17. package/dist/{chunk-XKNJSPB5.js → chunk-JCGCPAHF.js} +1 -1
  18. package/dist/chunk-K54L6CFR.js +25 -0
  19. package/dist/chunk-QBIQ2FYB.js +20 -0
  20. package/dist/chunk-QEQCPVF5.js +4 -0
  21. package/dist/chunk-ROU3F2HZ.js +6 -0
  22. package/dist/chunk-S4J337EQ.js +504 -0
  23. package/dist/chunk-V6MIKLMY.js +18 -0
  24. package/dist/chunk-WROJSWAO.js +93 -0
  25. package/dist/{chunk-TQOT2LBO.js → chunk-YXLGVOZO.js} +1 -1
  26. package/dist/chunk-ZSWXLFN7.js +12 -0
  27. package/dist/{compliance-J3VOV445.js → compliance-MLG4W6S4.js} +1 -1
  28. package/dist/{diff-ANKTFDRA.js → diff-MC6AXLKX.js} +1 -1
  29. package/dist/{docs-TSAAS4W3.js → docs-3YFNNZRV.js} +1 -1
  30. package/dist/doctor-CBZYYQQH.js +2 -0
  31. package/dist/{hooks-45WDP6QS.js → hooks-AXBWYJ5V.js} +1 -1
  32. package/dist/index.js +4 -4
  33. package/dist/mcp.js +3 -3
  34. package/dist/{migrate-R64OQGSM.js → migrate-5M4KUQ2L.js} +1 -1
  35. package/dist/{nomination-engine-NCLTGMAK.js → nomination-engine-AQHU2KBU.js} +1 -1
  36. package/dist/notebook-loader-6DYFMNJ2.js +2 -0
  37. package/dist/orchestrate-GMYEBA5T.js +8 -0
  38. package/dist/orchestration-G5MAY6IA.js +2 -0
  39. package/dist/propose-block-ZEMEWJQF.js +2 -0
  40. package/dist/{providers-TBPOE4DI.js → providers-5EHD45C6.js} +1 -1
  41. package/dist/reindex-XTRF23F7.js +2 -0
  42. package/dist/{serve-3FMUWW5K.js → serve-SMGWGJLM.js} +1 -1
  43. package/dist/session-tracker-BZ7FU4AT.js +2 -0
  44. package/dist/session-work-log-QXPAXY5K.js +2 -0
  45. package/dist/session-work-log-T2IE4Y4T.js +2 -0
  46. package/dist/{shift-TNA2E5O7.js → shift-JBCEDCGA.js} +2 -2
  47. package/dist/solo-OWR3MX74.js +3 -0
  48. package/dist/{spawn-KKDDR6UR.js → spawn-PHA2SVQ3.js} +1 -1
  49. package/dist/task-loader-IGQQ6ZFL.js +2 -0
  50. package/dist/task-settlement-NW4XMJGJ.js +3 -0
  51. package/dist/{team-PEGP6F7S.js → team-J2YXPEGX.js} +1 -1
  52. package/dist/team-funnel-RAJ6EDG3.js +2 -0
  53. package/dist/tools-HNJ7D5IO.js +2 -0
  54. package/dist/university-content/notes/N-para-801-cid-becomes-real.md +60 -0
  55. package/dist/university-content/notes/N-para-801-falsifiable-self-improvement.md +66 -0
  56. package/dist/university-content/notes/N-para-801-honest-routing-and-the-method.md +57 -0
  57. package/dist/university-content/notes/N-para-801-orchestration-emits-dag.md +60 -0
  58. package/dist/university-content/notes/N-para-801-settlement-closes-the-loop.md +64 -0
  59. package/dist/university-content/notes/N-para-801-the-task-dag.md +93 -0
  60. package/dist/university-content/paths/LP-para-801.yaml +43 -0
  61. package/dist/university-content/quizzes/Q-para-801-cid-becomes-real.yaml +54 -0
  62. package/dist/university-content/quizzes/Q-para-801-falsifiable-self-improvement.yaml +54 -0
  63. package/dist/university-content/quizzes/Q-para-801-honest-routing-and-the-method.yaml +54 -0
  64. package/dist/university-content/quizzes/Q-para-801-orchestration-emits-dag.yaml +54 -0
  65. package/dist/university-content/quizzes/Q-para-801-settlement-closes-the-loop.yaml +54 -0
  66. package/dist/university-content/quizzes/Q-para-801-the-task-dag.yaml +54 -0
  67. package/dist/university-ui/assets/{index-DrtbBC21.js → index-B8hm_MdR.js} +2 -2
  68. package/dist/university-ui/assets/{index-DrtbBC21.js.map → index-B8hm_MdR.js.map} +1 -1
  69. package/dist/university-ui/index.html +1 -1
  70. package/package.json +1 -1
  71. package/dist/ambient-AI42BOM5.js +0 -35
  72. package/dist/chunk-3OXR6F65.js +0 -666
  73. package/dist/chunk-4N56FRNE.js +0 -29
  74. package/dist/chunk-6QXBXZF6.js +0 -3
  75. package/dist/chunk-AMLD7IYC.js +0 -10
  76. package/dist/chunk-DVZWCXB6.js +0 -2
  77. package/dist/chunk-F6E3HW45.js +0 -14
  78. package/dist/chunk-K7X3Z3GL.js +0 -4
  79. package/dist/chunk-LAYBUKMB.js +0 -14
  80. package/dist/chunk-MU5YWTNE.js +0 -24
  81. package/dist/chunk-PMKZMCTS.js +0 -111
  82. package/dist/chunk-XQLO5URP.js +0 -11
  83. package/dist/doctor-L5XZENCF.js +0 -2
  84. package/dist/notebook-loader-3J2OFMS3.js +0 -2
  85. package/dist/orchestrate-UG5QXNAU.js +0 -8
  86. package/dist/reindex-PTIQ2UGY.js +0 -2
  87. package/dist/session-tracker-HHNY6J4I.js +0 -2
  88. package/dist/session-work-log-MEJ33TYD.js +0 -2
  89. package/dist/session-work-log-ZVVJGO7X.js +0 -2
  90. package/dist/task-loader-NZFDTUQ5.js +0 -2
  91. package/dist/tools-PUSDXUYE.js +0 -2
  92. /package/dist/{chunk-HXGYVS2N.js → chunk-ECLUYHAR.js} +0 -0
  93. /package/dist/{platform-server-ANOALDPL.js → platform-server-WIBVYHIV.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
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
2
+ import*as e from'fs';import*as a from'path';import*as E from'os';import {execSync}from'child_process';import o from'chalk';var k=`#!/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
  #
@@ -891,16 +891,39 @@ if [ "$_SEV" != "off" ]; then
891
891
 
892
892
  # Compare magnitude against threshold (default 3)
893
893
  if [ "$MAGNITUDE" -ge "$ORCH_THRESHOLD" ]; then
894
- if [ ! -f ".paradigm/.orchestrated" ]; then
894
+ # Gate markers expire by age (Stop fires per assistant turn, so clearing
895
+ # them here would erase declarations mid-session). TTL default 4h.
896
+ _GATE_TTL_MIN=$(( \${PARADIGM_GATE_TTL_HOURS:-4} * 60 ))
897
+ _marker_fresh() {
898
+ [ -f "$1" ] || return 1
899
+ [ -n "$(find "$1" -mmin "-$_GATE_TTL_MIN" 2>/dev/null)" ]
900
+ }
901
+ # A structured solo declaration (paradigm solo <reason>) satisfies the gate \u2014
902
+ # bypass becomes a legible recorded choice instead of silent drift.
903
+ if [ ! -f ".paradigm/.orchestrated" ] && ! _marker_fresh ".paradigm/.solo-declared"; then
904
+ # Record the bypass to the team-funnel telemetry regardless of severity \u2014
905
+ # the invocation-rate metric needs the event even when only warning.
906
+ # Deduped per TTL window: Stop fires per turn, and per-turn duplicates
907
+ # would structurally deflate the invocation rate Loid calibrates from.
908
+ if ! _marker_fresh ".paradigm/.team-bypass-recorded"; then
909
+ mkdir -p ".paradigm/events" 2>/dev/null
910
+ _BYPASS_TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
911
+ _BYPASS_REASONS=$(printf '%s' "$MAGNITUDE_REASONS" | tr -cd 'a-zA-Z0-9,. ' | head -c 120)
912
+ echo "{\\"timestamp\\":\\"$_BYPASS_TS\\",\\"type\\":\\"bypass\\",\\"source\\":\\"stop-hook\\",\\"magnitude\\":$MAGNITUDE,\\"reasons\\":\\"$_BYPASS_REASONS\\",\\"severity\\":\\"$_SEV\\"}" >> ".paradigm/events/team-funnel.jsonl" 2>/dev/null
913
+ touch ".paradigm/.team-bypass-recorded" 2>/dev/null
914
+ fi
915
+
895
916
  if [ "$_SEV" = "block" ]; then
896
917
  VIOLATIONS="$VIOLATIONS
897
918
  - Task magnitude $MAGNITUDE >= $ORCH_THRESHOLD without orchestration ($MAGNITUDE_REASONS).
898
919
  Run paradigm_orchestrate_inline mode=\\"quick\\" for fast pre-check.
920
+ Or declare solo explicitly: paradigm solo <trivial|hotfix|user-directed|exploratory>
899
921
  Override: paradigm enforcement override orchestration-required warn"
900
922
  VIOLATION_COUNT=$((VIOLATION_COUNT + 1))
901
923
  else
902
924
  ADVISORY="$ADVISORY
903
- - (orchestration) Magnitude $MAGNITUDE ($MAGNITUDE_REASONS) without team orchestration."
925
+ - (orchestration) Magnitude $MAGNITUDE ($MAGNITUDE_REASONS) without team orchestration.
926
+ Bypass recorded to team-funnel telemetry. Next time: orchestrate, or declare \\\`paradigm solo <reason>\\\`."
904
927
  fi
905
928
  fi
906
929
  fi
@@ -1082,6 +1105,10 @@ rm -f ".paradigm/.habits-blocking"
1082
1105
  rm -f ".paradigm/.session-started"
1083
1106
  rm -f ".paradigm/.purpose-paths"
1084
1107
  rm -f ".paradigm/.orchestrated"
1108
+ # NOTE: .solo-declared / .team-prompted / .team-reminded / .team-bypass-recorded
1109
+ # are deliberately NOT cleared here \u2014 Stop fires per assistant turn, and clearing
1110
+ # would erase solo declarations mid-session and re-nag every turn. They expire
1111
+ # by age instead (PARADIGM_GATE_TTL_HOURS, default 4h).
1085
1112
 
1086
1113
  # Auto-run postflight learning if there are pending verdicts (fire-and-forget, non-blocking)
1087
1114
  if command -v paradigm >/dev/null 2>&1 && [ -f ".paradigm/events/verdicts.jsonl" ]; then
@@ -1215,8 +1242,203 @@ echo " Returns relevant .purpose files, symbols, and file paths \u2014 skips bl
1215
1242
  echo " Scan index: $SCAN_INDEX" >&2
1216
1243
  echo " Navigator: $CWD/.paradigm/navigator.yaml" >&2
1217
1244
 
1245
+ exit 0
1246
+ `,b=`#!/bin/sh
1247
+ # Paradigm Claude Code UserPromptSubmit \u2014 Team Invocation Gate (advisory tier)
1248
+ # Fires on every user prompt. If the task looks orchestration-eligible and the
1249
+ # session has neither orchestrated nor declared solo, injects a decision-time
1250
+ # directive into the model's context (UserPromptSubmit stdout = context).
1251
+ #
1252
+ # Why decision-time: CLAUDE.md "always use the team" instructions sit far back
1253
+ # in context and lose to the model's action bias. A directive injected at the
1254
+ # moment of decision is deterministic \u2014 it fires 100% of the time.
1255
+ #
1256
+ # Hook type: UserPromptSubmit
1257
+ # Exit 0 = always (advisory only \u2014 never blocks)
1258
+ #
1259
+ # Telemetry: every eligible prompt appends an \`eligible\` event to
1260
+ # .paradigm/events/team-funnel.jsonl (even when the directive is capped),
1261
+ # so the classifier's false-positive rate and the team-invocation rate are
1262
+ # measurable from day one. Loid calibrates the gate from this data.
1263
+ #
1264
+ # Escape hatches: PARADIGM_TEAM_GATE=off env var; \`paradigm solo <reason>\`
1265
+ # declares a legible solo session; orchestrating clears the gate naturally.
1266
+
1267
+ # Read JSON from stdin (hook input)
1268
+ INPUT=$(cat)
1269
+
1270
+ # Kill switch
1271
+ if [ "$PARADIGM_TEAM_GATE" = "off" ]; then
1272
+ exit 0
1273
+ fi
1274
+
1275
+ # Extract cwd from input
1276
+ if command -v jq >/dev/null 2>&1; then
1277
+ CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
1278
+ else
1279
+ CWD=$(echo "$INPUT" | grep -o '"cwd"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"cwd"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
1280
+ fi
1281
+
1282
+ if [ -z "$CWD" ]; then
1283
+ CWD="$(pwd)"
1284
+ fi
1285
+
1286
+ # Not a paradigm project \u2014 pass
1287
+ if [ ! -d "$CWD/.paradigm" ]; then
1288
+ exit 0
1289
+ fi
1290
+
1291
+ # Markers expire by age, NOT by Stop-hook clearing \u2014 the Stop hook fires per
1292
+ # assistant turn, so clearing there would erase solo declarations mid-session
1293
+ # and turn the once-per-session cap into once-per-turn nagging. TTL default 4h.
1294
+ TTL_MIN=$(( \${PARADIGM_GATE_TTL_HOURS:-4} * 60 ))
1295
+ marker_fresh() {
1296
+ [ -f "$1" ] || return 1
1297
+ [ -n "$(find "$1" -mmin "-$TTL_MIN" 2>/dev/null)" ]
1298
+ }
1299
+
1300
+ # Session already resolved the gate (team ran, or solo was declared) \u2014 pass
1301
+ if [ -f "$CWD/.paradigm/.orchestrated" ] || marker_fresh "$CWD/.paradigm/.solo-declared"; then
1302
+ exit 0
1303
+ fi
1304
+
1305
+ # Extract the prompt text
1306
+ if command -v jq >/dev/null 2>&1; then
1307
+ PROMPT=$(printf '%s' "$INPUT" | jq -r '.prompt // empty' 2>/dev/null)
1308
+ else
1309
+ PROMPT=$(printf '%s' "$INPUT" | grep -o '"prompt"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"prompt"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
1310
+ fi
1311
+
1312
+ # Too short to be a task (confirmations, "yes", "continue") \u2014 pass
1313
+ if [ "\${#PROMPT}" -lt 24 ]; then
1314
+ exit 0
1315
+ fi
1316
+
1317
+ # Eligibility: implementation-shaped verbs. Deliberately simple \u2014 the funnel
1318
+ # telemetry measures this classifier's false-positive rate; tune from data.
1319
+ # printf (not echo): a prompt starting with -n/-e must not be mangled.
1320
+ MATCHED=$(printf '%s\\n' "$PROMPT" | grep -ioE 'implement|build |fix |refactor|migrate|rewrite|integrate|add (a |an |the )?(feature|support|endpoint|command|tool|component)|create (a |an |the )?(feature|component|module|service)' | head -1)
1321
+
1322
+ if [ -z "$MATCHED" ]; then
1323
+ exit 0
1324
+ fi
1325
+
1326
+ # Record the eligible event (telemetry fires every time, even when the
1327
+ # directive itself is capped)
1328
+ EVENTS_DIR="$CWD/.paradigm/events"
1329
+ mkdir -p "$EVENTS_DIR" 2>/dev/null
1330
+ MATCHED_CLEAN=$(printf '%s' "$MATCHED" | tr -cd 'a-zA-Z ' | head -c 40)
1331
+ TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
1332
+ echo "{\\"timestamp\\":\\"$TS\\",\\"type\\":\\"eligible\\",\\"source\\":\\"prompt-gate\\",\\"matched\\":\\"$MATCHED_CLEAN\\"}" >> "$EVENTS_DIR/team-funnel.jsonl" 2>/dev/null
1333
+
1334
+ # Inject the directive at most once per TTL window (age-based, see above)
1335
+ MARKER="$CWD/.paradigm/.team-prompted"
1336
+ if marker_fresh "$MARKER"; then
1337
+ exit 0
1338
+ fi
1339
+ touch "$MARKER" 2>/dev/null
1340
+
1341
+ # stdout on UserPromptSubmit = injected into the model's context
1342
+ echo "[paradigm] This task looks orchestration-eligible (matched: \\"$MATCHED_CLEAN\\")."
1343
+ echo "Standing opt-in for team orchestration exists in this project. Before editing source:"
1344
+ echo " - Run paradigm_orchestrate_inline (mode=\\"plan\\") to engage the agent team, OR"
1345
+ echo " - Declare solo explicitly: \\\`paradigm solo <trivial|hotfix|user-directed|exploratory> [note]\\\`"
1346
+ echo "Solo work on eligible tasks without a declaration is recorded as a bypass at session end."
1347
+
1218
1348
  exit 0
1219
1349
  `,L=`#!/bin/sh
1350
+ # Paradigm Claude Code PreToolUse \u2014 Team Edit Gate (advisory tier)
1351
+ # Fires before Write/Edit tool calls. If source code is about to be edited in a
1352
+ # session that has neither orchestrated nor declared solo, emits a one-time
1353
+ # advisory. Second line of defense after the prompt-gate (UserPromptSubmit) \u2014
1354
+ # catches sessions where the task only became implementation-shaped mid-way.
1355
+ #
1356
+ # Hook type: PreToolUse (matcher: Write|Edit)
1357
+ # Exit 0 = always allows (advisory only \u2014 never blocks at this tier).
1358
+ # Graduation to a blocking guard happens only after baseline telemetry
1359
+ # justifies it (Loid: "advisory-everywhere first, four weeks minimum").
1360
+ #
1361
+ # Uses a session marker (.paradigm/.team-reminded) to fire at most once.
1362
+ # Escape hatch: PARADIGM_TEAM_GATE=off
1363
+
1364
+ # Read JSON from stdin (hook input)
1365
+ INPUT=$(cat)
1366
+
1367
+ # Kill switch
1368
+ if [ "$PARADIGM_TEAM_GATE" = "off" ]; then
1369
+ exit 0
1370
+ fi
1371
+
1372
+ # Extract cwd from input
1373
+ if command -v jq >/dev/null 2>&1; then
1374
+ CWD=$(echo "$INPUT" | jq -r '.cwd // empty' 2>/dev/null)
1375
+ else
1376
+ CWD=$(echo "$INPUT" | grep -o '"cwd"[[:space:]]*:[[:space:]]*"[^"]*"' | sed 's/.*"cwd"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
1377
+ fi
1378
+
1379
+ if [ -z "$CWD" ]; then
1380
+ CWD="$(pwd)"
1381
+ fi
1382
+
1383
+ # Not a paradigm project \u2014 pass
1384
+ if [ ! -d "$CWD/.paradigm" ]; then
1385
+ exit 0
1386
+ fi
1387
+
1388
+ # Markers expire by age, NOT by Stop-hook clearing (Stop fires per turn).
1389
+ TTL_MIN=$(( \${PARADIGM_GATE_TTL_HOURS:-4} * 60 ))
1390
+ marker_fresh() {
1391
+ [ -f "$1" ] || return 1
1392
+ [ -n "$(find "$1" -mmin "-$TTL_MIN" 2>/dev/null)" ]
1393
+ }
1394
+
1395
+ # Session already resolved the gate \u2014 pass
1396
+ if [ -f "$CWD/.paradigm/.orchestrated" ] || marker_fresh "$CWD/.paradigm/.solo-declared"; then
1397
+ exit 0
1398
+ fi
1399
+
1400
+ # Only remind once per TTL window
1401
+ MARKER="$CWD/.paradigm/.team-reminded"
1402
+ if marker_fresh "$MARKER"; then
1403
+ exit 0
1404
+ fi
1405
+
1406
+ # Extract the target file path
1407
+ if command -v jq >/dev/null 2>&1; then
1408
+ FILE_PATH=$(printf '%s' "$INPUT" | jq -r '.tool_input.file_path // empty' 2>/dev/null)
1409
+ else
1410
+ FILE_PATH=$(printf '%s' "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
1411
+ fi
1412
+
1413
+ if [ -z "$FILE_PATH" ]; then
1414
+ exit 0
1415
+ fi
1416
+
1417
+ # Only fire for source files \u2014 docs/config/purpose edits are not team-eligible
1418
+ case "$FILE_PATH" in
1419
+ *.md|*.markdown|*.yaml|*.yml|*.json|*.txt|*.purpose) exit 0 ;;
1420
+ */docs/*|*/.paradigm/*) exit 0 ;;
1421
+ esac
1422
+
1423
+ # Mark as reminded so this only fires once per session
1424
+ touch "$MARKER" 2>/dev/null
1425
+
1426
+ # Record the edit-advisory event (telemetry)
1427
+ EVENTS_DIR="$CWD/.paradigm/events"
1428
+ mkdir -p "$EVENTS_DIR" 2>/dev/null
1429
+ FILE_BASE=$(basename -- "$FILE_PATH" | tr -cd 'a-zA-Z0-9._-' | head -c 60)
1430
+ TS=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
1431
+ echo "{\\"timestamp\\":\\"$TS\\",\\"type\\":\\"edit-advisory\\",\\"source\\":\\"team-gate\\",\\"file\\":\\"$FILE_BASE\\"}" >> "$EVENTS_DIR/team-funnel.jsonl" 2>/dev/null
1432
+
1433
+ # Emit advisory (non-blocking)
1434
+ echo "" >&2
1435
+ echo "[paradigm] Source edit without team orchestration this session." >&2
1436
+ echo " Standing opt-in exists: run paradigm_orchestrate_inline (mode=\\"plan\\") to engage the team," >&2
1437
+ echo " or declare solo explicitly: paradigm solo <trivial|hotfix|user-directed|exploratory> [note]" >&2
1438
+ echo " Undeclared solo work on eligible tasks is recorded as a bypass at session end." >&2
1439
+
1440
+ exit 0
1441
+ `,w=`#!/bin/sh
1220
1442
  # Paradigm Cursor Session Start Hook
1221
1443
  # Fires before the agent does anything \u2014 injects additional_context
1222
1444
  # that acts as a deterministic system prompt (not subject to context compaction).
@@ -1316,7 +1538,7 @@ fi
1316
1538
  printf '{"additional_context":"%s","continue":true}\\n' "$CONTEXT"
1317
1539
 
1318
1540
  exit 0
1319
- `,b=`#!/bin/sh
1541
+ `,x=`#!/bin/sh
1320
1542
  # Paradigm Cursor Stop Hook (v2)
1321
1543
  # Validates paradigm compliance before allowing the agent to finish.
1322
1544
  # Installed by: paradigm hooks install --cursor
@@ -1448,13 +1670,16 @@ rm -f ".paradigm/.stop-hook-active"
1448
1670
  rm -f ".paradigm/.session-started"
1449
1671
  rm -f ".paradigm/.purpose-paths"
1450
1672
  rm -f ".paradigm/.orchestrated"
1673
+ # NOTE: .solo-declared / .team-prompted / .team-reminded / .team-bypass-recorded
1674
+ # are deliberately NOT cleared here \u2014 stop fires per turn; they expire by age
1675
+ # instead (PARADIGM_GATE_TTL_HOURS, default 4h).
1451
1676
 
1452
1677
  exit 0
1453
- `,w=`#!/bin/sh
1678
+ `,M=`#!/bin/sh
1454
1679
  # Legacy afterFileEdit hook \u2014 replaced by paradigm-posttooluse.sh (postToolUse)
1455
1680
  # Kept as a no-op because Cursor expects the file to exist.
1456
1681
  exit 0
1457
- `,x=`#!/bin/sh
1682
+ `,V=`#!/bin/sh
1458
1683
  # Paradigm Cursor Pre-Commit Hook
1459
1684
  # Intercepts git commit shell executions and auto-rebuilds the index.
1460
1685
  # Installed by: paradigm hooks install --cursor
@@ -1499,7 +1724,7 @@ done
1499
1724
 
1500
1725
  # Never block \u2014 exit 0
1501
1726
  exit 0
1502
- `,M=`#!/bin/sh
1727
+ `,H=`#!/bin/sh
1503
1728
  # Paradigm Cursor PreToolUse Hook \u2014 Graduated Blocking
1504
1729
  # Fires BEFORE the agent calls Edit or Write.
1505
1730
  # Uses graduated enforcement based on uncovered source edits.
@@ -1644,7 +1869,7 @@ else
1644
1869
  echo " Then retry your edit." >&2
1645
1870
  exit 2
1646
1871
  fi
1647
- `,V=`#!/bin/sh
1872
+ `,F=`#!/bin/sh
1648
1873
  # Paradigm Cursor PostToolUse Hook \u2014 Advisory Feedback
1649
1874
  # Fires AFTER the agent calls Edit or Write.
1650
1875
  # Tracks modified source files and outputs advisory the agent can see.
@@ -1768,9 +1993,9 @@ if [ "$PENDING_COUNT" -ge 30 ]; then
1768
1993
  fi
1769
1994
 
1770
1995
  exit 0
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(`
1773
- `)[0]||"unknown error"}`}finally{try{e.unlinkSync(c);}catch{}}}catch{return null}}var G=`#!/bin/sh
1996
+ `;function j(){try{let i=a.join(E.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(E.homedir(),".claude","plugins","cache","a-paradigm","paradigm");if(!e.existsSync(d))return {active:!1};let n=e.readdirSync(d).filter(t=>e.statSync(a.join(d,t)).isDirectory()).sort().reverse();if(n.length===0)return {active:!1};let p=a.join(d,n[0]),l=a.join(p,"hooks","hooks.json");return e.existsSync(l)?{active:!0,cacheVersion:n[0]}:{active:!1}}catch{return {active:false}}}function K(){try{let i=j();if(!i.active||!i.cacheVersion)return {compatible:!0};let m=a.join(E.homedir(),".claude","plugins","cache","a-paradigm","paradigm",i.cacheVersion,"hooks.json");if(!e.existsSync(m))return {compatible:!0};let d=JSON.parse(e.readFileSync(m,"utf8")).compatibleVersions;if(!d)return {compatible:!0};let n=z();if(!n)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,r]=t,h=Z(n,r);if(s===">="&&h<0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${n}`};if(s===">"&&h<=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${n}`};if(s==="<="&&h>0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${n}`};if(s==="<"&&h>=0)return {compatible:!1,message:`Plugin requires paradigm ${d}, current: ${n}`}}return {compatible:!0}}catch{return {compatible:true}}}function z(){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 Z(i,m){let c=i.split(".").map(Number),d=m.split(".").map(Number);for(let n=0;n<3;n++){if((c[n]||0)<(d[n]||0))return -1;if((c[n]||0)>(d[n]||0))return 1}return 0}function Q(i){let m=[],c=a.join(i,".claude","hooks");if(e.existsSync(c)){for(let n of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh","paradigm-prompt-gate.sh","paradigm-team-gate.sh"]){let p=a.join(c,n);e.existsSync(p)&&(e.unlinkSync(p),m.push(n));}try{e.readdirSync(c).length===0&&e.rmdirSync(c);}catch{}}let d=a.join(i,".claude","settings.json");if(e.existsSync(d))try{let n=JSON.parse(e.readFileSync(d,"utf8")),p=n.hooks;if(p){let l=!1;for(let[t,s]of Object.entries(p)){if(!Array.isArray(s))continue;let r=s.filter(h=>!JSON.stringify(h).includes("paradigm-"));r.length!==s.length&&(l=!0,r.length===0?delete p[t]:p[t]=r);}l&&(Object.keys(p).length===0?delete n.hooks:n.hooks=p,e.writeFileSync(d,JSON.stringify(n,null,2)+`
1997
+ `,"utf8"),m.push("settings.json hooks"));}}catch{}return {cleaned:m.length>0,removed:m}}function ee(i,m){try{let c=a.join(E.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 `${m}: bash syntax error \u2014 ${d.message?.split(`
1998
+ `)[0]||"unknown error"}`}finally{try{e.unlinkSync(c);}catch{}}}catch{return null}}var J=`#!/bin/sh
1774
1999
  # Paradigm post-commit hook - captures history from commits
1775
2000
  # Installed by: paradigm hooks install
1776
2001
 
@@ -1854,7 +2079,7 @@ if [ -n "$SYMBOLS" ] && [ -d ".paradigm/history" ]; then
1854
2079
 
1855
2080
  echo "[paradigm] History entry $ID recorded"
1856
2081
  fi
1857
- `,Y=`#!/bin/sh
2082
+ `,q=`#!/bin/sh
1858
2083
  # Paradigm pre-push hook - reindex history before pushing
1859
2084
  # Installed by: paradigm hooks install
1860
2085
 
@@ -1862,25 +2087,25 @@ if [ -d ".paradigm/history" ] && [ -f ".paradigm/history/log.jsonl" ]; then
1862
2087
  echo "[paradigm] Reindexing history..."
1863
2088
  npx paradigm history reindex 2>/dev/null || true
1864
2089
  fi
1865
- `;async function ae(i={}){let h=process.cwd(),c=i.dryRun||false;c&&console.log(o.cyan(`
2090
+ `;async function ne(i={}){let m=process.cwd(),c=i.dryRun||false;c&&console.log(o.cyan(`
1866
2091
  [dry-run] Showing what would be installed:
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(`
2092
+ `));let d=i.claudeCode&&!i.postCommit&&!i.prePush&&!i.cursor,n=i.cursor&&!i.postCommit&&!i.prePush&&!i.claudeCode;if(!c){let t=[{name:"post-commit",content:J},{name:"pre-push",content:q},{name:"paradigm-common",content:k},{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:"claude-code-prompt-gate",content:b},{name:"claude-code-team-gate",content:L},{name:"cursor-session-start",content:w},{name:"cursor-stop",content:x},{name:"cursor-precommit",content:V},{name:"cursor-postwrite",content:M},{name:"cursor-pretooluse",content:H},{name:"cursor-posttooluse",content:F}];for(let s of t){let r=ee(s.content,s.name);if(r){console.log(o.red(`Hook syntax error: ${r}`)),console.log(o.gray("Aborting installation. Fix the hook script and try again."));return}}}let p=K();if(p.compatible||(console.log(o.yellow(`
1868
2093
  \u26A0 ${p.message}`)),console.log(o.gray(` Hook installation will continue, but behavior may differ from plugin expectations.
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(`
2094
+ `))),!d&&!n){let t=a.join(m,".git");if(!e.existsSync(t)){console.log(o.red("Not a git repository."));return}let s=a.join(t,"hooks"),r=!i.postCommit&&!i.prePush&&!i.claudeCode,h=[];if(r||i.postCommit){let f=a.join(s,"post-commit");if(c){let _=e.existsSync(f)&&!i.force?"skip (exists)":"install";console.log(o.gray(` post-commit: ${_} \u2192 ${f}`));}else e.existsSync(f)&&!i.force?e.readFileSync(f,"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(f,J),e.chmodSync(f,"755"),h.push("post-commit"));}if(r||i.prePush){let f=a.join(s,"pre-push");if(c){let _=e.existsSync(f)&&!i.force?"skip (exists)":"install";console.log(o.gray(` pre-push: ${_} \u2192 ${f}`));}else e.existsSync(f)&&!i.force?e.readFileSync(f,"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(f,q),e.chmodSync(f,"755"),h.push("pre-push"));}!c&&h.length>0&&console.log(o.green(`Git hooks installed: ${h.join(", ")}`));let O=a.join(m,".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(m,".claude","hooks")}/`)),console.log(o.gray(" \u2192 Update .claude/settings.json with hook configuration"))):await oe(m,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(m,".cursor","hooks")}/`)),console.log(o.gray(" \u2192 Update .cursor/hooks.json"))):await ie(m,i.force)),c&&console.log(o.cyan(`
1870
2095
  [dry-run] No changes made.
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(`
2096
+ `));}async function oe(i,m){let c=j();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:u}=Q(i);console.log(g?o.green(` Cleaned up stale project hooks: ${u.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 n=[],p=a.join(d,"paradigm-common.sh");e.writeFileSync(p,k,"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},{name:"paradigm-prompt-gate.sh",content:b},{name:"paradigm-team-gate.sh",content:L}];for(let g of l){let u=a.join(d,g.name);if(e.existsSync(u)&&!m){console.log(o.gray(` ${g.name}: already installed`));continue}e.writeFileSync(u,g.content,"utf8"),e.chmodSync(u,"755"),n.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 r=s.hooks||{},h={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}]},f=r.Stop||[];f.some(g=>JSON.stringify(g).includes("paradigm-stop.sh"))||f.push(h),r.Stop=f;let $=r.PreToolUse||[];$.some(g=>JSON.stringify(g).includes("paradigm-precommit.sh"))||$.push(O),r.PreToolUse=$;let G={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(G),r.PreToolUse=$;let Y={matcher:"Write|Edit",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-team-gate.sh"',timeout:5}]};$.some(g=>JSON.stringify(g).includes("paradigm-team-gate.sh"))||$.push(Y),r.PreToolUse=$;let T={hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-prompt-gate.sh"',timeout:5}]},C=r.UserPromptSubmit||[];C.some(g=>JSON.stringify(g).includes("paradigm-prompt-gate.sh"))||C.push(T),r.UserPromptSubmit=C;let S={matcher:"Edit,Write",hooks:[{type:"command",command:'bash "$CLAUDE_PROJECT_DIR/.claude/hooks/paradigm-postwrite.sh"',timeout:5}]},y=r.PostToolUse||[];y.some(g=>JSON.stringify(g).includes("paradigm-postwrite.sh"))||y.push(S),r.PostToolUse=y,s.hooks=r,e.writeFileSync(t,JSON.stringify(s,null,2)+`
2097
+ `,"utf8"),n.length>0&&console.log(o.green(`Claude Code hooks installed: ${n.join(", ")}`)),console.log(o.green("Claude Code settings.json updated with hook configuration"));}async function ie(i,m){let c=a.join(i,".cursor","hooks");e.mkdirSync(c,{recursive:true});let d=[],n=a.join(c,"paradigm-common.sh");e.writeFileSync(n,k,"utf8"),e.chmodSync(n,"755");let p=[{name:"paradigm-session-start.sh",content:w},{name:"paradigm-stop.sh",content:x},{name:"paradigm-precommit.sh",content:V},{name:"paradigm-postwrite.sh",content:M},{name:"paradigm-pretooluse.sh",content:H},{name:"paradigm-posttooluse.sh",content:F}];for(let u of p){let R=a.join(c,u.name);if(e.existsSync(R)&&!m){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||{},r={command:".cursor/hooks/paradigm-session-start.sh",timeout:5},h={command:".cursor/hooks/paradigm-stop.sh",timeout:10,loop_limit:3},O={command:".cursor/hooks/paradigm-postwrite.sh",timeout:5},f={command:".cursor/hooks/paradigm-precommit.sh",matcher:"git commit",timeout:30},_=s.sessionStart||[];_.some(u=>JSON.stringify(u).includes("paradigm-session-start.sh"))||_.push(r),s.sessionStart=_;let I=s.stop||[];I.some(u=>JSON.stringify(u).includes("paradigm-stop.sh"))||I.push(h),s.stop=I;let N=s.afterFileEdit||[];N.some(u=>JSON.stringify(u).includes("paradigm-postwrite.sh"))||N.push(O),s.afterFileEdit=N;let W={command:".cursor/hooks/paradigm-pretooluse.sh",matcher:"Edit|Write",timeout:5},T=s.preToolUse||[];T.some(u=>JSON.stringify(u).includes("paradigm-pretooluse.sh"))||T.push(W),s.preToolUse=T;let X={command:".cursor/hooks/paradigm-posttooluse.sh",matcher:"Edit|Write",timeout:5},S=s.postToolUse||[];S.some(u=>JSON.stringify(u).includes("paradigm-posttooluse.sh"))||S.push(X),s.postToolUse=S;let A=s.beforeShellExecution||[];A.some(u=>JSON.stringify(u).includes("paradigm-precommit.sh"))||A.push(f),s.beforeShellExecution=A,t.hooks=s,e.writeFileSync(l,JSON.stringify(t,null,2)+`
2098
+ `,"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 ce(i={}){let m=process.cwd(),c=i.dryRun||false;if(c&&console.log(o.cyan(`
1874
2099
  [dry-run] Showing what would be removed:
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(`
2100
+ `)),!i.cursor){let d=a.join(m,".git");if(!e.existsSync(d)){console.log(o.red("Not a git repository."));return}let n=a.join(d,"hooks"),p=[];for(let l of ["post-commit","pre-push"]){let t=a.join(n,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(m,".cursor","hooks"),n=[];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),n.push(l));}let p=a.join(m,".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(r=>!JSON.stringify(r).includes("paradigm-")),t[s].length===0&&delete t[s]);l.hooks=t,e.writeFileSync(p,JSON.stringify(l,null,2)+`
2101
+ `,"utf8");}catch{}c?n.length===0&&console.log(o.gray(" No paradigm Cursor hooks to remove")):n.length>0?console.log(o.green(`Cursor hooks removed: ${n.join(", ")}`)):console.log(o.gray("No paradigm Cursor hooks found to remove"));}c&&console.log(o.cyan(`
1877
2102
  [dry-run] No changes made.
1878
- `));}async function ne(){let i=process.cwd(),h=a.join(i,".git");if(e.existsSync(h)){console.log(o.magenta(`
2103
+ `));}async function de(){let i=process.cwd(),m=a.join(i,".git");if(e.existsSync(m)){console.log(o.magenta(`
1879
2104
  Git Hooks Status
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(`
2105
+ `));let l=a.join(m,"hooks"),t=["post-commit","pre-push"];for(let r of t){let h=a.join(l,r);e.existsSync(h)?e.readFileSync(h,"utf8").includes("paradigm")?console.log(o.green(` ${r}: installed (paradigm)`)):console.log(o.yellow(` ${r}: exists (other)`)):console.log(o.gray(` ${r}: not installed`));}console.log();let s=a.join(i,".paradigm/history");if(e.existsSync(s)){let r=a.join(s,"log.jsonl");if(e.existsSync(r)){let O=e.readFileSync(r,"utf8").split(`
2106
+ `).filter(f=>f.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(`
1882
2107
  Not a git repository (git hooks N/A)
1883
2108
  `));console.log(o.magenta(` Claude Code Hooks Status
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(`
2109
+ `));let c=j();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 h of ["paradigm-common.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-navigate-remind.sh","paradigm-prompt-gate.sh","paradigm-team-gate.sh"])e.existsSync(a.join(l,h))&&t.push(h);let s=a.join(i,".claude","settings.json"),r=false;if(e.existsSync(s))try{let h=JSON.parse(e.readFileSync(s,"utf8"));r=JSON.stringify(h.hooks||{}).includes("paradigm-");}catch{}(t.length>0||r)&&(console.log(o.yellow(` WARNING: Stale project hooks detected (${t.join(", ")}${r?", 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 r of t){let h=a.join(l,r);e.existsSync(h)?console.log(o.green(` ${r}: installed`)):console.log(o.gray(` ${r}: not installed`));}let s=a.join(i,".claude","settings.json");if(e.existsSync(s))try{let h=JSON.parse(e.readFileSync(s,"utf8")).hooks||{},O=JSON.stringify(h.Stop||[]).includes("paradigm-stop.sh"),f=JSON.stringify(h.PreToolUse||[]).includes("paradigm-precommit.sh"),_=JSON.stringify(h.PostToolUse||[]).includes("paradigm-postwrite.sh");console.log(o.gray(` settings.json Stop hook: ${O?"configured":"missing"}`)),console.log(o.gray(` settings.json PreToolUse hook: ${f?"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(`
1885
2110
  Cursor Hooks Status
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};
2111
+ `));let d=a.join(i,".cursor","hooks"),n=["paradigm-session-start.sh","paradigm-stop.sh","paradigm-precommit.sh","paradigm-postwrite.sh","paradigm-pretooluse.sh","paradigm-posttooluse.sh"];for(let l of n){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"),r=JSON.stringify(t.stop||[]).includes("paradigm-stop.sh"),h=JSON.stringify(t.afterFileEdit||[]).includes("paradigm-postwrite.sh"),O=JSON.stringify(t.beforeShellExecution||[]).includes("paradigm-precommit.sh"),f=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: ${r?"configured":"missing"}`)),console.log(o.gray(` hooks.json afterFileEdit: ${h?"configured":"missing"}`)),console.log(o.gray(` hooks.json preToolUse: ${f?"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{ne as a,ce as b,de as c};
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import {b}from'./chunk-MU5YWTNE.js';import {e,f,c,d,l,h,g,k,i,m as m$1,o,n,j,b as b$1,a as a$1}from'./chunk-TQOT2LBO.js';import {a}from'./chunk-Y4XFVDZC.js';import*as $ from'fs';import*as m from'path';import e$1 from'chalk';import E from'prompts';function F(){return process.env.CLAUDE_CODE==="1"||process.env.TERM_PROGRAM==="claude"?false:!!(process.env.TERM_PROGRAM==="cursor"||process.env.CURSOR_SESSION||process.env.CURSOR_TRACE_ID||process.env.VSCODE_CWD&&process.env.VSCODE_CWD.toLowerCase().includes("cursor")||process.env.VSCODE_NLS_CONFIG&&process.env.VSCODE_NLS_CONFIG.toLowerCase().includes("cursor")||process.env.TERM_PROGRAM==="vscode"&&process.env.VSCODE_GIT_ASKPASS_NODE?.toLowerCase().includes("cursor")||process.stdin.isTTY)}async function T(g){let n=new a(g),c=await n.discover();console.log(e$1.cyan(`
2
+ import {b}from'./chunk-6AKNXD22.js';import {e,f,c,d,l,h,g,k,i,m as m$1,o,n,j,b as b$1,a as a$1}from'./chunk-YXLGVOZO.js';import {a}from'./chunk-Y4XFVDZC.js';import*as $ from'fs';import*as m from'path';import e$1 from'chalk';import E from'prompts';function F(){return process.env.CLAUDE_CODE==="1"||process.env.TERM_PROGRAM==="claude"?false:!!(process.env.TERM_PROGRAM==="cursor"||process.env.CURSOR_SESSION||process.env.CURSOR_TRACE_ID||process.env.VSCODE_CWD&&process.env.VSCODE_CWD.toLowerCase().includes("cursor")||process.env.VSCODE_NLS_CONFIG&&process.env.VSCODE_NLS_CONFIG.toLowerCase().includes("cursor")||process.env.TERM_PROGRAM==="vscode"&&process.env.VSCODE_GIT_ASKPASS_NODE?.toLowerCase().includes("cursor")||process.stdin.isTTY)}async function T(g){let n=new a(g),c=await n.discover();console.log(e$1.cyan(`
3
3
  Configure Agent Models
4
4
  `)),console.log(e$1.gray(` Environment: ${c.source}`)),console.log(e$1.gray(` Available: ${c.models.length} models
5
5
  `));let i={},o=n.groupByTier(c.models),a$2=t=>{let r=a$1[t],s=r.tier==="high"?o.high:r.tier==="medium"?o.medium:o.low,l=[];for(let f of s){let P=l.length===0;l.push({title:P?`${f.name} (recommended)`:f.name,value:f.id,description:`${f.provider} - ${r.tier} tier`});}let u=o.high.filter(f=>!s.includes(f)),y=o.medium.filter(f=>!s.includes(f)),v=o.low.filter(f=>!s.includes(f));for(let f of u)l.push({title:f.name,value:f.id,description:`${f.provider} - high tier`});for(let f of y)l.push({title:f.name,value:f.id,description:`${f.provider} - medium tier`});for(let f of v)l.push({title:f.name,value:f.id,description:`${f.provider} - low tier`});return l};for(let t of ["architect","builder","tester","reviewer","security"]){let r=a$1[t],s=t.charAt(0).toUpperCase()+t.slice(1),l=a$2(t),u=await E({type:"select",name:"model",message:`${s} (${r.description})`,choices:l,initial:0},{onCancel:()=>{console.log(e$1.yellow(`