@soleri/forge 9.7.2 → 9.9.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.
- package/dist/agent-schema.d.ts +177 -6
- package/dist/agent-schema.js +58 -0
- package/dist/agent-schema.js.map +1 -1
- package/dist/compose-claude-md.js +56 -3
- package/dist/compose-claude-md.js.map +1 -1
- package/dist/domain-manager.d.ts +1 -0
- package/dist/domain-manager.js +57 -1
- package/dist/domain-manager.js.map +1 -1
- package/dist/knowledge-installer.d.ts +2 -0
- package/dist/knowledge-installer.js +107 -1
- package/dist/knowledge-installer.js.map +1 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/scaffold-filetree.d.ts +12 -0
- package/dist/scaffold-filetree.js +356 -10
- package/dist/scaffold-filetree.js.map +1 -1
- package/dist/scaffolder.js +12 -0
- package/dist/scaffolder.js.map +1 -1
- package/dist/skills/subagent-driven-development/SKILL.md +87 -20
- package/dist/templates/setup-script.js +71 -0
- package/dist/templates/setup-script.js.map +1 -1
- package/dist/templates/shared-rules.js +163 -6
- package/dist/templates/shared-rules.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/domain-manager.test.ts +140 -0
- package/src/__tests__/scaffold-filetree.test.ts +326 -1
- package/src/__tests__/scaffolder.test.ts +7 -5
- package/src/__tests__/shared-rules.test.ts +48 -0
- package/src/agent-schema.ts +66 -0
- package/src/compose-claude-md.ts +63 -3
- package/src/domain-manager.ts +74 -1
- package/src/knowledge-installer.ts +124 -1
- package/src/lib.ts +6 -1
- package/src/scaffold-filetree.ts +404 -10
- package/src/scaffolder.ts +17 -0
- package/src/skills/subagent-driven-development/SKILL.md +87 -20
- package/src/templates/setup-script.ts +71 -0
- package/src/templates/shared-rules.ts +166 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { stringify as stringifyYaml, parse as parseYaml } from 'yaml';
|
|
6
|
+
import { addDomain } from '../domain-manager.js';
|
|
7
|
+
|
|
8
|
+
describe('addDomain — file-tree agents', () => {
|
|
9
|
+
let tempDir: string;
|
|
10
|
+
let agentDir: string;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
tempDir = join(
|
|
14
|
+
tmpdir(),
|
|
15
|
+
`domain-manager-test-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
16
|
+
);
|
|
17
|
+
agentDir = join(tempDir, 'my-agent');
|
|
18
|
+
mkdirSync(agentDir, { recursive: true });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
function createFileTreeAgent(opts: { domains?: string[] } = {}): void {
|
|
26
|
+
const yaml = {
|
|
27
|
+
id: 'test-agent',
|
|
28
|
+
name: 'Test Agent',
|
|
29
|
+
role: 'A test agent',
|
|
30
|
+
domains: opts.domains ?? [],
|
|
31
|
+
};
|
|
32
|
+
writeFileSync(join(agentDir, 'agent.yaml'), stringifyYaml(yaml), 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
it('creates knowledge/{domain}.json with empty bundle', async () => {
|
|
36
|
+
createFileTreeAgent();
|
|
37
|
+
|
|
38
|
+
const result = await addDomain({
|
|
39
|
+
agentPath: agentDir,
|
|
40
|
+
domain: 'security',
|
|
41
|
+
format: 'filetree',
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
expect(result.success).toBe(true);
|
|
45
|
+
expect(result.domain).toBe('security');
|
|
46
|
+
expect(result.agentId).toBe('test-agent');
|
|
47
|
+
|
|
48
|
+
const bundlePath = join(agentDir, 'knowledge', 'security.json');
|
|
49
|
+
expect(existsSync(bundlePath)).toBe(true);
|
|
50
|
+
|
|
51
|
+
const bundle = JSON.parse(readFileSync(bundlePath, 'utf-8'));
|
|
52
|
+
expect(bundle).toEqual({ domain: 'security', entries: [] });
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it('updates agent.yaml domains array', async () => {
|
|
56
|
+
createFileTreeAgent({ domains: ['existing'] });
|
|
57
|
+
|
|
58
|
+
const result = await addDomain({
|
|
59
|
+
agentPath: agentDir,
|
|
60
|
+
domain: 'security',
|
|
61
|
+
format: 'filetree',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
expect(result.success).toBe(true);
|
|
65
|
+
|
|
66
|
+
const yaml = parseYaml(readFileSync(join(agentDir, 'agent.yaml'), 'utf-8')) as Record<
|
|
67
|
+
string,
|
|
68
|
+
unknown
|
|
69
|
+
>;
|
|
70
|
+
expect(yaml.domains).toEqual(['existing', 'security']);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('does NOT require package.json', async () => {
|
|
74
|
+
createFileTreeAgent();
|
|
75
|
+
// Explicitly verify no package.json exists
|
|
76
|
+
expect(existsSync(join(agentDir, 'package.json'))).toBe(false);
|
|
77
|
+
|
|
78
|
+
const result = await addDomain({
|
|
79
|
+
agentPath: agentDir,
|
|
80
|
+
domain: 'security',
|
|
81
|
+
format: 'filetree',
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect(result.success).toBe(true);
|
|
85
|
+
expect(result.facadeGenerated).toBe(false);
|
|
86
|
+
expect(result.buildOutput).toBe('');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('rejects duplicate domain', async () => {
|
|
90
|
+
createFileTreeAgent({ domains: ['security'] });
|
|
91
|
+
|
|
92
|
+
const result = await addDomain({
|
|
93
|
+
agentPath: agentDir,
|
|
94
|
+
domain: 'security',
|
|
95
|
+
format: 'filetree',
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(result.success).toBe(false);
|
|
99
|
+
expect(result.warnings[0]).toContain('already exists');
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('rejects invalid domain name', async () => {
|
|
103
|
+
createFileTreeAgent();
|
|
104
|
+
|
|
105
|
+
const result = await addDomain({
|
|
106
|
+
agentPath: agentDir,
|
|
107
|
+
domain: 'Invalid-Name',
|
|
108
|
+
format: 'filetree',
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
expect(result.success).toBe(false);
|
|
112
|
+
expect(result.warnings[0]).toContain('kebab-case');
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('fails when agent.yaml is missing', async () => {
|
|
116
|
+
// No agent.yaml created
|
|
117
|
+
|
|
118
|
+
const result = await addDomain({
|
|
119
|
+
agentPath: agentDir,
|
|
120
|
+
domain: 'security',
|
|
121
|
+
format: 'filetree',
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
expect(result.success).toBe(false);
|
|
125
|
+
expect(result.warnings[0]).toContain('No agent.yaml found');
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('creates knowledge/ directory if it does not exist', async () => {
|
|
129
|
+
createFileTreeAgent();
|
|
130
|
+
expect(existsSync(join(agentDir, 'knowledge'))).toBe(false);
|
|
131
|
+
|
|
132
|
+
await addDomain({
|
|
133
|
+
agentPath: agentDir,
|
|
134
|
+
domain: 'security',
|
|
135
|
+
format: 'filetree',
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
expect(existsSync(join(agentDir, 'knowledge'))).toBe(true);
|
|
139
|
+
});
|
|
140
|
+
});
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
9
|
-
import { mkdirSync, rmSync, existsSync, readFileSync } from 'node:fs';
|
|
9
|
+
import { mkdirSync, rmSync, existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
11
|
import { tmpdir } from 'node:os';
|
|
12
12
|
import { parse as parseYaml } from 'yaml';
|
|
@@ -158,6 +158,50 @@ describe('scaffoldFileTree', () => {
|
|
|
158
158
|
expect(existsSync(join(result.agentDir, 'workflows', 'code-review', 'prompt.md'))).toBe(true);
|
|
159
159
|
});
|
|
160
160
|
|
|
161
|
+
it('scaffolded gates.yaml contains schema comment header', () => {
|
|
162
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
163
|
+
expect(result.success).toBe(true);
|
|
164
|
+
|
|
165
|
+
const gatesContent = readFileSync(
|
|
166
|
+
join(result.agentDir, 'workflows', 'feature-dev', 'gates.yaml'),
|
|
167
|
+
'utf-8',
|
|
168
|
+
);
|
|
169
|
+
expect(gatesContent).toContain(
|
|
170
|
+
'# Workflow gates — engine reads these and enforces them during plan execution.',
|
|
171
|
+
);
|
|
172
|
+
expect(gatesContent).toContain(
|
|
173
|
+
'# Format: phase (brainstorming|pre-execution|post-task|completion), requirement, check',
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
// Verify all workflow gates have the header
|
|
177
|
+
const bugFixGates = readFileSync(
|
|
178
|
+
join(result.agentDir, 'workflows', 'bug-fix', 'gates.yaml'),
|
|
179
|
+
'utf-8',
|
|
180
|
+
);
|
|
181
|
+
expect(bugFixGates).toContain('# Workflow gates');
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it('scaffolded tools.yaml contains schema comment header', () => {
|
|
185
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
186
|
+
expect(result.success).toBe(true);
|
|
187
|
+
|
|
188
|
+
const toolsContent = readFileSync(
|
|
189
|
+
join(result.agentDir, 'workflows', 'feature-dev', 'tools.yaml'),
|
|
190
|
+
'utf-8',
|
|
191
|
+
);
|
|
192
|
+
expect(toolsContent).toContain('# Workflow tools — engine merges these into plan steps.');
|
|
193
|
+
expect(toolsContent).toContain(
|
|
194
|
+
'# Format: list of operation strings (agentId_facade op:operation_name)',
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
// Verify all workflow tools have the header
|
|
198
|
+
const bugFixTools = readFileSync(
|
|
199
|
+
join(result.agentDir, 'workflows', 'bug-fix', 'tools.yaml'),
|
|
200
|
+
'utf-8',
|
|
201
|
+
);
|
|
202
|
+
expect(bugFixTools).toContain('# Workflow tools');
|
|
203
|
+
});
|
|
204
|
+
|
|
161
205
|
it('generates knowledge bundles per domain', () => {
|
|
162
206
|
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
163
207
|
expect(result.success).toBe(true);
|
|
@@ -197,6 +241,31 @@ describe('scaffoldFileTree', () => {
|
|
|
197
241
|
expect(gitignore).toContain('_engine.md');
|
|
198
242
|
});
|
|
199
243
|
|
|
244
|
+
it('generates conventions.md example instruction file', () => {
|
|
245
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
246
|
+
expect(result.success).toBe(true);
|
|
247
|
+
|
|
248
|
+
const content = readFileSync(join(result.agentDir, 'instructions', 'conventions.md'), 'utf-8');
|
|
249
|
+
expect(content).toContain('# Conventions');
|
|
250
|
+
expect(content).toContain('Naming Conventions');
|
|
251
|
+
expect(content).toContain('What to Avoid');
|
|
252
|
+
expect(content).toContain('kebab-case');
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it('generates getting-started.md example instruction file', () => {
|
|
256
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
257
|
+
expect(result.success).toBe(true);
|
|
258
|
+
|
|
259
|
+
const content = readFileSync(
|
|
260
|
+
join(result.agentDir, 'instructions', 'getting-started.md'),
|
|
261
|
+
'utf-8',
|
|
262
|
+
);
|
|
263
|
+
expect(content).toContain('Getting Started with Instructions');
|
|
264
|
+
expect(content).toContain('_engine.md');
|
|
265
|
+
expect(content).toContain('soleri dev');
|
|
266
|
+
expect(content).toContain('alphabetical order');
|
|
267
|
+
});
|
|
268
|
+
|
|
200
269
|
it('fails if directory already exists', () => {
|
|
201
270
|
scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
202
271
|
const result2 = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
@@ -252,4 +321,260 @@ describe('scaffoldFileTree', () => {
|
|
|
252
321
|
expect(result.success).toBe(true);
|
|
253
322
|
expect(result.summary).toContain('No build step needed');
|
|
254
323
|
});
|
|
324
|
+
|
|
325
|
+
it('generates user.md with placeholder content', () => {
|
|
326
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
327
|
+
expect(result.success).toBe(true);
|
|
328
|
+
|
|
329
|
+
const userMdPath = join(result.agentDir, 'instructions', 'user.md');
|
|
330
|
+
expect(existsSync(userMdPath)).toBe(true);
|
|
331
|
+
|
|
332
|
+
const content = readFileSync(userMdPath, 'utf-8');
|
|
333
|
+
expect(content).toContain('# Your Custom Rules');
|
|
334
|
+
expect(content).toContain('priority placement in CLAUDE.md');
|
|
335
|
+
expect(content).toContain('Delete these instructions and replace with your own content.');
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('includes user.md in filesCreated', () => {
|
|
339
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
340
|
+
expect(result.success).toBe(true);
|
|
341
|
+
expect(result.filesCreated).toContain('instructions/user.md');
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it('places user.md content before engine rules ref in CLAUDE.md', () => {
|
|
345
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
346
|
+
expect(result.success).toBe(true);
|
|
347
|
+
|
|
348
|
+
const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
|
|
349
|
+
const userPos = claudeMd.indexOf('# Your Custom Rules');
|
|
350
|
+
const enginePos = claudeMd.indexOf('soleri:engine-rules-ref');
|
|
351
|
+
|
|
352
|
+
expect(userPos).toBeGreaterThan(-1);
|
|
353
|
+
expect(enginePos).toBeGreaterThan(-1);
|
|
354
|
+
expect(userPos).toBeLessThan(enginePos);
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('does not duplicate user.md in the alphabetical instructions section', () => {
|
|
358
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
359
|
+
expect(result.success).toBe(true);
|
|
360
|
+
|
|
361
|
+
const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
|
|
362
|
+
// user.md content should appear exactly once
|
|
363
|
+
const matches = claudeMd.match(/# Your Custom Rules/g);
|
|
364
|
+
expect(matches).toHaveLength(1);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
// ─── Skills Filter Tests ─────────────────────────────────────
|
|
368
|
+
|
|
369
|
+
it('default scaffold creates only essential skills (~7)', () => {
|
|
370
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
371
|
+
expect(result.success).toBe(true);
|
|
372
|
+
|
|
373
|
+
const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
|
|
374
|
+
.filter((d) => d.isDirectory())
|
|
375
|
+
.map((d) => d.name);
|
|
376
|
+
|
|
377
|
+
// Should have ~7 essential skills, not 30+
|
|
378
|
+
expect(skillDirs.length).toBeGreaterThanOrEqual(5);
|
|
379
|
+
expect(skillDirs.length).toBeLessThanOrEqual(10);
|
|
380
|
+
|
|
381
|
+
// Essential skills should be present
|
|
382
|
+
expect(skillDirs).toContain('agent-guide');
|
|
383
|
+
expect(skillDirs).toContain('vault-navigator');
|
|
384
|
+
expect(skillDirs).toContain('vault-capture');
|
|
385
|
+
expect(skillDirs).toContain('systematic-debugging');
|
|
386
|
+
expect(skillDirs).toContain('writing-plans');
|
|
387
|
+
expect(skillDirs).toContain('context-resume');
|
|
388
|
+
expect(skillDirs).toContain('agent-persona');
|
|
389
|
+
|
|
390
|
+
// Optional skills should NOT be present
|
|
391
|
+
expect(skillDirs).not.toContain('brainstorming');
|
|
392
|
+
expect(skillDirs).not.toContain('deep-review');
|
|
393
|
+
expect(skillDirs).not.toContain('code-patrol');
|
|
394
|
+
expect(skillDirs).not.toContain('yolo-mode');
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
it('skillsFilter: "all" creates all skills', () => {
|
|
398
|
+
const result = scaffoldFileTree(
|
|
399
|
+
{ ...MINIMAL_CONFIG, id: 'all-skills', skillsFilter: 'all' },
|
|
400
|
+
tempDir,
|
|
401
|
+
);
|
|
402
|
+
expect(result.success).toBe(true);
|
|
403
|
+
|
|
404
|
+
const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
|
|
405
|
+
.filter((d) => d.isDirectory())
|
|
406
|
+
.map((d) => d.name);
|
|
407
|
+
|
|
408
|
+
// Should have all 30+ skills
|
|
409
|
+
expect(skillDirs.length).toBeGreaterThanOrEqual(25);
|
|
410
|
+
expect(skillDirs).toContain('brainstorming');
|
|
411
|
+
expect(skillDirs).toContain('deep-review');
|
|
412
|
+
expect(skillDirs).toContain('yolo-mode');
|
|
413
|
+
});
|
|
414
|
+
|
|
415
|
+
it('skillsFilter: explicit array creates exactly those skills', () => {
|
|
416
|
+
const result = scaffoldFileTree(
|
|
417
|
+
{ ...MINIMAL_CONFIG, id: 'custom-skills', skillsFilter: ['vault-navigator', 'agent-guide'] },
|
|
418
|
+
tempDir,
|
|
419
|
+
);
|
|
420
|
+
expect(result.success).toBe(true);
|
|
421
|
+
|
|
422
|
+
const skillDirs = readdirSync(join(result.agentDir, 'skills'), { withFileTypes: true })
|
|
423
|
+
.filter((d) => d.isDirectory())
|
|
424
|
+
.map((d) => d.name);
|
|
425
|
+
|
|
426
|
+
expect(skillDirs).toEqual(['agent-guide', 'vault-navigator']);
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
it('CLAUDE.md only lists on-disk skills', () => {
|
|
430
|
+
// Default scaffold = essential only
|
|
431
|
+
const result = scaffoldFileTree({ ...MINIMAL_CONFIG, id: 'claude-md-skills' }, tempDir);
|
|
432
|
+
expect(result.success).toBe(true);
|
|
433
|
+
|
|
434
|
+
const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
|
|
435
|
+
|
|
436
|
+
// Essential skills should appear
|
|
437
|
+
expect(claudeMd).toContain('vault-navigator');
|
|
438
|
+
expect(claudeMd).toContain('agent-guide');
|
|
439
|
+
|
|
440
|
+
// Optional skills should NOT appear (not on disk)
|
|
441
|
+
expect(claudeMd).not.toContain('brainstorming');
|
|
442
|
+
expect(claudeMd).not.toContain('yolo-mode');
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
it('skillsFilter default (essential) is not written to agent.yaml', () => {
|
|
446
|
+
const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
|
|
447
|
+
expect(result.success).toBe(true);
|
|
448
|
+
|
|
449
|
+
const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
|
|
450
|
+
expect(content).not.toContain('skillsFilter');
|
|
451
|
+
});
|
|
452
|
+
|
|
453
|
+
it('skillsFilter: "all" IS written to agent.yaml', () => {
|
|
454
|
+
const result = scaffoldFileTree(
|
|
455
|
+
{ ...MINIMAL_CONFIG, id: 'written-filter', skillsFilter: 'all' },
|
|
456
|
+
tempDir,
|
|
457
|
+
);
|
|
458
|
+
expect(result.success).toBe(true);
|
|
459
|
+
|
|
460
|
+
const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
|
|
461
|
+
const parsed = parseYaml(content);
|
|
462
|
+
expect(parsed.skillsFilter).toBe('all');
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// ─── Workspace & Routing Tests ─────────────────────────────
|
|
466
|
+
|
|
467
|
+
it('creates workspace directories with CONTEXT.md when workspaces defined', () => {
|
|
468
|
+
const result = scaffoldFileTree(
|
|
469
|
+
{
|
|
470
|
+
...MINIMAL_CONFIG,
|
|
471
|
+
workspaces: [
|
|
472
|
+
{ id: 'design', name: 'Design', description: 'Design workspace' },
|
|
473
|
+
{ id: 'review', name: 'Review', description: 'Review workspace' },
|
|
474
|
+
],
|
|
475
|
+
},
|
|
476
|
+
tempDir,
|
|
477
|
+
);
|
|
478
|
+
expect(result.success).toBe(true);
|
|
479
|
+
|
|
480
|
+
// Workspace directories and CONTEXT.md files exist
|
|
481
|
+
expect(existsSync(join(result.agentDir, 'workspaces', 'design', 'CONTEXT.md'))).toBe(true);
|
|
482
|
+
expect(existsSync(join(result.agentDir, 'workspaces', 'review', 'CONTEXT.md'))).toBe(true);
|
|
483
|
+
|
|
484
|
+
// CONTEXT.md contains workspace name and description
|
|
485
|
+
const content = readFileSync(
|
|
486
|
+
join(result.agentDir, 'workspaces', 'design', 'CONTEXT.md'),
|
|
487
|
+
'utf-8',
|
|
488
|
+
);
|
|
489
|
+
expect(content).toContain('# Design');
|
|
490
|
+
expect(content).toContain('Design workspace');
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
it('seeds default workspaces from domains when no explicit workspaces', () => {
|
|
494
|
+
const result = scaffoldFileTree(
|
|
495
|
+
{
|
|
496
|
+
...MINIMAL_CONFIG,
|
|
497
|
+
domains: ['architecture'],
|
|
498
|
+
},
|
|
499
|
+
tempDir,
|
|
500
|
+
);
|
|
501
|
+
expect(result.success).toBe(true);
|
|
502
|
+
|
|
503
|
+
// Architecture domain seeds planning, src, docs workspaces
|
|
504
|
+
expect(existsSync(join(result.agentDir, 'workspaces', 'planning', 'CONTEXT.md'))).toBe(true);
|
|
505
|
+
expect(existsSync(join(result.agentDir, 'workspaces', 'src', 'CONTEXT.md'))).toBe(true);
|
|
506
|
+
expect(existsSync(join(result.agentDir, 'workspaces', 'docs', 'CONTEXT.md'))).toBe(true);
|
|
507
|
+
});
|
|
508
|
+
|
|
509
|
+
it('includes routing entries in agent.yaml', () => {
|
|
510
|
+
const result = scaffoldFileTree(
|
|
511
|
+
{
|
|
512
|
+
...MINIMAL_CONFIG,
|
|
513
|
+
workspaces: [{ id: 'src', name: 'Source', description: 'Source code' }],
|
|
514
|
+
routing: [{ pattern: 'implement feature', workspace: 'src', skills: ['tdd'] }],
|
|
515
|
+
},
|
|
516
|
+
tempDir,
|
|
517
|
+
);
|
|
518
|
+
expect(result.success).toBe(true);
|
|
519
|
+
|
|
520
|
+
const content = readFileSync(join(result.agentDir, 'agent.yaml'), 'utf-8');
|
|
521
|
+
const parsed = parseYaml(content);
|
|
522
|
+
|
|
523
|
+
expect(parsed.workspaces).toHaveLength(1);
|
|
524
|
+
expect(parsed.workspaces[0].id).toBe('src');
|
|
525
|
+
expect(parsed.routing).toHaveLength(1);
|
|
526
|
+
expect(parsed.routing[0].pattern).toBe('implement feature');
|
|
527
|
+
expect(parsed.routing[0].workspace).toBe('src');
|
|
528
|
+
expect(parsed.routing[0].skills).toEqual(['tdd']);
|
|
529
|
+
});
|
|
530
|
+
|
|
531
|
+
it('creates no workspaces directory when no workspaces and no matching domains', () => {
|
|
532
|
+
const result = scaffoldFileTree(
|
|
533
|
+
{
|
|
534
|
+
...MINIMAL_CONFIG,
|
|
535
|
+
domains: ['testing', 'quality'], // no workspace seeds for these
|
|
536
|
+
},
|
|
537
|
+
tempDir,
|
|
538
|
+
);
|
|
539
|
+
expect(result.success).toBe(true);
|
|
540
|
+
|
|
541
|
+
// No workspaces directory
|
|
542
|
+
expect(existsSync(join(result.agentDir, 'workspaces'))).toBe(false);
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
it('includes workspaces and routing sections in CLAUDE.md when defined', () => {
|
|
546
|
+
const result = scaffoldFileTree(
|
|
547
|
+
{
|
|
548
|
+
...MINIMAL_CONFIG,
|
|
549
|
+
workspaces: [{ id: 'design', name: 'Design', description: 'Design patterns' }],
|
|
550
|
+
routing: [
|
|
551
|
+
{ pattern: 'design component', workspace: 'design', skills: ['vault-navigator'] },
|
|
552
|
+
],
|
|
553
|
+
},
|
|
554
|
+
tempDir,
|
|
555
|
+
);
|
|
556
|
+
expect(result.success).toBe(true);
|
|
557
|
+
|
|
558
|
+
const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
|
|
559
|
+
expect(claudeMd).toContain('## Workspaces');
|
|
560
|
+
expect(claudeMd).toContain('Design patterns');
|
|
561
|
+
expect(claudeMd).toContain('## Task Routing');
|
|
562
|
+
expect(claudeMd).toContain('design component');
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it('omits workspaces and routing sections from CLAUDE.md when not defined', () => {
|
|
566
|
+
// Use domains with no workspace seeds
|
|
567
|
+
const result = scaffoldFileTree(
|
|
568
|
+
{
|
|
569
|
+
...MINIMAL_CONFIG,
|
|
570
|
+
domains: ['testing', 'quality'],
|
|
571
|
+
},
|
|
572
|
+
tempDir,
|
|
573
|
+
);
|
|
574
|
+
expect(result.success).toBe(true);
|
|
575
|
+
|
|
576
|
+
const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
|
|
577
|
+
expect(claudeMd).not.toContain('## Workspaces');
|
|
578
|
+
expect(claudeMd).not.toContain('## Task Routing');
|
|
579
|
+
});
|
|
255
580
|
});
|
|
@@ -212,9 +212,11 @@ describe('Scaffolder', () => {
|
|
|
212
212
|
expect(setup).toContain('AGENT_NAME="atlas"');
|
|
213
213
|
expect(setup).toContain('#!/usr/bin/env bash');
|
|
214
214
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
if (process.platform !== 'win32') {
|
|
216
|
+
const stats = statSync(setupPath);
|
|
217
|
+
const isExecutable = (stats.mode & 0o111) !== 0;
|
|
218
|
+
expect(isExecutable).toBe(true);
|
|
219
|
+
}
|
|
218
220
|
});
|
|
219
221
|
|
|
220
222
|
it('should generate facade tests using runtime factories', () => {
|
|
@@ -297,7 +299,7 @@ describe('Scaffolder', () => {
|
|
|
297
299
|
|
|
298
300
|
for (const dir of skillDirs) {
|
|
299
301
|
const content = readFileSync(join(skillsDir, dir, 'SKILL.md'), 'utf-8');
|
|
300
|
-
expect(content).toMatch(/^---\nname: /);
|
|
302
|
+
expect(content).toMatch(/^---\r?\nname: /);
|
|
301
303
|
expect(content).toContain('description:');
|
|
302
304
|
}
|
|
303
305
|
});
|
|
@@ -326,7 +328,7 @@ describe('Scaffolder', () => {
|
|
|
326
328
|
const skillPath = join(skillsDir, name, 'SKILL.md');
|
|
327
329
|
if (existsSync(skillPath)) {
|
|
328
330
|
const content = readFileSync(skillPath, 'utf-8');
|
|
329
|
-
expect(content).toMatch(/^---\nname: /);
|
|
331
|
+
expect(content).toMatch(/^---\r?\nname: /);
|
|
330
332
|
}
|
|
331
333
|
}
|
|
332
334
|
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getEngineRulesContent, getEngineMarker } from '../templates/shared-rules.js';
|
|
3
|
+
|
|
4
|
+
describe('shared-rules', () => {
|
|
5
|
+
const content = getEngineRulesContent();
|
|
6
|
+
|
|
7
|
+
it('includes the engine marker', () => {
|
|
8
|
+
expect(content).toContain(`<!-- ${getEngineMarker()} -->`);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
describe('Reconciliation Triggers', () => {
|
|
12
|
+
it('includes the Reconciliation Triggers section', () => {
|
|
13
|
+
expect(content).toContain('### Reconciliation Triggers');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('includes the explicit trigger (user says "done")', () => {
|
|
17
|
+
expect(content).toContain('**Explicit**');
|
|
18
|
+
expect(content).toMatch(/User says.*done.*ship it.*looks good/);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('includes the plan-complete trigger', () => {
|
|
22
|
+
expect(content).toContain('**Plan-complete**');
|
|
23
|
+
expect(content).toContain(
|
|
24
|
+
'All tasks are complete. Want me to wrap up and capture what we learned, or is there more to fix?',
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it('includes the idle trigger', () => {
|
|
29
|
+
expect(content).toContain('**Idle**');
|
|
30
|
+
expect(content).toContain(
|
|
31
|
+
"We've been idle on this plan. Ready to wrap up, or still working?",
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('includes the NEVER auto-complete rule', () => {
|
|
36
|
+
expect(content).toContain('**NEVER auto-complete without asking the user.**');
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('references orchestrate_status readiness field', () => {
|
|
40
|
+
expect(content).toContain('op:orchestrate_status');
|
|
41
|
+
expect(content).toContain('allTasksTerminal');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('describes orchestrate_complete as user-gated in the Non-Negotiable Rule', () => {
|
|
46
|
+
expect(content).toContain('user-gated');
|
|
47
|
+
});
|
|
48
|
+
});
|