dot-agents 0.6.0 → 0.7.5

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 (80) hide show
  1. package/dist/cli/commands/channel.d.ts.map +1 -1
  2. package/dist/cli/commands/channel.js +70 -2
  3. package/dist/cli/commands/channel.js.map +1 -1
  4. package/dist/daemon/api/channels.d.ts +6 -0
  5. package/dist/daemon/api/channels.d.ts.map +1 -0
  6. package/dist/daemon/api/channels.js +143 -0
  7. package/dist/daemon/api/channels.js.map +1 -0
  8. package/dist/daemon/api/server.d.ts.map +1 -1
  9. package/dist/daemon/api/server.js +57 -0
  10. package/dist/daemon/api/server.js.map +1 -1
  11. package/dist/daemon/daemon.d.ts +28 -0
  12. package/dist/daemon/daemon.d.ts.map +1 -1
  13. package/dist/daemon/daemon.js +174 -6
  14. package/dist/daemon/daemon.js.map +1 -1
  15. package/dist/daemon/lib/index.d.ts +1 -0
  16. package/dist/daemon/lib/index.d.ts.map +1 -1
  17. package/dist/daemon/lib/index.js +1 -0
  18. package/dist/daemon/lib/index.js.map +1 -1
  19. package/dist/daemon/lib/safeguards.d.ts +135 -0
  20. package/dist/daemon/lib/safeguards.d.ts.map +1 -0
  21. package/dist/daemon/lib/safeguards.js +250 -0
  22. package/dist/daemon/lib/safeguards.js.map +1 -0
  23. package/dist/daemon/lib/watcher.d.ts.map +1 -1
  24. package/dist/daemon/lib/watcher.js +48 -8
  25. package/dist/daemon/lib/watcher.js.map +1 -1
  26. package/dist/daemon/web/app.js +433 -0
  27. package/dist/daemon/web/index.html +68 -0
  28. package/dist/daemon/web/styles.css +452 -0
  29. package/dist/lib/environment.d.ts +1 -0
  30. package/dist/lib/environment.d.ts.map +1 -1
  31. package/dist/lib/environment.js +14 -0
  32. package/dist/lib/environment.js.map +1 -1
  33. package/dist/lib/invoke.d.ts +8 -0
  34. package/dist/lib/invoke.d.ts.map +1 -1
  35. package/dist/lib/invoke.js +28 -16
  36. package/dist/lib/invoke.js.map +1 -1
  37. package/dist/lib/processor.d.ts +8 -0
  38. package/dist/lib/processor.d.ts.map +1 -1
  39. package/dist/lib/processor.js +16 -2
  40. package/dist/lib/processor.js.map +1 -1
  41. package/dist/lib/validation/persona.d.ts.map +1 -1
  42. package/dist/lib/validation/persona.js +41 -4
  43. package/dist/lib/validation/persona.js.map +1 -1
  44. package/package.json +15 -9
  45. package/dist/lib/channel.test.d.ts +0 -2
  46. package/dist/lib/channel.test.d.ts.map +0 -1
  47. package/dist/lib/channel.test.js +0 -33
  48. package/dist/lib/channel.test.js.map +0 -1
  49. package/dist/lib/frontmatter.test.d.ts +0 -2
  50. package/dist/lib/frontmatter.test.d.ts.map +0 -1
  51. package/dist/lib/frontmatter.test.js +0 -60
  52. package/dist/lib/frontmatter.test.js.map +0 -1
  53. package/dist/lib/integration.test.d.ts +0 -2
  54. package/dist/lib/integration.test.d.ts.map +0 -1
  55. package/dist/lib/integration.test.js +0 -445
  56. package/dist/lib/integration.test.js.map +0 -1
  57. package/dist/lib/invoke.test.d.ts +0 -2
  58. package/dist/lib/invoke.test.d.ts.map +0 -1
  59. package/dist/lib/invoke.test.js +0 -82
  60. package/dist/lib/invoke.test.js.map +0 -1
  61. package/dist/lib/persona.test.d.ts +0 -2
  62. package/dist/lib/persona.test.d.ts.map +0 -1
  63. package/dist/lib/persona.test.js +0 -324
  64. package/dist/lib/persona.test.js.map +0 -1
  65. package/dist/lib/processor.test.d.ts +0 -2
  66. package/dist/lib/processor.test.d.ts.map +0 -1
  67. package/dist/lib/processor.test.js +0 -134
  68. package/dist/lib/processor.test.js.map +0 -1
  69. package/dist/lib/registry.test.d.ts +0 -2
  70. package/dist/lib/registry.test.d.ts.map +0 -1
  71. package/dist/lib/registry.test.js +0 -236
  72. package/dist/lib/registry.test.js.map +0 -1
  73. package/dist/lib/session-thread.test.d.ts +0 -2
  74. package/dist/lib/session-thread.test.d.ts.map +0 -1
  75. package/dist/lib/session-thread.test.js +0 -235
  76. package/dist/lib/session-thread.test.js.map +0 -1
  77. package/dist/lib/session.test.d.ts +0 -2
  78. package/dist/lib/session.test.d.ts.map +0 -1
  79. package/dist/lib/session.test.js +0 -336
  80. package/dist/lib/session.test.js.map +0 -1
