aether-colony 3.1.17 → 5.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 (183) hide show
  1. package/{runtime → .aether}/CONTEXT.md +1 -1
  2. package/{runtime → .aether}/aether-utils.sh +1772 -98
  3. package/.aether/docs/QUEEN-SYSTEM.md +211 -0
  4. package/.aether/docs/QUEEN.md +84 -0
  5. package/.aether/docs/README.md +68 -0
  6. package/.aether/docs/caste-system.md +48 -0
  7. package/{runtime → .aether/docs/disciplines}/DISCIPLINES.md +8 -8
  8. package/.aether/docs/error-codes.md +268 -0
  9. package/{runtime → .aether}/docs/known-issues.md +42 -26
  10. package/.aether/docs/queen-commands.md +97 -0
  11. package/.aether/exchange/colony-registry.xml +11 -0
  12. package/{runtime → .aether}/exchange/pheromone-xml.sh +2 -1
  13. package/.aether/exchange/pheromones.xml +87 -0
  14. package/.aether/exchange/queen-wisdom.xml +14 -0
  15. package/{runtime → .aether}/exchange/registry-xml.sh +7 -3
  16. package/{runtime → .aether}/exchange/wisdom-xml.sh +11 -4
  17. package/.aether/rules/aether-colony.md +134 -0
  18. package/.aether/schemas/example-prompt-builder.xml +234 -0
  19. package/.aether/templates/colony-state-reset.jq.template +22 -0
  20. package/.aether/templates/colony-state.template.json +35 -0
  21. package/.aether/templates/constraints.template.json +9 -0
  22. package/.aether/templates/crowned-anthill.template.md +36 -0
  23. package/.aether/templates/handoff-build-error.template.md +30 -0
  24. package/.aether/templates/handoff-build-success.template.md +39 -0
  25. package/.aether/templates/handoff.template.md +40 -0
  26. package/{runtime → .aether}/utils/atomic-write.sh +5 -5
  27. package/{runtime → .aether}/utils/chamber-compare.sh +23 -10
  28. package/{runtime → .aether}/utils/chamber-utils.sh +32 -20
  29. package/{runtime → .aether}/utils/error-handler.sh +13 -1
  30. package/{runtime → .aether}/utils/file-lock.sh +49 -13
  31. package/.aether/utils/semantic-cli.sh +413 -0
  32. package/{runtime → .aether}/utils/xml-compose.sh +7 -1
  33. package/.aether/utils/xml-convert.sh +273 -0
  34. package/.aether/utils/xml-query.sh +201 -0
  35. package/.aether/utils/xml-utils.sh +110 -0
  36. package/{runtime → .aether}/workers.md +14 -17
  37. package/.claude/agents/ant/aether-ambassador.md +264 -0
  38. package/.claude/agents/ant/aether-archaeologist.md +322 -0
  39. package/.claude/agents/ant/aether-auditor.md +266 -0
  40. package/.claude/agents/ant/aether-builder.md +187 -0
  41. package/.claude/agents/ant/aether-chaos.md +268 -0
  42. package/.claude/agents/ant/aether-chronicler.md +304 -0
  43. package/.claude/agents/ant/aether-gatekeeper.md +325 -0
  44. package/.claude/agents/ant/aether-includer.md +373 -0
  45. package/.claude/agents/ant/aether-keeper.md +271 -0
  46. package/.claude/agents/ant/aether-measurer.md +317 -0
  47. package/.claude/agents/ant/aether-probe.md +210 -0
  48. package/.claude/agents/ant/aether-queen.md +325 -0
  49. package/.claude/agents/ant/aether-route-setter.md +173 -0
  50. package/.claude/agents/ant/aether-sage.md +353 -0
  51. package/.claude/agents/ant/aether-scout.md +142 -0
  52. package/.claude/agents/ant/aether-surveyor-disciplines.md +416 -0
  53. package/.claude/agents/ant/aether-surveyor-nest.md +354 -0
  54. package/.claude/agents/ant/aether-surveyor-pathogens.md +288 -0
  55. package/.claude/agents/ant/aether-surveyor-provisions.md +359 -0
  56. package/.claude/agents/ant/aether-tracker.md +265 -0
  57. package/.claude/agents/ant/aether-watcher.md +244 -0
  58. package/.claude/agents/ant/aether-weaver.md +247 -0
  59. package/.claude/commands/ant/archaeology.md +16 -7
  60. package/.claude/commands/ant/build.md +415 -284
  61. package/.claude/commands/ant/chaos.md +19 -10
  62. package/.claude/commands/ant/colonize.md +58 -24
  63. package/.claude/commands/ant/continue.md +155 -145
  64. package/.claude/commands/ant/council.md +15 -5
  65. package/.claude/commands/ant/dream.md +16 -7
  66. package/.claude/commands/ant/entomb.md +274 -157
  67. package/.claude/commands/ant/feedback.md +33 -29
  68. package/.claude/commands/ant/flag.md +18 -10
  69. package/.claude/commands/ant/flags.md +14 -6
  70. package/.claude/commands/ant/focus.md +29 -21
  71. package/.claude/commands/ant/help.md +11 -1
  72. package/.claude/commands/ant/history.md +10 -0
  73. package/.claude/commands/ant/init.md +91 -65
  74. package/.claude/commands/ant/interpret.md +15 -4
  75. package/.claude/commands/ant/lay-eggs.md +55 -7
  76. package/.claude/commands/ant/maturity.md +11 -1
  77. package/.claude/commands/ant/migrate-state.md +14 -2
  78. package/.claude/commands/ant/oracle.md +23 -15
  79. package/.claude/commands/ant/organize.md +29 -20
  80. package/.claude/commands/ant/pause-colony.md +17 -7
  81. package/.claude/commands/ant/phase.md +17 -8
  82. package/.claude/commands/ant/plan.md +20 -9
  83. package/.claude/commands/ant/redirect.md +29 -32
  84. package/.claude/commands/ant/resume-colony.md +19 -9
  85. package/.claude/commands/ant/resume.md +272 -96
  86. package/.claude/commands/ant/seal.md +201 -191
  87. package/.claude/commands/ant/status.md +71 -32
  88. package/.claude/commands/ant/swarm.md +26 -44
  89. package/.claude/commands/ant/tunnels.md +279 -105
  90. package/.claude/commands/ant/update.md +81 -20
  91. package/.claude/commands/ant/verify-castes.md +14 -4
  92. package/.claude/commands/ant/watch.md +13 -12
  93. package/.opencode/agents/aether-ambassador.md +63 -20
  94. package/.opencode/agents/aether-archaeologist.md +29 -12
  95. package/.opencode/agents/aether-auditor.md +51 -18
  96. package/.opencode/agents/aether-builder.md +69 -19
  97. package/.opencode/agents/aether-chaos.md +29 -12
  98. package/.opencode/agents/aether-chronicler.md +60 -18
  99. package/.opencode/agents/aether-gatekeeper.md +27 -18
  100. package/.opencode/agents/aether-includer.md +27 -18
  101. package/.opencode/agents/aether-keeper.md +89 -18
  102. package/.opencode/agents/aether-measurer.md +27 -18
  103. package/.opencode/agents/aether-probe.md +60 -18
  104. package/.opencode/agents/aether-queen.md +172 -24
  105. package/.opencode/agents/aether-route-setter.md +57 -12
  106. package/.opencode/agents/aether-sage.md +26 -18
  107. package/.opencode/agents/aether-scout.md +27 -19
  108. package/.opencode/agents/aether-surveyor-disciplines.md +53 -1
  109. package/.opencode/agents/aether-surveyor-nest.md +53 -1
  110. package/.opencode/agents/aether-surveyor-pathogens.md +51 -1
  111. package/.opencode/agents/aether-surveyor-provisions.md +53 -1
  112. package/.opencode/agents/aether-tracker.md +64 -18
  113. package/.opencode/agents/aether-watcher.md +66 -19
  114. package/.opencode/agents/aether-weaver.md +61 -18
  115. package/.opencode/commands/ant/build.md +406 -192
  116. package/.opencode/commands/ant/continue.md +66 -76
  117. package/.opencode/commands/ant/entomb.md +106 -45
  118. package/.opencode/commands/ant/init.md +46 -48
  119. package/.opencode/commands/ant/organize.md +5 -5
  120. package/.opencode/commands/ant/resume.md +334 -0
  121. package/.opencode/commands/ant/seal.md +33 -24
  122. package/.opencode/commands/ant/status.md +11 -0
  123. package/.opencode/commands/ant/tunnels.md +149 -0
  124. package/.opencode/commands/ant/update.md +59 -16
  125. package/CHANGELOG.md +79 -0
  126. package/README.md +135 -353
  127. package/bin/cli.js +243 -122
  128. package/bin/generate-commands.sh +2 -2
  129. package/bin/lib/init.js +13 -3
  130. package/bin/lib/update-transaction.js +119 -117
  131. package/bin/sync-to-runtime.sh +5 -137
  132. package/bin/validate-package.sh +84 -0
  133. package/package.json +9 -6
  134. package/.opencode/agents/aether-architect.md +0 -66
  135. package/.opencode/agents/aether-guardian.md +0 -107
  136. package/.opencode/agents/workers.md +0 -1034
  137. package/runtime/QUEEN_ANT_ARCHITECTURE.md +0 -402
  138. package/runtime/data/signatures.json +0 -41
  139. package/runtime/docs/AETHER-2.0-IMPLEMENTATION-PLAN.md +0 -1343
  140. package/runtime/docs/AETHER-PHEROMONE-SYSTEM-MASTER-SPEC.md +0 -2642
  141. package/runtime/docs/PHEROMONE-INJECTION.md +0 -240
  142. package/runtime/docs/PHEROMONE-INTEGRATION.md +0 -192
  143. package/runtime/docs/PHEROMONE-SYSTEM-DESIGN.md +0 -426
  144. package/runtime/docs/README.md +0 -94
  145. package/runtime/docs/VISUAL-OUTPUT-SPEC.md +0 -219
  146. package/runtime/docs/biological-reference.md +0 -272
  147. package/runtime/docs/codebase-review.md +0 -399
  148. package/runtime/docs/command-sync.md +0 -164
  149. package/runtime/docs/constraints.md +0 -116
  150. package/runtime/docs/implementation-learnings.md +0 -89
  151. package/runtime/docs/namespace.md +0 -148
  152. package/runtime/docs/pathogen-schema-example.json +0 -36
  153. package/runtime/docs/pathogen-schema.md +0 -111
  154. package/runtime/docs/planning-discipline.md +0 -159
  155. package/runtime/docs/progressive-disclosure.md +0 -184
  156. package/runtime/lib/queen-utils.sh +0 -729
  157. package/runtime/planning.md +0 -159
  158. package/runtime/recover.sh +0 -136
  159. package/runtime/utils/xml-utils.sh +0 -2196
  160. package/runtime/workers-new-castes.md +0 -516
  161. /package/{runtime → .aether/docs/disciplines}/coding-standards.md +0 -0
  162. /package/{runtime → .aether/docs/disciplines}/debugging.md +0 -0
  163. /package/{runtime → .aether/docs/disciplines}/learning.md +0 -0
  164. /package/{runtime → .aether/docs/disciplines}/tdd.md +0 -0
  165. /package/{runtime → .aether/docs/disciplines}/verification-loop.md +0 -0
  166. /package/{runtime → .aether/docs/disciplines}/verification.md +0 -0
  167. /package/{runtime → .aether}/docs/pheromones.md +0 -0
  168. /package/{runtime → .aether}/model-profiles.yaml +0 -0
  169. /package/{runtime → .aether}/schemas/aether-types.xsd +0 -0
  170. /package/{runtime → .aether}/schemas/colony-registry.xsd +0 -0
  171. /package/{runtime → .aether}/schemas/pheromone.xsd +0 -0
  172. /package/{runtime → .aether}/schemas/prompt.xsd +0 -0
  173. /package/{runtime → .aether}/schemas/queen-wisdom.xsd +0 -0
  174. /package/{runtime → .aether}/schemas/worker-priming.xsd +0 -0
  175. /package/{runtime → .aether}/templates/QUEEN.md.template +0 -0
  176. /package/{runtime → .aether}/utils/colorize-log.sh +0 -0
  177. /package/{runtime → .aether}/utils/queen-to-md.xsl +0 -0
  178. /package/{runtime → .aether}/utils/spawn-tree.sh +0 -0
  179. /package/{runtime → .aether}/utils/spawn-with-model.sh +0 -0
  180. /package/{runtime → .aether}/utils/state-loader.sh +0 -0
  181. /package/{runtime → .aether}/utils/swarm-display.sh +0 -0
  182. /package/{runtime → .aether}/utils/watch-spawn-tree.sh +0 -0
  183. /package/{runtime → .aether}/utils/xml-core.sh +0 -0
