aether-colony 5.1.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/.aether/aether-utils.sh +157 -42
  2. package/.aether/agents/aether-ambassador.md +140 -0
  3. package/.aether/agents/aether-archaeologist.md +108 -0
  4. package/.aether/agents/aether-architect.md +133 -0
  5. package/.aether/agents/aether-auditor.md +144 -0
  6. package/.aether/agents/aether-builder.md +184 -0
  7. package/.aether/agents/aether-chaos.md +115 -0
  8. package/.aether/agents/aether-chronicler.md +122 -0
  9. package/.aether/agents/aether-gatekeeper.md +116 -0
  10. package/.aether/agents/aether-includer.md +117 -0
  11. package/.aether/agents/aether-keeper.md +177 -0
  12. package/.aether/agents/aether-measurer.md +128 -0
  13. package/.aether/agents/aether-oracle.md +137 -0
  14. package/.aether/agents/aether-probe.md +133 -0
  15. package/.aether/agents/aether-queen.md +286 -0
  16. package/.aether/agents/aether-route-setter.md +130 -0
  17. package/.aether/agents/aether-sage.md +106 -0
  18. package/.aether/agents/aether-scout.md +101 -0
  19. package/.aether/agents/aether-surveyor-disciplines.md +391 -0
  20. package/.aether/agents/aether-surveyor-nest.md +329 -0
  21. package/.aether/agents/aether-surveyor-pathogens.md +264 -0
  22. package/.aether/agents/aether-surveyor-provisions.md +334 -0
  23. package/.aether/agents/aether-tracker.md +137 -0
  24. package/.aether/agents/aether-watcher.md +174 -0
  25. package/.aether/agents/aether-weaver.md +130 -0
  26. package/.aether/commands/claude/archaeology.md +334 -0
  27. package/.aether/commands/claude/build.md +65 -0
  28. package/.aether/commands/claude/chaos.md +336 -0
  29. package/.aether/commands/claude/colonize.md +259 -0
  30. package/.aether/commands/claude/continue.md +60 -0
  31. package/.aether/commands/claude/council.md +507 -0
  32. package/.aether/commands/claude/data-clean.md +81 -0
  33. package/.aether/commands/claude/dream.md +268 -0
  34. package/.aether/commands/claude/entomb.md +498 -0
  35. package/.aether/commands/claude/export-signals.md +57 -0
  36. package/.aether/commands/claude/feedback.md +96 -0
  37. package/.aether/commands/claude/flag.md +151 -0
  38. package/.aether/commands/claude/flags.md +169 -0
  39. package/.aether/commands/claude/focus.md +76 -0
  40. package/.aether/commands/claude/help.md +154 -0
  41. package/.aether/commands/claude/history.md +140 -0
  42. package/.aether/commands/claude/import-signals.md +71 -0
  43. package/.aether/commands/claude/init.md +505 -0
  44. package/.aether/commands/claude/insert-phase.md +105 -0
  45. package/.aether/commands/claude/interpret.md +278 -0
  46. package/.aether/commands/claude/lay-eggs.md +210 -0
  47. package/.aether/commands/claude/maturity.md +113 -0
  48. package/.aether/commands/claude/memory-details.md +77 -0
  49. package/.aether/commands/claude/migrate-state.md +171 -0
  50. package/.aether/commands/claude/oracle.md +642 -0
  51. package/.aether/commands/claude/organize.md +232 -0
  52. package/.aether/commands/claude/patrol.md +620 -0
  53. package/.aether/commands/claude/pause-colony.md +233 -0
  54. package/.aether/commands/claude/phase.md +115 -0
  55. package/.aether/commands/claude/pheromones.md +156 -0
  56. package/.aether/commands/claude/plan.md +693 -0
  57. package/.aether/commands/claude/preferences.md +65 -0
  58. package/.aether/commands/claude/quick.md +100 -0
  59. package/.aether/commands/claude/redirect.md +76 -0
  60. package/.aether/commands/claude/resume-colony.md +197 -0
  61. package/.aether/commands/claude/resume.md +388 -0
  62. package/.aether/commands/claude/run.md +231 -0
  63. package/.aether/commands/claude/seal.md +774 -0
  64. package/.aether/commands/claude/skill-create.md +286 -0
  65. package/.aether/commands/claude/status.md +410 -0
  66. package/.aether/commands/claude/swarm.md +349 -0
  67. package/.aether/commands/claude/tunnels.md +426 -0
  68. package/.aether/commands/claude/update.md +132 -0
  69. package/.aether/commands/claude/verify-castes.md +143 -0
  70. package/.aether/commands/claude/watch.md +239 -0
  71. package/.aether/commands/colonize.yaml +4 -0
  72. package/.aether/commands/council.yaml +205 -0
  73. package/.aether/commands/init.yaml +46 -13
  74. package/.aether/commands/insert-phase.yaml +4 -0
  75. package/.aether/commands/opencode/archaeology.md +331 -0
  76. package/.aether/commands/opencode/build.md +1168 -0
  77. package/.aether/commands/opencode/chaos.md +329 -0
  78. package/.aether/commands/opencode/colonize.md +195 -0
  79. package/.aether/commands/opencode/continue.md +1436 -0
  80. package/.aether/commands/opencode/council.md +437 -0
  81. package/.aether/commands/opencode/data-clean.md +77 -0
  82. package/.aether/commands/opencode/dream.md +260 -0
  83. package/.aether/commands/opencode/entomb.md +377 -0
  84. package/.aether/commands/opencode/export-signals.md +54 -0
  85. package/.aether/commands/opencode/feedback.md +99 -0
  86. package/.aether/commands/opencode/flag.md +149 -0
  87. package/.aether/commands/opencode/flags.md +167 -0
  88. package/.aether/commands/opencode/focus.md +73 -0
  89. package/.aether/commands/opencode/help.md +157 -0
  90. package/.aether/commands/opencode/history.md +136 -0
  91. package/.aether/commands/opencode/import-signals.md +68 -0
  92. package/.aether/commands/opencode/init.md +518 -0
  93. package/.aether/commands/opencode/insert-phase.md +111 -0
  94. package/.aether/commands/opencode/interpret.md +272 -0
  95. package/.aether/commands/opencode/lay-eggs.md +213 -0
  96. package/.aether/commands/opencode/maturity.md +108 -0
  97. package/.aether/commands/opencode/memory-details.md +83 -0
  98. package/.aether/commands/opencode/migrate-state.md +165 -0
  99. package/.aether/commands/opencode/oracle.md +593 -0
  100. package/.aether/commands/opencode/organize.md +226 -0
  101. package/.aether/commands/opencode/patrol.md +626 -0
  102. package/.aether/commands/opencode/pause-colony.md +203 -0
  103. package/.aether/commands/opencode/phase.md +113 -0
  104. package/.aether/commands/opencode/pheromones.md +162 -0
  105. package/.aether/commands/opencode/plan.md +684 -0
  106. package/.aether/commands/opencode/preferences.md +71 -0
  107. package/.aether/commands/opencode/quick.md +91 -0
  108. package/.aether/commands/opencode/redirect.md +84 -0
  109. package/.aether/commands/opencode/resume-colony.md +190 -0
  110. package/.aether/commands/opencode/resume.md +394 -0
  111. package/.aether/commands/opencode/run.md +237 -0
  112. package/.aether/commands/opencode/seal.md +452 -0
  113. package/.aether/commands/opencode/skill-create.md +63 -0
  114. package/.aether/commands/opencode/status.md +307 -0
  115. package/.aether/commands/opencode/swarm.md +15 -0
  116. package/.aether/commands/opencode/tunnels.md +400 -0
  117. package/.aether/commands/opencode/update.md +127 -0
  118. package/.aether/commands/opencode/verify-castes.md +139 -0
  119. package/.aether/commands/opencode/watch.md +227 -0
  120. package/.aether/commands/plan.yaml +53 -2
  121. package/.aether/commands/quick.yaml +104 -0
  122. package/.aether/commands/resume-colony.yaml +6 -4
  123. package/.aether/commands/resume.yaml +9 -0
  124. package/.aether/commands/run.yaml +37 -1
  125. package/.aether/commands/seal.yaml +9 -0
  126. package/.aether/commands/status.yaml +45 -1
  127. package/.aether/docs/command-playbooks/build-full.md +3 -2
  128. package/.aether/docs/command-playbooks/build-prep.md +12 -4
  129. package/.aether/docs/command-playbooks/build-verify.md +51 -0
  130. package/.aether/docs/command-playbooks/continue-advance.md +115 -6
  131. package/.aether/docs/command-playbooks/continue-full.md +1 -0
  132. package/.aether/docs/command-playbooks/continue-verify.md +33 -0
  133. package/.aether/utils/clash-detect.sh +239 -0
  134. package/.aether/utils/council.sh +425 -0
  135. package/.aether/utils/error-handler.sh +3 -3
  136. package/.aether/utils/flag.sh +23 -12
  137. package/.aether/utils/hive.sh +2 -2
  138. package/.aether/utils/hooks/clash-pre-tool-use.js +99 -0
  139. package/.aether/utils/immune.sh +508 -0
  140. package/.aether/utils/learning.sh +2 -2
  141. package/.aether/utils/merge-driver-lockfile.sh +35 -0
  142. package/.aether/utils/midden.sh +712 -0
  143. package/.aether/utils/pheromone.sh +1376 -108
  144. package/.aether/utils/queen.sh +31 -21
  145. package/.aether/utils/session.sh +264 -0
  146. package/.aether/utils/spawn-tree.sh +7 -7
  147. package/.aether/utils/spawn.sh +2 -2
  148. package/.aether/utils/state-api.sh +216 -5
  149. package/.aether/utils/swarm.sh +1 -1
  150. package/.aether/utils/worktree.sh +189 -0
  151. package/.claude/commands/ant/colonize.md +2 -0
  152. package/.claude/commands/ant/council.md +205 -0
  153. package/.claude/commands/ant/init.md +53 -14
  154. package/.claude/commands/ant/insert-phase.md +4 -0
  155. package/.claude/commands/ant/plan.md +27 -1
  156. package/.claude/commands/ant/quick.md +100 -0
  157. package/.claude/commands/ant/resume-colony.md +3 -2
  158. package/.claude/commands/ant/resume.md +9 -0
  159. package/.claude/commands/ant/run.md +37 -1
  160. package/.claude/commands/ant/seal.md +9 -0
  161. package/.claude/commands/ant/status.md +45 -1
  162. package/.opencode/commands/ant/colonize.md +2 -0
  163. package/.opencode/commands/ant/council.md +143 -0
  164. package/.opencode/commands/ant/init.md +53 -13
  165. package/.opencode/commands/ant/insert-phase.md +4 -0
  166. package/.opencode/commands/ant/plan.md +26 -1
  167. package/.opencode/commands/ant/quick.md +91 -0
  168. package/.opencode/commands/ant/resume-colony.md +3 -2
  169. package/.opencode/commands/ant/resume.md +9 -0
  170. package/.opencode/commands/ant/run.md +37 -1
  171. package/.opencode/commands/ant/status.md +2 -0
  172. package/CHANGELOG.md +116 -0
  173. package/README.md +34 -8
  174. package/bin/cli.js +103 -61
  175. package/bin/lib/banner.js +14 -0
  176. package/bin/lib/init.js +8 -7
  177. package/bin/lib/interactive-setup.js +251 -0
  178. package/bin/npx-entry.js +21 -0
  179. package/bin/npx-install.js +9 -167
  180. package/bin/validate-package.sh +23 -0
  181. package/package.json +11 -3
  182. package/.aether/docs/plans/pheromone-display-plan.md +0 -257
  183. package/.aether/schemas/example-prompt-builder.xml +0 -234
  184. package/.aether/scripts/incident-test-add.sh +0 -47
  185. package/.aether/scripts/weekly-audit.sh +0 -79
