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
@@ -0,0 +1,203 @@
1
+ <!-- Generated from .aether/commands/pause-colony.yaml - DO NOT EDIT DIRECTLY -->
2
+ ---
3
+ name: ant:pause-colony
4
+ description: "๐Ÿ’พ๐Ÿœโธ๏ธ๐Ÿœ๐Ÿ’พ Pause colony work and create handoff document for resuming later"
5
+ ---
6
+
7
+ ### Step -1: Normalize Arguments
8
+
9
+ Run: `normalized_args=$(bash .aether/aether-utils.sh normalize-args "$@")`
10
+
11
+ This ensures arguments work correctly in both Claude Code and OpenCode. Use `$normalized_args` throughout this command.
12
+
13
+ You are the **Queen Ant Colony**. Save current state for session handoff.
14
+
15
+ ## Instructions
16
+
17
+ Parse `$normalized_args`:
18
+ - If contains `--no-visual`: set `visual_mode = false` (visual is ON by default)
19
+ - Otherwise: set `visual_mode = true`
20
+
21
+ ### Step 1: Read State
22
+
23
+ Use the Read tool to read `.aether/data/COLONY_STATE.json`.
24
+
25
+ If `goal` is null, output `No colony initialized. Nothing to pause.` and stop.
26
+
27
+ ### Step 2: Compute Active Signals
28
+
29
+ Run using the Bash tool:
30
+ ```bash
31
+ bash .aether/aether-utils.sh pheromone-read
32
+ ```
33
+
34
+ Use `.result.signals` as the active signal list (already decay-filtered by runtime logic).
35
+ If empty, treat as "no active pheromones."
36
+
37
+ ### Step 3: Build Handoff Summary
38
+
39
+ Gather context for the handoff from `COLONY_STATE.json`:
40
+ - `goal` from top level
41
+ - `state` and `current_phase` from top level
42
+ - `workers` object
43
+ - Active signals from `pheromone-read` output (with current decayed strengths from Step 2)
44
+ - Phase progress from `plan.phases` (how many complete, current phase tasks)
45
+ - What was in progress or pending
46
+
47
+ ### Step 4: Write Handoff
48
+
49
+ Use the Write tool to update `.aether/HANDOFF.md` with a session handoff section at the top. The format:
50
+
51
+ ```markdown
52
+ # Colony Session Paused
53
+
54
+ ## Quick Resume
55
+ Run `/ant:resume-colony` in a new session.
56
+
57
+ ## State at Pause
58
+ - Goal: "<goal>"
59
+ - State: <state>
60
+ - Current Phase: <phase_number> โ€” <phase_name>
61
+ - Session: <session_id>
62
+ - Paused: <ISO-8601 timestamp>
63
+
64
+ ## Active Pheromones
65
+ - <TYPE> (strength <current>): "<content>"
66
+ (list each non-expired signal)
67
+
68
+ ## Phase Progress
69
+ (for each phase, show status)
70
+ - Phase <id>: <name> [<status>]
71
+
72
+ ## Current Phase Tasks
73
+ (list tasks in the current phase with their statuses)
74
+ - [<icon>] <task_id>: <description>
75
+
76
+ ## What Was Happening
77
+ <brief description of what the colony was doing>
78
+
79
+ ## Next Steps on Resume
80
+ <what should happen next>
81
+ ```
82
+
83
+ ### Step 4.5: Set Paused Flag in State
84
+
85
+ Use Read tool to get current COLONY_STATE.json.
86
+
87
+ Use Write tool to update COLONY_STATE.json with paused flag:
88
+ - Add field: `"paused": true`
89
+ - Add field: `"paused_at": "<ISO-8601 timestamp>"`
90
+ - Update last_updated timestamp
91
+
92
+ This flag indicates the colony is in a paused state and will be cleared on resume.
93
+
94
+ ### Step 4.6: Commit Suggestion (Optional)
95
+
96
+ **This step is non-blocking. Skipping does not affect the pause or any subsequent steps. Failure to commit has zero consequences.**
97
+
98
+ Before displaying the pause confirmation, check if the user has uncommitted work worth preserving.
99
+
100
+ 1. **Check for uncommitted changes:**
101
+ ```bash
102
+ git status --porcelain 2>/dev/null
103
+ ```
104
+ If the output is empty (nothing to commit) or the command fails (not a git repo), skip this step silently and continue to Step 5.
105
+
106
+ 2. **Check for double-prompting:**
107
+ Read `last_commit_suggestion_phase` from COLONY_STATE.json (already loaded in Step 1).
108
+ If `last_commit_suggestion_phase` equals the current phase, skip this step silently โ€” the user was already prompted at POST-ADVANCE. Continue to Step 5.
109
+
110
+ 3. **Generate the commit message:**
111
+ ```bash
112
+ bash .aether/aether-utils.sh generate-commit-message "pause" {current_phase} "{phase_name}"
113
+ ```
114
+ Parse the returned JSON to extract `message` and `files_changed`.
115
+
116
+ 4. **Check files changed:**
117
+ ```bash
118
+ git diff --stat HEAD 2>/dev/null | tail -5
119
+ ```
120
+
121
+ 5. **Display the suggestion:**
122
+ ```
123
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
124
+ Commit Suggestion
125
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
126
+
127
+ Message: {generated_message}
128
+ Files: {files_changed} files changed
129
+ Preview: {first 5 lines of git diff --stat}
130
+
131
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
132
+ ```
133
+
134
+ 6. **Use AskUserQuestion:**
135
+ ```
136
+ Commit your work before pausing?
137
+
138
+ 1. Yes, commit with this message
139
+ 2. Yes, but let me write the message
140
+ 3. No, I'll commit later
141
+ ```
142
+
143
+ 7. **If option 1 ("Yes, commit with this message"):**
144
+ ```bash
145
+ git add -A && git commit -m "{generated_message}"
146
+ ```
147
+ Display: `Committed: {generated_message} ({files_changed} files)`
148
+
149
+ 8. **If option 2 ("Yes, but let me write the message"):**
150
+ Use AskUserQuestion to get the user's custom commit message, then:
151
+ ```bash
152
+ git add -A && git commit -m "{custom_message}"
153
+ ```
154
+ Display: `Committed: {custom_message} ({files_changed} files)`
155
+
156
+ 9. **If option 3 ("No, I'll commit later"):**
157
+ Display: `Skipped. Your changes are saved on disk but not committed.`
158
+
159
+ 10. **Record the suggestion to prevent double-prompting:**
160
+ Set `last_commit_suggestion_phase` to `{current_phase}` in COLONY_STATE.json (add the field at the top level if it does not exist).
161
+
162
+ **Error handling:** If any git command fails (not a repo, merge conflict, pre-commit hook rejection), display the error output and continue to Step 5. The commit suggestion is advisory only โ€” it never blocks the pause flow.
163
+
164
+ Continue to Step 5.
165
+
166
+ ### Step 5: Display Confirmation
167
+
168
+ Output header:
169
+
170
+ ```
171
+ ๐Ÿ’พ๐Ÿœโธ๏ธ๐Ÿœ๐Ÿ’พ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
172
+ C O L O N Y P A U S E D
173
+ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• ๐Ÿ’พ๐Ÿœโธ๏ธ๐Ÿœ๐Ÿ’พ
174
+ ```
175
+
176
+ Then output:
177
+ +=====================================================+
178
+ | AETHER COLONY :: PAUSED |
179
+ +=====================================================+
180
+
181
+ Goal: "<goal>"
182
+ Phase: <current_phase> โ€” <phase_name>
183
+ Pheromones: <active_count> active
184
+
185
+ Handoff saved to .aether/HANDOFF.md
186
+ Paused state saved to COLONY_STATE.json
187
+
188
+ To resume in a new session:
189
+ /ant:resume-colony
190
+
191
+ ๐Ÿ’พ State persisted โ€” safe to /clear
192
+
193
+ ๐Ÿœ What would you like to do next?
194
+ 1. /ant:resume-colony โ€” Resume work in this session
195
+ 2. /ant:lay-eggs "<new goal>" โ€” Start a new colony
196
+ 3. /clear โ€” Clear context and continue
197
+
198
+ Use AskUserQuestion with these three options.
199
+
200
+ If option 1 selected: proceed to run /ant:resume-colony flow
201
+ If option 2 selected: run /ant:lay-eggs flow
202
+ If option 3 selected: display "Run /ant:resume-colony when ready to continue, or /ant:lay-eggs to start fresh"
203
+ ```
@@ -0,0 +1,113 @@
1
+ <!-- Generated from .aether/commands/phase.yaml - DO NOT EDIT DIRECTLY -->
2
+ ---
3
+ name: ant:phase
4
+ description: "๐Ÿ“๐Ÿœ๐Ÿ“๐Ÿœ๐Ÿ“ Show phase details - Queen reviews phase status, tasks, and caste assignment"
5
+ ---
6
+
7
+ ### Step -1: Normalize Arguments
8
+
9
+ Run: `normalized_args=$(bash .aether/aether-utils.sh normalize-args "$@")`
10
+
11
+ This ensures arguments work correctly in both Claude Code and OpenCode. Use `$normalized_args` throughout this command.
12
+
13
+ You are the **Queen Ant Colony**. Display phase details from the project plan.
14
+
15
+ ## Instructions
16
+
17
+ The argument is: `$normalized_args`
18
+
19
+ ### Step 1: Read State
20
+
21
+ Use the Read tool to read `.aether/data/COLONY_STATE.json`.
22
+
23
+ If `goal` is null, output `No colony initialized. Run /ant:init first.` and stop.
24
+
25
+ If `plan.phases` is an empty array, output `No project plan. Run /ant:plan first.` and stop.
26
+
27
+ ### Step 2: Determine What to Show
28
+
29
+ - If `$normalized_args` is empty -> show the current phase (from `current_phase`). If `current_phase` is 0 or beyond the last phase, show phase 1.
30
+ - If `$normalized_args` is a number -> show that specific phase
31
+ - If `$normalized_args` is "list" or "all" -> show all phases in summary
32
+
33
+ ### Step 3a: Single Phase View
34
+
35
+ Find the phase by ID in `plan.phases`.
36
+
37
+ **Calculate next phase ID:**
38
+ - Let `total_phases` = length of `plan.phases` array
39
+ - If current phase ID < total_phases, then `next_id` = current phase ID + 1
40
+ - If current phase ID >= total_phases (viewing last phase), omit the "View next phase" suggestion
41
+
42
+ Output this header:
43
+
44
+
45
+
46
+ ```
47
+ ๐Ÿ“๐Ÿœ๐Ÿ“๐Ÿœ๐Ÿ“ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
48
+ P H A S E {id} D E T A I L S
49
+ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• ๐Ÿ“๐Ÿœ๐Ÿ“๐Ÿœ๐Ÿ“
50
+
51
+
52
+ Then display:
53
+
54
+ ```
55
+ ๐Ÿ“ Phase <id>: <name>
56
+ ๐Ÿ“Š Status: <status>
57
+
58
+ <description>
59
+
60
+ ๐Ÿœ Tasks:
61
+ {status_icon} <task_id>: <description>
62
+ โ†ณ depends on: <deps or "none">
63
+
64
+ โœ… Success Criteria:
65
+ โ€ข <criterion>
66
+
67
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
68
+
69
+
70
+ ๐Ÿœ Next Steps:
71
+
72
+ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
73
+ /ant:build <id> ๐Ÿ”จ Phase <id>: <phase_name>
74
+ /ant:phase <next_id> ๐Ÿ“‹ Phase <next_id>: <next_phase_name> (only if not last phase)
75
+ /ant:status ๐Ÿ“Š Colony status
76
+ ```
77
+
78
+
79
+
80
+ Status icons: `[ ]` pending, `[~]` in_progress, `[โœ“]` completed
81
+
82
+ ### Step 3b: List View
83
+
84
+ Output this header:
85
+
86
+
87
+
88
+ ```
89
+ ๐Ÿ“๐Ÿœ๐Ÿ“๐Ÿœ๐Ÿ“ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
90
+ A L L P H A S E S
91
+ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ• ๐Ÿ“๐Ÿœ๐Ÿ“๐Ÿœ๐Ÿ“
92
+
93
+
94
+ For each phase in `plan.phases`, display:
95
+ ```
96
+ [{id}] {name} [{status}]
97
+ {short_description}
98
+ ```
99
+
100
+ Display phases grouped by status:
101
+ ```
102
+ โœ“ Completed
103
+ [{id}] {name}
104
+ ~ In Progress
105
+ [{id}] {name}
106
+ [ ] Pending
107
+ [{id}] {name}
108
+ ```
109
+
110
+ Display completion progress:
111
+ ```
112
+ ๐Ÿ“Š Overall: {completed_count}/{total_count} phases complete
113
+ ```
@@ -0,0 +1,162 @@
1
+ <!-- Generated from .aether/commands/pheromones.yaml - DO NOT EDIT DIRECTLY -->
2
+ ---
3
+ name: ant:pheromones
4
+ description: "๐ŸŽฏ๐Ÿœ๐Ÿšซ๐Ÿœ๐Ÿ’ฌ View and manage active pheromone signals"
5
+ ---
6
+
7
+ ### Step -1: Normalize Arguments
8
+
9
+ Run: `normalized_args=$(bash .aether/aether-utils.sh normalize-args "$@")`
10
+
11
+ This ensures arguments work correctly in both Claude Code and OpenCode. Use `$normalized_args` throughout this command.
12
+
13
+ You are the **Queen**. Display and manage the colony's pheromone signals.
14
+
15
+ ## Instructions
16
+
17
+ Parse `$normalized_args`:
18
+ - If contains `--no-visual`: set `visual_mode = false` (visual is ON by default)
19
+ - Otherwise: set `visual_mode = true`
20
+
21
+ Extract subcommand from `$normalized_args`:
22
+ - No argument or `all`: Show all active pheromones
23
+ - `focus`: Show only FOCUS signals
24
+ - `redirect`: Show only REDIRECT signals
25
+ - `feedback`: Show only FEEDBACK signals
26
+ - `clear`: Clear expired/inactive signals
27
+ - `expire <id>`: Expire a specific signal by ID
28
+
29
+ ### Step 1: Read Colony State
30
+
31
+ Read `.aether/data/COLONY_STATE.json`.
32
+
33
+ If file missing or `goal: null`:
34
+ ```
35
+ No colony initialized. Run /ant:init first.
36
+ ```
37
+ Stop here.
38
+
39
+ ### Step 2: Handle Subcommands
40
+
41
+ **If subcommand is `clear`:**
42
+
43
+ Run using the Bash tool:
44
+ ```bash
45
+ # Count signals before
46
+ before_count=$(jq '[.signals[] | select(.active == true)] | length' .aether/data/pheromones.json 2>/dev/null || echo "0")
47
+
48
+ # Mark expired/inactive signals as inactive
49
+ now=$(date +%s)
50
+ jq --argjson now "$now" '
51
+ def to_epoch(ts):
52
+ if ts == null or ts == "" or ts == "phase_end" then null
53
+ else
54
+ (ts | split("T")) as $parts |
55
+ ($parts[0] | split("-")) as $d |
56
+ ($parts[1] | rtrimstr("Z") | split(":")) as $t |
57
+ (($d[0] | tonumber) - 1970) * 365 * 86400 +
58
+ (($d[1] | tonumber) - 1) * 30 * 86400 +
59
+ (($d[2] | tonumber) - 1) * 86400 +
60
+ ($t[0] | tonumber) * 3600 +
61
+ ($t[1] | tonumber) * 60 +
62
+ ($t[2] | rtrimstr("Z") | tonumber)
63
+ end;
64
+
65
+ def decay_days(t):
66
+ if t == "FOCUS" then 30
67
+ elif t == "REDIRECT" then 60
68
+ else 90
69
+ end;
70
+
71
+ .signals = [.signals[] |
72
+ (to_epoch(.created_at)) as $created_epoch |
73
+ (if $created_epoch != null then ($now - $created_epoch) / 86400 else 0 end) as $elapsed_days |
74
+ (decay_days(.type)) as $dd |
75
+ ((.strength // 0.8) * (1 - ($elapsed_days / $dd))) as $eff_raw |
76
+ (if $eff_raw < 0 then 0 else $eff_raw end) as $eff |
77
+ if $eff < 0.1 then . + {active: false} else . end
78
+ ]
79
+ ' .aether/data/pheromones.json > .aether/data/pheromones.json.tmp && mv .aether/data/pheromones.json.tmp .aether/data/pheromones.json
80
+
81
+ # Count signals after
82
+ after_count=$(jq '[.signals[] | select(.active == true)] | length' .aether/data/pheromones.json 2>/dev/null || echo "0")
83
+ cleared=$((before_count - after_count))
84
+
85
+ echo "before=$before_count after=$after_count cleared=$cleared"
86
+ ```
87
+
88
+ Display:
89
+ ```
90
+ ๐Ÿงน Pheromone Cleanup
91
+
92
+ Before: {before_count} active signals
93
+ After: {after_count} active signals
94
+ Cleared: {cleared} expired signal(s)
95
+
96
+ Run /ant:pheromones to see remaining signals.
97
+ ```
98
+ Stop here.
99
+
100
+ **If subcommand is `expire <id>`:**
101
+
102
+ Extract the signal ID from arguments.
103
+ Run using the Bash tool:
104
+ ```bash
105
+ signal_id="{extracted_id}"
106
+ jq --arg id "$signal_id" '.signals = [.signals[] | if .id == $id then . + {active: false} else . end]' .aether/data/pheromones.json > .aether/data/pheromones.json.tmp && mv .aether/data/pheromones.json.tmp .aether/data/pheromones.json && echo "expired=$signal_id"
107
+ ```
108
+
109
+ Display:
110
+ ```
111
+ โœ“ Signal expired: {signal_id}
112
+
113
+ Run /ant:pheromones to see remaining signals.
114
+ ```
115
+ Stop here.
116
+
117
+ ### Step 3: Display Active Pheromones (default or filter)
118
+
119
+ Run using the Bash tool with description "Displaying pheromones...":
120
+ ```bash
121
+ bash .aether/aether-utils.sh pheromone-display "{subcommand or 'all'}"
122
+ ```
123
+
124
+ The output will be the formatted pheromone table.
125
+
126
+ ### Step 4: Summary and Next Steps
127
+
128
+ Display guidance:
129
+ ```
130
+ โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
131
+
132
+ ๐Ÿ’ก Managing Pheromones
133
+
134
+ /ant:focus "area" ๐ŸŽฏ Guide attention
135
+ /ant:redirect "avoid" ๐Ÿšซ Set hard constraint
136
+ /ant:feedback "note" ๐Ÿ’ฌ Provide guidance
137
+ /ant:pheromones clear ๐Ÿงน Clear expired signals
138
+
139
+ ๐Ÿœ Signals decay over time: FOCUS 30d, REDIRECT 60d, FEEDBACK 90d
140
+ ```
141
+
142
+ ### Edge Cases
143
+
144
+ **No pheromones file:**
145
+ ```
146
+ No pheromones active. Colony has no signals.
147
+
148
+ Inject signals with:
149
+ /ant:focus "area" - Guide attention
150
+ /ant:redirect "avoid" - Set hard constraint
151
+ /ant:feedback "note" - Provide guidance
152
+ ```
153
+
154
+ **No active signals of filtered type:**
155
+ ```
156
+ No active {type} signals found.
157
+
158
+ Try: /ant:pheromones (to see all)
159
+ ```
160
+
161
+ **Invalid subcommand:**
162
+ Display help showing valid subcommands.