@@ -9,9 +9,9 @@ You are the **Queen**. Browse the colony history.
9
9
 
10
10
  ### Argument Handling
11
11
 
12
- - No arguments: Show chamber list (Step 4)
13
- - One argument: Show single chamber detail (Step 3)
14
- - Two arguments: Compare two chambers (Step 5)
12
+ - No arguments: Show timeline view (Step 4)
13
+ - One argument: Show single chamber detail with seal document (Step 3)
14
+ - Two arguments: Compare two chambers side-by-side (Step 5)
15
15
  - More than two: "Too many arguments. Use: /ant:tunnels [chamber1] [chamber2]"
16
16
 
17
17
  ### Step 1: Check for Chambers Directory
@@ -20,9 +20,7 @@ Check if `.aether/chambers/` exists.
20
20
 
21
21
  If not:
22
22
  ```
23
- 🕳️ ═══════════════════════════════════════════════════
24
- T U N N E L S (Colony History)
25
- ══════════════════════════════════════════════════ 🕳️
23
+ TUNNELS — Colony Timeline
26
24
 
27
25
  No chambers found.
28
26
 
@@ -32,26 +30,24 @@ Stop here.
32
30
 
33
31
  ### Step 2: List All Chambers
34
32
 
35
- Run: `bash .aether/aether-utils.sh chamber-list`
33
+ Run using the Bash tool with description "Loading chamber list...": `bash .aether/aether-utils.sh chamber-list`
36
34
 
37
35
  Parse JSON result into array of chambers.
38
36
 
39
37
  If no chambers (empty array):
40
38
  ```
