beth-copilot 1.0.14 → 1.0.16

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 (236) hide show
  1. package/CHANGELOG.md +195 -177
  2. package/README.md +528 -185
  3. package/bin/cli.js +47 -0
  4. package/dist/cli/commands/doctor.e2e.test.d.ts +8 -0
  5. package/dist/cli/commands/doctor.e2e.test.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.e2e.test.js +428 -0
  7. package/dist/cli/commands/doctor.e2e.test.js.map +1 -0
  8. package/dist/cli/commands/doctor.test.js +1 -1
  9. package/dist/cli/commands/help.e2e.test.d.ts +9 -0
  10. package/dist/cli/commands/help.e2e.test.d.ts.map +1 -0
  11. package/dist/cli/commands/help.e2e.test.js +150 -0
  12. package/dist/cli/commands/help.e2e.test.js.map +1 -0
  13. package/dist/cli/commands/init.test.d.ts +6 -0
  14. package/dist/cli/commands/init.test.d.ts.map +1 -0
  15. package/dist/cli/commands/init.test.js +289 -0
  16. package/dist/cli/commands/init.test.js.map +1 -0
  17. package/dist/cli/commands/mcp.e2e.test.d.ts +9 -0
  18. package/dist/cli/commands/mcp.e2e.test.d.ts.map +1 -0
  19. package/dist/cli/commands/mcp.e2e.test.js +139 -0
  20. package/dist/cli/commands/mcp.e2e.test.js.map +1 -0
  21. package/dist/cli/commands/pipeline.e2e.test.d.ts +9 -0
  22. package/dist/cli/commands/pipeline.e2e.test.d.ts.map +1 -0
  23. package/dist/cli/commands/pipeline.e2e.test.js +192 -0
  24. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -0
  25. package/dist/cli/commands/quickstart.test.d.ts +6 -0
  26. package/dist/cli/commands/quickstart.test.d.ts.map +1 -0
  27. package/dist/cli/commands/quickstart.test.js +232 -0
  28. package/dist/cli/commands/quickstart.test.js.map +1 -0
  29. package/dist/core/agents/frontmatter.test.d.ts +8 -0
  30. package/dist/core/agents/frontmatter.test.d.ts.map +1 -0
  31. package/dist/core/agents/frontmatter.test.js +589 -0
  32. package/dist/core/agents/frontmatter.test.js.map +1 -0
  33. package/dist/core/agents/handoffs.test.d.ts +8 -0
  34. package/dist/core/agents/handoffs.test.d.ts.map +1 -0
  35. package/dist/core/agents/handoffs.test.js +320 -0
  36. package/dist/core/agents/handoffs.test.js.map +1 -0
  37. package/dist/core/agents/loader.test.js +1 -1
  38. package/dist/core/agents/suite.test.d.ts +8 -0
  39. package/dist/core/agents/suite.test.d.ts.map +1 -0
  40. package/dist/core/agents/suite.test.js +207 -0
  41. package/dist/core/agents/suite.test.js.map +1 -0
  42. package/dist/core/agents/tools.test.d.ts +8 -0
  43. package/dist/core/agents/tools.test.d.ts.map +1 -0
  44. package/dist/core/agents/tools.test.js +332 -0
  45. package/dist/core/agents/tools.test.js.map +1 -0
  46. package/dist/core/context.d.ts +171 -0
  47. package/dist/core/context.d.ts.map +1 -0
  48. package/dist/core/context.js +353 -0
  49. package/dist/core/context.js.map +1 -0
  50. package/dist/core/context.test.d.ts +8 -0
  51. package/dist/core/context.test.d.ts.map +1 -0
  52. package/dist/core/context.test.js +253 -0
  53. package/dist/core/context.test.js.map +1 -0
  54. package/dist/core/handoffs.d.ts +151 -0
  55. package/dist/core/handoffs.d.ts.map +1 -0
  56. package/dist/core/handoffs.js +220 -0
  57. package/dist/core/handoffs.js.map +1 -0
  58. package/dist/core/handoffs.test.d.ts +8 -0
  59. package/dist/core/handoffs.test.d.ts.map +1 -0
  60. package/dist/core/handoffs.test.js +231 -0
  61. package/dist/core/handoffs.test.js.map +1 -0
  62. package/dist/core/orchestrator.d.ts +246 -0
  63. package/dist/core/orchestrator.d.ts.map +1 -0
  64. package/dist/core/orchestrator.js +514 -0
  65. package/dist/core/orchestrator.js.map +1 -0
  66. package/dist/core/orchestrator.test.d.ts +8 -0
  67. package/dist/core/orchestrator.test.d.ts.map +1 -0
  68. package/dist/core/orchestrator.test.js +517 -0
  69. package/dist/core/orchestrator.test.js.map +1 -0
  70. package/dist/core/router.d.ts +102 -0
  71. package/dist/core/router.d.ts.map +1 -0
  72. package/dist/core/router.js +178 -0
  73. package/dist/core/router.js.map +1 -0
  74. package/dist/core/router.test.d.ts +8 -0
  75. package/dist/core/router.test.d.ts.map +1 -0
  76. package/dist/core/router.test.js +215 -0
  77. package/dist/core/router.test.js.map +1 -0
  78. package/dist/index.d.ts +9 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +7 -0
  81. package/dist/index.js.map +1 -1
  82. package/dist/init.test.js +288 -0
  83. package/dist/providers/azure.d.ts +147 -0
  84. package/dist/providers/azure.d.ts.map +1 -0
  85. package/dist/providers/azure.js +491 -0
  86. package/dist/providers/azure.js.map +1 -0
  87. package/dist/providers/azure.test.d.ts +11 -0
  88. package/dist/providers/azure.test.d.ts.map +1 -0
  89. package/dist/providers/azure.test.js +330 -0
  90. package/dist/providers/azure.test.js.map +1 -0
  91. package/dist/providers/config.d.ts +87 -0
  92. package/dist/providers/config.d.ts.map +1 -0
  93. package/dist/providers/config.js +193 -0
  94. package/dist/providers/config.js.map +1 -0
  95. package/dist/providers/config.test.d.ts +7 -0
  96. package/dist/providers/config.test.d.ts.map +1 -0
  97. package/dist/providers/config.test.js +370 -0
  98. package/dist/providers/config.test.js.map +1 -0
  99. package/dist/providers/index.d.ts +18 -0
  100. package/dist/providers/index.d.ts.map +1 -0
  101. package/dist/providers/index.js +14 -0
  102. package/dist/providers/index.js.map +1 -0
  103. package/dist/providers/interface.d.ts +191 -0
  104. package/dist/providers/interface.d.ts.map +1 -0
  105. package/dist/providers/interface.js +94 -0
  106. package/dist/providers/interface.js.map +1 -0
  107. package/dist/providers/retry.d.ts +128 -0
  108. package/dist/providers/retry.d.ts.map +1 -0
  109. package/dist/providers/retry.js +205 -0
  110. package/dist/providers/retry.js.map +1 -0
  111. package/dist/providers/retry.test.d.ts +7 -0
  112. package/dist/providers/retry.test.d.ts.map +1 -0
  113. package/dist/providers/retry.test.js +439 -0
  114. package/dist/providers/retry.test.js.map +1 -0
  115. package/dist/providers/streaming.d.ts +157 -0
  116. package/dist/providers/streaming.d.ts.map +1 -0
  117. package/dist/providers/streaming.js +233 -0
  118. package/dist/providers/streaming.js.map +1 -0
  119. package/dist/providers/streaming.test.d.ts +7 -0
  120. package/dist/providers/streaming.test.d.ts.map +1 -0
  121. package/dist/providers/streaming.test.js +372 -0
  122. package/dist/providers/streaming.test.js.map +1 -0
  123. package/dist/providers/types.d.ts +209 -0
  124. package/dist/providers/types.d.ts.map +1 -0
  125. package/dist/providers/types.js +53 -0
  126. package/dist/providers/types.js.map +1 -0
  127. package/dist/providers/types.test.d.ts +7 -0
  128. package/dist/providers/types.test.d.ts.map +1 -0
  129. package/dist/providers/types.test.js +141 -0
  130. package/dist/providers/types.test.js.map +1 -0
  131. package/dist/tools/cli/beads.d.ts +27 -0
  132. package/dist/tools/cli/beads.d.ts.map +1 -0
  133. package/dist/tools/cli/beads.js +172 -0
  134. package/dist/tools/cli/beads.js.map +1 -0
  135. package/dist/tools/cli/beads.test.d.ts +8 -0
  136. package/dist/tools/cli/beads.test.d.ts.map +1 -0
  137. package/dist/tools/cli/beads.test.js +264 -0
  138. package/dist/tools/cli/beads.test.js.map +1 -0
  139. package/dist/tools/cli/editFile.d.ts +17 -0
  140. package/dist/tools/cli/editFile.d.ts.map +1 -0
  141. package/dist/tools/cli/editFile.js +125 -0
  142. package/dist/tools/cli/editFile.js.map +1 -0
  143. package/dist/tools/cli/editFile.test.d.ts +8 -0
  144. package/dist/tools/cli/editFile.test.d.ts.map +1 -0
  145. package/dist/tools/cli/editFile.test.js +177 -0
  146. package/dist/tools/cli/editFile.test.js.map +1 -0
  147. package/dist/tools/cli/readFile.d.ts +25 -0
  148. package/dist/tools/cli/readFile.d.ts.map +1 -0
  149. package/dist/tools/cli/readFile.js +118 -0
  150. package/dist/tools/cli/readFile.js.map +1 -0
  151. package/dist/tools/cli/readFile.test.d.ts +8 -0
  152. package/dist/tools/cli/readFile.test.d.ts.map +1 -0
  153. package/dist/tools/cli/readFile.test.js +194 -0
  154. package/dist/tools/cli/readFile.test.js.map +1 -0
  155. package/dist/tools/cli/search.d.ts +16 -0
  156. package/dist/tools/cli/search.d.ts.map +1 -0
  157. package/dist/tools/cli/search.js +261 -0
  158. package/dist/tools/cli/search.js.map +1 -0
  159. package/dist/tools/cli/search.test.d.ts +8 -0
  160. package/dist/tools/cli/search.test.d.ts.map +1 -0
  161. package/dist/tools/cli/search.test.js +172 -0
  162. package/dist/tools/cli/search.test.js.map +1 -0
  163. package/dist/tools/cli/subagent.d.ts +43 -0
  164. package/dist/tools/cli/subagent.d.ts.map +1 -0
  165. package/dist/tools/cli/subagent.js +99 -0
  166. package/dist/tools/cli/subagent.js.map +1 -0
  167. package/dist/tools/cli/subagent.test.d.ts +8 -0
  168. package/dist/tools/cli/subagent.test.d.ts.map +1 -0
  169. package/dist/tools/cli/subagent.test.js +190 -0
  170. package/dist/tools/cli/subagent.test.js.map +1 -0
  171. package/dist/tools/cli/terminal.d.ts +19 -0
  172. package/dist/tools/cli/terminal.d.ts.map +1 -0
  173. package/dist/tools/cli/terminal.js +164 -0
  174. package/dist/tools/cli/terminal.js.map +1 -0
  175. package/dist/tools/cli/terminal.test.d.ts +8 -0
  176. package/dist/tools/cli/terminal.test.d.ts.map +1 -0
  177. package/dist/tools/cli/terminal.test.js +161 -0
  178. package/dist/tools/cli/terminal.test.js.map +1 -0
  179. package/dist/tools/index.d.ts +25 -0
  180. package/dist/tools/index.d.ts.map +1 -0
  181. package/dist/tools/index.js +41 -0
  182. package/dist/tools/index.js.map +1 -0
  183. package/dist/tools/interface.d.ts +64 -0
  184. package/dist/tools/interface.d.ts.map +1 -0
  185. package/dist/tools/interface.js +37 -0
  186. package/dist/tools/interface.js.map +1 -0
  187. package/dist/tools/interface.test.d.ts +7 -0
  188. package/dist/tools/interface.test.d.ts.map +1 -0
  189. package/dist/tools/interface.test.js +179 -0
  190. package/dist/tools/interface.test.js.map +1 -0
  191. package/dist/tools/mcp/bridge.d.ts +48 -0
  192. package/dist/tools/mcp/bridge.d.ts.map +1 -0
  193. package/dist/tools/mcp/bridge.js +128 -0
  194. package/dist/tools/mcp/bridge.js.map +1 -0
  195. package/dist/tools/mcp/bridge.test.d.ts +8 -0
  196. package/dist/tools/mcp/bridge.test.d.ts.map +1 -0
  197. package/dist/tools/mcp/bridge.test.js +300 -0
  198. package/dist/tools/mcp/bridge.test.js.map +1 -0
  199. package/dist/tools/mcp/client.d.ts +135 -0
  200. package/dist/tools/mcp/client.d.ts.map +1 -0
  201. package/dist/tools/mcp/client.js +263 -0
  202. package/dist/tools/mcp/client.js.map +1 -0
  203. package/dist/tools/mcp/client.test.d.ts +8 -0
  204. package/dist/tools/mcp/client.test.d.ts.map +1 -0
  205. package/dist/tools/mcp/client.test.js +390 -0
  206. package/dist/tools/mcp/client.test.js.map +1 -0
  207. package/dist/tools/registry.d.ts +82 -0
  208. package/dist/tools/registry.d.ts.map +1 -0
  209. package/dist/tools/registry.js +99 -0
  210. package/dist/tools/registry.js.map +1 -0
  211. package/dist/tools/registry.test.d.ts +7 -0
  212. package/dist/tools/registry.test.d.ts.map +1 -0
  213. package/dist/tools/registry.test.js +199 -0
  214. package/dist/tools/registry.test.js.map +1 -0
  215. package/dist/tools/suite.test.d.ts +11 -0
  216. package/dist/tools/suite.test.d.ts.map +1 -0
  217. package/dist/tools/suite.test.js +119 -0
  218. package/dist/tools/suite.test.js.map +1 -0
  219. package/dist/tools/types.d.ts +75 -0
  220. package/dist/tools/types.d.ts.map +1 -0
  221. package/dist/tools/types.js +30 -0
  222. package/dist/tools/types.js.map +1 -0
  223. package/dist/tools/types.test.d.ts +7 -0
  224. package/dist/tools/types.test.d.ts.map +1 -0
  225. package/dist/tools/types.test.js +178 -0
  226. package/dist/tools/types.test.js.map +1 -0
  227. package/package.json +60 -56
  228. package/sbom.json +3302 -8
  229. package/templates/.github/agents/beth.agent.md +329 -329
  230. package/templates/.github/agents/developer.agent.md +572 -572
  231. package/templates/.github/agents/product-manager.agent.md +272 -272
  232. package/templates/.github/agents/researcher.agent.md +338 -338
  233. package/templates/.github/agents/security-reviewer.agent.md +465 -465
  234. package/templates/.github/agents/tester.agent.md +496 -496
  235. package/templates/.github/agents/ux-designer.agent.md +393 -393
  236. package/templates/mcp.json.example +4 -0