@@ -1,445 +0,0 @@
1
- import { describe, it, before, after } from "node:test";
2
- import assert from "node:assert";
3
- import { join, dirname } from "node:path";
4
- import { fileURLToPath } from "node:url";
5
- import { mkdir, writeFile, rm, stat } from "node:fs/promises";
6
- /**
7
- * Integration tests for the cross-project channel flow:
8
- * channels publish @project → message lands in @root → channels process @root → invokes root persona
9
- *
10
- * These tests validate that the pieces connect end-to-end, catching gaps like:
11
- * - Root persona not being recognized at .agents/PERSONA.md
12
- * - personaExists() not finding root persona
13
- * - invokePersona path resolution failures
14
- */
15
- const __filename = fileURLToPath(import.meta.url);
16
- const __dirname = dirname(__filename);
17
- const PROJECT_ROOT = join(__dirname, "..", "..");
18
- // Import pure functions for testing (inline where needed to avoid module issues)
19
- const PERSONA_FILENAME = "PERSONA.md";
20
- async function hasPersonaFile(dirPath) {
21
- try {
22
- const filePath = join(dirPath, PERSONA_FILENAME);
23
- const stats = await stat(filePath);
24
- return stats.isFile();
25
- }
26
- catch {
27
- return false;
28
- }
29
- }
30
- // Inline persona path resolution (mirrors invoke.ts:51-53)
31
- function resolvePersonaPath(personaName, agentsDir, personasDir) {
32
- if (personaName === "root") {
33
- return agentsDir;
34
- }
35
- return join(personasDir, personaName);
36
- }
37
- // Inline personaExists (mirrors processor.ts:93-116)
38
- async function personaExists(config, channelName, listPersonasFn) {
39
- const personaName = channelName.slice(1);
40
- if (personaName === "root") {
41
- return await hasPersonaFile(config.agentsDir);
42
- }
43
- const personaPaths = await listPersonasFn();
44
- for (const path of personaPaths) {
45
- const parts = path.split("/");
46
- const name = parts[parts.length - 1];
47
- if (name === personaName) {
48
- return true;
49
- }
50
- }
51
- return false;
52
- }
53
- function parseChannelAddress(address) {
54
- if (!address.startsWith("#") && !address.startsWith("@")) {
55
- throw new Error(`Invalid channel address: ${address}. Must start with # or @`);
56
- }
57
- const type = address[0];
58
- const rest = address.slice(1);
59
- const slashIndex = rest.indexOf("/");
60
- if (slashIndex > 0) {
61
- const project = rest.slice(0, slashIndex);
62
- const name = rest.slice(slashIndex + 1);
63
- if (!name) {
64
- throw new Error(`Invalid channel address: ${address}. Missing channel/persona name after project.`);
65
- }
66
- return { project, type, name, original: address };
67
- }
68
- return { project: null, type, name: rest, original: address };
69
- }
70
- function resolveChannelAddress(address, localChannelsDir, projectRegistry) {
71
- const parsed = parseChannelAddress(address);
72
- if (parsed.project === null && parsed.type === "@") {
73
- const projectPath = projectRegistry[parsed.name];
74
- if (projectPath) {
75
- return {
76
- channelsDir: `${projectPath}/channels`,
77
- localChannelName: "@root",
78
- isProjectEntryPoint: true,
79
- projectName: parsed.name,
80
- };
81
- }
82
- }
83
- if (parsed.project === null) {
84
- return {
85
- channelsDir: localChannelsDir,
86
- localChannelName: address,
87
- };
88
- }
89
- const projectPath = projectRegistry[parsed.project];
90
- if (!projectPath) {
91
- throw new Error(`Unknown project: ${parsed.project}`);
92
- }
93
- return {
94
- channelsDir: `${projectPath}/channels`,
95
- localChannelName: `${parsed.type}${parsed.name}`,
96
- projectName: parsed.project,
97
- };
98
- }
99
- describe("Integration: Cross-project channel flow", () => {
100
- /**
101
- * This test suite validates the complete flow:
102
- * 1. @project address resolution routes to @root
103
- * 2. @root channel maps to root persona
104
- * 3. Root persona exists at .agents/PERSONA.md
105
- * 4. Persona path resolution returns agentsDir for root
106
- *
107
- * This is the exact flow that was broken before the root persona fix.
108
- */
109
- const projectRegistry = {
110
- "dot-agents": join(PROJECT_ROOT, ".agents"),
111
- "remote-project": "/path/to/remote/.agents",
112
- };
113
- describe("Step 1: @project routes to @root", () => {
114
- it("@dot-agents routes to dot-agents project's @root channel", () => {
115
- const result = resolveChannelAddress("@dot-agents", "/local/.agents/channels", projectRegistry);
116
- assert.strictEqual(result.localChannelName, "@root", "@project should route to @root");
117
- assert.strictEqual(result.isProjectEntryPoint, true);
118
- assert.strictEqual(result.projectName, "dot-agents");
119
- });
120
- it("preserves @root when already specified", () => {
121
- // If someone explicitly uses @project/root, it should still work
122
- const result = resolveChannelAddress("@dot-agents/root", "/local/.agents/channels", projectRegistry);
123
- assert.strictEqual(result.localChannelName, "@root");
124
- assert.strictEqual(result.projectName, "dot-agents");
125
- });
126
- });
127
- describe("Step 2: @root channel maps to root persona", () => {
128
- it("@root extracts 'root' as persona name", () => {
129
- const channel = "@root";
130
- const personaName = channel.slice(1);
131
- assert.strictEqual(personaName, "root");
132
- });
133
- it("personaExists finds root at .agents/PERSONA.md", async () => {
134
- const config = {
135
- agentsDir: join(PROJECT_ROOT, ".agents"),
136
- personasDir: join(PROJECT_ROOT, ".agents", "personas"),
137
- };
138
- const exists = await personaExists(config, "@root", async () => []);
139
- assert.strictEqual(exists, true, "Root persona should exist at .agents/PERSONA.md");
140
- });
141
- it("personaExists does NOT look in personasDir for root", async () => {
142
- // This is the bug we fixed: root was looked up in personas/ directory
143
- const config = {
144
- agentsDir: "/nonexistent-agents", // No PERSONA.md here
145
- personasDir: "/path/to/personas", // Would have root/ here
146
- };
147
- // Even if listPersonas would return a "root" persona, @root should check agentsDir
148
- const mockListPersonas = async () => ["/path/to/personas/root"];
149
- const exists = await personaExists(config, "@root", mockListPersonas);
150
- assert.strictEqual(exists, false, "Should check agentsDir, not personas list");
151
- });
152
- });
153
- describe("Step 3: Root persona path resolution", () => {
154
- it("'root' persona resolves to agentsDir", () => {
155
- const agentsDir = "/project/.agents";
156
- const personasDir = "/project/.agents/personas";
157
- const path = resolvePersonaPath("root", agentsDir, personasDir);
158
- assert.strictEqual(path, agentsDir, "Root should resolve to agentsDir");
159
- });
160
- it("'root' does NOT resolve to personasDir/root", () => {
161
- const agentsDir = "/project/.agents";
162
- const personasDir = "/project/.agents/personas";
163
- const path = resolvePersonaPath("root", agentsDir, personasDir);
164
- assert.notStrictEqual(path, join(personasDir, "root"), "Root should NOT be in personas dir");
165
- });
166
- it("other personas still resolve to personasDir/<name>", () => {
167
- const agentsDir = "/project/.agents";
168
- const personasDir = "/project/.agents/personas";
169
- const path = resolvePersonaPath("developer", agentsDir, personasDir);
170
- assert.strictEqual(path, join(personasDir, "developer"));
171
- });
172
- });
173
- describe("Step 4: End-to-end path validation", () => {
174
- it("complete flow: @project → @root → root persona → agentsDir", () => {
175
- // Simulate the complete flow
176
- const localChannelsDir = "/caller/.agents/channels";
177
- // Step 1: Resolve @dot-agents to @root
178
- const resolved = resolveChannelAddress("@dot-agents", localChannelsDir, projectRegistry);
179
- assert.strictEqual(resolved.localChannelName, "@root");
180
- // Step 2: Extract persona name
181
- const personaName = resolved.localChannelName.slice(1);
182
- assert.strictEqual(personaName, "root");
183
- // Step 3: Resolve persona path
184
- const agentsDir = projectRegistry["dot-agents"];
185
- const personasDir = join(agentsDir, "personas");
186
- const personaPath = resolvePersonaPath(personaName, agentsDir, personasDir);
187
- assert.strictEqual(personaPath, agentsDir, "Complete flow should end at agentsDir");
188
- });
189
- it("actual project has PERSONA.md at expected location", async () => {
190
- // Verify the actual dot-agents project structure
191
- const agentsDir = join(PROJECT_ROOT, ".agents");
192
- const exists = await hasPersonaFile(agentsDir);
193
- assert.strictEqual(exists, true, "dot-agents should have .agents/PERSONA.md");
194
- });
195
- });
196
- });
197
- describe("Integration: Cross-project delegation with isolated fixture", () => {
198
- /**
199
- * Test with isolated fixtures to avoid depending on actual project structure.
200
- * Creates temporary project structures to validate the integration.
201
- */
202
- const testRoot = join(PROJECT_ROOT, ".test-fixtures", `integration-${Date.now()}`);
203
- const projectA = join(testRoot, "project-a");
204
- const projectB = join(testRoot, "project-b");
205
- before(async () => {
206
- // Create project A with root persona
207
- await mkdir(join(projectA, ".agents", "channels", "@root"), { recursive: true });
208
- await writeFile(join(projectA, ".agents", "PERSONA.md"), `---
209
- name: root
210
- cmd: "echo"
211
- ---
212
- I am project A's entry point.
213
- `);
214
- // Create project B with root persona
215
- await mkdir(join(projectB, ".agents", "channels", "@root"), { recursive: true });
216
- await writeFile(join(projectB, ".agents", "PERSONA.md"), `---
217
- name: root
218
- cmd: "echo"
219
- ---
220
- I am project B's entry point.
221
- `);
222
- // Create project A with a named persona (developer)
223
- await mkdir(join(projectA, ".agents", "personas", "developer"), { recursive: true });
224
- await writeFile(join(projectA, ".agents", "personas", "developer", "PERSONA.md"), `---
225
- name: developer
226
- cmd: "echo"
227
- ---
228
- I am project A's developer persona.
229
- `);
230
- });
231
- after(async () => {
232
- try {
233
- await rm(testRoot, { recursive: true, force: true });
234
- }
235
- catch {
236
- // Ignore cleanup errors
237
- }
238
- });
239
- describe("cross-project routing to entry points", () => {
240
- it("@project-a routes to project A's @root", () => {
241
- const registry = {
242
- "project-a": join(projectA, ".agents"),
243
- "project-b": join(projectB, ".agents"),
244
- };
245
- const result = resolveChannelAddress("@project-a", "/caller/.agents/channels", registry);
246
- assert.strictEqual(result.channelsDir, join(projectA, ".agents", "channels"));
247
- assert.strictEqual(result.localChannelName, "@root");
248
- assert.strictEqual(result.isProjectEntryPoint, true);
249
- });
250
- it("@project-a/developer routes to project A's @developer", () => {
251
- const registry = {
252
- "project-a": join(projectA, ".agents"),
253
- };
254
- const result = resolveChannelAddress("@project-a/developer", "/caller/.agents/channels", registry);
255
- assert.strictEqual(result.channelsDir, join(projectA, ".agents", "channels"));
256
- assert.strictEqual(result.localChannelName, "@developer");
257
- assert.strictEqual(result.isProjectEntryPoint, undefined);
258
- });
259
- });
260
- describe("persona existence checks with fixtures", () => {
261
- it("finds root persona in project A", async () => {
262
- const config = {
263
- agentsDir: join(projectA, ".agents"),
264
- personasDir: join(projectA, ".agents", "personas"),
265
- };
266
- const exists = await personaExists(config, "@root", async () => []);
267
- assert.strictEqual(exists, true);
268
- });
269
- it("finds developer persona in project A", async () => {
270
- const config = {
271
- agentsDir: join(projectA, ".agents"),
272
- personasDir: join(projectA, ".agents", "personas"),
273
- };
274
- const mockListPersonas = async () => [
275
- join(projectA, ".agents", "personas", "developer"),
276
- ];
277
- const exists = await personaExists(config, "@developer", mockListPersonas);
278
- assert.strictEqual(exists, true);
279
- });
280
- it("does not find nonexistent persona", async () => {
281
- const config = {
282
- agentsDir: join(projectA, ".agents"),
283
- personasDir: join(projectA, ".agents", "personas"),
284
- };
285
- const mockListPersonas = async () => [
286
- join(projectA, ".agents", "personas", "developer"),
287
- ];
288
- const exists = await personaExists(config, "@nonexistent", mockListPersonas);
289
- assert.strictEqual(exists, false);
290
- });
291
- });
292
- describe("path resolution with fixtures", () => {
293
- it("root resolves to project A agentsDir", () => {
294
- const agentsDir = join(projectA, ".agents");
295
- const personasDir = join(projectA, ".agents", "personas");
296
- const path = resolvePersonaPath("root", agentsDir, personasDir);
297
- assert.strictEqual(path, agentsDir);
298
- });
299
- it("developer resolves to project A personasDir/developer", () => {
300
- const agentsDir = join(projectA, ".agents");
301
- const personasDir = join(projectA, ".agents", "personas");
302
- const path = resolvePersonaPath("developer", agentsDir, personasDir);
303
- assert.strictEqual(path, join(personasDir, "developer"));
304
- });
305
- });
306
- });
307
- describe("Contract: Root persona must be first-class citizen", () => {
308
- /**
309
- * Contract tests that explicitly document and test root persona behavior.
310
- * These tests serve as the contract for how root persona should work.
311
- *
312
- * Any function that resolves personas MUST handle root specially:
313
- * 1. personaExists(@root) checks agentsDir, not personasDir
314
- * 2. resolvePersonaPath("root") returns agentsDir, not personasDir/root
315
- * 3. @project routes to @root (project entry point)
316
- */
317
- const agentsDir = "/project/.agents";
318
- const personasDir = "/project/.agents/personas";
319
- describe("personaExists contract", () => {
320
- it("CONTRACT: @root checks agentsDir for PERSONA.md", async () => {
321
- // This is the correct behavior
322
- const config = {
323
- agentsDir: join(PROJECT_ROOT, ".agents"), // Has PERSONA.md
324
- personasDir: join(PROJECT_ROOT, ".agents", "personas"),
325
- };
326
- const exists = await personaExists(config, "@root", async () => []);
327
- assert.strictEqual(exists, true, "VIOLATED: personaExists must check agentsDir for @root");
328
- });
329
- it("CONTRACT: @root does NOT use listPersonas", async () => {
330
- // Even if there's a "root" in the personas list, @root should check agentsDir
331
- const config = {
332
- agentsDir: "/nonexistent",
333
- personasDir: "/also-nonexistent",
334
- };
335
- // This mock would return true if the function wrongly used the list
336
- const mockListPersonas = async () => ["/some/path/root"];
337
- const exists = await personaExists(config, "@root", mockListPersonas);
338
- assert.strictEqual(exists, false, "VIOLATED: @root must not use personas list");
339
- });
340
- it("CONTRACT: @other uses listPersonas", async () => {
341
- const config = {
342
- agentsDir: "/project/.agents",
343
- personasDir: "/project/.agents/personas",
344
- };
345
- const mockListPersonas = async () => ["/project/.agents/personas/developer"];
346
- const exists = await personaExists(config, "@developer", mockListPersonas);
347
- assert.strictEqual(exists, true, "Named personas should use list lookup");
348
- });
349
- });
350
- describe("resolvePersonaPath contract", () => {
351
- it("CONTRACT: 'root' returns agentsDir", () => {
352
- const path = resolvePersonaPath("root", agentsDir, personasDir);
353
- assert.strictEqual(path, agentsDir, "VIOLATED: root must resolve to agentsDir");
354
- });
355
- it("CONTRACT: 'root' does NOT return personasDir/root", () => {
356
- const path = resolvePersonaPath("root", agentsDir, personasDir);
357
- assert.notStrictEqual(path, join(personasDir, "root"), "VIOLATED: root must not be in personasDir");
358
- });
359
- it("CONTRACT: other personas return personasDir/<name>", () => {
360
- const path = resolvePersonaPath("developer", agentsDir, personasDir);
361
- assert.strictEqual(path, join(personasDir, "developer"));
362
- });
363
- });
364
- describe("channel address resolution contract", () => {
365
- it("CONTRACT: @project routes to @root", () => {
366
- const registry = { myproject: "/path/to/myproject/.agents" };
367
- const result = resolveChannelAddress("@myproject", "/local/channels", registry);
368
- assert.strictEqual(result.localChannelName, "@root", "VIOLATED: @project must route to @root");
369
- assert.strictEqual(result.isProjectEntryPoint, true);
370
- });
371
- it("CONTRACT: @project/persona routes to @persona", () => {
372
- const registry = { myproject: "/path/to/myproject/.agents" };
373
- const result = resolveChannelAddress("@myproject/developer", "/local/channels", registry);
374
- assert.strictEqual(result.localChannelName, "@developer");
375
- assert.strictEqual(result.isProjectEntryPoint, undefined);
376
- });
377
- it("CONTRACT: @local-persona stays local when not a project", () => {
378
- const registry = { myproject: "/path/to/myproject/.agents" };
379
- const result = resolveChannelAddress("@developer", "/local/channels", registry);
380
- assert.strictEqual(result.channelsDir, "/local/channels");
381
- assert.strictEqual(result.localChannelName, "@developer");
382
- });
383
- });
384
- });
385
- describe("Regression: Previous root persona bugs", () => {
386
- /**
387
- * Regression tests for specific bugs we've encountered.
388
- * Each test documents a bug and ensures it stays fixed.
389
- */
390
- describe("Bug: personaExists only checked personasDir for root", () => {
391
- /**
392
- * Before fix: personaExists used listPersonas which only scanned personasDir.
393
- * This meant @root would fail because there was no personas/root directory.
394
- *
395
- * After fix: personaExists checks hasPersonaFile(agentsDir) for @root.
396
- */
397
- it("REGRESSION: @root works even without personas/root directory", async () => {
398
- const config = {
399
- agentsDir: join(PROJECT_ROOT, ".agents"),
400
- personasDir: join(PROJECT_ROOT, ".agents", "personas"),
401
- };
402
- // The mock returns empty list (no personas/root)
403
- const mockListPersonas = async () => [];
404
- const exists = await personaExists(config, "@root", mockListPersonas);
405
- assert.strictEqual(exists, true, "Root persona should exist via agentsDir check");
406
- });
407
- });
408
- describe("Bug: invokePersona resolved root to personasDir/root", () => {
409
- /**
410
- * Before fix: invokePersona used join(personasDir, personaName) for all personas.
411
- * This meant "root" resolved to .agents/personas/root instead of .agents.
412
- *
413
- * After fix: invokePersona checks personaName === "root" and uses agentsDir.
414
- */
415
- it("REGRESSION: 'root' resolves to agentsDir, not personasDir/root", () => {
416
- const agentsDir = "/project/.agents";
417
- const personasDir = "/project/.agents/personas";
418
- const path = resolvePersonaPath("root", agentsDir, personasDir);
419
- // The bug would have produced this wrong path
420
- const wrongPath = join(personasDir, "root");
421
- assert.notStrictEqual(path, wrongPath, "Must not resolve to personasDir/root");
422
- // Correct path
423
- assert.strictEqual(path, agentsDir, "Must resolve to agentsDir");
424
- });
425
- });
426
- describe("Bug: `personas run root` failed", () => {
427
- /**
428
- * Before fix: CLI command "personas run root" used the same broken path resolution.
429
- *
430
- * After fix: All code paths use the same pattern: root → agentsDir.
431
- */
432
- it("REGRESSION: CLI path resolution follows same pattern", () => {
433
- // The CLI uses the same resolvePersonaPath logic
434
- // This test ensures consistency across all entry points
435
- const agentsDir = "/project/.agents";
436
- const personasDir = "/project/.agents/personas";
437
- // Both invokePersona and CLI should resolve identically
438
- const invokePath = resolvePersonaPath("root", agentsDir, personasDir);
439
- const cliPath = resolvePersonaPath("root", agentsDir, personasDir);
440
- assert.strictEqual(invokePath, cliPath);
441
- assert.strictEqual(invokePath, agentsDir);
442
- });
443
- });
444
- });
445
- //# sourceMappingURL=integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/lib/integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=invoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke.test.d.ts","sourceRoot":"","sources":["../../src/lib/invoke.test.ts"],"names":[],"mappings":""}
@@ -1,82 +0,0 @@
1
- import { describe, it } from "node:test";
2
- import assert from "node:assert";
3
- import { join } from "node:path";
4
- /**
5
- * Tests for invokePersona root persona handling
6
- *
7
- * The invokePersona function has special logic for the "root" persona:
8
- * - For "root": uses config.agentsDir as the persona path
9
- * - For other personas: uses config.personasDir/name as the persona path
10
- *
11
- * This mirrors the logic from invoke.ts:51-53
12
- */
13
- // Inline the persona path resolution logic for testing
14
- function resolvePersonaPath(personaName, agentsDir, personasDir) {
15
- // Root persona lives at agentsDir, not personasDir/root
16
- if (personaName === "root") {
17
- return agentsDir;
18
- }
19
- return join(personasDir, personaName);
20
- }
21
- describe("invokePersona path resolution", () => {
22
- const agentsDir = "/project/.agents";
23
- const personasDir = "/project/.agents/personas";
24
- describe("root persona handling", () => {
25
- it("resolves 'root' persona to agentsDir (not personasDir/root)", () => {
26
- const path = resolvePersonaPath("root", agentsDir, personasDir);
27
- assert.strictEqual(path, "/project/.agents");
28
- });
29
- it("does NOT resolve 'root' to personasDir/root", () => {
30
- const path = resolvePersonaPath("root", agentsDir, personasDir);
31
- assert.notStrictEqual(path, "/project/.agents/personas/root");
32
- });
33
- });
34
- describe("named persona handling", () => {
35
- it("resolves 'developer' to personasDir/developer", () => {
36
- const path = resolvePersonaPath("developer", agentsDir, personasDir);
37
- assert.strictEqual(path, "/project/.agents/personas/developer");
38
- });
39
- it("resolves 'reviewer' to personasDir/reviewer", () => {
40
- const path = resolvePersonaPath("reviewer", agentsDir, personasDir);
41
- assert.strictEqual(path, "/project/.agents/personas/reviewer");
42
- });
43
- it("handles hyphenated persona names", () => {
44
- const path = resolvePersonaPath("code-reviewer", agentsDir, personasDir);
45
- assert.strictEqual(path, "/project/.agents/personas/code-reviewer");
46
- });
47
- });
48
- describe("edge cases", () => {
49
- it("paths with trailing slashes work correctly", () => {
50
- // Ensure join handles this gracefully
51
- const path = resolvePersonaPath("developer", "/project/.agents/", "/project/.agents/personas/");
52
- assert.ok(path.includes("personas"));
53
- assert.ok(path.includes("developer"));
54
- });
55
- it("root persona at different project locations", () => {
56
- // Different project structures should work
57
- const customAgentsDir = "/home/user/myproject/custom-agents";
58
- const customPersonasDir = "/home/user/myproject/custom-agents/personas";
59
- const rootPath = resolvePersonaPath("root", customAgentsDir, customPersonasDir);
60
- assert.strictEqual(rootPath, "/home/user/myproject/custom-agents");
61
- const devPath = resolvePersonaPath("developer", customAgentsDir, customPersonasDir);
62
- assert.strictEqual(devPath, "/home/user/myproject/custom-agents/personas/developer");
63
- });
64
- });
65
- });
66
- describe("invokePersona channel-to-persona mapping", () => {
67
- /**
68
- * When a DM channel like @root is processed, the processor extracts the
69
- * persona name by removing the @ prefix. This ensures the mapping is correct.
70
- */
71
- it("@root channel maps to 'root' persona name", () => {
72
- const channel = "@root";
73
- const personaName = channel.slice(1);
74
- assert.strictEqual(personaName, "root");
75
- });
76
- it("@developer channel maps to 'developer' persona name", () => {
77
- const channel = "@developer";
78
- const personaName = channel.slice(1);
79
- assert.strictEqual(personaName, "developer");
80
- });
81
- });
82
- //# sourceMappingURL=invoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"invoke.test.js","sourceRoot":"","sources":["../../src/lib/invoke.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=persona.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persona.test.d.ts","sourceRoot":"","sources":["../../src/lib/persona.test.ts"],"names":[],"mappings":""}