41
- 🕳️ ═══════════════════════════════════════════════════
42
- T U N N E L S (Colony History)
43
- ══════════════════════════════════════════════════ 🕳️
39
+ TUNNELS — Colony Timeline
44
40
 
45
- Chambers: 0 colonies archived
41
+ 0 colonies archived
46
42
 
47
43
  The tunnel network is empty.
48
44
  Archive colonies with /ant:entomb to preserve history.
49
45
  ```
50
46
  Stop here.
51
47
 
52
- ### Step 3: Handle Detail View (if argument provided)
48
+ ### Step 3: Detail View — Show Seal Document (if one argument provided)
53
49
 
54
- If `$ARGUMENTS` is not empty:
50
+ If `$ARGUMENTS` is not empty and contains exactly one argument:
55
51
  - Treat it as chamber name
56
52
  - Check if `.aether/chambers/{arguments}/` exists
57
53
  - If not found:
@@ -62,43 +58,111 @@ If `$ARGUMENTS` is not empty:
62
58
  ```
63
59
  Stop here.
64
60
 
65
- - If found, read manifest.json and display detailed view:
61
+ **If CROWNED-ANTHILL.md exists in the chamber:**
62
+
63
+ ```bash
64
+ seal_doc=".aether/chambers/{arguments}/CROWNED-ANTHILL.md"
65
+ ```
66
+
67
+ Display the header:
68
+ ```
69
+ CHAMBER DETAILS — {chamber_name}
70
+ ```
71
+
72
+ Then display the FULL content of `CROWNED-ANTHILL.md` (read and output the file contents — this IS the seal ceremony record).
73
+
74
+ After the seal document, check if `colony-archive.xml` exists in the chamber:
75
+
76
+ ```bash
77
+ chamber_has_xml=false
78
+ [[ -f ".aether/chambers/{chamber_name}/colony-archive.xml" ]] && chamber_has_xml=true
66
79
  ```
67
- 🕳️ ═══════════════════════════════════════════════════
68
- C H A M B E R D E T A I L S
69
- ══════════════════════════════════════════════════ 🕳️
70
80
 