@@ -44,6 +44,10 @@ CURRENT_LOCK=${CURRENT_LOCK:-""}
44
44
  [[ -f "$SCRIPT_DIR/utils/pheromone.sh" ]] && source "$SCRIPT_DIR/utils/pheromone.sh"
45
45
  [[ -f "$SCRIPT_DIR/utils/scan.sh" ]] && source "$SCRIPT_DIR/utils/scan.sh"
46
46
  [[ -f "$SCRIPT_DIR/utils/emoji-audit.sh" ]] && source "$SCRIPT_DIR/utils/emoji-audit.sh"
47
+ [[ -f "$SCRIPT_DIR/utils/immune.sh" ]] && source "$SCRIPT_DIR/utils/immune.sh"
48
+ [[ -f "$SCRIPT_DIR/utils/council.sh" ]] && source "$SCRIPT_DIR/utils/council.sh"
49
+ [[ -f "$SCRIPT_DIR/utils/clash-detect.sh" ]] && source "$SCRIPT_DIR/utils/clash-detect.sh"
50
+ [[ -f "$SCRIPT_DIR/utils/worktree.sh" ]] && source "$SCRIPT_DIR/utils/worktree.sh"
47
51
 
48
52
  # Fallback error constants if error-handler.sh wasn't sourced
49
53
  # This prevents "unbound variable" errors in older installations
@@ -106,7 +110,7 @@ if ! type json_err &>/dev/null; then
106
110
  local code="${1:-E_UNKNOWN}"
107
111
  local message="${2:-An unknown error occurred}"
108
112
  printf '[aether] Warning: error-handler.sh not loaded — using minimal fallback\n' >&2
109
- printf '{"ok":false,"error":{"code":"%s","message":"%s"}}\n' "$code" "$message" >&2
113
+ printf '%s\n' "$(jq -nc --arg c "$code" --arg m "$message" '{ok:false,error:{code:$c,message:$m}}')" >&2
110
114
  exit 1
