aether-colony 5.2.1 → 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 (145) hide show
  1. package/.aether/aether-utils.sh +35 -0
  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/opencode/archaeology.md +331 -0
  72. package/.aether/commands/opencode/build.md +1168 -0
  73. package/.aether/commands/opencode/chaos.md +329 -0
  74. package/.aether/commands/opencode/colonize.md +195 -0
  75. package/.aether/commands/opencode/continue.md +1436 -0
  76. package/.aether/commands/opencode/council.md +437 -0
  77. package/.aether/commands/opencode/data-clean.md +77 -0
  78. package/.aether/commands/opencode/dream.md +260 -0
  79. package/.aether/commands/opencode/entomb.md +377 -0
  80. package/.aether/commands/opencode/export-signals.md +54 -0
  81. package/.aether/commands/opencode/feedback.md +99 -0
  82. package/.aether/commands/opencode/flag.md +149 -0
  83. package/.aether/commands/opencode/flags.md +167 -0
  84. package/.aether/commands/opencode/focus.md +73 -0
  85. package/.aether/commands/opencode/help.md +157 -0
  86. package/.aether/commands/opencode/history.md +136 -0
  87. package/.aether/commands/opencode/import-signals.md +68 -0
  88. package/.aether/commands/opencode/init.md +518 -0
  89. package/.aether/commands/opencode/insert-phase.md +111 -0
  90. package/.aether/commands/opencode/interpret.md +272 -0
  91. package/.aether/commands/opencode/lay-eggs.md +213 -0
  92. package/.aether/commands/opencode/maturity.md +108 -0
  93. package/.aether/commands/opencode/memory-details.md +83 -0
  94. package/.aether/commands/opencode/migrate-state.md +165 -0
  95. package/.aether/commands/opencode/oracle.md +593 -0
  96. package/.aether/commands/opencode/organize.md +226 -0
  97. package/.aether/commands/opencode/patrol.md +626 -0
  98. package/.aether/commands/opencode/pause-colony.md +203 -0
  99. package/.aether/commands/opencode/phase.md +113 -0
  100. package/.aether/commands/opencode/pheromones.md +162 -0
  101. package/.aether/commands/opencode/plan.md +684 -0
  102. package/.aether/commands/opencode/preferences.md +71 -0
  103. package/.aether/commands/opencode/quick.md +91 -0
  104. package/.aether/commands/opencode/redirect.md +84 -0
  105. package/.aether/commands/opencode/resume-colony.md +190 -0
  106. package/.aether/commands/opencode/resume.md +394 -0
  107. package/.aether/commands/opencode/run.md +237 -0
  108. package/.aether/commands/opencode/seal.md +452 -0
  109. package/.aether/commands/opencode/skill-create.md +63 -0
  110. package/.aether/commands/opencode/status.md +307 -0
  111. package/.aether/commands/opencode/swarm.md +15 -0
  112. package/.aether/commands/opencode/tunnels.md +400 -0
  113. package/.aether/commands/opencode/update.md +127 -0
  114. package/.aether/commands/opencode/verify-castes.md +139 -0
  115. package/.aether/commands/opencode/watch.md +227 -0
  116. package/.aether/docs/command-playbooks/build-full.md +1 -1
  117. package/.aether/docs/command-playbooks/build-prep.md +10 -3
  118. package/.aether/docs/command-playbooks/build-verify.md +51 -0
  119. package/.aether/docs/command-playbooks/continue-advance.md +115 -6
  120. package/.aether/docs/command-playbooks/continue-verify.md +32 -0
  121. package/.aether/utils/clash-detect.sh +239 -0
  122. package/.aether/utils/hooks/clash-pre-tool-use.js +99 -0
  123. package/.aether/utils/merge-driver-lockfile.sh +35 -0
  124. package/.aether/utils/midden.sh +534 -0
  125. package/.aether/utils/pheromone.sh +1376 -108
  126. package/.aether/utils/queen.sh +2 -4
  127. package/.aether/utils/state-api.sh +25 -4
  128. package/.aether/utils/swarm.sh +1 -1
  129. package/.aether/utils/worktree.sh +189 -0
  130. package/.claude/commands/ant/init.md +9 -3
  131. package/.opencode/commands/ant/init.md +9 -2
  132. package/CHANGELOG.md +26 -0
  133. package/README.md +11 -8
  134. package/bin/cli.js +103 -61
  135. package/bin/lib/banner.js +14 -0
  136. package/bin/lib/init.js +8 -7
  137. package/bin/lib/interactive-setup.js +251 -0
  138. package/bin/npx-entry.js +21 -0
  139. package/bin/npx-install.js +9 -167
  140. package/bin/validate-package.sh +23 -0
  141. package/package.json +2 -2
  142. package/.aether/docs/plans/pheromone-display-plan.md +0 -257
  143. package/.aether/schemas/example-prompt-builder.xml +0 -234
  144. package/.aether/scripts/incident-test-add.sh +0 -47
  145. package/.aether/scripts/weekly-audit.sh +0 -79