71
- 📦 {chamber_name}
81
+ **If `colony-archive.xml` exists in the chamber**, show footer with import option:
82
+ ```
83
+ Chamber integrity: {hash_status from chamber-verify}
84
+ Chamber location: .aether/chambers/{chamber_name}/
85
+ XML Archive: colony-archive.xml found
86
+
87
+ Actions:
88
+ 1. Import signals from this colony into current colony
89
+ 2. Return to timeline
90
+ 3. Compare with another chamber
91
+
92
+ Select an action (1/2/3)
93
+ ```
94
+
95
+ Use AskUserQuestion with three options.
72
96
 
73
- 👑 Goal:
74
- {goal}
97
+ If option 1 selected: proceed to Step 6 (Import Signals from Chamber).
98
+ If option 2 selected: return to timeline (run /ant:tunnels).
99
+ If option 3 selected: prompt for second chamber name then run /ant:tunnels {chamber_a} {chamber_b}.
75
100
 
76
- 🏆 Milestone: {milestone} ({version})
77
- 📍 Progress: {phases_completed} of {total_phases} phases
78
- 📅 Entombed: {entombed_at}
101
+ **If `colony-archive.xml` does NOT exist in the chamber**, show the existing footer unchanged:
102
+ ```
103
+ Chamber integrity: {hash_status from chamber-verify}
104
+ Chamber location: .aether/chambers/{chamber_name}/
79
105
 
80
- {If decisions exist:}
81
- 🧠 Decisions Preserved:
82
- {N} architectural decisions recorded
83
- {End if}
106
+ Run /ant:tunnels to return to timeline
107
+ Run /ant:tunnels {chamber_a} {chamber_b} to compare chambers
108
+ ```
84
109
 
85
- {If learnings exist:}
86
- 💡 Learnings Preserved:
87
- {N} validated learnings recorded
88
- {End if}
110
+ **If CROWNED-ANTHILL.md does NOT exist (older chamber):**
89
111
 
90
- 📁 Files:
91
- - COLONY_STATE.json (verified: {hash_status})
92
- - manifest.json
112
+ Display the header:
113
+ ```
114
+ CHAMBER DETAILS — {chamber_name}
93
115
 
94
- Run /ant:tunnels to return to chamber list.
116
+ (No seal document this chamber was created before the sealing ceremony was introduced)
95
117
  ```
96
118
 
97
- To get the counts and hash status:
119
+ Fall back to manifest data display:
120
+ - Read `manifest.json` and show: goal, milestone, version, phases_completed, total_phases, entombed_at
121
+ - Show decisions count and learnings count from manifest
122
+ - Show hash status from `chamber-verify`
123
+
124
+ Footer with navigation guidance:
125
+ ```
126
+ Run /ant:tunnels to return to timeline
127
+ Run /ant:tunnels {chamber_a} {chamber_b} to compare chambers
128
+ ```
129
+
130
+ To get the hash status, run using the Bash tool with description "Verifying chamber integrity...":
98
131
  - Run `bash .aether/aether-utils.sh chamber-verify .aether/chambers/{chamber_name}`
99
- - If verified: hash_status = ""
100
- - If not verified: hash_status = "⚠️ hash mismatch"
101
- - If error: hash_status = "⚠️ error"
132
+ - If verified: hash_status = "verified"
133
+ - If not verified: hash_status = "hash mismatch"
134
+ - If error: hash_status = "error"
135
+
136
+ Stop here.
137
+
138
+ ### Step 4: Timeline View (default, no arguments)
139
+
140
+ Display header:
141
+ ```
142
+ TUNNELS — Colony Timeline
143
+
144
+ {count} colonies archived
145
+ ```
146
+
147
+ For each chamber in sorted list (already sorted by `chamber-list` — newest first), display as a timeline entry:
148
+ ```
149
+ [{date}] {milestone_emoji} {chamber_name}
150
+ {goal (truncated to 60 chars)}
151
+ {phases_completed} phases | {milestone}
152
+ ```
153
+
154
+ Where `milestone_emoji` is:
155
+ - Crowned Anthill: crown emoji
156
+ - Sealed Chambers: lock emoji
157
+ - Other: circle emoji
158
+
159
+ After the timeline entries, show:
160
+ ```
161
+ Run /ant:tunnels <chamber_name> to view seal document
162
+ Run /ant:tunnels <chamber_a> <chamber_b> to compare two colonies
163
+ ```
164
+
165
+ Use the entombed_at field from the chamber-list JSON to extract the date (first 10 chars of ISO timestamp).
102
166
 
103
167
  Stop here.
104
168
 
@@ -106,9 +170,8 @@ Stop here.
106
170
 
107
171
  If two arguments provided (chamber names separated by space):
108
172
  - Treat as: `/ant:tunnels <chamber_a> <chamber_b>`
109
- - Run comparison: `bash .aether/utils/chamber-compare.sh compare <chamber_a> <chamber_b>`
110
173
 
111
- If either chamber not found:
174
+ Check both chambers exist. If either missing:
112
175
  ```
113
176
  Chamber not found: {chamber_name}
114
177
 
@@ -117,73 +180,75 @@ Available chambers:
117
180
  ```
118
181
  Stop here.
119
182
 
183
+ Run comparison using the Bash tool with description "Comparing chambers...":
184
+ ```bash
185
+ bash .aether/utils/chamber-compare.sh compare <chamber_a> <chamber_b>
186
+ bash .aether/utils/chamber-compare.sh stats <chamber_a> <chamber_b>
187
+ ```
188
+
120
189
  Display comparison header:
121
190
  ```
122
- 🕳️ ═══════════════════════════════════════════════════
123
- C H A M B E R C O M P A R I S O N
124
- ══════════════════════════════════════════════════ 🕳️
191
+ CHAMBER COMPARISON
125
192
 
126
- 📦 {chamber_a} vs 📦 {chamber_b}
193
+ {chamber_a} vs {chamber_b}
127
194
  ```