111
115
  }
112
116
  fi
@@ -570,7 +574,7 @@ Git Commits: 0
570
574
 
571
575
  **Colony Memory Active** 🧠🐜
572
576
  EOF
573
- json_ok "{\"updated\":true,\"action\":\"init\",\"file\":\"$ctx_file\"}"
577
+ json_ok "$(jq -nc --arg file "$ctx_file" '{updated:true,action:"init",file:$file}')"
574
578
  ;;
575
579
 
576
580
  update-phase)
@@ -586,7 +590,7 @@ EOF
586
590
  sed -i.bak "s/| \*\*Phase Name\*\* | .*/| **Phase Name** | $new_phase_name |/" "$ctx_file" && rm -f "$ctx_file.bak"
587
591
  sed -i.bak "s/| \*\*Safe to Clear?\*\* | .*/| **Safe to Clear?** | $safe_clear — $safe_reason |/" "$ctx_file" && rm -f "$ctx_file.bak"
588
592
 
589
- json_ok "{\"updated\":true,\"action\":\"update-phase\",\"phase\":$new_phase}"
593
+ json_ok "$(jq -nc --argjson phase "$new_phase" '{updated:true,action:"update-phase",phase:$phase}')"
590
594
  ;;
591
595
 
592
596
  activity)
@@ -613,7 +617,7 @@ EOF
613
617
  ' "$ctx_file" > "$ctx_tmp"
614
618
 
615
619
  mv "$ctx_tmp" "$ctx_file"
616
- json_ok "{\"updated\":true,\"action\":\"activity\",\"command\":\"$cmd\"}"
620
+ json_ok "$(jq -nc --arg cmd "$cmd" '{updated:true,action:"activity",command:$cmd}')"
617
621
  ;;
618
622
 
619
623
  safe-to-clear)
@@ -625,7 +629,7 @@ EOF
625
629
  sed -i.bak "s/| \*\*Last Updated\*\* | .*/| **Last Updated** | $ctx_ts |/" "$ctx_file" && rm -f "$ctx_file.bak"
626
630
  sed -i.bak "s/| \*\*Safe to Clear?\*\* | .*/| **Safe to Clear?** | $safe — $reason |/" "$ctx_file" && rm -f "$ctx_file.bak"
627
631
 
628
- json_ok "{\"updated\":true,\"action\":\"safe-to-clear\",\"safe\":\"$safe\"}"
632
+ json_ok "$(jq -nc --arg safe "$safe" '{updated:true,action:"safe-to-clear",safe:$safe}')"
629
633
  ;;
630
634
 
631
635
  constraint)
@@ -651,7 +655,7 @@ EOF
651
655
  }" "$ctx_file" && rm -f "$ctx_file.bak"
652
656
  fi
653
657
 
654
- json_ok "{\"updated\":true,\"action\":\"constraint\",\"type\":\"$c_type\"}"
658
+ json_ok "$(jq -nc --arg type "$c_type" '{updated:true,action:"constraint",type:$type}')"
655
659
  ;;
656
660
 
657
661
  decision)
@@ -692,7 +696,7 @@ EOF
692
696
  --ttl "30d" 2>/dev/null \
693
697
  || _aether_log_error "Could not emit feedback signal for decision" # SUPPRESS:OK -- read-default: returns fallback on failure
694
698
 
695
- json_ok "{\"updated\":true,\"action\":\"decision\"}"
699
+ json_ok "$(jq -nc '{updated:true,action:"decision"}')"
696
700
  ;;
697
701
 
698
702
  build-start)
@@ -706,7 +710,7 @@ EOF
706
710
  sed -i.bak "s/## 📍 What's In Progress/## 📍 What's In Progress\n\n**Phase $phase_id Build IN PROGRESS**\n- Workers: $worker_count | Tasks: $tasks_count\n- Started: $ctx_ts/" "$ctx_file" && rm -f "$ctx_file.bak"
707
711
  sed -i.bak "s/| \*\*Safe to Clear?\*\* | .*/| **Safe to Clear?** | ⚠️ NO — Build in progress |/" "$ctx_file" && rm -f "$ctx_file.bak"
708
712
 
709
- json_ok "{\"updated\":true,\"action\":\"build-start\",\"workers\":$worker_count}"
713
+ json_ok "$(jq -nc --argjson workers "$worker_count" '{updated:true,action:"build-start",workers:$workers}')"
710
714
  ;;
711
715
 
712
716
  worker-spawn)
@@ -727,7 +731,7 @@ EOF
727
731
  { print }
728
732
  ' "$ctx_file" > "$ctx_tmp" && mv "$ctx_tmp" "$ctx_file"
729
733
 
730
- json_ok "{\"updated\":true,\"action\":\"worker-spawn\",\"ant\":\"$ant_name\"}"
734
+ json_ok "$(jq -nc --arg ant "$ant_name" '{updated:true,action:"worker-spawn",ant:$ant}')"
731
735
  ;;
732
736
 
733
737
  worker-complete)
@@ -738,7 +742,7 @@ EOF
738
742
 
739
743
  sed -i.bak "s/- .*$ant_name .*$/- $ant_name: $status (updated $ctx_ts)/" "$ctx_file" && rm -f "$ctx_file.bak"
740
744
 
741
- json_ok "{\"updated\":true,\"action\":\"worker-complete\",\"ant\":\"$ant_name\"}"
745
+ json_ok "$(jq -nc --arg ant "$ant_name" '{updated:true,action:"worker-complete",ant:$ant}')"
742
746
  ;;
743
747
 
744
748
  build-progress)
@@ -750,7 +754,7 @@ EOF
750
754
 
751
755
  sed -i.bak "s/Build IN PROGRESS/Build IN PROGRESS ($percentage% complete)/" "$ctx_file" && rm -f "$ctx_file.bak"
752
756
 
753
- json_ok "{\"updated\":true,\"action\":\"build-progress\",\"percent\":$percentage}"
757
+ json_ok "$(jq -nc --argjson percent "$percentage" '{updated:true,action:"build-progress",percent:$percent}')"
754
758
  ;;
755
759
 
756
760
  build-complete)
@@ -776,7 +780,7 @@ EOF
776
780
 
777
781
  sed -i.bak "s/| \*\*Safe to Clear?\*\* | .*/| **Safe to Clear?** | ✅ YES — Build $status |/" "$ctx_file" && rm -f "$ctx_file.bak"
778
782
 
779
- json_ok "{\"updated\":true,\"action\":\"build-complete\",\"status\":\"$status\"}"
783
+ json_ok "$(jq -nc --arg status "$status" '{updated:true,action:"build-complete",status:$status}')"
780
784
  ;;
781
785
 
782
786
  *)
@@ -953,7 +957,7 @@ EOF
953
957
  # Atomically replace the file
954
958
  mv "$temp_file" "$changelog_file"
955
959
 