@@ -0,0 +1,251 @@
1
+ /**
2
+ * interactive-setup.js — Interactive menu for npx aether-colony
3
+ *
4
+ * Displays an environment-aware menu with three options:
5
+ * [1] Full setup — Install globally + set up this repo
6
+ * [2] Global only — Install hub, commands, and agents (~/.aether/)
7
+ * [3] Repo only — Set up Aether in this directory (.aether/)
8
+ *
9
+ * Zero npm dependencies — uses built-in Node readline.
10
+ */
11
+
12
+ const fs = require('fs');
13
+ const path = require('path');
14
+ const os = require('os');
15
+ const readline = require('readline');
16
+
17
+ const { BANNER } = require('./banner');
18
+
19
+ const VERSION = require('../../package.json').version;
20
+ const HOME_DIR = os.homedir();
21
+ const HUB_VERSION_PATH = path.join(HOME_DIR, '.aether', 'version.json');
22
+
23
+ /**
24
+ * Detect the current environment state.
25
+ * @returns {{ hubInstalled: boolean, hasAether: boolean, isProjectDir: boolean }}
26
+ */
27
+ function detectEnvironment() {
28
+ const cwd = process.cwd();
29
+
30
+ const hubInstalled = fs.existsSync(HUB_VERSION_PATH);
31
+
32
+ const hasAether = fs.existsSync(path.join(cwd, '.aether', 'aether-utils.sh'));
33
+
34
+ const isProjectDir =
35
+ fs.existsSync(path.join(cwd, '.git')) ||
36
+ fs.existsSync(path.join(cwd, 'package.json')) ||
37
+ fs.existsSync(path.join(cwd, 'Makefile')) ||
38
+ fs.existsSync(path.join(cwd, 'pyproject.toml')) ||
39
+ fs.existsSync(path.join(cwd, 'Cargo.toml'));
40
+
41
+ return { hubInstalled, hasAether, isProjectDir };
42
+ }
43
+
44
+ /**
45
+ * Choose the context-sensitive default menu option.
46
+ * @param {{ hubInstalled: boolean, hasAether: boolean, isProjectDir: boolean }} env
47
+ * @returns {1|2|3}
48
+ */
49
+ function getDefaultOption(env) {
50
+ if (!env.hubInstalled && env.isProjectDir) return 1;
51
+ if (!env.hubInstalled) return 2;
52
+ if (env.hubInstalled && !env.hasAether) return 3;
53
+ return 1;
54
+ }
55
+
56
+ /**
57
+ * Readline promise helper.
58
+ * @param {readline.Interface} rl
59
+ * @param {string} question
60
+ * @returns {Promise<string>}
61
+ */
62
+ function prompt(rl, question) {
63
+ return new Promise(resolve => rl.question(question, resolve));
64
+ }
65
+
66
+ /**
67
+ * Log a message with 🐜 ant prefix.
68
+ * @param {string} msg
69
+ */
70
+ function log(msg) {
71
+ console.log(`🐜 ${msg}`);
72
+ }
73
+
74
+ /**
75
+ * Main interactive setup entry point.
76
+ * Handles --global, --repo, --yes flags and non-TTY environments.
77
+ */
78
+ async function interactiveSetup() {
79
+ const args = process.argv.slice(2);
80
+ const flagGlobal = args.includes('--global');
81
+ const flagRepo = args.includes('--repo');
82
+ const flagYes = args.includes('--yes');
83
+
84
+ // Import performGlobalInstall lazily to avoid circular require issues
85
+ const { performGlobalInstall } = require('../cli');
86
+ const { initializeRepo } = require('./init');
87
+
88
+ const env = detectEnvironment();
89
+
90
+ // Non-TTY: auto-pick default without prompting
91
+ if (!process.stdin.isTTY && !flagGlobal && !flagRepo && !flagYes) {
92
+ const choice = getDefaultOption(env);
93
+ await executeChoice(choice, env, performGlobalInstall, initializeRepo);
94
+ return;
95
+ }
96
+
97
+ // Flag shortcuts: skip menu entirely
98
+ if (flagGlobal) {
99
+ await executeChoice(2, env, performGlobalInstall, initializeRepo);
100
+ return;
101
+ }
102
+ if (flagRepo) {
103
+ await executeChoice(3, env, performGlobalInstall, initializeRepo);
104
+ return;
105
+ }
106
+
107
+ // Already fully set up: offer refresh
108
+ if (env.hubInstalled && env.hasAether) {
109
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
110
+ try {
111
+ console.log(BANNER);
112
+ console.log(` 🐜 Aether Colony v${VERSION}\n`);
113
+ log('Aether is already set up in this directory.');
114
+
115
+ let answer;
116
+ if (flagYes) {
117
+ answer = 'y';
118
+ } else {
119
+ answer = await prompt(rl, '\n Already set up. Refresh? (y/n) [n]: ');
120
+ }
121
+
122
+ if (answer.trim().toLowerCase() === 'y') {
123
+ await executeChoice(1, env, performGlobalInstall, initializeRepo);
124
+ } else {
125
+ log('Nothing changed. Run /ant:init "your goal" to start a colony.');
126
+ }
127
+ } finally {
128
+ rl.close();
129
+ }
130
+ return;
131
+ }
132
+
133
+ // Interactive menu
134
+ const defaultChoice = flagYes ? getDefaultOption(env) : null;
135
+
136
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
137
+ try {
138
+ console.log(BANNER);
139
+ console.log(` 🐜 Aether Colony v${VERSION}\n`);
140
+
141
+ const defaultOption = getDefaultOption(env);
142
+ const option3Disabled = !env.isProjectDir;
143
+
144
+ console.log(' 🐜 What would you like to do?\n');
145
+ console.log(` [1] Full setup — Install globally + set up this repo${defaultOption === 1 ? ' (recommended)' : ''}`);
146
+ console.log(` [2] Global only — Install hub, commands, and agents (~/.aether/)${defaultOption === 2 ? ' (recommended)' : ''}`);
147
+ if (option3Disabled) {
148
+ console.log(' [3] Repo only — (not available: no project found in current directory)');
149
+ } else {
150
+ console.log(` [3] Repo only — Set up Aether in this directory (.aether/)${defaultOption === 3 ? ' (recommended)' : ''}`);
151
+ }
152
+ console.log('');
153
+
154
+ let choice;
155
+ if (flagYes) {
156
+ choice = defaultOption;
157
+ console.log(` Auto-selected [${choice}] (--yes flag)\n`);
158
+ } else {
159
+ const raw = await prompt(rl, ` Enter choice [${defaultOption}]: `);
160
+ const trimmed = raw.trim();
161
+ choice = trimmed === '' ? defaultOption : parseInt(trimmed, 10);
162
+ }
163
+
164
+ if (isNaN(choice) || choice < 1 || choice > 3) {
165
+ console.error('\n Invalid choice. Please run again and select 1, 2, or 3.\n');
166
+ process.exit(1);
167
+ }
168
+
169
+ if (choice === 3 && option3Disabled) {
170
+ console.error('\n Option 3 is not available outside a project directory.\n');
171
+ process.exit(1);
172
+ }
173
+
174
+ await executeChoice(choice, env, performGlobalInstall, initializeRepo);
175
+ } finally {
176
+ rl.close();
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Execute the selected menu option.
182
+ * @param {1|2|3} choice
183
+ * @param {{ hubInstalled: boolean, hasAether: boolean, isProjectDir: boolean }} env
184
+ * @param {Function} performGlobalInstall
185
+ * @param {Function} initializeRepo
186
+ */
187
+ async function executeChoice(choice, env, performGlobalInstall, initializeRepo) {
188
+ const cwd = process.cwd();
189
+
190
+ if (choice === 1) {
191
+ log('Running full setup...');
192
+ await performGlobalInstall();
193
+ const result = await initializeRepo(cwd, { setupOnly: true });
194
+ printRepoSuccess(result);
195
+ } else if (choice === 2) {
196
+ log('Running global install...');
197
+ await performGlobalInstall();
198
+ printGlobalSuccess();
199
+ } else if (choice === 3) {
200
+ if (!env.hubInstalled) {
201
+ console.error('\n Aether hub not installed. Run without --repo to install globally first.\n');
202
+ process.exit(1);
203
+ }
204
+ log('Setting up this repository...');
205
+ const result = await initializeRepo(cwd, { setupOnly: true });
206
+ printRepoSuccess(result);
207
+ }
208
+ }
209
+
210
+ /**
211
+ * Print success message after global install.
212
+ */
213
+ function printGlobalSuccess() {
214
+ console.log('');
215
+ console.log(' 🐜 Global install complete!');
216
+ console.log('');
217
+ console.log(' Next steps:');
218
+ console.log(' cd into a project, then run: npx aether-colony --repo');
219
+ console.log(' Or: aether init --goal "your goal"');
220
+ console.log(' 🐜🐜🐜')
221
+ console.log('');
222
+ }
223
+
224
+ /**
225
+ * Print success message after repo setup.
226
+ * @param {{ success: boolean, filesCopied?: number }} result
227
+ */
228
+ function printRepoSuccess(result) {
229
+ if (!result || !result.success) {
230
+ console.error('\n Repo setup failed. Check that the Aether hub is installed.\n');
231
+ return;
232
+ }
233
+ console.log('');
234
+ console.log(' 🐜 Aether is ready!');
235
+ if (result.filesCopied != null) {
236
+ console.log(` ${result.filesCopied} system files synced to .aether/`);
237
+ }
238
+ console.log('');
239
+ console.log(' Next steps:');
240
+ console.log(' In Claude Code: /ant:init "your goal"');
241
+ console.log(' Or terminal: aether init --goal "your goal"');
242
+ console.log(' 🐜🐜🐜');
243
+ console.log('');
244
+ }
245
+
246
+ module.exports = {
247
+ interactiveSetup,
248
+ detectEnvironment,
249
+ getDefaultOption,
250
+ executeChoice,
251
+ };
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * npx-entry.js — Entry point for `npx aether-colony`
4
+ *
5
+ * With no subcommand: launches interactive setup menu.
6
+ * With a subcommand (e.g. `npx aether-colony install`): delegates to full CLI.
7
+ */
8
+
9
+ const args = process.argv.slice(2);
10
+
11
+ // If a subcommand is provided (not a flag), delegate to the full CLI
12
+ if (args.length > 0 && !args[0].startsWith('-')) {
13
+ const { run } = require('./cli.js');
14
+ run();
15
+ } else {
16
+ const { interactiveSetup } = require('./lib/interactive-setup');
17
+ interactiveSetup().catch(err => {
18
+ console.error('Setup failed:', err.message);
19
+ process.exit(1);
20
+ });
21
+ }
@@ -1,177 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * npx-install.js — Professional installer for Aether Colony
4
+ * npx-install.js — Legacy installer for Aether Colony (deprecated)
5
5
  *
6
- * Usage: npx aether-colony install
7
- *
8
- * Creates the global hub at ~/.aether/ with all system files,
9
- * slash commands, and agent definitions.
6
+ * This entry point has been superseded by npx-entry.js.
7
+ * It now redirects to the interactive setup.
10
8
  */
11
9
 
12
- const fs = require('fs');
13
- const path = require('path');
14
- const os = require('os');
15
-
16
- const BANNER = `
17
- █████╗ ███████╗████████╗██╗ ██╗███████╗██████╗
18
- ██╔══██╗██╔════╝╚══██╔══╝██║ ██║██╔════╝██╔══██╗
19
- ███████║█████╗ ██║ ███████║█████╗ ██████╔╝
20
- ██╔══██║██╔══╝ ██║ ██╔══██║██╔══╝ ██╔══██╗
21
- ██║ ██║███████╗ ██║ ██║ ██║███████╗██║ ██║
22
- ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
23
- `;
24
-
25
- const AETHER_VERSION = require('../package.json').version;
26
- const HOME_DIR = os.homedir();
27
- const HUB_DIR = path.join(HOME_DIR, '.aether');
28
- const CLAUDE_COMMANDS_DIR = path.join(HOME_DIR, '.claude', 'commands', 'ant');
29
- const CLAUDE_AGENTS_DIR = path.join(HOME_DIR, '.claude', 'agents', 'ant');
30
-
31
- // Get the package root (where this script is located)
32
- const PACKAGE_ROOT = path.resolve(__dirname, '..');
33
- const AETHER_SRC = path.join(PACKAGE_ROOT, '.aether');
34
- const CLAUDE_COMMANDS_SRC = path.join(PACKAGE_ROOT, '.claude', 'commands', 'ant');
35
- const OPENCODE_AGENTS_SRC = path.join(PACKAGE_ROOT, '.opencode', 'agents');
36
- const OPENCODE_COMMANDS_SRC = path.join(PACKAGE_ROOT, '.opencode', 'commands', 'ant');
37
-
38
- function log(message, type = 'info') {
39
- const icons = {
40
- info: 'ℹ',
41
- success: '✓',
42
- warning: '⚠',
43
- error: '✗',
44
- ant: '🐜'
45
- };
46
- console.log(`${icons[type] || '•'} ${message}`);
47
- }
48
-
49
- function ensureDir(dir) {
50
- if (!fs.existsSync(dir)) {
51
- fs.mkdirSync(dir, { recursive: true });
52
- return true;
53
- }
54
- return false;
55
- }
56
-
57
- function copyDir(src, dest, options = {}) {
58
- const { exclude = [] } = options;
59
- ensureDir(dest);
60
-
61
- const entries = fs.readdirSync(src, { withFileTypes: true });
62
- let copied = 0;
63
-
64
- for (const entry of entries) {
65
- const srcPath = path.join(src, entry.name);
66
- const destPath = path.join(dest, entry.name);
67
-
68
- // Skip excluded directories
69
- if (exclude.includes(entry.name)) {
70
- continue;
71
- }
72
-
73
- if (entry.isDirectory()) {
74
- copied += copyDir(srcPath, destPath, options);
75
- } else {
76
- fs.copyFileSync(srcPath, destPath);
77
- copied++;
78
- }
79
- }
80
-
81
- return copied;
82
- }
83
-
84
- function copyFile(src, dest) {
85
- const destDir = path.dirname(dest);
86
- ensureDir(destDir);
87
- fs.copyFileSync(src, dest);
88
- }
89
-
90
10
  function install() {
91
- console.log(BANNER);
92
- console.log('\n');
93
-
94
- let filesCopied = 0;
95
-
96
- // Step 1: Create hub directory structure
97
- log('Creating hub directory structure...', 'ant');
98
- const hubDirs = [
99
- path.join(HUB_DIR, 'system'),
100
- path.join(HUB_DIR, 'system', 'docs'),
101
- path.join(HUB_DIR, 'system', 'utils'),
102
- path.join(HUB_DIR, 'system', 'templates'),
103
- path.join(HUB_DIR, 'system', 'schemas'),
104
- path.join(HUB_DIR, 'system', 'exchange'),
105
- path.join(HUB_DIR, 'system', 'rules'),
106
- path.join(HUB_DIR, 'data'),
107
- path.join(HUB_DIR, 'chambers')
108
- ];
109
-
110
- for (const dir of hubDirs) {
111
- if (ensureDir(dir)) {
112
- log(` Created ${path.relative(HOME_DIR, dir)}`, 'info');
113
- }
114
- }
115
-
116
- // Step 2: Copy system files from .aether/
117
- log('Copying system files to hub...', 'ant');
118
- if (fs.existsSync(AETHER_SRC)) {
119
- // Private directories to exclude
120
- const excludeDirs = ['data', 'dreams', 'oracle', 'checkpoints', 'locks', 'temp', 'archive', 'chambers'];
121
- filesCopied += copyDir(AETHER_SRC, path.join(HUB_DIR, 'system'), { exclude: excludeDirs });
122
- log(` Copied ${filesCopied} files from .aether/`, 'success');
123
- } else {
124
- log(' Warning: .aether/ source not found', 'warning');
125
- }
126
-
127
- // Step 3: Copy Claude Code commands
128
- log('Installing Claude Code commands...', 'ant');
129
- if (fs.existsSync(CLAUDE_COMMANDS_SRC)) {
130
- const cmdCount = copyDir(CLAUDE_COMMANDS_SRC, CLAUDE_COMMANDS_DIR);
131
- log(` Installed ${cmdCount} slash commands to ~/.claude/commands/ant/`, 'success');
132
- filesCopied += cmdCount;
133
- }
134
-
135
- // Step 4: Copy Claude Code agents (from OpenCode agents)
136
- log('Installing Claude Code agents...', 'ant');
137
- if (fs.existsSync(OPENCODE_AGENTS_SRC)) {
138
- const agentCount = copyDir(OPENCODE_AGENTS_SRC, CLAUDE_AGENTS_DIR);
139
- log(` Installed ${agentCount} agents to ~/.claude/agents/ant/`, 'success');
140
- filesCopied += agentCount;
141
- }
142
-
143
- // Step 5: Write version file
144
- const versionData = {
145
- version: AETHER_VERSION,
146
- installed_at: new Date().toISOString(),
147
- package_root: PACKAGE_ROOT
148
- };
149
- fs.writeFileSync(
150
- path.join(HUB_DIR, 'version.json'),
151
- JSON.stringify(versionData, null, 2)
152
- );
153
- log(' Version info written', 'success');
154
-
155
- // Step 6: Create global QUEEN.md if missing
156
- const globalQueen = path.join(HUB_DIR, 'QUEEN.md');
157
- if (!fs.existsSync(globalQueen)) {
158
- const queenTemplate = path.join(HUB_DIR, 'system', 'templates', 'QUEEN.md.template');
159
- if (fs.existsSync(queenTemplate)) {
160
- let content = fs.readFileSync(queenTemplate, 'utf8');
161
- content = content.replace(/{TIMESTAMP}/g, new Date().toISOString());
162
- fs.writeFileSync(globalQueen, content);
163
- log(' Created global QUEEN.md', 'success');
164
- }
165
- }
166
-
167
- // Summary
168
- console.log('\n ─────────────────────────────────────────────\n');
169
- log(`Installation complete! ${filesCopied} files installed.`, 'success');
170
- console.log('\n Next steps:\n');
171
- console.log(' 1. Run /ant:init "your goal" in any project');
172
- console.log(' 2. Use /ant:build to execute phases');
173
- console.log(' 3. Run /ant:help for command reference\n');
174
- console.log(' ─────────────────────────────────────────────\n');
11
+ console.log('\n ⚠ This installer has moved. Redirecting...\n');
12
+ const { interactiveSetup } = require('./lib/interactive-setup');
13
+ interactiveSetup().catch(err => {
14
+ console.error('Setup failed:', err.message);
15
+ process.exit(1);
16
+ });
175
17
  }
176
18
 
177
19
  // Run installer
@@ -51,6 +51,29 @@ REQUIRED_FILES=(
51
51
  "skills/colony/.manifest.json"
52
52
  "skills/domain/.manifest.json"
53
53
  "utils/file-lock.sh"
54
+ "utils/chamber-compare.sh"
55
+ "utils/chamber-utils.sh"
56
+ "utils/clash-detect.sh"
57
+ "utils/colorize-log.sh"
58
+ "utils/council.sh"
59
+ "utils/emoji-audit.sh"
60
+ "utils/immune.sh"
61
+ "utils/merge-driver-lockfile.sh"
62
+ "utils/scan.sh"
63
+ "utils/semantic-cli.sh"
64
+ "utils/spawn-tree.sh"
65
+ "utils/state-loader.sh"
66
+ "utils/swarm-display.sh"
67
+ "utils/watch-spawn-tree.sh"
68
+ "utils/worktree.sh"
69
+ "utils/xml-compose.sh"
70
+ "utils/xml-convert.sh"
71
+ "utils/xml-core.sh"
72
+ "utils/xml-query.sh"
73
+ "utils/xml-utils.sh"
74
+ "utils/hooks/clash-pre-tool-use.js"
75
+ "utils/oracle/oracle.sh"
76
+ "utils/queen-to-md.xsl"
54
77
  "templates/QUEEN.md.template"
55
78
  "templates/colony-state.template.json"
56
79
  "templates/constraints.template.json"
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "aether-colony",
3
- "version": "5.2.1",
3
+ "version": "5.3.0",
4
4
  "description": "Multi-agent system using ant colony intelligence for Claude Code and OpenCode — workers self-organize via pheromone signals",
5
5
  "bin": {
6
6
  "aether": "bin/cli.js",
7
- "aether-colony": "bin/npx-install.js"
7
+ "aether-colony": "bin/npx-entry.js"
8
8
  },
9
9
  "files": [
10
10
  "bin/",