128
195
 
129
196
  Display side-by-side comparison:
130
197
  ```
131
- ┌─────────────────────┬─────────────────────┐
132
- {chamber_a} {chamber_b}
133
- ├─────────────────────┼─────────────────────┤
134
- 👑 {goal_a} 👑 {goal_b}
135
-
136
- 🏆 {milestone_a} 🏆 {milestone_b}
137
- {version_a}{version_b}
138
-
139
- 📍 {phases_a} done 📍 {phases_b} done
140
- of {total_a}of {total_b}
141
-
142
- 🧠 {decisions_a} 🧠 {decisions_b}
143
- decisionsdecisions
144
-
145
- 💡 {learnings_a} 💡 {learnings_b}
146
- learningslearnings
147
-
148
- 📅 {date_a} 📅 {date_b}
149
- └─────────────────────┴─────────────────────┘
198
+ +---------------------+---------------------+
199
+ | {chamber_a} | {chamber_b} |
200
+ +---------------------+---------------------+
201
+ | Goal: {goal_a} | Goal: {goal_b} |
202
+ | | |
203
+ | {milestone_a} | {milestone_b} |
204
+ | {version_a} | {version_b} |
205
+ | | |
206
+ | {phases_a} done | {phases_b} done |
207
+ | of {total_a} | of {total_b} |
208
+ | | |
209
+ | {decisions_a} | {decisions_b} |
210
+ | decisions | decisions |
211
+ | | |
212
+ | {learnings_a} | {learnings_b} |
213
+ | learnings | learnings |
214
+ | | |
215
+ | {date_a} | {date_b} |
216
+ +---------------------+---------------------+
150
217
  ```
151
218
 
152
219
  Display growth metrics:
153
220
  ```
154
- 📈 Growth Between Chambers:
155
- Phases: +{phases_diff} ({phases_a} {phases_b})
156
- Decisions: +{decisions_diff} new
157
- Learnings: +{learnings_diff} new
158
- Time: {time_between} days apart
221
+ Growth Between Chambers:
222
+ Phases: +{phases_diff} ({phases_a} -> {phases_b})
223
+ Decisions: +{decisions_diff} new
224
+ Learnings: +{learnings_diff} new
225
+ Time: {time_between} days apart
159
226
  ```
160
227
 
161
- If phases_diff > 0: show "📈 Colony grew"
162
- If phases_diff < 0: show "📉 Colony reduced (unusual)"
163
- If same_milestone: show "🏆 Same milestone reached"
164
- If milestone changed: show "🏆 Milestone advanced: {milestone_a} {milestone_b}"
228
+ If phases_diff > 0: show "Colony grew"
229
+ If phases_diff < 0: show "Colony reduced (unusual)"
230
+ If same_milestone: show "Same milestone reached"
231
+ If milestone changed: show "Milestone advanced: {milestone_a} -> {milestone_b}"
165
232
 
166
- Display pheromone trail diff (new decisions/learnings in B):
233
+ Display pheromone trail diff (new decisions/learnings in B) by running using the Bash tool with description "Analyzing pheromone differences...":
167
234
  ```bash
168
235
  bash .aether/utils/chamber-compare.sh diff <chamber_a> <chamber_b>
169
236
  ```
170
237
 
171
238
  Parse result and show:
172
239
  ```
173
- 🧠 New Decisions in {chamber_b}:
174
- {N} new architectural decisions
175
- {if N <= 5, list them; else show first 3 + "...and {N-3} more"}
240
+ New Decisions in {chamber_b}:
241
+ {N} new architectural decisions
242
+ {if N <= 5, list them; else show first 3 + "...and {N-3} more"}
176
243
 
177
- 💡 New Learnings in {chamber_b}:
178
- {N} new validated learnings
179
- {if N <= 5, list them; else show first 3 + "...and {N-3} more"}
244
+ New Learnings in {chamber_b}:
245
+ {N} new validated learnings
246
+ {if N <= 5, list them; else show first 3 + "...and {N-3} more"}
180
247
  ```
181
248
 
182
- Display knowledge preservation:
249
+ If both chambers have `CROWNED-ANTHILL.md`, note:
183
250
  ```
184
- 📚 Knowledge Preservation:
185
- {preserved_decisions} decisions carried forward
186
- {preserved_learnings} learnings carried forward
251
+ Both colonies have seal documents. Run /ant:tunnels <name> to view individually.
187
252
  ```
188
253
 
189
254
  Footer:
@@ -194,36 +259,145 @@ Run /ant:tunnels <chamber> to view single chamber details
194
259
 
195
260
  Stop here.
196
261
 
197
- ### Step 4: Display Chamber List (default view)
262
+ ### Step 6: Import Signals from Chamber
263
+
264
+ When user selects "Import signals" from Step 3:
265
+
266
+ **Step 6.1: Check XML tools** by running using the Bash tool with description "Checking XML tools...":
267
+ ```bash
268
+ if command -v xmllint >/dev/null 2>&1; then
269
+ xmllint_available=true
270
+ else
271
+ xmllint_available=false
272
+ fi
273
+ ```
274
+
275
+ If xmllint not available:
276
+ ```
277
+ Import requires xmllint. Install it first:
278
+ macOS: xcode-select --install
279
+ Linux: apt-get install libxml2-utils
280
+ ```
281
+ Stop here (return to timeline).
282
+
283
+ **Step 6.2: Extract source colony name** by running using the Bash tool with description "Extracting colony info...":
284
+ ```bash
285
+ chamber_xml=".aether/chambers/{chamber_name}/colony-archive.xml"
286
+ # Extract colony_id from the archive root element
287
+ source_colony=$(xmllint --xpath "string(/*/@colony_id)" "$chamber_xml" 2>/dev/null)
288
+ [[ -z "$source_colony" ]] && source_colony="{chamber_name}"
289
+ ```
290
+
291
+ **Step 6.3: Extract pheromone section and show import preview**
292
+
293
+ The combined `colony-archive.xml` contains pheromones, wisdom, and registry sections. Extract the pheromone section to a temp file before counting or importing. This prevents over-counting signals from wisdom/registry sections and ensures `pheromone-import-xml` receives the format it expects (`<pheromones>` as root element).
198
294
 