956
- json_ok '{"appended":true,"date":"'"$date_str"'","phase":"'"$phase"'","plan":"'"$plan"'"}'
960
+ json_ok "$(jq -nc --arg date "$date_str" --arg phase "$phase" --arg plan "$plan" '{appended:true,date:$date,phase:$phase,plan:$plan}')"
957
961
  }
958
962
 
959
963
  # Collect plan data for changelog entry
@@ -1174,7 +1178,7 @@ case "$cmd" in
1174
1178
  cat <<'HELP_EOF'
1175
1179
  {
1176
1180
  "ok": true,
1177
- "commands": ["help","version","validate-state","validate-oracle-state","load-state","unload-state","error-add","error-pattern-check","error-summary","activity-log","activity-log-init","activity-log-read","learning-promote","learning-inject","learning-observe","learning-check-promotion","learning-promote-auto","memory-capture","queen-thresholds","context-capsule","rolling-summary","generate-ant-name","spawn-log","spawn-complete","spawn-can-spawn","spawn-get-depth","spawn-tree-load","spawn-tree-active","spawn-tree-depth","spawn-efficiency","validate-worker-response","update-progress","check-antipattern","error-flag-pattern","signature-scan","signature-match","flag-add","flag-check-blockers","flag-resolve","flag-acknowledge","flag-list","flag-auto-resolve","autofix-checkpoint","autofix-rollback","spawn-can-spawn-swarm","swarm-findings-init","swarm-findings-add","swarm-findings-read","swarm-solution-set","swarm-cleanup","swarm-activity-log","swarm-display-init","swarm-display-update","swarm-display-get","swarm-display-text","swarm-timing-start","swarm-timing-get","swarm-timing-eta","view-state-init","view-state-get","view-state-set","view-state-toggle","view-state-expand","view-state-collapse","grave-add","grave-check","phase-insert","generate-commit-message","version-check","registry-add","registry-list","bootstrap-system","chamber-create","chamber-verify","chamber-list","milestone-detect","queen-init","queen-read","queen-promote","incident-rule-add","survey-load","survey-verify","pheromone-export","pheromone-write","pheromone-count","pheromone-read","instinct-read","instinct-create","instinct-apply","pheromone-prime","colony-prime","pheromone-expire","eternal-init","eternal-store","pheromone-export-xml","pheromone-import-xml","pheromone-validate-xml","wisdom-export-xml","wisdom-import-xml","registry-export-xml","registry-import-xml","memory-metrics","midden-recent-failures","midden-review","midden-acknowledge","entropy-score","force-unlock","changelog-append","changelog-collect-plan-data","suggest-approve","suggest-quick-dismiss","data-clean","autopilot-init","autopilot-update","autopilot-status","autopilot-stop","autopilot-check-replan","hive-init","hive-store","hive-read","hive-abstract","hive-promote","init-research","charter-write","colony-name","emoji-audit"],
1181
+ "commands": ["help","version","validate-state","validate-oracle-state","load-state","unload-state","error-add","error-pattern-check","error-summary","activity-log","activity-log-init","activity-log-read","learning-promote","learning-inject","learning-observe","learning-check-promotion","learning-promote-auto","memory-capture","queen-thresholds","context-capsule","rolling-summary","generate-ant-name","spawn-log","spawn-complete","spawn-can-spawn","spawn-get-depth","spawn-tree-load","spawn-tree-active","spawn-tree-depth","spawn-efficiency","validate-worker-response","update-progress","check-antipattern","error-flag-pattern","signature-scan","signature-match","flag-add","flag-check-blockers","flag-resolve","flag-acknowledge","flag-list","flag-auto-resolve","autofix-checkpoint","autofix-rollback","spawn-can-spawn-swarm","swarm-findings-init","swarm-findings-add","swarm-findings-read","swarm-solution-set","swarm-cleanup","swarm-activity-log","swarm-display-init","swarm-display-update","swarm-display-get","swarm-display-text","swarm-timing-start","swarm-timing-get","swarm-timing-eta","view-state-init","view-state-get","view-state-set","view-state-toggle","view-state-expand","view-state-collapse","grave-add","grave-check","phase-insert","generate-commit-message","version-check","registry-add","registry-list","bootstrap-system","chamber-create","chamber-verify","chamber-list","milestone-detect","queen-init","queen-read","queen-promote","incident-rule-add","survey-load","survey-verify","pheromone-export","pheromone-write","pheromone-count","pheromone-read","instinct-read","instinct-create","instinct-apply","pheromone-prime","colony-prime","pheromone-expire","eternal-init","eternal-store","pheromone-export-xml","pheromone-import-xml","pheromone-validate-xml","wisdom-export-xml","wisdom-import-xml","registry-export-xml","registry-import-xml","memory-metrics","midden-recent-failures","midden-review","midden-acknowledge","midden-search","midden-tag","entropy-score","force-unlock","changelog-append","changelog-collect-plan-data","suggest-approve","suggest-quick-dismiss","data-clean","autopilot-init","autopilot-update","autopilot-status","autopilot-stop","autopilot-check-replan","autopilot-set-headless","autopilot-headless-check","pending-decision-add","pending-decision-list","pending-decision-resolve","hive-init","hive-store","hive-read","hive-abstract","hive-promote","init-research","charter-write","colony-name","colony-vital-signs","emoji-audit","trophallaxis-diagnose","trophallaxis-retry","scar-add","scar-list","scar-check","immune-auto-scar","council-deliberate","council-advocate","council-challenger","council-sage","council-history","council-budget-check"],
1178
1182
  "sections": {
1179
1183
  "Core": [
1180
1184
  {"name": "help", "description": "List all available commands with sections"},
@@ -1250,6 +1254,7 @@ case "$cmd" in
1250
1254
  {"name": "pheromone-count", "description": "Count active pheromone signals"},
1251
1255
  {"name": "pheromone-prime", "description": "Prime the pheromone system"},
1252
1256
  {"name": "colony-prime", "description": "Assemble unified worker priming payload"},
1257
+ {"name": "pr-context", "description": "Generate CI-ready colony context as structured JSON"},
1253
1258
  {"name": "pheromone-expire", "description": "Expire old pheromone signals"},
1254
1259
  {"name": "eternal-store", "description": "Store high-value signals in eternal memory"},
1255
1260
  {"name": "pheromone-export", "description": "Export pheromone data to JSON"},
@@ -1271,7 +1276,14 @@ case "$cmd" in
1271
1276
  {"name": "midden-recent-failures", "description": "Read recent failure signals from midden"},
1272
1277
  {"name": "midden-review", "description": "Review unacknowledged midden entries grouped by category"},
1273
1278
  {"name": "midden-acknowledge", "description": "Acknowledge midden entries by id or category"},
1279
+ {"name": "midden-search", "description": "Search midden entries by keyword with optional category/source filters"},
1280
+ {"name": "midden-tag", "description": "Add or remove a tag from a midden entry"},
1281
+ {"name": "midden-collect", "description": "Collect failure records from a merged branch worktree into main midden"},
1282
+ {"name": "midden-handle-revert", "description": "Tag entries from a reverted merge commit (preserves audit trail)"},
1283
+ {"name": "midden-cross-pr-analysis", "description": "Detect failure patterns across multiple merged branches with auto-REDIRECT"},
1284
+ {"name": "midden-prune", "description": "Prune stale merge records and acknowledge old reverted entries"},
1274
1285
  {"name": "entropy-score", "description": "Compute colony entropy score (0-100)"},
1286
+ {"name": "colony-vital-signs", "description": "Compute colony health metrics from existing data (velocity, errors, signals, memory, overall score)"},
1275
1287
  {"name": "force-unlock", "description": "Emergency unlock — remove stale lock files"}
1276
1288
  ],
1277
1289
  "Changelog": [
@@ -1290,7 +1302,12 @@ case "$cmd" in
1290
1302
  {"name": "autopilot-update", "description": "Update autopilot state after phase action"},
1291
1303
  {"name": "autopilot-status", "description": "Return current autopilot state"},
1292
1304
  {"name": "autopilot-stop", "description": "Stop or complete an autopilot run with reason"},
1293
- {"name": "autopilot-check-replan", "description": "Check if replan trigger should fire based on completed phases"}
1305
+ {"name": "autopilot-check-replan", "description": "Check if replan trigger should fire based on completed phases"},
1306
+ {"name": "autopilot-set-headless", "description": "Set headless mode flag in run-state.json (true or false)"},
1307
+ {"name": "autopilot-headless-check", "description": "Check if autopilot is running in headless mode"},
1308
+ {"name": "pending-decision-add", "description": "Queue a deferred decision for later review"},
1309
+ {"name": "pending-decision-list", "description": "List pending decisions, optionally filtered by type or status"},
1310
+ {"name": "pending-decision-resolve", "description": "Mark a pending decision as resolved with a resolution note"}
1294
1311
  ],
1295
1312
  "Hive Intelligence": [
1296
1313
  {"name": "hive-init", "description": "Initialize ~/.aether/hive/ directory and wisdom.json schema"},
@@ -1318,6 +1335,28 @@ case "$cmd" in
1318
1335
  "Emoji Audit": [
1319
1336
  {"name": "emoji-audit", "description": "Audit emoji usage in command files against the canonical colony-visuals reference map"}
1320
1337
  ],
1338
+ "Immune System": [
1339
+ {"name": "trophallaxis-diagnose", "description": "Diagnose a task failure by searching midden for related failures and suggesting an approach"},
1340
+ {"name": "trophallaxis-retry", "description": "Record a retry attempt for a task with diagnosis context injected"},
1341
+ {"name": "scar-add", "description": "Record a persistent failure pattern as a scar to warn future workers"},
1342
+ {"name": "scar-list", "description": "List scars, optionally filtered by active status or severity"},
1343
+ {"name": "scar-check", "description": "Check if a task description matches any active scar patterns"},
1344
+ {"name": "immune-auto-scar", "description": "Auto-create a scar if a task has been retried 3 or more times"}
1345
+ ],
1346
+ "Council": [
1347
+ {"name": "council-deliberate", "description": "Start a new deliberation with Advocate/Challenger/Sage model and spawn budget guard"},
1348
+ {"name": "council-advocate", "description": "Record an advocate argument (FOR) for a deliberation"},
1349
+ {"name": "council-challenger", "description": "Record a challenger argument (AGAINST) for a deliberation"},
1350
+ {"name": "council-sage", "description": "Record sage synthesis and recommendation, marks deliberation complete"},
1351
+ {"name": "council-history", "description": "List past deliberations with their outcomes"},
1352
+ {"name": "council-budget-check", "description": "Check if current spawn budget allows N more spawns"}
1353
+ ],
1354
+ "Clash Detection": [
1355
+ {"name": "clash-check", "description": "Check if a file has conflicts across active worktrees"},
1356
+ {"name": "clash-setup", "description": "Install or uninstall the PreToolUse clash detection hook"},
1357
+ {"name": "worktree-create", "description": "Create a git worktree with colony context copy"},
1358
+ {"name": "worktree-cleanup", "description": "Remove a git worktree and clean up tracking"}
1359
+ ],
1321
1360
  "Deprecated": [
1322
1361
  {"name": "checkpoint-check", "description": "Check dirty files against allowlist [DEPRECATED]"},
1323
1362
  {"name": "error-pattern-check", "description": "Check for error anti-patterns [DEPRECATED]"},
@@ -1348,7 +1387,7 @@ HELP_EOF
1348
1387
  _pkg_json="$SCRIPT_DIR/../package.json"
1349
1388
  if [[ -f "$_pkg_json" ]] && command -v jq >/dev/null 2>&1; then # SUPPRESS:OK -- cleanup: output suppression for clean operation
1350
1389
  _ver=$(jq -r '.version // "unknown"' "$_pkg_json" 2>/dev/null) # SUPPRESS:OK -- read-default: file may not exist yet
1351
- json_ok "\"$_ver\""
1390
+ json_ok "$(jq -nc --arg v "$_ver" '$v')"
1352
1391
  else
1353
1392
  json_ok '"1.1.5"'
1354
1393
  fi
@@ -1381,6 +1420,7 @@ HELP_EOF
1381
1420
  ;;
1382
1421
  constraints)
1383
1422
  [[ -f "$COLONY_DATA_DIR/constraints.json" ]] || json_err "$E_FILE_NOT_FOUND" "constraints.json not found" '{"file":"constraints.json"}'
1423
+ [[ -s "$COLONY_DATA_DIR/constraints.json" ]] || { json_ok '{"file":"constraints.json","checks":["pass","pass"],"pass":true}'; exit 0; }
1384
1424
  json_ok "$(jq '
1385
1425
  def arr(f): if has(f) and (.[f]|type) == "array" then "pass" else "fail: \(f) not array" end;
1386
1426
  {file:"constraints.json", checks:[
@@ -1428,7 +1468,7 @@ HELP_EOF
1428
1468
  json_err "$E_FEATURE_UNAVAILABLE" "create_backup function not available -- atomic-write.sh may not be sourced"
1429
1469
  fi
1430
1470
 
1431
- json_ok "{\"checkpointed\":true,\"reason\":\"$sc_reason\"}"
1471
+ json_ok "$(jq -nc --arg reason "$sc_reason" '{checkpointed:true,reason:$reason}')"
1432
1472
  ;;
1433
1473
  state-write)
1434
1474
  # MIGRATE: direct COLONY_STATE.json access -- use _state_write instead
@@ -1670,7 +1710,7 @@ HELP_EOF
1670
1710
  if (.errors.records|length) > 50 then .errors.records = .errors.records[-50:] else . end
1671
1711
  ' >/dev/null
1672
1712
 
1673
- json_ok "\"$ea_id\""
1713
+ json_ok "$(jq -nc --arg id "$ea_id" '$id')"
1674
1714
  ;;
1675
1715
  error-pattern-check)
1676
1716
  _deprecation_warning "error-pattern-check"
@@ -1707,6 +1747,12 @@ HELP_EOF
1707
1747
  exit 0
1708
1748
  fi
1709
1749
 
1750
+ # Skip writes during test runs to prevent test noise in activity.log
1751
+ if [[ "${AETHER_TESTING:-}" == "1" ]]; then
1752
+ json_ok '"logged"'
1753
+ exit 0
1754
+ fi
1755
+
1710
1756
  log_file="$COLONY_DATA_DIR/activity.log"
1711
1757
  mkdir -p "$COLONY_DATA_DIR"
1712
1758
  ts=$(date -u +"%H:%M:%S")
@@ -1857,7 +1903,7 @@ EOF
1857
1903
  json_err "$E_UNKNOWN" "Failed to write error patterns file"
1858
1904
  }
1859
1905
  count=$(echo "$updated" | jq --arg name "$pattern_name" '.patterns[] | select(.name == $name) | .occurrences')
1860
- json_ok "{\"updated\":true,\"pattern\":\"$pattern_name\",\"occurrences\":$count}"
1906
+ json_ok "$(jq -nc --arg p "$pattern_name" --argjson c "$count" '{updated:true,pattern:$p,occurrences:$c}')"
1861
1907
  else
1862
1908
  # Add new pattern
1863
1909
  updated=$(jq --arg name "$pattern_name" --arg desc "$description" --arg sev "$severity" --arg ts "$ts" --arg proj "$project_name" '
@@ -1876,7 +1922,7 @@ EOF
1876
1922
  _aether_log_error "Could not save new error pattern"
1877
1923
  json_err "$E_UNKNOWN" "Failed to write error patterns file"
1878
1924
  }
1879
- json_ok "{\"created\":true,\"pattern\":\"$pattern_name\"}"
1925
+ json_ok "$(jq -nc --arg p "$pattern_name" '{created:true,pattern:$p}')"
1880
1926
  fi
1881
1927
  ;;
1882
1928
  error-patterns-check)
@@ -2159,7 +2205,7 @@ EOF
2159
2205
  prefix="${prefixes[$idx]}"
2160
2206
  num=$((RANDOM % 99 + 1))
2161
2207
  name="${prefix}-${num}"
2162
- json_ok "\"$name\""
2208
+ json_ok "$(jq -nc --arg n "$name" '$n')"
2163
2209
  ;;
2164
2210
 
2165
2211
  validate-worker-response)
