aoaoe 0.25.3 → 0.26.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.
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Integration test for aoaoe — end-to-end test with real aoe sessions.
4
+ *
5
+ * Creates two throwaway AoE sessions, starts the aoaoe daemon, verifies
6
+ * that the daemon can observe and interact with the sessions, then cleans
7
+ * everything up.
8
+ *
9
+ * Prerequisites: aoe, opencode, tmux must be on $PATH.
10
+ * Run: npm run integration-test
11
+ *
12
+ * This is NOT part of `npm test` — it requires a live environment with
13
+ * real CLI tools and takes 2-3 minutes to complete.
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=integration-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-test.d.ts","sourceRoot":"","sources":["../src/integration-test.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,352 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Integration test for aoaoe — end-to-end test with real aoe sessions.
4
+ *
5
+ * Creates two throwaway AoE sessions, starts the aoaoe daemon, verifies
6
+ * that the daemon can observe and interact with the sessions, then cleans
7
+ * everything up.
8
+ *
9
+ * Prerequisites: aoe, opencode, tmux must be on $PATH.
10
+ * Run: npm run integration-test
11
+ *
12
+ * This is NOT part of `npm test` — it requires a live environment with
13
+ * real CLI tools and takes 2-3 minutes to complete.
14
+ */
15
+ import { execFile as execFileCb } from "node:child_process";
16
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { homedir } from "node:os";
19
+ import { setTimeout as sleep } from "node:timers/promises";
20
+ // ── Constants ────────────────────────────────────────────────────────────────
21
+ const TEST_DIR = "/tmp/aoaoe-itest";
22
+ const SESSION_1_TITLE = "aoaoe-itest-1";
23
+ const SESSION_2_TITLE = "aoaoe-itest-2";
24
+ const DAEMON_TMUX = "aoaoe_itest_daemon";
25
+ const DAEMON_LOG = join(TEST_DIR, "daemon.log");
26
+ const DAEMON_STATE = join(homedir(), ".aoaoe", "daemon-state.json");
27
+ // timeouts
28
+ const SESSION_START_WAIT_MS = 8_000; // wait for AoE session to fully start
29
+ const DAEMON_START_WAIT_MS = 10_000; // wait for daemon to complete first tick
30
+ const TASK_WAIT_MS = 90_000; // wait for agent to complete a task
31
+ const POLL_INTERVAL_MS = 5_000; // how often to check for task completion
32
+ function exec(cmd, args, timeoutMs = 30_000) {
33
+ return new Promise((resolve) => {
34
+ execFileCb(cmd, args, { timeout: timeoutMs, maxBuffer: 10 * 1024 * 1024 }, (err, stdout, stderr) => {
35
+ if (err) {
36
+ const e = err;
37
+ const exitCode = typeof e.code === "number" ? e.code : 1;
38
+ resolve({ stdout: stdout ?? "", stderr: stderr ?? "", exitCode });
39
+ return;
40
+ }
41
+ resolve({ stdout: stdout ?? "", stderr: stderr ?? "", exitCode: 0 });
42
+ });
43
+ });
44
+ }
45
+ function log(msg) {
46
+ const ts = new Date().toISOString().slice(11, 23);
47
+ console.log(`[${ts}] ${msg}`);
48
+ }
49
+ function fail(msg) {
50
+ console.error(`\n❌ FAIL: ${msg}\n`);
51
+ process.exit(1);
52
+ }
53
+ function pass(msg) {
54
+ console.log(` ✅ ${msg}`);
55
+ }
56
+ // ── Phase 0: Prerequisites ──────────────────────────────────────────────────
57
+ async function checkPrerequisites() {
58
+ log("Phase 0: Checking prerequisites...");
59
+ for (const tool of ["aoe", "opencode", "tmux"]) {
60
+ const result = await exec("which", [tool]);
61
+ if (result.exitCode !== 0)
62
+ fail(`${tool} not found on PATH`);
63
+ }
64
+ // verify aoe is responsive
65
+ const aoeList = await exec("aoe", ["list", "--json"]);
66
+ if (aoeList.exitCode !== 0)
67
+ fail("aoe list --json failed");
68
+ pass("aoe, opencode, tmux all available");
69
+ }
70
+ async function createTestSessions() {
71
+ log("Phase 1: Creating test sessions...");
72
+ // create project directories with simple test files
73
+ const dir1 = join(TEST_DIR, "project-1");
74
+ const dir2 = join(TEST_DIR, "project-2");
75
+ mkdirSync(dir1, { recursive: true });
76
+ mkdirSync(dir2, { recursive: true });
77
+ // write a simple AGENTS.md for each so context loading has something to find
78
+ writeFileSync(join(dir1, "AGENTS.md"), "# Project 1\nIntegration test project. Do whatever is asked.\n");
79
+ writeFileSync(join(dir2, "AGENTS.md"), "# Project 2\nIntegration test project. Do whatever is asked.\n");
80
+ // create sessions via aoe add
81
+ const s1 = await createOneSession(dir1, SESSION_1_TITLE);
82
+ const s2 = await createOneSession(dir2, SESSION_2_TITLE);
83
+ // start both sessions
84
+ await exec("aoe", ["session", "start", s1.id]);
85
+ await exec("aoe", ["session", "start", s2.id]);
86
+ log(` Waiting ${SESSION_START_WAIT_MS / 1000}s for sessions to initialize...`);
87
+ await sleep(SESSION_START_WAIT_MS);
88
+ // verify both tmux sessions exist
89
+ for (const s of [s1, s2]) {
90
+ const check = await exec("tmux", ["has-session", "-t", s.tmuxName]);
91
+ if (check.exitCode !== 0)
92
+ fail(`tmux session ${s.tmuxName} not found after start`);
93
+ }
94
+ pass(`Created sessions: ${s1.id.slice(0, 8)} (${s1.title}), ${s2.id.slice(0, 8)} (${s2.title})`);
95
+ return [s1, s2];
96
+ }
97
+ async function createOneSession(dir, title) {
98
+ const result = await exec("aoe", ["add", dir, "-t", title, "-c", "opencode", "-y"]);
99
+ if (result.exitCode !== 0)
100
+ fail(`aoe add failed for ${title}: ${result.stderr}`);
101
+ // parse ID from aoe list
102
+ const list = await exec("aoe", ["list", "--json"]);
103
+ const sessions = JSON.parse(list.stdout);
104
+ const found = sessions.find((s) => s.title === title);
105
+ if (!found)
106
+ fail(`session "${title}" not found in aoe list after creation`);
107
+ // tmux name format: aoe_<sanitized_title>_<first8_of_id>
108
+ const sanitized = title.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 20);
109
+ const tmuxName = `aoe_${sanitized}_${found.id.slice(0, 8)}`;
110
+ return { id: found.id, title, tmuxName, dir };
111
+ }
112
+ // ── Phase 2: Start daemon ───────────────────────────────────────────────────
113
+ async function startDaemon() {
114
+ log("Phase 2: Starting daemon in tmux session...");
115
+ // kill any stale daemon tmux session
116
+ await exec("tmux", ["kill-session", "-t", DAEMON_TMUX]);
117
+ // start daemon in a detached tmux session, logging to file
118
+ // use --dry-run=false and a short poll interval for faster tests
119
+ const daemonCmd = `cd /Users/kadler/Documents/repos && npx aoaoe --verbose 2>&1 | tee ${DAEMON_LOG}`;
120
+ const result = await exec("tmux", [
121
+ "new-session", "-d", "-s", DAEMON_TMUX, "-x", "200", "-y", "50", daemonCmd,
122
+ ]);
123
+ if (result.exitCode !== 0)
124
+ fail(`failed to start daemon tmux session: ${result.stderr}`);
125
+ log(` Waiting ${DAEMON_START_WAIT_MS / 1000}s for daemon to complete first tick...`);
126
+ await sleep(DAEMON_START_WAIT_MS);
127
+ // verify daemon is running by checking tmux session exists
128
+ const check = await exec("tmux", ["has-session", "-t", DAEMON_TMUX]);
129
+ if (check.exitCode !== 0)
130
+ fail("daemon tmux session died");
131
+ pass("Daemon started in tmux session");
132
+ }
133
+ // ── Phase 3: Test scenarios ─────────────────────────────────────────────────
134
+ async function testDaemonStateFile() {
135
+ log("Test 1: Daemon state file exists and has sessions...");
136
+ // daemon should have written state file after first tick
137
+ if (!existsSync(DAEMON_STATE)) {
138
+ // give it a few more seconds
139
+ await sleep(5_000);
140
+ if (!existsSync(DAEMON_STATE))
141
+ fail("daemon-state.json not found");
142
+ }
143
+ const state = JSON.parse(readFileSync(DAEMON_STATE, "utf-8"));
144
+ if (typeof state.pollCount !== "number")
145
+ fail("daemon state missing pollCount");
146
+ if (!Array.isArray(state.sessions))
147
+ fail("daemon state missing sessions array");
148
+ // should see our test sessions (plus possibly the main aoaoe session)
149
+ const testSessions = state.sessions.filter((s) => s.title === SESSION_1_TITLE || s.title === SESSION_2_TITLE);
150
+ if (testSessions.length < 2) {
151
+ fail(`expected 2 test sessions in daemon state, found ${testSessions.length}: ${JSON.stringify(state.sessions.map((s) => s.title))}`);
152
+ }
153
+ pass(`Daemon state has ${state.sessions.length} sessions, pollCount=${state.pollCount}`);
154
+ }
155
+ async function testTmuxCapture(sessions) {
156
+ log("Test 2: tmux capture-pane works for test sessions...");
157
+ for (const s of sessions) {
158
+ const cap = await exec("tmux", ["capture-pane", "-t", s.tmuxName, "-p", "-S", "-50"]);
159
+ if (cap.exitCode !== 0)
160
+ fail(`tmux capture failed for ${s.tmuxName}: ${cap.stderr}`);
161
+ // output should be non-empty (at minimum opencode shows its UI)
162
+ if (cap.stdout.trim().length === 0) {
163
+ log(` Warning: empty capture for ${s.title} — agent may still be loading`);
164
+ }
165
+ }
166
+ pass("tmux capture-pane works for both test sessions");
167
+ }
168
+ async function testDaemonObservation(sessions) {
169
+ log("Test 3: Daemon log shows observation of test sessions...");
170
+ // capture daemon pane to check for log lines
171
+ const cap = await exec("tmux", ["capture-pane", "-t", DAEMON_TMUX, "-p", "-S", "-200"]);
172
+ if (cap.exitCode !== 0)
173
+ fail("cannot capture daemon pane");
174
+ const output = cap.stdout;
175
+ // daemon should show session names in its output
176
+ let foundSessions = 0;
177
+ for (const s of sessions) {
178
+ // the daemon dashboard shows session titles
179
+ if (output.includes(s.title) || output.includes(s.id.slice(0, 8))) {
180
+ foundSessions++;
181
+ }
182
+ }
183
+ if (foundSessions === 0) {
184
+ // check if daemon log file has the info instead
185
+ if (existsSync(DAEMON_LOG)) {
186
+ const logContent = readFileSync(DAEMON_LOG, "utf-8");
187
+ for (const s of sessions) {
188
+ if (logContent.includes(s.title) || logContent.includes(s.id.slice(0, 8))) {
189
+ foundSessions++;
190
+ }
191
+ }
192
+ }
193
+ }
194
+ if (foundSessions < 2) {
195
+ log(` Warning: only found ${foundSessions}/2 test sessions in daemon output (may need more time)`);
196
+ }
197
+ pass(`Daemon observing ${foundSessions}/2 test sessions`);
198
+ }
199
+ async function testSendInput(session) {
200
+ log("Test 4: Can send input via tmux send-keys...");
201
+ // send a simple echo command to verify tmux send-keys works
202
+ // we use -l for literal text, then Enter separately (matching executor pattern)
203
+ const textOk = await exec("tmux", ["send-keys", "-t", session.tmuxName, "-l", 'echo "ITEST_PING"']);
204
+ if (textOk.exitCode !== 0)
205
+ fail(`send-keys text failed for ${session.tmuxName}`);
206
+ const enterOk = await exec("tmux", ["send-keys", "-t", session.tmuxName, "Enter"]);
207
+ if (enterOk.exitCode !== 0)
208
+ fail(`send-keys Enter failed for ${session.tmuxName}`);
209
+ // wait a moment, then capture and look for our string
210
+ await sleep(3_000);
211
+ const cap = await exec("tmux", ["capture-pane", "-t", session.tmuxName, "-p", "-S", "-50"]);
212
+ if (cap.stdout.includes("ITEST_PING")) {
213
+ pass("send-keys round-trip verified (ITEST_PING found in output)");
214
+ }
215
+ else {
216
+ // this is ok — the agent might have consumed the input before we captured
217
+ pass("send-keys completed (agent may have already processed the input)");
218
+ }
219
+ }
220
+ async function testContextDiscovery(sessions) {
221
+ log("Test 5: Context files are discoverable for test projects...");
222
+ // run aoaoe test-context to verify context loading works
223
+ const result = await exec("npx", ["aoaoe", "test-context"], 30_000);
224
+ // test-context should mention our test session directories
225
+ let found = 0;
226
+ for (const s of sessions) {
227
+ if (result.stdout.includes(s.title) || result.stdout.includes("AGENTS.md")) {
228
+ found++;
229
+ }
230
+ }
231
+ // even if test-context doesn't find our sessions (they may not resolve to test dirs
232
+ // from /Users/kadler/Documents/repos), the command should succeed
233
+ if (result.exitCode !== 0) {
234
+ log(` Warning: test-context exited with code ${result.exitCode}`);
235
+ }
236
+ pass(`Context discovery completed (test-context exit code: ${result.exitCode})`);
237
+ }
238
+ async function testDaemonLogNoTimeouts() {
239
+ log("Test 6: No reasoner timeouts in daemon log...");
240
+ if (!existsSync(DAEMON_LOG)) {
241
+ pass("No daemon log file yet (daemon may not have reasoned yet)");
242
+ return;
243
+ }
244
+ const logContent = readFileSync(DAEMON_LOG, "utf-8");
245
+ const timeoutLines = logContent
246
+ .split("\n")
247
+ .filter((line) => line.includes("timed out") || line.includes("TIMEOUT"));
248
+ if (timeoutLines.length > 0) {
249
+ log(` Warning: Found ${timeoutLines.length} timeout lines in daemon log`);
250
+ for (const line of timeoutLines.slice(0, 3)) {
251
+ log(` ${line.slice(0, 120)}`);
252
+ }
253
+ }
254
+ pass(`Daemon log: ${timeoutLines.length} timeout(s) found`);
255
+ }
256
+ async function testSessionRemoval() {
257
+ log("Test 7: Session removal via aoe remove...");
258
+ // list current sessions
259
+ const before = await exec("aoe", ["list", "--json"]);
260
+ const beforeSessions = JSON.parse(before.stdout);
261
+ const testBefore = beforeSessions.filter((s) => s.title === SESSION_1_TITLE || s.title === SESSION_2_TITLE);
262
+ if (testBefore.length === 0) {
263
+ pass("No test sessions to remove (already cleaned up)");
264
+ return;
265
+ }
266
+ // remove test sessions
267
+ for (const s of testBefore) {
268
+ // aoe remove does NOT accept -y, pipe "y" to confirm
269
+ const result = await exec("bash", ["-c", `echo "y" | aoe remove ${s.id}`]);
270
+ if (result.exitCode !== 0) {
271
+ log(` Warning: failed to remove session ${s.id}: ${result.stderr}`);
272
+ }
273
+ }
274
+ // verify removal
275
+ await sleep(2_000);
276
+ const after = await exec("aoe", ["list", "--json"]);
277
+ const afterSessions = JSON.parse(after.stdout);
278
+ const testAfter = afterSessions.filter((s) => s.title === SESSION_1_TITLE || s.title === SESSION_2_TITLE);
279
+ if (testAfter.length > 0) {
280
+ log(` Warning: ${testAfter.length} test session(s) still present after removal`);
281
+ }
282
+ else {
283
+ pass("All test sessions removed successfully");
284
+ }
285
+ }
286
+ // ── Phase 4: Cleanup ────────────────────────────────────────────────────────
287
+ async function cleanup() {
288
+ log("Phase 4: Cleanup...");
289
+ // stop daemon tmux session
290
+ await exec("tmux", ["kill-session", "-t", DAEMON_TMUX]);
291
+ // remove any remaining test sessions
292
+ const list = await exec("aoe", ["list", "--json"]);
293
+ if (list.exitCode === 0) {
294
+ try {
295
+ const sessions = JSON.parse(list.stdout);
296
+ for (const s of sessions) {
297
+ if (s.title === SESSION_1_TITLE || s.title === SESSION_2_TITLE) {
298
+ await exec("bash", ["-c", `echo "y" | aoe remove ${s.id}`]);
299
+ }
300
+ }
301
+ }
302
+ catch { }
303
+ }
304
+ // clean temp directory
305
+ try {
306
+ rmSync(TEST_DIR, { recursive: true, force: true });
307
+ }
308
+ catch { }
309
+ pass("Cleanup complete");
310
+ }
311
+ // ── Main ────────────────────────────────────────────────────────────────────
312
+ async function main() {
313
+ console.log("\n╔══════════════════════════════════════════════╗");
314
+ console.log("║ aoaoe Integration Test ║");
315
+ console.log("╚══════════════════════════════════════════════╝\n");
316
+ const startTime = Date.now();
317
+ let sessions = [];
318
+ try {
319
+ // Phase 0
320
+ await checkPrerequisites();
321
+ // Phase 1: Create test sessions
322
+ const [s1, s2] = await createTestSessions();
323
+ sessions = [s1, s2];
324
+ // Phase 2: Start daemon
325
+ await startDaemon();
326
+ // Phase 3: Run tests
327
+ await testDaemonStateFile();
328
+ await testTmuxCapture(sessions);
329
+ await testDaemonObservation(sessions);
330
+ await testSendInput(s1);
331
+ await testContextDiscovery(sessions);
332
+ await testDaemonLogNoTimeouts();
333
+ // Test 7 is destructive — does its own session removal
334
+ await testSessionRemoval();
335
+ }
336
+ catch (err) {
337
+ console.error(`\n💥 Unexpected error: ${err}`);
338
+ }
339
+ finally {
340
+ // Always clean up
341
+ await cleanup();
342
+ }
343
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
344
+ console.log(`\n────────────────────────────────────────────────`);
345
+ console.log(`Integration test completed in ${elapsed}s`);
346
+ console.log(`────────────────────────────────────────────────\n`);
347
+ }
348
+ main().catch((err) => {
349
+ console.error("Fatal:", err);
350
+ process.exit(1);
351
+ });
352
+ //# sourceMappingURL=integration-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-test.js","sourceRoot":"","sources":["../src/integration-test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aoaoe",
3
- "version": "0.25.3",
3
+ "version": "0.26.0",
4
4
  "description": "Autonomous supervisor for agent-of-empires sessions using OpenCode or Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -19,6 +19,7 @@
19
19
  "start": "node dist/index.js",
20
20
  "lint": "tsc --noEmit",
21
21
  "test": "npm run build && node --test --test-reporter spec dist/*.test.js dist/**/*.test.js",
22
+ "integration-test": "npm run build && node dist/integration-test.js",
22
23
  "clean": "rm -rf dist",
23
24
  "prepublishOnly": "npm run build"
24
25
  },