295
+ Run using the Bash tool with description "Extracting pheromone signals...":
296
+ ```bash
297
+ # Extract the <pheromones> section from the combined archive into a standalone temp file
298
+ import_tmp_dir=$(mktemp -d)
299
+ import_tmp_pheromones="$import_tmp_dir/pheromones-extracted.xml"
300
+
301
+ # Use xmllint to extract the pheromones element (with its namespace)
302
+ xmllint --xpath "//*[local-name()='pheromones']" "$chamber_xml" > "$import_tmp_pheromones" 2>/dev/null
303
+
304
+ # Add XML declaration to make it a standalone well-formed document
305
+ if [[ -s "$import_tmp_pheromones" ]]; then
306
+ # Portable approach: prepend declaration via temp file (avoids macOS/Linux sed -i differences)
307
+ { echo '<?xml version="1.0" encoding="UTF-8"?>'; cat "$import_tmp_pheromones"; } > "$import_tmp_dir/tmp_decl.xml"
308
+ mv "$import_tmp_dir/tmp_decl.xml" "$import_tmp_pheromones"
309
+ fi
310
+
311
+ # Count pheromone signals in extracted pheromone-only XML
312
+ # Scoped to pheromone section only — no over-counting from wisdom/registry sections
313
+ pheromone_count=$(xmllint --xpath "count(//*[local-name()='signal'])" "$import_tmp_pheromones" 2>/dev/null || echo "unknown")
199
314
  ```
200
- 🕳️ ═══════════════════════════════════════════════════
201
- T U N N E L S (Colony History)
202
- ══════════════════════════════════════════════════ 🕳️
203
315
 
204
- Chambers: {count} colonies archived
316
+ Display:
317
+ ```
318
+ IMPORT FROM COLONY: {source_colony}
205
319
 
206
- {For each chamber in sorted list:}
207
- 📦 {chamber_name}
208
- 👑 {goal (truncated to 50 chars)}
209
- 🏆 {milestone} ({version})
210
- 📍 {phases_completed} phases | 📅 {date}
320
+ Source: .aether/chambers/{chamber_name}/colony-archive.xml
321
+ Signals available: ~{pheromone_count} pheromone signals
211
322
 
212
- {End for}
323
+ Import behavior:
324
+ - Signals tagged with prefix "{source_colony}:" to identify origin
325
+ - Additive merge — your current signals are never overwritten
326
+ - On conflict, your current colony wins
213
327
 
214
- Run /ant:tunnels <chamber_name> to view details
328
+ Import these signals? (yes/no)
215
329
  ```
216
330
 
217
- **Formatting details:**
218
- - Sort by entombed_at descending (newest first) - already sorted by chamber-list
219
- - Truncate goal to 50 characters with "..." if longer
220
- - Format date as YYYY-MM-DD from ISO timestamp (extract first 10 chars of entombed_at)
221
- - Show chamber count at top
331
+ Use AskUserQuestion with yes/no options.
222
332
 
223
- **Edge cases:**
224
- - Malformed manifest: show "⚠️ Invalid manifest" for that chamber and skip it
225
- - Missing COLONY_STATE.json: show "⚠️ Incomplete chamber" for that chamber
226
- - Very long chamber list: display all (no pagination for now)
333
+ If no: "Import cancelled." Clean up: `rm -rf "$import_tmp_dir"`. Return to timeline.
334
+
335
+ **Step 6.4: Perform import**
336
+
337
+ Pass the extracted pheromone-only temp file (NOT the combined `colony-archive.xml`) to `pheromone-import-xml`, along with `$source_colony` as the second argument. This ensures:
338
+ 1. `pheromone-import-xml` receives XML with `<pheromones>` as root element (the format it expects)
339
+ 2. The prefix-tagging logic prepends `${source_colony}:` to each imported signal's ID before the merge
340
+
341
+ Run using the Bash tool with description "Importing pheromone signals...":
342
+ ```bash
343
+ # Import the EXTRACTED pheromone-only XML (NOT the combined colony-archive.xml)
344
+ # $import_tmp_pheromones has <pheromones> as root — the format pheromone-import-xml expects
345
+ # Second argument triggers prefix-tagging — imported signal IDs become "{source_colony}:original_id"
346
+ import_result=$(bash .aether/aether-utils.sh pheromone-import-xml "$import_tmp_pheromones" "$source_colony" 2>&1)
347
+ import_ok=$(echo "$import_result" | jq -r '.ok // false' 2>/dev/null)
348
+
349
+ if [[ "$import_ok" == "true" ]]; then
350
+ imported_count=$(echo "$import_result" | jq -r '.result.signal_count // 0' 2>/dev/null)
351
+ else
352
+ imported_count=0
353
+ import_error=$(echo "$import_result" | jq -r '.error // "Unknown error"' 2>/dev/null)
354
+ fi
355
+
356
+ # Clean up temp files
357
+ rm -rf "$import_tmp_dir"
358
+ ```
359
+
360
+ **Step 6.5: Display result**
361
+
362
+ If import succeeded:
363
+ ```
364
+ SIGNALS IMPORTED
365
+
366
+ Source: {source_colony}
367
+ Imported: {imported_count} pheromone signals
368
+ Tagged with: "{source_colony}:" prefix
369
+
370
+ Your colony now carries wisdom from {source_colony}.
371
+ Run /ant:status to see current colony state.
372
+ ```
373
+
374
+ If import failed:
375
+ ```
376
+ Import failed: {import_error}
377
+
378
+ The archive may be malformed. Check:
379
+ .aether/chambers/{chamber_name}/colony-archive.xml
380
+ ```
381
+
382
+ ### Edge Cases
383
+
384
+ **Malformed manifest:** show "Invalid manifest" for that chamber and skip it.
385
+
386
+ **Missing COLONY_STATE.json:** show "Incomplete chamber" for that chamber.
387
+
388
+ **Very long chamber list:** display all (no pagination for now).
389
+
390
+ **Older chambers without CROWNED-ANTHILL.md:** Fall back to manifest data in detail view.
391
+
392
+ ### Step 7: Next Up
393
+
394
+ Generate the state-based Next Up block by running using the Bash tool with description "Generating Next Up suggestions...":
395
+ ```bash
396
+ state=$(jq -r '.state // "IDLE"' .aether/data/COLONY_STATE.json)
397
+ current_phase=$(jq -r '.current_phase // 0' .aether/data/COLONY_STATE.json)
398
+ total_phases=$(jq -r '.plan.phases | length' .aether/data/COLONY_STATE.json)
399
+ bash .aether/aether-utils.sh print-next-up "$state" "$current_phase" "$total_phases"
400
+ ```
227
401
 