@@ -2260,7 +2306,7 @@ EOF
2260
2306
  json_err "$E_VALIDATION_FAILED" "Worker response failed schema validation" "{\"caste\":\"$vw_caste\"}"
2261
2307
  fi
2262
2308
 
2263
- json_ok "{\"valid\":true,\"caste\":\"$vw_caste\"}"
2309
+ json_ok "$(jq -nc --arg c "$vw_caste" '{valid:true,caste:$c}')"
2264
2310
  ;;
2265
2311
 
2266
2312
  # ============================================
@@ -2315,7 +2361,7 @@ EOF
2315
2361
  if (.graveyards | length) > 30 then .graveyards = .graveyards[-30:] else . end
2316
2362
  ' >/dev/null
2317
2363
 
2318
- json_ok "\"$ga_id\""
2364
+ json_ok "$(jq -nc --arg id "$ga_id" '$id')"
2319
2365
  ;;
2320
2366
 
2321
2367
  grave-check)
@@ -2414,7 +2460,7 @@ Files: ${files_changed} files changed"
2414
2460
  fi
2415
2461
 
2416
2462
  # Return enhanced JSON with additional metadata
2417
- json_ok "{\"message\":\"$message\",\"body\":\"$body\",\"files_changed\":$files_changed,\"subsystem\":\"$subsystem\",\"scope\":\"${phase_id}.${plan_num}\"}"
2463
+ json_ok "$(jq -nc --arg msg "$message" --arg body "$body" --arg sub "$subsystem" --arg scope "${phase_id}.${plan_num}" '{message:$msg,body:$body,files_changed:'"$files_changed"',subsystem:$sub,scope:$scope}')"
2418
2464
  exit 0