@@ -0,0 +1,589 @@
1
+ /**
2
+ * Agent Frontmatter Validation Tests
3
+ *
4
+ * Tests for YAML frontmatter parsing and validation in agent files.
5
+ * Uses temporary files with inline fixtures to test edge cases.
6
+ */
7
+ import { describe, it, beforeEach, afterEach } from 'node:test';
8
+ import assert from 'node:assert';
9
+ import { writeFileSync, mkdirSync, rmSync, existsSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { loadAgent } from './loader.js';
12
+ // Temp directory for test fixtures
13
+ const TEST_DIR = join(process.cwd(), '.test-agents-frontmatter');
14
+ /**
15
+ * Helper to create a test agent file with given content.
16
+ */
17
+ function createTestAgent(filename, content) {
18
+ const filePath = join(TEST_DIR, filename);
19
+ writeFileSync(filePath, content, 'utf-8');
20
+ return filePath;
21
+ }
22
+ describe('Agent Frontmatter Validation', () => {
23
+ beforeEach(() => {
24
+ if (!existsSync(TEST_DIR)) {
25
+ mkdirSync(TEST_DIR, { recursive: true });
26
+ }
27
+ });
28
+ afterEach(() => {
29
+ if (existsSync(TEST_DIR)) {
30
+ rmSync(TEST_DIR, { recursive: true, force: true });
31
+ }
32
+ });
33
+ describe('Valid frontmatter scenarios', () => {
34
+ it('1. valid frontmatter with all fields parses correctly', () => {
35
+ const content = `---
36
+ name: Test Agent
37
+ description: A test agent for validation
38
+ model: Claude Opus 4.6
39
+ tools:
40
+ - codebase
41
+ - readFile
42
+ - editFiles
43
+ handoffs:
44
+ - label: Hand to Developer
45
+ agent: developer
46
+ prompt: Please implement this feature
47
+ send: true
48
+ infer: true
49
+ ---
50
+
51
+ # Test Agent Instructions
52
+
53
+ This is the body content.
54
+ `;
55
+ const filePath = createTestAgent('complete.agent.md', content);
56
+ const result = loadAgent(filePath);
57
+ assert.ok(!('error' in result), `Unexpected error: ${JSON.stringify(result)}`);
58
+ const { agent } = result;
59
+ assert.strictEqual(agent.id, 'complete');
60
+ assert.strictEqual(agent.frontmatter.name, 'Test Agent');
61
+ assert.strictEqual(agent.frontmatter.description, 'A test agent for validation');
62
+ assert.strictEqual(agent.frontmatter.model, 'Claude Opus 4.6');
63
+ assert.deepStrictEqual(agent.frontmatter.tools, ['codebase', 'readFile', 'editFiles']);
64
+ assert.strictEqual(agent.frontmatter.infer, true);
65
+ assert.ok(Array.isArray(agent.frontmatter.handoffs));
66
+ assert.strictEqual(agent.frontmatter.handoffs.length, 1);
67
+ assert.strictEqual(agent.frontmatter.handoffs[0].label, 'Hand to Developer');
68
+ assert.strictEqual(agent.frontmatter.handoffs[0].agent, 'developer');
69
+ assert.strictEqual(agent.frontmatter.handoffs[0].prompt, 'Please implement this feature');
70
+ assert.strictEqual(agent.frontmatter.handoffs[0].send, true);
71
+ assert.ok(agent.body.includes('Test Agent Instructions'));
72
+ });
73
+ it('4. valid tools array parses correctly', () => {
74
+ const content = `---
75
+ name: Tools Agent
76
+ tools:
77
+ - codebase
78
+ - readFile
79
+ - editFiles
80
+ - createFile
81
+ - runInTerminal
82
+ - custom-mcp-tool
83
+ ---
84
+
85
+ Agent with tools.
86
+ `;
87
+ const filePath = createTestAgent('tools.agent.md', content);
88
+ const result = loadAgent(filePath);
89
+ assert.ok(!('error' in result));
90
+ const { agent } = result;
91
+ assert.deepStrictEqual(agent.frontmatter.tools, [
92
+ 'codebase',
93
+ 'readFile',
94
+ 'editFiles',
95
+ 'createFile',
96
+ 'runInTerminal',
97
+ 'custom-mcp-tool',
98
+ ]);
99
+ });
100
+ it('6. valid handoffs array parses correctly', () => {
101
+ const content = `---
102
+ name: Handoff Agent
103
+ handoffs:
104
+ - label: Ask Developer
105
+ agent: developer
106
+ prompt: Implement this feature
107
+ - label: Review with PM
108
+ agent: product-manager
109
+ prompt: Review requirements
110
+ send: false
111
+ ---
112
+
113
+ Agent with handoffs.
114
+ `;
115
+ const filePath = createTestAgent('handoffs.agent.md', content);
116
+ const result = loadAgent(filePath);
117
+ assert.ok(!('error' in result));
118
+ const { agent } = result;
119
+ assert.ok(Array.isArray(agent.frontmatter.handoffs));
120
+ assert.strictEqual(agent.frontmatter.handoffs.length, 2);
121
+ assert.strictEqual(agent.frontmatter.handoffs[0].label, 'Ask Developer');
122
+ assert.strictEqual(agent.frontmatter.handoffs[0].agent, 'developer');
123
+ assert.strictEqual(agent.frontmatter.handoffs[0].prompt, 'Implement this feature');
124
+ assert.strictEqual(agent.frontmatter.handoffs[1].label, 'Review with PM');
125
+ assert.strictEqual(agent.frontmatter.handoffs[1].agent, 'product-manager');
126
+ assert.strictEqual(agent.frontmatter.handoffs[1].send, false);
127
+ });
128
+ it('10. infer: true boolean parses correctly', () => {
129
+ const content = `---
130
+ name: Inferable Agent
131
+ infer: true
132
+ ---
133
+
134
+ This agent can be invoked as a subagent.
135
+ `;
136
+ const filePath = createTestAgent('inferable.agent.md', content);
137
+ const result = loadAgent(filePath);
138
+ assert.ok(!('error' in result));
139
+ const { agent } = result;
140
+ assert.strictEqual(agent.frontmatter.infer, true);
141
+ });
142
+ it('10b. infer: false boolean parses correctly', () => {
143
+ const content = `---
144
+ name: Non-Inferable Agent
145
+ infer: false
146
+ ---
147
+
148
+ This agent cannot be invoked as a subagent.
149
+ `;
150
+ const filePath = createTestAgent('non-inferable.agent.md', content);
151
+ const result = loadAgent(filePath);
152
+ assert.ok(!('error' in result));
153
+ const { agent } = result;
154
+ // infer: false is preserved in frontmatter (both true and false are set)
155
+ assert.strictEqual(agent.frontmatter.infer, false);
156
+ });
157
+ it('11. infer: "true" (string) gets handled correctly', () => {
158
+ // YAML parses unquoted `true` as boolean, but quoted "true" is string
159
+ // The loader should only accept boolean true
160
+ const content = `---
161
+ name: String Infer Agent
162
+ infer: "true"
163
+ ---
164
+
165
+ This has infer as a string, not boolean.
166
+ `;
167
+ const filePath = createTestAgent('string-infer.agent.md', content);
168
+ const result = loadAgent(filePath);
169
+ assert.ok(!('error' in result));
170
+ const { agent } = result;
171
+ // String "true" should NOT be converted to boolean true
172
+ assert.strictEqual(agent.frontmatter.infer, undefined);
173
+ });
174
+ it('14. extra/unknown fields are ignored (no error)', () => {
175
+ const content = `---
176
+ name: Extended Agent
177
+ description: Standard description
178
+ customField: some value
179
+ extraData:
180
+ nested: true
181
+ value: 42
182
+ anotherUnknown: test
183
+ ---
184
+
185
+ Agent with extra fields.
186
+ `;
187
+ const filePath = createTestAgent('extended.agent.md', content);
188
+ const result = loadAgent(filePath);
189
+ assert.ok(!('error' in result), 'Should not error on unknown fields');
190
+ const { agent } = result;
191
+ assert.strictEqual(agent.frontmatter.name, 'Extended Agent');
192
+ assert.strictEqual(agent.frontmatter.description, 'Standard description');
193
+ // Unknown fields should not appear in frontmatter
194
+ assert.strictEqual(agent.frontmatter.customField, undefined);
195
+ assert.strictEqual(agent.frontmatter.extraData, undefined);
196
+ });
197
+ it('15. model field accepts any string value', () => {
198
+ const content = `---
199
+ name: Custom Model Agent
200
+ model: gpt-4-turbo-preview
201
+ ---
202
+
203
+ Agent with custom model.
204
+ `;
205
+ const filePath = createTestAgent('custom-model.agent.md', content);
206
+ const result = loadAgent(filePath);
207
+ assert.ok(!('error' in result));
208
+ const { agent } = result;
209
+ assert.strictEqual(agent.frontmatter.model, 'gpt-4-turbo-preview');
210
+ });
211
+ it('15b. model field accepts complex model strings', () => {
212
+ const content = `---
213
+ name: Complex Model Agent
214
+ model: "anthropic/claude-3.5-sonnet@20240620"
215
+ ---
216
+
217
+ Agent with complex model identifier.
218
+ `;
219
+ const filePath = createTestAgent('complex-model.agent.md', content);
220
+ const result = loadAgent(filePath);
221
+ assert.ok(!('error' in result));
222
+ const { agent } = result;
223
+ assert.strictEqual(agent.frontmatter.model, 'anthropic/claude-3.5-sonnet@20240620');
224
+ });
225
+ });
226
+ describe('Invalid frontmatter scenarios', () => {
227
+ it('2. missing name field returns error', () => {
228
+ const content = `---
229
+ description: Agent without a name
230
+ model: Claude Opus 4.6
231
+ ---
232
+
233
+ This agent is missing the required name field.
234
+ `;
235
+ const filePath = createTestAgent('no-name.agent.md', content);
236
+ const result = loadAgent(filePath);
237
+ assert.ok('error' in result, 'Should return error for missing name');
238
+ const { error } = result;
239
+ assert.ok(error.message.includes('name'), `Error should mention 'name', got: ${error.message}`);
240
+ });
241
+ it('3. invalid name type (non-string) returns error', () => {
242
+ const content = `---
243
+ name: 123
244
+ description: Agent with numeric name
245
+ ---
246
+
247
+ Name should be a string.
248
+ `;
249
+ const filePath = createTestAgent('numeric-name.agent.md', content);
250
+ const result = loadAgent(filePath);
251
+ assert.ok('error' in result, 'Should return error for non-string name');
252
+ const { error } = result;
253
+ assert.ok(error.message.includes('name'), `Error should mention 'name', got: ${error.message}`);
254
+ });
255
+ it('3b. name as array returns error', () => {
256
+ const content = `---
257
+ name:
258
+ - First
259
+ - Second
260
+ description: Agent with array name
261
+ ---
262
+
263
+ Name should be a string.
264
+ `;
265
+ const filePath = createTestAgent('array-name.agent.md', content);
266
+ const result = loadAgent(filePath);
267
+ assert.ok('error' in result, 'Should return error for array name');
268
+ const { error } = result;
269
+ assert.ok(error.message.includes('name'));
270
+ });
271
+ it('3c. name as null returns error', () => {
272
+ const content = `---
273
+ name: null
274
+ description: Agent with null name
275
+ ---
276
+
277
+ Name should be a string.
278
+ `;
279
+ const filePath = createTestAgent('null-name.agent.md', content);
280
+ const result = loadAgent(filePath);
281
+ assert.ok('error' in result, 'Should return error for null name');
282
+ const { error } = result;
283
+ assert.ok(error.message.includes('name'));
284
+ });
285
+ it('5. invalid tools (non-array) returns error', () => {
286
+ const content = `---
287
+ name: Bad Tools Agent
288
+ tools: codebase
289
+ ---
290
+
291
+ Tools should be an array.
292
+ `;
293
+ const filePath = createTestAgent('bad-tools.agent.md', content);
294
+ const result = loadAgent(filePath);
295
+ assert.ok('error' in result, 'Should return error for non-array tools');
296
+ const { error } = result;
297
+ assert.ok(error.message.includes('tools'), `Error should mention 'tools', got: ${error.message}`);
298
+ });
299
+ it('5b. tools as object returns error', () => {
300
+ const content = `---
301
+ name: Object Tools Agent
302
+ tools:
303
+ read: true
304
+ write: false
305
+ ---
306
+
307
+ Tools should be an array, not an object.
308
+ `;
309
+ const filePath = createTestAgent('object-tools.agent.md', content);
310
+ const result = loadAgent(filePath);
311
+ assert.ok('error' in result, 'Should return error for object tools');
312
+ const { error } = result;
313
+ assert.ok(error.message.includes('tools'));
314
+ });
315
+ it('7. handoff missing label returns error', () => {
316
+ const content = `---
317
+ name: Missing Label Agent
318
+ handoffs:
319
+ - agent: developer
320
+ prompt: Please help
321
+ ---
322
+
323
+ Handoff is missing label field.
324
+ `;
325
+ const filePath = createTestAgent('no-label.agent.md', content);
326
+ const result = loadAgent(filePath);
327
+ assert.ok('error' in result, 'Should return error for missing handoff label');
328
+ const { error } = result;
329
+ assert.ok(error.message.includes('Handoff') || error.message.includes('label'), `Error should mention handoff issue, got: ${error.message}`);
330
+ });
331
+ it('8. handoff missing agent returns error', () => {
332
+ const content = `---
333
+ name: Missing Agent Field
334
+ handoffs:
335
+ - label: Send to someone
336
+ prompt: Please help
337
+ ---
338
+
339
+ Handoff is missing agent field.
340
+ `;
341
+ const filePath = createTestAgent('no-agent.agent.md', content);
342
+ const result = loadAgent(filePath);
343
+ assert.ok('error' in result, 'Should return error for missing handoff agent');
344
+ const { error } = result;
345
+ assert.ok(error.message.includes('Handoff') || error.message.includes('agent'), `Error should mention handoff issue, got: ${error.message}`);
346
+ });
347
+ it('9. handoff missing prompt returns error', () => {
348
+ const content = `---
349
+ name: Missing Prompt Agent
350
+ handoffs:
351
+ - label: Send to developer
352
+ agent: developer
353
+ ---
354
+
355
+ Handoff is missing prompt field.
356
+ `;
357
+ const filePath = createTestAgent('no-prompt.agent.md', content);
358
+ const result = loadAgent(filePath);
359
+ assert.ok('error' in result, 'Should return error for missing handoff prompt');
360
+ const { error } = result;
361
+ assert.ok(error.message.includes('Handoff') || error.message.includes('prompt'), `Error should mention handoff issue, got: ${error.message}`);
362
+ });
363
+ it('12. empty frontmatter (only delimiters) returns error', () => {
364
+ const content = `---
365
+ ---
366
+
367
+ This file has empty frontmatter.
368
+ `;
369
+ const filePath = createTestAgent('empty-frontmatter.agent.md', content);
370
+ const result = loadAgent(filePath);
371
+ assert.ok('error' in result, 'Should return error for empty frontmatter');
372
+ const { error } = result;
373
+ assert.ok(error.message.includes('name'), `Error should mention missing name, got: ${error.message}`);
374
+ });
375
+ it('13. malformed YAML returns error', () => {
376
+ const content = `---
377
+ name: Malformed Agent
378
+ tools:
379
+ - valid item
380
+ invalid: yaml: here
381
+ - another item
382
+ ---
383
+
384
+ This YAML is malformed.
385
+ `;
386
+ const filePath = createTestAgent('malformed.agent.md', content);
387
+ const result = loadAgent(filePath);
388
+ assert.ok('error' in result, 'Should return error for malformed YAML');
389
+ const { error } = result;
390
+ assert.ok(error.message.includes('Failed to parse') || error.message.includes('YAML'), `Error should indicate parse failure, got: ${error.message}`);
391
+ });
392
+ it('13b. unclosed YAML block returns error', () => {
393
+ const content = `---
394
+ name: Unclosed Agent
395
+ description: This frontmatter never closes
396
+
397
+ Body content without closing delimiter.
398
+ `;
399
+ const filePath = createTestAgent('unclosed.agent.md', content);
400
+ const result = loadAgent(filePath);
401
+ // gray-matter treats everything after first --- as frontmatter if no closing ---
402
+ // This should still work but body will be empty
403
+ // Actually, let's see what happens
404
+ if ('error' in result) {
405
+ // If it errors, that's expected
406
+ assert.ok(true);
407
+ }
408
+ else {
409
+ // If it doesn't error, body should be empty and frontmatter parsed
410
+ // This is acceptable behavior for gray-matter
411
+ assert.strictEqual(result.agent.frontmatter.name, 'Unclosed Agent');
412
+ }
413
+ });
414
+ it('13c. invalid YAML indentation returns error', () => {
415
+ const content = `---
416
+ name: Bad Indent Agent
417
+ handoffs:
418
+ - label: No indent
419
+ agent: developer
420
+ prompt: Missing indent
421
+ ---
422
+
423
+ Bad indentation in YAML.
424
+ `;
425
+ const filePath = createTestAgent('bad-indent.agent.md', content);
426
+ const result = loadAgent(filePath);
427
+ // gray-matter might parse this differently than expected
428
+ // The handoff array item would not have agent/prompt as nested fields
429
+ if ('error' in result) {
430
+ assert.ok(true, 'Returned error as expected');
431
+ }
432
+ else {
433
+ // If parsed, handoffs[0] should be missing required fields
434
+ const handoffs = result.agent.frontmatter.handoffs;
435
+ if (handoffs && handoffs.length > 0) {
436
+ // The label is there but agent/prompt won't be nested
437
+ assert.ok(!handoffs[0].agent || !handoffs[0].prompt, 'Bad indent should result in missing handoff fields');
438
+ }
439
+ }
440
+ });
441
+ it('handoffs as non-array returns error', () => {
442
+ const content = `---
443
+ name: Bad Handoffs Agent
444
+ handoffs: developer
445
+ ---
446
+
447
+ Handoffs should be an array.
448
+ `;
449
+ const filePath = createTestAgent('bad-handoffs.agent.md', content);
450
+ const result = loadAgent(filePath);
451
+ assert.ok('error' in result, 'Should return error for non-array handoffs');
452
+ const { error } = result;
453
+ assert.ok(error.message.includes('handoffs'), `Error should mention 'handoffs', got: ${error.message}`);
454
+ });
455
+ });
456
+ describe('Edge cases', () => {
457
+ it('should handle minimal valid agent (name only)', () => {
458
+ const content = `---
459
+ name: Minimal Agent
460
+ ---
461
+ `;
462
+ const filePath = createTestAgent('minimal.agent.md', content);
463
+ const result = loadAgent(filePath);
464
+ assert.ok(!('error' in result), 'Minimal agent should be valid');
465
+ const { agent } = result;
466
+ assert.strictEqual(agent.frontmatter.name, 'Minimal Agent');
467
+ assert.strictEqual(agent.frontmatter.description, undefined);
468
+ assert.strictEqual(agent.frontmatter.model, undefined);
469
+ assert.strictEqual(agent.frontmatter.tools, undefined);
470
+ assert.strictEqual(agent.frontmatter.handoffs, undefined);
471
+ assert.strictEqual(agent.frontmatter.infer, undefined);
472
+ });
473
+ it('should handle empty body', () => {
474
+ const content = `---
475
+ name: Empty Body Agent
476
+ ---
477
+ `;
478
+ const filePath = createTestAgent('empty-body.agent.md', content);
479
+ const result = loadAgent(filePath);
480
+ assert.ok(!('error' in result));
481
+ const { agent } = result;
482
+ assert.strictEqual(agent.body, '');
483
+ });
484
+ it('should handle empty tools array', () => {
485
+ const content = `---
486
+ name: No Tools Agent
487
+ tools: []
488
+ ---
489
+
490
+ Agent with empty tools array.
491
+ `;
492
+ const filePath = createTestAgent('empty-tools.agent.md', content);
493
+ const result = loadAgent(filePath);
494
+ assert.ok(!('error' in result));
495
+ const { agent } = result;
496
+ assert.deepStrictEqual(agent.frontmatter.tools, []);
497
+ });
498
+ it('should handle empty handoffs array', () => {
499
+ const content = `---
500
+ name: No Handoffs Agent
501
+ handoffs: []
502
+ ---
503
+
504
+ Agent with empty handoffs array.
505
+ `;
506
+ const filePath = createTestAgent('empty-handoffs.agent.md', content);
507
+ const result = loadAgent(filePath);
508
+ assert.ok(!('error' in result));
509
+ const { agent } = result;
510
+ assert.deepStrictEqual(agent.frontmatter.handoffs, []);
511
+ });
512
+ it('should handle special characters in name', () => {
513
+ const content = `---
514
+ name: "Agent: The Sequel (2.0)"
515
+ ---
516
+
517
+ Agent with special characters in name.
518
+ `;
519
+ const filePath = createTestAgent('special-chars.agent.md', content);
520
+ const result = loadAgent(filePath);
521
+ assert.ok(!('error' in result));
522
+ const { agent } = result;
523
+ assert.strictEqual(agent.frontmatter.name, 'Agent: The Sequel (2.0)');
524
+ });
525
+ it('should handle multiline description', () => {
526
+ const content = `---
527
+ name: Multiline Agent
528
+ description: |
529
+ This is a multiline description
530
+ that spans several lines
531
+ and should be preserved.
532
+ ---
533
+
534
+ Agent with multiline description.
535
+ `;
536
+ const filePath = createTestAgent('multiline-desc.agent.md', content);
537
+ const result = loadAgent(filePath);
538
+ assert.ok(!('error' in result));
539
+ const { agent } = result;
540
+ assert.ok(agent.frontmatter.description?.includes('multiline description'));
541
+ assert.ok(agent.frontmatter.description?.includes('spans several lines'));
542
+ });
543
+ it('should handle unicode in content', () => {
544
+ const content = `---
545
+ name: Unicode Agent 🤖
546
+ description: Supports émojis and ünïcödé
547
+ ---
548
+
549
+ Content with unicode: 日本語, العربية, 中文
550
+ `;
551
+ const filePath = createTestAgent('unicode.agent.md', content);
552
+ const result = loadAgent(filePath);
553
+ assert.ok(!('error' in result));
554
+ const { agent } = result;
555
+ assert.strictEqual(agent.frontmatter.name, 'Unicode Agent 🤖');
556
+ assert.ok(agent.body.includes('日本語'));
557
+ });
558
+ it('should handle GitHub Copilot code fence wrapper', () => {
559
+ const content = `\`\`\`chatagent
560
+ ---
561
+ name: Wrapped Agent
562
+ description: Agent wrapped in code fence
563
+ ---
564
+
565
+ This is inside a code fence.
566
+ \`\`\``;
567
+ const filePath = createTestAgent('wrapped.agent.md', content);
568
+ const result = loadAgent(filePath);
569
+ assert.ok(!('error' in result), `Unexpected error: ${JSON.stringify(result)}`);
570
+ const { agent } = result;
571
+ assert.strictEqual(agent.frontmatter.name, 'Wrapped Agent');
572
+ assert.ok(agent.body.includes('inside a code fence'));
573
+ });
574
+ it('should derive agent ID from filename', () => {
575
+ const content = `---
576
+ name: My Complex Agent
577
+ ---
578
+
579
+ Body content.
580
+ `;
581
+ const filePath = createTestAgent('my-complex-agent.agent.md', content);
582
+ const result = loadAgent(filePath);
583
+ assert.ok(!('error' in result));
584
+ const { agent } = result;
585
+ assert.strictEqual(agent.id, 'my-complex-agent');
586
+ });
587
+ });
588
+ });
589
+ //# sourceMappingURL=frontmatter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.test.js","sourceRoot":"","sources":["../../../src/core/agents/frontmatter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Handoff Validation Tests
3
+ *
4
+ * Tests for agent handoff configuration validation.
5
+ * Handoff interface: { label, agent, prompt, send? }
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=handoffs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoffs.test.d.ts","sourceRoot":"","sources":["../../../src/core/agents/handoffs.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}