228
402
  ## Implementation Notes
229
403
 
@@ -28,7 +28,20 @@ Stop here. Do not proceed.
28
28
 
29
29
  Read the `version` field — this is the **available version**.
30
30
 
31
- ### Step 2: Check Current Version
31
+ ### Step 2: Check Pending State and Current Version
32
+
33
+ First, check for a pending sentinel using the Bash tool with description "Checking update state...":
34
+
35
+ ```bash
36
+ test -f .aether/.update-pending && echo "PENDING" || echo "CLEAN"
37
+ ```
38
+
39
+ If output is "PENDING":
40
+ - Output: `Detected incomplete update, re-syncing...`
41
+ - Run using the Bash tool with description "Clearing incomplete update sentinel...": `rm -f .aether/.update-pending`
42
+ - Skip the version comparison entirely — proceed directly to Step 3.
43
+
44
+ If output is "CLEAN":
32
45
 
33
46
  Use the Read tool to read `.aether/version.json`.
34
47
 
@@ -38,7 +51,7 @@ Otherwise, read the `version` field — this is the **current version**.
38
51
  If current version equals available version, output:
39
52
 
40
53
  ```
41
- Already up-to-date (v{version}).
54
+ Already up to date (v{version}).
42
55
 
43
56
  System files and commands match the global hub.
44
57
  Colony data (.aether/data/) is always untouched by updates.
@@ -46,54 +59,79 @@ Colony data (.aether/data/) is always untouched by updates.
46
59
 
47
60
  Stop here. Do not proceed.
48
61
 
49
- ### Step 3: Bootstrap System Files
62
+ ### Step 3: Sync System Files from Hub
50
63
 
51
- If `.aether/aether-utils.sh` does not exist yet (new repo that predates the hub), copy it from the hub first:
52
- ```
53
- cp ~/.aether/system/aether-utils.sh .aether/aether-utils.sh && chmod +x .aether/aether-utils.sh
64
+ The hub stores all system files at `~/.aether/system/`.
65
+
66
+ Run ONE bash command with description "Syncing colony system files...":
67
+
68
+ ```bash
69
+ mkdir -p .aether/docs .aether/utils .aether/templates .aether/schemas .aether/exchange && \
70
+ cp -f ~/.aether/system/aether-utils.sh .aether/ && \
71
+ cp -f ~/.aether/system/workers.md .aether/ 2>/dev/null || true && \
72
+ cp -f ~/.aether/system/CONTEXT.md .aether/ 2>/dev/null || true && \
73
+ cp -f ~/.aether/system/model-profiles.yaml .aether/ 2>/dev/null || true && \
74
+ cp -Rf ~/.aether/system/docs/* .aether/docs/ 2>/dev/null || true && \
75
+ cp -Rf ~/.aether/system/utils/* .aether/utils/ 2>/dev/null || true && \
76
+ cp -Rf ~/.aether/system/templates/* .aether/templates/ 2>/dev/null || true && \
77
+ cp -Rf ~/.aether/system/schemas/* .aether/schemas/ 2>/dev/null || true && \
78
+ cp -Rf ~/.aether/system/exchange/* .aether/exchange/ 2>/dev/null || true && \
79
+ chmod +x .aether/aether-utils.sh && \
80
+ echo "System files synced"
54
81
  ```
55
82
 
56
- Then run using the Bash tool:
83
+ Colony data (`.aether/data/`) is never touched.
84
+
85
+ If any sync step fails, output:
57
86
  ```
58
- bash .aether/aether-utils.sh bootstrap-system
87
+ Update couldn't finish — some files didn't copy. Run /ant:update again to retry.
59
88
  ```
60
89
 
61
- This copies system files (docs, utils, aether-utils.sh) from `~/.aether/system/` into `.aether/` using an explicit allowlist. Colony data is never touched.
90
+ ### Step 3.5: Sync Rules to .claude/rules/
91
+
92
+ Rules files teach Claude Code about the colony system. Sync them from the hub with description "Syncing colony rules...":
62
93
 