2419
2465
  ;;
2420
2466
  seal)
@@ -2436,7 +2482,7 @@ Files: ${files_changed} files changed"
2436
2482
  message="${message:0:69}..."
2437
2483
  fi
2438
2484
 
2439
- json_ok "{\"message\":\"$message\",\"body\":\"$body\",\"files_changed\":$files_changed}"
2485
+ json_ok "$(jq -nc --arg msg "$message" --arg body "$body" '{message:$msg,body:$body,files_changed:'"$files_changed"'}')"
2440
2486
  exit 0
2441
2487
  ;;
2442
2488
  *)
@@ -2450,7 +2496,7 @@ Files: ${files_changed} files changed"
2450
2496
  message="${message:0:69}..."
2451
2497
  fi
2452
2498
 
2453
- json_ok "{\"message\":\"$message\",\"body\":\"$body\",\"files_changed\":$files_changed}"
2499
+ json_ok "$(jq -nc --arg msg "$message" --arg body "$body" '{message:$msg,body:$body,files_changed:'"$files_changed"'}')"
2454
2500
  ;;
2455
2501
 
2456
2502
  # ============================================
@@ -2502,7 +2548,7 @@ Files: ${files_changed} files changed"
2502
2548
  json_ok '""'
2503
2549
  else
2504
2550
  printf -v msg 'Update available: %s to %s (run /ant:update)' "$local_ver" "$hub_ver"
2505
- json_ok "$msg"
2551
+ json_ok "$(jq -nc --arg m "$msg" '$m')"
2506
2552
  fi
2507
2553
  ;;
2508
2554
 
@@ -2628,7 +2674,7 @@ Files: ${files_changed} files changed"
2628
2674
  json_err "$E_UNKNOWN" "Failed to write registry file"
2629
2675
  }
2630
2676
  release_lock "$registry_file" 2>/dev/null || true # SUPPRESS:OK -- cleanup: lock may not be held
2631
- json_ok "{\"registered\":true,\"path\":\"$repo_path\",\"version\":\"$repo_version\"}"
2677
+ json_ok "$(jq -nc --arg p "$repo_path" --arg v "$repo_version" '{registered:true,path:$p,version:$v}')"
2632
2678
  ;;
2633
2679
 
2634
2680
  registry-list)
@@ -2773,7 +2819,8 @@ Files: ${files_changed} files changed"
2773
2819
  if [[ $? -eq 0 ]]; then
2774
2820
  # Output success with handoff info if detected
2775
2821
  if [[ "$HANDOFF_DETECTED" == "true" ]]; then
2776
- json_ok "{\"loaded\":true,\"handoff_detected\":true,\"handoff_summary\":\"$(get_handoff_summary)\"}"
2822
+ _handoff_summary=$(get_handoff_summary)
2823
+ json_ok "$(jq -nc --arg hs "$_handoff_summary" '{loaded:true,handoff_detected:true,handoff_summary:$hs}')"
2777
2824
  else