63
- Parse the JSON output to get the count of copied files.
94
+ ```bash
95
+ # Sync rules if hub has them
96
+ if [ -d ~/.aether/system/rules ]; then
97
+ mkdir -p .claude/rules
98
+ cp -Rf ~/.aether/system/rules/* .claude/rules/ 2>/dev/null || true
99
+ echo "Rules synced"
100
+ fi
101
+ ```
64
102
 
65
103
  ### Step 4: Sync Commands (with orphan cleanup)
66
104
 
67
105
  Sync command files from the hub to this repo **and remove stale files** that no longer exist in the hub. This prevents renamed or deleted commands from accumulating as orphans.
68
106
 
69
- For each directory pair, run using the Bash tool:
107
+ For each directory pair, run using the Bash tool with description "Syncing colony commands and agents...":
70
108
 
71
109
  ```bash
72
110
  # Sync Claude commands
73
111
  mkdir -p .claude/commands/ant
74
- cp -R ~/.aether/commands/claude/* .claude/commands/ant/ 2>/dev/null
112
+ cp -R ~/.aether/system/commands/claude/* .claude/commands/ant/ 2>/dev/null
75
113
  # Remove orphans: files in dest that aren't in hub
76
114
  comm -23 \
77
115
  <(cd .claude/commands/ant && find . -type f ! -name '.*' | sort) \
78
- <(cd ~/.aether/commands/claude && find . -type f ! -name '.*' | sort) \
116
+ <(cd ~/.aether/system/commands/claude && find . -type f ! -name '.*' | sort) \
79
117
  | while read f; do rm ".claude/commands/ant/$f" && echo " removed stale: .claude/commands/ant/$f"; done
80
118
  echo "claude: done"
81
119
 
82
120
  # Sync OpenCode commands
83
121
  mkdir -p .opencode/commands/ant
84
- cp -R ~/.aether/commands/opencode/* .opencode/commands/ant/ 2>/dev/null
122
+ cp -R ~/.aether/system/commands/opencode/* .opencode/commands/ant/ 2>/dev/null
85
123
  comm -23 \
86
124
  <(cd .opencode/commands/ant && find . -type f ! -name '.*' | sort) \
87
- <(cd ~/.aether/commands/opencode && find . -type f ! -name '.*' | sort) \
125
+ <(cd ~/.aether/system/commands/opencode && find . -type f ! -name '.*' | sort) \
88
126
  | while read f; do rm ".opencode/commands/ant/$f" && echo " removed stale: .opencode/commands/ant/$f"; done
89
127
  echo "opencode: done"
90
128
 
91
129
  # Sync agents
92
130
  mkdir -p .opencode/agents
93
- cp -R ~/.aether/agents/* .opencode/agents/ 2>/dev/null
131
+ cp -R ~/.aether/system/agents/* .opencode/agents/ 2>/dev/null
94
132
  comm -23 \
95
133
  <(cd .opencode/agents && find . -type f ! -name '.*' | sort) \
96
- <(cd ~/.aether/agents && find . -type f ! -name '.*' | sort) \
134
+ <(cd ~/.aether/system/agents && find . -type f ! -name '.*' | sort) \
97
135
  | while read f; do rm ".opencode/agents/$f" && echo " removed stale: .opencode/agents/$f"; done
98
136
  echo "agents: done"
99
137
  ```
@@ -102,7 +140,7 @@ Report any removed stale files in the summary.
102
140
 
103
141
  ### Step 5: Register and Version Stamp
104
142
 
105
- Run using the Bash tool:
143
+ Run using the Bash tool with description "Registering colony in hub...":
106
144
  ```
107
145
  bash .aether/aether-utils.sh registry-add "$(pwd)" "{available_version}"
108
146
  ```
@@ -117,14 +155,27 @@ Then use the Write tool to write `.aether/version.json`:
117
155
  }
118
156
  ```
119
157
 
158
+ Then delete any leftover pending sentinel (update is now complete) using the Bash tool with description "Clearing update sentinel...":
159
+ ```bash
160
+ rm -f .aether/.update-pending
161
+ ```
162
+
163
+ ### Step 5.5: Clear Version Cache
164
+
165
+ Clear the version check cache so the next command sees the fresh version:
166
+
167
+ ```bash
168
+ rm -f .aether/data/.version-check-cache
169
+ ```
170
+
120
171
  ### Step 6: Display Summary
121
172
 
122
173
  Output:
123
174
 
124
175
  ```
125
- 🔄🐜📦🐜🔄 ═══════════════════════════════════════════════════
176
+ 🔄🐜📦🐜🔄 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
126
177
  A E T H E R U P D A T E
127
- ═══════════════════════════════════════════════════ 🔄🐜📦🐜🔄
178
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🔄🐜📦🐜🔄
128
179
 
129
180
  Updated: v{current_version} -> v{available_version}
130
181
 
@@ -146,3 +197,13 @@ The CLI version (`aether update`) performs the same sync-with-cleanup and also s
146
197
 
147
198
  - `--dry-run` — Preview what would change without modifying any files
148
199
  - `--force` — Stash uncommitted changes in managed files and proceed with the update
200
+
201
+ ### Next Up
202
+
203
+ Generate the state-based Next Up block by running using the Bash tool with description "Generating Next Up suggestions...":
204
+ ```bash
205
+ state=$(jq -r '.state // "IDLE"' .aether/data/COLONY_STATE.json)
206
+ current_phase=$(jq -r '.current_phase // 0' .aether/data/COLONY_STATE.json)
207
+ total_phases=$(jq -r '.plan.phases | length' .aether/data/COLONY_STATE.json)
208
+ bash .aether/aether-utils.sh print-next-up "$state" "$current_phase" "$total_phases"
209
+ ```