2778
2825
  json_ok '{"loaded":true}'
2779
2826
  fi
@@ -3110,10 +3157,10 @@ Files: ${files_changed} files changed"
3110
3157
  json_ok "$(cat "$view_state_file")"
3111
3158
  elif [[ -z "$key" ]]; then
3112
3159
  # Return specific view
3113
- json_ok "$(jq ".${view_name} // {}" "$view_state_file")"
3160
+ json_ok "$(jq --arg v "$view_name" '.[$v] // {}' "$view_state_file")"
3114
3161
  else
3115
3162
  # Return specific key from view
3116
- json_ok "$(jq ".${view_name}.${key} // null" "$view_state_file")"
3163
+ json_ok "$(jq --arg v "$view_name" --arg k "$key" '.[$v][$k] // null' "$view_state_file")"
3117
3164
  fi
3118
3165
  ;;
3119
3166
 
@@ -3145,7 +3192,7 @@ Files: ${files_changed} files changed"
3145
3192
  fi
3146
3193
 
3147
3194
  atomic_write "$view_state_file" "$updated"
3148
- json_ok "$(echo "$updated" | jq ".${view_name}")"
3195
+ json_ok "$(echo "$updated" | jq --arg v "$view_name" '.[$v]')"
3149
3196
  ;;
3150
3197
 
3151
3198
  view-state-toggle)
@@ -3183,7 +3230,7 @@ Files: ${files_changed} files changed"
3183
3230
  fi
3184
3231
 
3185
3232
  atomic_write "$view_state_file" "$updated"
3186
- json_ok "{\"item\":\"$item\",\"state\":\"$new_state\",\"view\":\"$view_name\"}"
3233
+ json_ok "$(jq -nc --arg i "$item" --arg s "$new_state" --arg v "$view_name" '{item:$i,state:$s,view:$v}')"
3187
3234
  ;;
3188
3235
 
3189
3236
  view-state-expand)
@@ -3205,7 +3252,7 @@ Files: ${files_changed} files changed"
3205
3252
  ' "$view_state_file") || json_err "$E_JSON_INVALID" "Failed to update view state"
3206
3253
 
3207
3254
  atomic_write "$view_state_file" "$updated"
3208
- json_ok "{\"item\":\"$item\",\"state\":\"expanded\",\"view\":\"$view_name\"}"
3255
+ json_ok "$(jq -nc --arg i "$item" --arg v "$view_name" '{item:$i,state:"expanded",view:$v}')"
3209
3256
  ;;
3210
3257
 
3211
3258
  view-state-collapse)
@@ -3227,7 +3274,7 @@ Files: ${files_changed} files changed"
3227
3274
  ' "$view_state_file") || json_err "$E_JSON_INVALID" "Failed to update view state"
3228
3275
 
3229
3276
  atomic_write "$view_state_file" "$updated"
3230
- json_ok "{\"item\":\"$item\",\"state\":\"collapsed\",\"view\":\"$view_name\"}"
3277
+ json_ok "$(jq -nc --arg i "$item" --arg v "$view_name" '{item:$i,state:"collapsed",view:$v}')"
3231
3278
  ;;
3232
3279
 
3233
3280
  queen-init) _queen_init "$@" ;;
@@ -3294,7 +3341,7 @@ Files: ${files_changed} files changed"
3294
3341
  bar="[$bar]"
3295
3342
  fi
3296
3343
 
3297
- json_ok "{\"bar\":\"$bar\",\"count\":$obs_count,\"threshold\":$threshold}"
3344
+ json_ok "$(jq -nc --arg b "$bar" --argjson c "$obs_count" --argjson t "$threshold" '{bar:$b,count:$c,threshold:$t}')"
3298
3345
  ;;
3299
3346
 
3300
3347
  parse-selection)
@@ -3501,7 +3548,7 @@ Files: ${files_changed} files changed"
3501
3548
  ;;
3502
3549
  esac
3503
3550
 
3504
- json_ok "{\"incident_id\":\"$ir_incident_id\",\"rule_type\":\"$ir_rule_type\",\"added\":true,\"timestamp\":\"$ir_ts\"}"
3551
+ json_ok "$(jq -nc --arg id "$ir_incident_id" --arg rt "$ir_rule_type" --arg ts "$ir_ts" '{incident_id:$id,rule_type:$rt,added:true,timestamp:$ts}')"
3505
3552
  ;;
3506
3553
 
3507
3554
  queen-promote) _queen_promote "$@" ;;
@@ -3630,7 +3677,7 @@ Files: ${files_changed} files changed"
3630
3677
  bash "$0" rolling-summary add "$mc_event" "$mc_content" "$mc_source" >/dev/null 2>&1 \
3631
3678
  || _aether_log_error "Could not update rolling summary"
3632
3679
 
3633
- json_ok "{\"event_type\":\"$mc_event\",\"wisdom_type\":\"$mc_wisdom_type\",\"observation_count\":$obs_count,\"threshold\":$obs_threshold,\"threshold_met\":$obs_threshold_met,\"pheromone_created\":$pheromone_created,\"signal_id\":\"$pheromone_signal_id\",\"auto_promoted\":$auto_promoted,\"promotion_reason\":\"$auto_reason\"}"
3680
+ json_ok "$(jq -nc --arg et "$mc_event" --arg wt "$mc_wisdom_type" --argjson oc "$obs_count" --argjson th "$obs_threshold" --argjson tm "$obs_threshold_met" --argjson pc "$pheromone_created" --arg sid "$pheromone_signal_id" --argjson ap "$auto_promoted" --arg pr "$auto_reason" '{event_type:$et,wisdom_type:$wt,observation_count:$oc,threshold:$th,threshold_met:$tm,pheromone_created:$pc,signal_id:$sid,auto_promoted:$ap,promotion_reason:$pr}')"
3634
3681
  ;;
3635
3682
 
3636
3683
  learning-display-proposals) _learning_display_proposals "$@" ;;
@@ -3675,7 +3722,7 @@ Files: ${files_changed} files changed"
3675
3722
  ;;
3676
3723
  esac
3677
3724
 
3678
- json_ok "{\"ok\":true,\"docs\":\"$docs\",\"dir\":\"$survey_dir\"}"
3725
+ json_ok "$(jq -nc --arg d "$docs" --arg dir "$survey_dir" '{ok:true,docs:$d,dir:$dir}')"
3679
3726
  ;;
3680
3727
 
3681
3728
  survey-verify)
@@ -3697,7 +3744,7 @@ Files: ${files_changed} files changed"
3697
3744
  json_err "$E_FILE_NOT_FOUND" "Missing survey documents" "{\"missing\":\"$missing\"}"
3698
3745
  fi
3699
3746
 
3700
- json_ok "{\"ok\":true,\"counts\":\"$counts\"}"
3747
+ json_ok "$(jq -nc --arg c "$counts" '{ok:true,counts:$c}')"
3701
3748
  ;;
3702
3749
 
3703
3750
  checkpoint-check)
@@ -3869,6 +3916,7 @@ Files: ${files_changed} files changed"
3869
3916
 
3870
3917
  pheromone-prime) _pheromone_prime "$@" ;;
3871
3918
  colony-prime) _colony_prime "$@" ;;
3919
+ pr-context) _pr_context "$@" ;;
3872
3920
  pheromone-expire) _pheromone_expire "$@" ;;
3873
3921
  eternal-init) _eternal_init "$@" ;;
3874
3922
  eternal-store) _eternal_store "$@" ;;
@@ -4101,7 +4149,7 @@ Files: ${files_changed} files changed"
4101
4149
  json_err "$E_UNKNOWN" "Failed to finalize rolling summary file"
4102
4150
  }
4103
4151
 
4104
- json_ok "{\"added\":true,\"event\":\"$rs_clean_event\",\"source\":\"$rs_clean_source\"}"
4152
+ json_ok "$(jq -nc --arg e "$rs_clean_event" --arg s "$rs_clean_source" '{added:true,event:$e,source:$s}')"
4105
4153
  ;;
4106
4154
 
4107
4155
  read)
@@ -4330,7 +4378,7 @@ Files: ${files_changed} files changed"
4330
4378
 
4331
4379
  cc_words=$(printf '%s' "$cc_section" | wc -w | tr -d ' ')
4332
4380
  cc_prompt_json=$(printf '%s' "$cc_section" | jq -Rs '.' 2>/dev/null || echo '""') # SUPPRESS:OK -- read-default: returns fallback if missing
4333
- json_ok "{\"exists\":true,\"state\":\"$cc_state\",\"next_action\":\"$cc_next_action\",\"word_count\":$cc_words,\"prompt_section\":$cc_prompt_json}"
4381
+ json_ok "$(jq -nc --arg st "$cc_state" --arg na "$cc_next_action" --argjson wc "$cc_words" --argjson ps "$cc_prompt_json" '{exists:true,state:$st,next_action:$na,word_count:$wc,prompt_section:$ps}')"
4334
4382
  ;;
4335
4383
 
4336
4384
  session-init) _session_init "$@" ;;
@@ -4341,6 +4389,13 @@ Files: ${files_changed} files changed"
4341
4389
  session-mark-resumed) _session_mark_resumed "$@" ;;
4342
4390
  session-summary) _session_summary "$@" ;;
4343
4391
 
4392
+ pending-decision-add) _pending_decision_add "$@" ;;
4393
+ pending-decision-list) _pending_decision_list "$@" ;;
4394
+ pending-decision-resolve) _pending_decision_resolve "$@" ;;
4395
+
4396
+ autopilot-headless-check) _autopilot_headless_check "$@" ;;
4397
+ autopilot-set-headless) _autopilot_set_headless "$@" ;;
4398
+
4344
4399
  generate-progress-bar)
4345
4400
  generate-progress-bar "$@"
4346
4401
  ;;
@@ -4717,6 +4772,40 @@ EOF
4717
4772
 
4718
4773
  midden-acknowledge) _midden_acknowledge "$@" ;;
4719
4774
 
4775
+ midden-search) _midden_search "$@" ;;
4776
+
4777
+ midden-tag) _midden_tag "$@" ;;
4778
+
4779
+ midden-collect) _midden_collect "$@" ;;
4780
+ midden-handle-revert) _midden_handle_revert "$@" ;;
4781
+ midden-cross-pr-analysis) _midden_cross_pr_analysis "$@" ;;
4782
+ midden-prune) _midden_prune "$@" ;;
4783
+
4784
+ trophallaxis-diagnose) _trophallaxis_diagnose "$@" ;;
4785
+
4786
+ trophallaxis-retry) _trophallaxis_retry "$@" ;;
4787
+
4788
+ scar-add) _scar_add "$@" ;;
4789
+
4790
+ scar-list) _scar_list "$@" ;;
4791
+
4792
+ scar-check) _scar_check "$@" ;;
4793
+
4794
+ immune-auto-scar) _immune_auto_scar "$@" ;;
4795
+
4796
+ # ── Council Deliberation ────────────────────────────────────────────────────
4797
+ council-deliberate) _council_deliberate "$@" ;;
4798
+
4799
+ council-advocate) _council_advocate "$@" ;;
4800
+
4801
+ council-challenger) _council_challenger "$@" ;;
4802
+
4803
+ council-sage) _council_sage "$@" ;;
4804
+
4805
+ council-history) _council_history "$@" ;;
4806
+
4807
+ council-budget-check) _council_budget_check "$@" ;;
4808
+
4720
4809
  resume-dashboard)
4721
4810
  # Generate dashboard data for /ant:resume command
4722
4811
  # Usage: resume-dashboard
@@ -4798,6 +4887,14 @@ EOF
4798
4887
  exit 0
4799
4888
  ;;
4800
4889
 
4890
+ colony-vital-signs)
4891
+ # Compute colony health metrics from existing data files
4892
+ # Usage: colony-vital-signs
4893
+ # Returns: JSON with build_velocity, error_rate, signal_health, memory_pressure,
4894
+ # colony_age_hours, and overall_health (0-100)
4895
+ _colony_vital_signs
4896
+ ;;
4897
+
4801
4898
  data-safety-stats)
4802
4899
  # Read data safety statistics from safety-stats.json
4803
4900
  # Usage: data-safety-stats
@@ -4820,6 +4917,8 @@ EOF
4820
4917
  exit 0
4821
4918
  ;;
4822
4919
 
4920
+ # colony-vital-signs handled above (dispatches to _colony_vital_signs in state-api.sh)
4921
+
4823
4922
  suggest-analyze) _suggest_analyze "$@" ;;
4824
4923
  suggest-record) _suggest_record "$@" ;;
4825
4924
  suggest-check) _suggest_check "$@" ;;
@@ -5348,6 +5447,22 @@ DRYRUN_EOF
5348
5447
  _emoji_audit_main "${1:-$(pwd)}"
5349
5448
  ;;
5350
5449
 
5450
+ # ── Clash Detection ─────────────────────────────────────────────────────────
5451
+ clash-detect|clash-check)
5452
+ _clash_detect "$@"
5453
+ ;;
5454
+ clash-setup)
5455
+ _clash_setup "$@"
5456
+ ;;
5457
+
5458
+ # ── Worktree Management ─────────────────────────────────────────────────────
5459
+ worktree-create)
5460
+ _worktree_create "$@"
5461
+ ;;
5462
+ worktree-cleanup)
5463
+ _worktree_cleanup "$@"
5464
+ ;;
5465
+
5351
5466
  *)
5352
5467
  json_err "$E_VALIDATION_FAILED" "Unknown command: $cmd"
5353
5468
  ;;