hool-cli 0.7.0 → 0.7.1
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/agents/claude/be-dev.md +9 -1
- package/agents/claude/be-tech-lead.md +8 -0
- package/agents/claude/fe-dev.md +9 -1
- package/agents/claude/fe-tech-lead.md +8 -0
- package/agents/claude/forensic.md +8 -0
- package/agents/claude/governor.md +8 -0
- package/agents/claude/qa.md +8 -0
- package/dist/adapters/adapters.test.d.ts +1 -0
- package/dist/adapters/adapters.test.js +189 -0
- package/dist/adapters/adapters.test.js.map +1 -0
- package/dist/adapters/claude-code.js +21 -11
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/core/scaffold.js +20 -0
- package/dist/core/scaffold.js.map +1 -1
- package/dist/core/scaffold.test.d.ts +1 -0
- package/dist/core/scaffold.test.js +329 -0
- package/dist/core/scaffold.test.js.map +1 -0
- package/dist/core/templates.js +2 -2
- package/dist/core/templates.js.map +1 -1
- package/dist/core/templates.test.d.ts +1 -0
- package/dist/core/templates.test.js +146 -0
- package/dist/core/templates.test.js.map +1 -0
- package/dist/e2e.test.d.ts +1 -0
- package/dist/e2e.test.js +161 -0
- package/dist/e2e.test.js.map +1 -0
- package/dist/mcps/mcps.test.d.ts +1 -0
- package/dist/mcps/mcps.test.js +110 -0
- package/dist/mcps/mcps.test.js.map +1 -0
- package/hooks/inject-pl-context.sh +22 -3
- package/hooks/suggest-compact.sh +8 -12
- package/hooks/track-prompt-count.sh +24 -22
- package/package.json +13 -3
- package/prompts/agents/05-fe-tech-lead.md +3 -0
- package/prompts/agents/06-be-tech-lead.md +3 -0
- package/prompts/agents/08-be-dev.md +4 -1
- package/prompts/agents/08-fe-dev.md +4 -1
- package/prompts/agents/10-qa.md +1 -0
- package/prompts/agents/11-forensic.md +1 -0
- package/prompts/agents/governor.md +1 -0
- package/prompts/orchestrator.md +123 -31
- package/settings/be-dev.json +17 -0
- package/settings/be-tech-lead.json +17 -0
- package/settings/fe-dev.json +17 -0
- package/settings/fe-tech-lead.json +17 -0
- package/settings/forensic.json +17 -0
- package/settings/governor.json +17 -0
- package/settings/qa.json +17 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import { scaffoldProject, scaffoldOnboard, reonboard, writeMcpManifest, writeAgentManifest, copyPlatformFiles, copySkills, copyChecklists, } from './scaffold.js';
|
|
6
|
+
let tmpDir;
|
|
7
|
+
beforeEach(async () => {
|
|
8
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-test-'));
|
|
9
|
+
});
|
|
10
|
+
afterEach(async () => {
|
|
11
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
12
|
+
});
|
|
13
|
+
describe('scaffoldProject', () => {
|
|
14
|
+
it('creates .hool/operations/ with all template files', async () => {
|
|
15
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
16
|
+
const files = await fs.readdir(path.join(tmpDir, '.hool/operations'));
|
|
17
|
+
expect(files).toContain('current-phase.md');
|
|
18
|
+
expect(files).toContain('task-board.md');
|
|
19
|
+
expect(files).toContain('bugs.md');
|
|
20
|
+
expect(files).toContain('issues.md');
|
|
21
|
+
expect(files).toContain('inconsistencies.md');
|
|
22
|
+
expect(files).toContain('needs-human-review.md');
|
|
23
|
+
expect(files).toContain('client-preferences.md');
|
|
24
|
+
expect(files).toContain('governor-rules.md');
|
|
25
|
+
expect(files).toContain('governor-log.md');
|
|
26
|
+
});
|
|
27
|
+
it('creates context and dispatch subdirs', async () => {
|
|
28
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
29
|
+
const stat1 = await fs.stat(path.join(tmpDir, '.hool/operations/context'));
|
|
30
|
+
const stat2 = await fs.stat(path.join(tmpDir, '.hool/operations/dispatch'));
|
|
31
|
+
expect(stat1.isDirectory()).toBe(true);
|
|
32
|
+
expect(stat2.isDirectory()).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it('creates memory dirs for all 8 agents', async () => {
|
|
35
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
36
|
+
const agents = ['product-lead', 'fe-tech-lead', 'be-tech-lead', 'fe-dev', 'be-dev', 'qa', 'forensic', 'governor'];
|
|
37
|
+
for (const agent of agents) {
|
|
38
|
+
const agentDir = path.join(tmpDir, '.hool/memory', agent);
|
|
39
|
+
const files = await fs.readdir(agentDir);
|
|
40
|
+
expect(files).toContain('hot.md');
|
|
41
|
+
expect(files).toContain('cold.md');
|
|
42
|
+
expect(files).toContain('best-practices.md');
|
|
43
|
+
expect(files).toContain('issues.md');
|
|
44
|
+
expect(files).toContain('governor-feedback.md');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
it('creates project-profile.md with correct type and mode', async () => {
|
|
48
|
+
await scaffoldProject(tmpDir, 'cli-tool', 'full-hool');
|
|
49
|
+
const profile = await fs.readFile(path.join(tmpDir, '.hool/phases/00-init/project-profile.md'), 'utf-8');
|
|
50
|
+
expect(profile).toContain('cli-tool');
|
|
51
|
+
expect(profile).toContain('full-hool');
|
|
52
|
+
});
|
|
53
|
+
it('creates all phase directories for web-app', async () => {
|
|
54
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
55
|
+
const expectedDirs = [
|
|
56
|
+
'.hool/phases/00-init',
|
|
57
|
+
'.hool/phases/01-brainstorm',
|
|
58
|
+
'.hool/phases/02-spec/features',
|
|
59
|
+
'.hool/phases/03-design/cards',
|
|
60
|
+
'.hool/phases/03-design/flows',
|
|
61
|
+
'.hool/phases/04-architecture/contracts',
|
|
62
|
+
'.hool/phases/04-architecture/flows',
|
|
63
|
+
'.hool/phases/05-fe-scaffold/pages',
|
|
64
|
+
'.hool/phases/06-be-scaffold/services',
|
|
65
|
+
'.hool/phases/07-test-plan/cases',
|
|
66
|
+
];
|
|
67
|
+
for (const dir of expectedDirs) {
|
|
68
|
+
const stat = await fs.stat(path.join(tmpDir, dir));
|
|
69
|
+
expect(stat.isDirectory()).toBe(true);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
it('skips design and fe-scaffold for cli-tool', async () => {
|
|
73
|
+
await scaffoldProject(tmpDir, 'cli-tool');
|
|
74
|
+
// These should NOT exist
|
|
75
|
+
await expect(fs.access(path.join(tmpDir, '.hool/phases/03-design'))).rejects.toThrow();
|
|
76
|
+
await expect(fs.access(path.join(tmpDir, '.hool/phases/05-fe-scaffold'))).rejects.toThrow();
|
|
77
|
+
// These SHOULD exist
|
|
78
|
+
const stat = await fs.stat(path.join(tmpDir, '.hool/phases/06-be-scaffold/services'));
|
|
79
|
+
expect(stat.isDirectory()).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it('skips be-scaffold for animation', async () => {
|
|
82
|
+
await scaffoldProject(tmpDir, 'animation');
|
|
83
|
+
await expect(fs.access(path.join(tmpDir, '.hool/phases/06-be-scaffold'))).rejects.toThrow();
|
|
84
|
+
const stat = await fs.stat(path.join(tmpDir, '.hool/phases/05-fe-scaffold/pages'));
|
|
85
|
+
expect(stat.isDirectory()).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('creates .hool utility directories', async () => {
|
|
88
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
89
|
+
for (const dir of ['checklists', 'hooks', 'logs', 'metrics', 'settings']) {
|
|
90
|
+
const stat = await fs.stat(path.join(tmpDir, '.hool', dir));
|
|
91
|
+
expect(stat.isDirectory()).toBe(true);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
it('defaults to interactive mode', async () => {
|
|
95
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
96
|
+
const phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
|
|
97
|
+
expect(phase).toContain('interactive');
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('scaffoldOnboard', () => {
|
|
101
|
+
it('creates .hool structure with onboarding phase', async () => {
|
|
102
|
+
await scaffoldOnboard(tmpDir, 'web-app');
|
|
103
|
+
const phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
|
|
104
|
+
expect(phase).toContain('onboarding');
|
|
105
|
+
});
|
|
106
|
+
it('creates task-board with ONBOARD tasks', async () => {
|
|
107
|
+
await scaffoldOnboard(tmpDir, 'web-app');
|
|
108
|
+
const board = await fs.readFile(path.join(tmpDir, '.hool/operations/task-board.md'), 'utf-8');
|
|
109
|
+
expect(board).toContain('ONBOARD-001');
|
|
110
|
+
expect(board).toContain('ONBOARD-011');
|
|
111
|
+
});
|
|
112
|
+
it('marks project-profile as onboarded', async () => {
|
|
113
|
+
await scaffoldOnboard(tmpDir, 'cli-tool', 'full-hool');
|
|
114
|
+
const profile = await fs.readFile(path.join(tmpDir, '.hool/phases/00-init/project-profile.md'), 'utf-8');
|
|
115
|
+
expect(profile).toContain('onboarded');
|
|
116
|
+
expect(profile).toContain('cli-tool');
|
|
117
|
+
expect(profile).toContain('full-hool');
|
|
118
|
+
});
|
|
119
|
+
it('respects skip phases same as init', async () => {
|
|
120
|
+
await scaffoldOnboard(tmpDir, 'api-only');
|
|
121
|
+
await expect(fs.access(path.join(tmpDir, '.hool/phases/03-design'))).rejects.toThrow();
|
|
122
|
+
await expect(fs.access(path.join(tmpDir, '.hool/phases/05-fe-scaffold'))).rejects.toThrow();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe('reonboard', () => {
|
|
126
|
+
it('overwrites current-phase to onboarding', async () => {
|
|
127
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
128
|
+
// Verify it starts at phase 0
|
|
129
|
+
let phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
|
|
130
|
+
expect(phase).toContain('Phase**: 0');
|
|
131
|
+
await reonboard(tmpDir);
|
|
132
|
+
phase = await fs.readFile(path.join(tmpDir, '.hool/operations/current-phase.md'), 'utf-8');
|
|
133
|
+
expect(phase).toContain('onboarding');
|
|
134
|
+
});
|
|
135
|
+
it('prepends re-onboard tasks to existing task-board', async () => {
|
|
136
|
+
await scaffoldProject(tmpDir, 'web-app');
|
|
137
|
+
// Add a custom task
|
|
138
|
+
const taskBoardPath = path.join(tmpDir, '.hool/operations/task-board.md');
|
|
139
|
+
await fs.writeFile(taskBoardPath, '# Task Board\n\n## Active Tasks\n- [ ] TASK-099: Custom task | assigned: be-dev\n', 'utf-8');
|
|
140
|
+
await reonboard(tmpDir);
|
|
141
|
+
const board = await fs.readFile(taskBoardPath, 'utf-8');
|
|
142
|
+
expect(board).toContain('## Re-onboard Tasks');
|
|
143
|
+
expect(board).toContain('ONBOARD-001');
|
|
144
|
+
expect(board).toContain('TASK-099'); // preserved
|
|
145
|
+
});
|
|
146
|
+
it('works when no existing task-board', async () => {
|
|
147
|
+
await fs.mkdir(path.join(tmpDir, '.hool/operations'), { recursive: true });
|
|
148
|
+
await reonboard(tmpDir);
|
|
149
|
+
const board = await fs.readFile(path.join(tmpDir, '.hool/operations/task-board.md'), 'utf-8');
|
|
150
|
+
expect(board).toContain('# Task Board');
|
|
151
|
+
expect(board).toContain('ONBOARD-001');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('writeMcpManifest', () => {
|
|
155
|
+
it('writes valid JSON manifest', async () => {
|
|
156
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
157
|
+
await writeMcpManifest(tmpDir, 'web-app', ['context7', 'playwright']);
|
|
158
|
+
const content = await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8');
|
|
159
|
+
const manifest = JSON.parse(content);
|
|
160
|
+
expect(manifest.domain).toBe('web-app');
|
|
161
|
+
expect(manifest.servers).toHaveProperty('context7');
|
|
162
|
+
expect(manifest.servers).toHaveProperty('playwright');
|
|
163
|
+
expect(manifest.servers.context7).toHaveProperty('command');
|
|
164
|
+
expect(manifest.servers.context7).toHaveProperty('args');
|
|
165
|
+
});
|
|
166
|
+
it('includes optional field', async () => {
|
|
167
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
168
|
+
await writeMcpManifest(tmpDir, 'cli-tool', ['context7']);
|
|
169
|
+
const manifest = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8'));
|
|
170
|
+
expect(manifest.optional).toContain('hool-context-mcp');
|
|
171
|
+
});
|
|
172
|
+
it('skips unknown MCP names gracefully', async () => {
|
|
173
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
174
|
+
await writeMcpManifest(tmpDir, 'web-app', ['context7', 'nonexistent-mcp']);
|
|
175
|
+
const manifest = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/mcps.json'), 'utf-8'));
|
|
176
|
+
expect(manifest.servers).toHaveProperty('context7');
|
|
177
|
+
expect(manifest.servers).not.toHaveProperty('nonexistent-mcp');
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
describe('writeAgentManifest', () => {
|
|
181
|
+
it('writes valid JSON with all 8 agents', async () => {
|
|
182
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
183
|
+
await writeAgentManifest(tmpDir);
|
|
184
|
+
const content = await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8');
|
|
185
|
+
const agents = JSON.parse(content);
|
|
186
|
+
expect(agents).toHaveLength(8);
|
|
187
|
+
const names = agents.map((a) => a.name);
|
|
188
|
+
expect(names).toContain('product-lead');
|
|
189
|
+
expect(names).toContain('be-dev');
|
|
190
|
+
expect(names).toContain('fe-dev');
|
|
191
|
+
expect(names).toContain('qa');
|
|
192
|
+
expect(names).toContain('governor');
|
|
193
|
+
});
|
|
194
|
+
it('each agent has required fields', async () => {
|
|
195
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
196
|
+
await writeAgentManifest(tmpDir);
|
|
197
|
+
const agents = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8'));
|
|
198
|
+
for (const agent of agents) {
|
|
199
|
+
expect(agent).toHaveProperty('name');
|
|
200
|
+
expect(agent).toHaveProperty('role');
|
|
201
|
+
expect(agent).toHaveProperty('prompt');
|
|
202
|
+
expect(agent).toHaveProperty('memory');
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
it('agent memory paths use .hool/memory/ prefix', async () => {
|
|
206
|
+
await fs.mkdir(path.join(tmpDir, '.hool'), { recursive: true });
|
|
207
|
+
await writeAgentManifest(tmpDir);
|
|
208
|
+
const agents = JSON.parse(await fs.readFile(path.join(tmpDir, '.hool/agents.json'), 'utf-8'));
|
|
209
|
+
for (const agent of agents) {
|
|
210
|
+
expect(agent.memory).toMatch(/^\.hool\/memory\//);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe('copyPlatformFiles', () => {
|
|
215
|
+
let templateDir;
|
|
216
|
+
beforeEach(async () => {
|
|
217
|
+
templateDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-templates-'));
|
|
218
|
+
// Create minimal template structure
|
|
219
|
+
await fs.mkdir(path.join(templateDir, 'agents/claude'), { recursive: true });
|
|
220
|
+
await fs.writeFile(path.join(templateDir, 'agents/claude/be-dev.md'), '---\nname: BE Dev\n---\nBE Dev agent');
|
|
221
|
+
await fs.writeFile(path.join(templateDir, 'agents/claude/qa.md'), '---\nname: QA\n---\nQA agent');
|
|
222
|
+
await fs.mkdir(path.join(templateDir, 'hooks'), { recursive: true });
|
|
223
|
+
await fs.writeFile(path.join(templateDir, 'hooks/block-pl-src-write.sh'), '#!/bin/bash\necho test');
|
|
224
|
+
await fs.writeFile(path.join(templateDir, 'hooks/track-prompt-count.sh'), '#!/bin/bash\necho test');
|
|
225
|
+
await fs.mkdir(path.join(templateDir, 'settings'), { recursive: true });
|
|
226
|
+
await fs.writeFile(path.join(templateDir, 'settings/claude-settings.json'), JSON.stringify({
|
|
227
|
+
hooks: { PreToolUse: [{ matcher: 'Edit', hooks: [{ type: 'command', command: '.hool/hooks/block-pl-src-write.sh' }] }] }
|
|
228
|
+
}));
|
|
229
|
+
await fs.writeFile(path.join(templateDir, 'settings/be-dev.json'), JSON.stringify({
|
|
230
|
+
hooks: { Stop: [{ matcher: '', hooks: [{ type: 'command', command: '.hool/hooks/agent-checklist.sh' }] }] }
|
|
231
|
+
}));
|
|
232
|
+
await fs.writeFile(path.join(templateDir, 'settings/qa.json'), JSON.stringify({
|
|
233
|
+
hooks: { Stop: [{ matcher: '', hooks: [{ type: 'command', command: '.hool/hooks/agent-checklist.sh' }] }] }
|
|
234
|
+
}));
|
|
235
|
+
await fs.mkdir(path.join(templateDir, 'prompts/skills'), { recursive: true });
|
|
236
|
+
await fs.writeFile(path.join(templateDir, 'prompts/skills/01-brainstorm.md'), '# Brainstorm skill');
|
|
237
|
+
await fs.mkdir(path.join(templateDir, 'prompts/checklists'), { recursive: true });
|
|
238
|
+
await fs.writeFile(path.join(templateDir, 'prompts/checklists/code-review.md'), '# Code review checklist');
|
|
239
|
+
});
|
|
240
|
+
afterEach(async () => {
|
|
241
|
+
await fs.rm(templateDir, { recursive: true, force: true });
|
|
242
|
+
});
|
|
243
|
+
it('copies agent definitions to .claude/agents/ for claude-code', async () => {
|
|
244
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
245
|
+
const agents = await fs.readdir(path.join(tmpDir, '.claude/agents'));
|
|
246
|
+
expect(agents).toContain('be-dev.md');
|
|
247
|
+
expect(agents).toContain('qa.md');
|
|
248
|
+
});
|
|
249
|
+
it('copies hooks to .hool/hooks/ and makes them executable', async () => {
|
|
250
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
251
|
+
const hookPath = path.join(tmpDir, '.hool/hooks/block-pl-src-write.sh');
|
|
252
|
+
const stat = await fs.stat(hookPath);
|
|
253
|
+
expect(stat.mode & 0o111).toBeGreaterThan(0); // executable
|
|
254
|
+
});
|
|
255
|
+
it('copies settings.json to .claude/settings.json', async () => {
|
|
256
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
257
|
+
const settings = JSON.parse(await fs.readFile(path.join(tmpDir, '.claude/settings.json'), 'utf-8'));
|
|
258
|
+
expect(settings.hooks).toHaveProperty('PreToolUse');
|
|
259
|
+
});
|
|
260
|
+
it('merges with existing .claude/settings.json', async () => {
|
|
261
|
+
await fs.mkdir(path.join(tmpDir, '.claude'), { recursive: true });
|
|
262
|
+
await fs.writeFile(path.join(tmpDir, '.claude/settings.json'), JSON.stringify({
|
|
263
|
+
hooks: { PostToolUse: [{ matcher: 'Test', hooks: [{ type: 'command', command: 'test.sh' }] }] }
|
|
264
|
+
}));
|
|
265
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
266
|
+
const settings = JSON.parse(await fs.readFile(path.join(tmpDir, '.claude/settings.json'), 'utf-8'));
|
|
267
|
+
expect(settings.hooks).toHaveProperty('PreToolUse'); // from HOOL
|
|
268
|
+
expect(settings.hooks).toHaveProperty('PostToolUse'); // preserved
|
|
269
|
+
});
|
|
270
|
+
it('copies per-role settings to .hool/settings/ (excluding claude-settings.json)', async () => {
|
|
271
|
+
await fs.mkdir(path.join(tmpDir, '.hool/settings'), { recursive: true });
|
|
272
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
273
|
+
const settingsFiles = await fs.readdir(path.join(tmpDir, '.hool/settings'));
|
|
274
|
+
expect(settingsFiles).toContain('be-dev.json');
|
|
275
|
+
expect(settingsFiles).toContain('qa.json');
|
|
276
|
+
expect(settingsFiles).not.toContain('claude-settings.json');
|
|
277
|
+
});
|
|
278
|
+
it('copies skills to .claude/skills/', async () => {
|
|
279
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
280
|
+
const skillFile = await fs.readFile(path.join(tmpDir, '.claude/skills/brainstorm/SKILL.md'), 'utf-8');
|
|
281
|
+
expect(skillFile).toContain('Brainstorm skill');
|
|
282
|
+
});
|
|
283
|
+
it('copies checklists to .hool/checklists/', async () => {
|
|
284
|
+
await copyPlatformFiles(tmpDir, templateDir, 'claude-code');
|
|
285
|
+
const checklist = await fs.readFile(path.join(tmpDir, '.hool/checklists/code-review.md'), 'utf-8');
|
|
286
|
+
expect(checklist).toContain('Code review checklist');
|
|
287
|
+
});
|
|
288
|
+
it('copies cursor agents for cursor platform', async () => {
|
|
289
|
+
await fs.mkdir(path.join(templateDir, 'agents/cursor'), { recursive: true });
|
|
290
|
+
await fs.writeFile(path.join(templateDir, 'agents/cursor/be-dev.md'), 'cursor be-dev');
|
|
291
|
+
await fs.mkdir(path.join(templateDir, 'rules/cursor'), { recursive: true });
|
|
292
|
+
await fs.writeFile(path.join(templateDir, 'rules/cursor/be-dev.mdc'), 'cursor rule');
|
|
293
|
+
await copyPlatformFiles(tmpDir, templateDir, 'cursor');
|
|
294
|
+
const agentContent = await fs.readFile(path.join(tmpDir, '.cursor/agents/be-dev.md'), 'utf-8');
|
|
295
|
+
expect(agentContent).toBe('cursor be-dev');
|
|
296
|
+
const ruleContent = await fs.readFile(path.join(tmpDir, '.cursor/rules/be-dev.mdc'), 'utf-8');
|
|
297
|
+
expect(ruleContent).toBe('cursor rule');
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe('copySkills', () => {
|
|
301
|
+
it('copies skill files with correct naming', async () => {
|
|
302
|
+
const skillsDir = path.join(tmpDir, 'skills');
|
|
303
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
304
|
+
await fs.writeFile(path.join(skillsDir, '01-brainstorm.md'), '# Brainstorm');
|
|
305
|
+
await fs.writeFile(path.join(skillsDir, '02-spec.md'), '# Spec');
|
|
306
|
+
const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
|
|
307
|
+
await copySkills(projectDir, tmpDir);
|
|
308
|
+
expect(await fs.readFile(path.join(projectDir, '.claude/skills/brainstorm/SKILL.md'), 'utf-8')).toBe('# Brainstorm');
|
|
309
|
+
expect(await fs.readFile(path.join(projectDir, '.claude/skills/spec/SKILL.md'), 'utf-8')).toBe('# Spec');
|
|
310
|
+
await fs.rm(projectDir, { recursive: true, force: true });
|
|
311
|
+
});
|
|
312
|
+
it('handles missing skills directory gracefully', async () => {
|
|
313
|
+
const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
|
|
314
|
+
await expect(copySkills(projectDir, '/nonexistent')).resolves.toBeUndefined();
|
|
315
|
+
await fs.rm(projectDir, { recursive: true, force: true });
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
describe('copyChecklists', () => {
|
|
319
|
+
it('copies checklist files', async () => {
|
|
320
|
+
const checklistsDir = path.join(tmpDir, 'checklists');
|
|
321
|
+
await fs.mkdir(checklistsDir, { recursive: true });
|
|
322
|
+
await fs.writeFile(path.join(checklistsDir, 'review.md'), '# Review');
|
|
323
|
+
const projectDir = await fs.mkdtemp(path.join(os.tmpdir(), 'hool-proj-'));
|
|
324
|
+
await copyChecklists(projectDir, tmpDir);
|
|
325
|
+
expect(await fs.readFile(path.join(projectDir, '.hool/checklists/review.md'), 'utf-8')).toBe('# Review');
|
|
326
|
+
await fs.rm(projectDir, { recursive: true, force: true });
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
//# sourceMappingURL=scaffold.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../../src/core/scaffold.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EACL,eAAe,EACf,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,cAAc,GACf,MAAM,eAAe,CAAC;AAEvB,IAAI,MAAc,CAAC;AAEnB,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAClH,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yCAAyC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzG,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG;YACnB,sBAAsB;YACtB,4BAA4B;YAC5B,+BAA+B;YAC/B,8BAA8B;YAC9B,8BAA8B;YAC9B,wCAAwC;YACxC,oCAAoC;YACpC,mCAAmC;YACnC,sCAAsC;YACtC,iCAAiC;SAClC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,yBAAyB;QACzB,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvF,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5F,qBAAqB;QACrB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5F,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjG,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,yCAAyC,CAAC,EAAE,OAAO,CAAC,CAAC;QACzG,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvF,MAAM,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,6BAA6B,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,8BAA8B;QAC9B,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/F,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAEtC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACzC,oBAAoB;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;QAC1E,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,mFAAmF,EAAE,OAAO,CAAC,CAAC;QAEhI,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gCAAgC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9F,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACtD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9F,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACpD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAE1E,oCAAoC;QACpC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,yBAAyB,CAAC,EAAE,sCAAsC,CAAC,CAAC;QAC9G,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAElG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,EAAE,wBAAwB,CAAC,CAAC;QACpG,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAEpG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,+BAA+B,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YACzF,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,EAAE,CAAC,EAAE;SACzH,CAAC,CAAC,CAAC;QACJ,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAChF,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,EAAE,CAAC,EAAE;SAC5G,CAAC,CAAC,CAAC;QACJ,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5E,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,EAAE,CAAC,EAAE;SAC5G,CAAC,CAAC,CAAC;QAEJ,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iCAAiC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAEpG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,mCAAmC,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5E,KAAK,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE;SAChG,CAAC,CAAC,CAAC;QAEJ,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY;QACjE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC5F,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC5E,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,oCAAoC,CAAC,EAAE,OAAO,CAAC,CAAC;QACtG,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iCAAiC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnG,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,yBAAyB,CAAC,EAAE,eAAe,CAAC,CAAC;QACvF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,yBAAyB,CAAC,EAAE,aAAa,CAAC,CAAC;QAErF,MAAM,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/F,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,0BAA0B,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9F,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,cAAc,CAAC,CAAC;QAC7E,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEjE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAErC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,oCAAoC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrH,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,8BAA8B,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzG,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1E,MAAM,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9E,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACtD,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;QAEtE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QAC1E,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,4BAA4B,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEzG,MAAM,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/core/templates.js
CHANGED
|
@@ -7,7 +7,7 @@ export function getOperationTemplates(mode = 'interactive') {
|
|
|
7
7
|
'inconsistencies.md': `# Inconsistencies\n\n_No inconsistencies found yet._\n`,
|
|
8
8
|
'needs-human-review.md': `# Needs Human Review\n\n_Nothing pending human review._\n`,
|
|
9
9
|
'client-preferences.md': `# Client Preferences\n\nUser tech and product preferences captured during the project. Every agent honours these.\n\n## Tech Preferences\n_None yet._\n\n## Product Constraints\n_None yet._\n\n## Integrations\n_None yet._\n`,
|
|
10
|
-
'governor-rules.md': `# Governor Rules\n\nHard rules enforced by the Governor agent. Agents self-enforce; Governor audits.\n\n## Critical (must never happen even once)\n- [CRITICAL] No agent may modify its own prompt files (.hool/prompts/)\n- [CRITICAL] Product Lead must NEVER edit application code (src/, tests/) directly — always dispatch\n- [CRITICAL] No agent may remove or overwrite entries in governor-rules.md\n\n## High\n- [HIGH] All agents must load operations/client-preferences.md and honour user preferences\n- [HIGH] Product Lead must write a dispatch brief to operations/context/ before dispatching any agent\n- [HIGH] No task is too small for agent dispatch — even one-line changes go through the assigned agent\n- [HIGH] Dev agents (FE Dev, BE Dev) and QA MUST run actual test commands and paste terminal output showing pass/fail counts. Describing tests without executing them is a violation. No terminal output = no evidence = violation.\n\n## Medium\n- [MEDIUM] Agents must review best-practices.md and governor-feedback.md before submitting work\n- [MEDIUM] All file edits must be within the agent's declared writable paths\n`,
|
|
10
|
+
'governor-rules.md': `# Governor Rules\n\nHard rules enforced by the Governor agent. Agents self-enforce; Governor audits.\n\n## Critical (must never happen even once)\n- [CRITICAL] No agent may modify its own prompt files (.hool/prompts/)\n- [CRITICAL] Product Lead must NEVER edit application code (src/, tests/) directly — always dispatch\n- [CRITICAL] No agent may remove or overwrite entries in governor-rules.md\n\n## High\n- [HIGH] All agents must load operations/client-preferences.md and honour user preferences\n- [HIGH] Product Lead must write a dispatch brief to operations/context/ before dispatching any agent\n- [HIGH] No task is too small for agent dispatch — even one-line changes go through the assigned agent\n- [HIGH] Dev agents (FE Dev, BE Dev) and QA MUST run actual test commands and paste terminal output showing pass/fail counts. Describing tests without executing them is a violation. No terminal output = no evidence = violation.\n- [HIGH] Never dispatch multiple instances of the same agent in parallel. Same-agent instances share memory files (cold.md, hot.md, best-practices.md, issues.md) — concurrent writes cause data loss. Sequential dispatch only within the same agent role. Cross-role parallel dispatch (e.g., fe-dev + be-dev) is safe when tasks have no shared files.\n\n## Medium\n- [MEDIUM] Agents must review best-practices.md and governor-feedback.md before submitting work\n- [MEDIUM] All file edits must be within the agent's declared writable paths\n`,
|
|
11
11
|
'governor-log.md': `# Governor Log\n\n_No audits yet._\n`,
|
|
12
12
|
};
|
|
13
13
|
}
|
|
@@ -63,7 +63,7 @@ _No inconsistencies found yet. Onboarding will populate this._
|
|
|
63
63
|
_Onboarding will add the inferred spec here for review._
|
|
64
64
|
`,
|
|
65
65
|
'client-preferences.md': `# Client Preferences\n\nUser tech and product preferences captured during the project. Every agent honours these.\n\n## Tech Preferences\n_None yet._\n\n## Product Constraints\n_None yet._\n\n## Integrations\n_None yet._\n`,
|
|
66
|
-
'governor-rules.md': `# Governor Rules\n\nHard rules enforced by the Governor agent. Agents self-enforce; Governor audits.\n\n## Critical (must never happen even once)\n- [CRITICAL] No agent may modify its own prompt files (.hool/prompts/)\n- [CRITICAL] Product Lead must NEVER edit application code (src/, tests/) directly — always dispatch\n- [CRITICAL] No agent may remove or overwrite entries in governor-rules.md\n\n## High\n- [HIGH] All agents must load operations/client-preferences.md and honour user preferences\n- [HIGH] Product Lead must write a dispatch brief to operations/context/ before dispatching any agent\n- [HIGH] No task is too small for agent dispatch — even one-line changes go through the assigned agent\n- [HIGH] Dev agents (FE Dev, BE Dev) and QA MUST run actual test commands and paste terminal output showing pass/fail counts. Describing tests without executing them is a violation. No terminal output = no evidence = violation.\n\n## Medium\n- [MEDIUM] Agents must review best-practices.md and governor-feedback.md before submitting work\n- [MEDIUM] All file edits must be within the agent's declared writable paths\n`,
|
|
66
|
+
'governor-rules.md': `# Governor Rules\n\nHard rules enforced by the Governor agent. Agents self-enforce; Governor audits.\n\n## Critical (must never happen even once)\n- [CRITICAL] No agent may modify its own prompt files (.hool/prompts/)\n- [CRITICAL] Product Lead must NEVER edit application code (src/, tests/) directly — always dispatch\n- [CRITICAL] No agent may remove or overwrite entries in governor-rules.md\n\n## High\n- [HIGH] All agents must load operations/client-preferences.md and honour user preferences\n- [HIGH] Product Lead must write a dispatch brief to operations/context/ before dispatching any agent\n- [HIGH] No task is too small for agent dispatch — even one-line changes go through the assigned agent\n- [HIGH] Dev agents (FE Dev, BE Dev) and QA MUST run actual test commands and paste terminal output showing pass/fail counts. Describing tests without executing them is a violation. No terminal output = no evidence = violation.\n- [HIGH] Never dispatch multiple instances of the same agent in parallel. Same-agent instances share memory files (cold.md, hot.md, best-practices.md, issues.md) — concurrent writes cause data loss. Sequential dispatch only within the same agent role. Cross-role parallel dispatch (e.g., fe-dev + be-dev) is safe when tasks have no shared files.\n\n## Medium\n- [MEDIUM] Agents must review best-practices.md and governor-feedback.md before submitting work\n- [MEDIUM] All file edits must be within the agent's declared writable paths\n`,
|
|
67
67
|
'governor-log.md': `# Governor Log\n\n_No audits yet._\n`,
|
|
68
68
|
};
|
|
69
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,OAAe,aAAa;IAChE,OAAO;QACL,kBAAkB,EAAE,kCAAkC,IAAI,sDAAsD;QAEhH,eAAe,EAAE,mFAAmF;QAEpG,SAAS,EAAE,4CAA4C;QAEvD,WAAW,EAAE,uCAAuC;QAEpD,oBAAoB,EAAE,wDAAwD;QAE9E,uBAAuB,EAAE,2DAA2D;QAEpF,uBAAuB,EAAE,gOAAgO;QAEzP,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,OAAe,aAAa;IAChE,OAAO;QACL,kBAAkB,EAAE,kCAAkC,IAAI,sDAAsD;QAEhH,eAAe,EAAE,mFAAmF;QAEpG,SAAS,EAAE,4CAA4C;QAEvD,WAAW,EAAE,uCAAuC;QAEpD,oBAAoB,EAAE,wDAAwD;QAE9E,uBAAuB,EAAE,2DAA2D;QAEpF,uBAAuB,EAAE,gOAAgO;QAEzP,mBAAmB,EAAE,i8CAAi8C;QAEt9C,iBAAiB,EAAE,sCAAsC;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,OAAe,aAAa;IACvE,OAAO;QACL,kBAAkB,EAAE;;cAEV,IAAI;;;;;;;;;;;;CAYjB;QAEG,eAAe,EAAE;;;;;;;;;;;;;;;;;CAiBpB;QAEG,SAAS,EAAE;;;CAGd;QAEG,WAAW,EAAE;;;CAGhB;QAEG,oBAAoB,EAAE;;;CAGzB;QAEG,uBAAuB,EAAE;;;CAG5B;QAEG,uBAAuB,EAAE,gOAAgO;QAEzP,mBAAmB,EAAE,i8CAAi8C;QAEt9C,iBAAiB,EAAE,sCAAsC;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAe,aAAa;IACjE,OAAO;;cAEK,IAAI;;;;;;;;;;;;CAYjB,CAAC;AACF,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO;;;;;;;;;;;;;CAaR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,QAAQ,EAAE,kGAAkG;QAE5G,SAAS,EAAE,gBAAgB;QAE3B,mBAAmB,EAAE,4DAA4D;QAEjF,WAAW,EAAE,oDAAoD;QAEjE,sBAAsB,EAAE,6CAA6C;KACtE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { getOperationTemplates, getOnboardOperationTemplates, getOnboardCurrentPhase, getOnboardTasksPrepend, getMemoryHeaders, } from './templates.js';
|
|
3
|
+
describe('getOperationTemplates', () => {
|
|
4
|
+
it('returns all expected operation files', () => {
|
|
5
|
+
const templates = getOperationTemplates();
|
|
6
|
+
const expectedFiles = [
|
|
7
|
+
'current-phase.md',
|
|
8
|
+
'task-board.md',
|
|
9
|
+
'bugs.md',
|
|
10
|
+
'issues.md',
|
|
11
|
+
'inconsistencies.md',
|
|
12
|
+
'needs-human-review.md',
|
|
13
|
+
'client-preferences.md',
|
|
14
|
+
'governor-rules.md',
|
|
15
|
+
'governor-log.md',
|
|
16
|
+
];
|
|
17
|
+
for (const file of expectedFiles) {
|
|
18
|
+
expect(templates).toHaveProperty(file);
|
|
19
|
+
expect(templates[file].length).toBeGreaterThan(0);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
it('defaults to interactive mode', () => {
|
|
23
|
+
const templates = getOperationTemplates();
|
|
24
|
+
expect(templates['current-phase.md']).toContain('interactive');
|
|
25
|
+
});
|
|
26
|
+
it('respects full-hool mode', () => {
|
|
27
|
+
const templates = getOperationTemplates('full-hool');
|
|
28
|
+
expect(templates['current-phase.md']).toContain('full-hool');
|
|
29
|
+
});
|
|
30
|
+
it('sets phase to 0 for init', () => {
|
|
31
|
+
const templates = getOperationTemplates();
|
|
32
|
+
expect(templates['current-phase.md']).toContain('Phase**: 0');
|
|
33
|
+
});
|
|
34
|
+
it('includes all governor rule severity levels', () => {
|
|
35
|
+
const rules = getOperationTemplates()['governor-rules.md'];
|
|
36
|
+
expect(rules).toContain('[CRITICAL]');
|
|
37
|
+
expect(rules).toContain('[HIGH]');
|
|
38
|
+
expect(rules).toContain('[MEDIUM]');
|
|
39
|
+
});
|
|
40
|
+
it('includes single-instance dispatch rule in governor-rules', () => {
|
|
41
|
+
const rules = getOperationTemplates()['governor-rules.md'];
|
|
42
|
+
expect(rules).toContain('Never dispatch multiple instances of the same agent in parallel');
|
|
43
|
+
});
|
|
44
|
+
it('task-board starts empty', () => {
|
|
45
|
+
const templates = getOperationTemplates();
|
|
46
|
+
expect(templates['task-board.md']).toContain('No tasks yet');
|
|
47
|
+
});
|
|
48
|
+
it('client-preferences has all sections', () => {
|
|
49
|
+
const prefs = getOperationTemplates()['client-preferences.md'];
|
|
50
|
+
expect(prefs).toContain('## Tech Preferences');
|
|
51
|
+
expect(prefs).toContain('## Product Constraints');
|
|
52
|
+
expect(prefs).toContain('## Integrations');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('getOnboardOperationTemplates', () => {
|
|
56
|
+
it('returns all expected operation files', () => {
|
|
57
|
+
const templates = getOnboardOperationTemplates();
|
|
58
|
+
expect(Object.keys(templates)).toHaveLength(9);
|
|
59
|
+
});
|
|
60
|
+
it('sets phase to onboarding', () => {
|
|
61
|
+
const templates = getOnboardOperationTemplates();
|
|
62
|
+
expect(templates['current-phase.md']).toContain('Phase**: onboarding');
|
|
63
|
+
});
|
|
64
|
+
it('task-board has all 11 ONBOARD tasks', () => {
|
|
65
|
+
const board = getOnboardOperationTemplates()['task-board.md'];
|
|
66
|
+
for (let i = 1; i <= 11; i++) {
|
|
67
|
+
const taskId = `ONBOARD-${String(i).padStart(3, '0')}`;
|
|
68
|
+
expect(board).toContain(taskId);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
it('all ONBOARD tasks are assigned to product-lead', () => {
|
|
72
|
+
const board = getOnboardOperationTemplates()['task-board.md'];
|
|
73
|
+
const taskLines = board.split('\n').filter(l => l.includes('ONBOARD-'));
|
|
74
|
+
for (const line of taskLines) {
|
|
75
|
+
expect(line).toContain('assigned: product-lead');
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
it('ONBOARD tasks have dependency chains', () => {
|
|
79
|
+
const board = getOnboardOperationTemplates()['task-board.md'];
|
|
80
|
+
expect(board).toContain('depends: ONBOARD-001');
|
|
81
|
+
expect(board).toContain('depends: ONBOARD-010');
|
|
82
|
+
});
|
|
83
|
+
it('includes single-instance dispatch rule in governor-rules', () => {
|
|
84
|
+
const rules = getOnboardOperationTemplates()['governor-rules.md'];
|
|
85
|
+
expect(rules).toContain('Never dispatch multiple instances of the same agent in parallel');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('getOnboardCurrentPhase', () => {
|
|
89
|
+
it('returns onboarding phase content', () => {
|
|
90
|
+
const content = getOnboardCurrentPhase();
|
|
91
|
+
expect(content).toContain('Phase**: onboarding');
|
|
92
|
+
expect(content).toContain('awaiting-analysis');
|
|
93
|
+
});
|
|
94
|
+
it('respects mode parameter', () => {
|
|
95
|
+
expect(getOnboardCurrentPhase('full-hool')).toContain('full-hool');
|
|
96
|
+
expect(getOnboardCurrentPhase('interactive')).toContain('interactive');
|
|
97
|
+
});
|
|
98
|
+
it('describes 5-step onboarding process', () => {
|
|
99
|
+
const content = getOnboardCurrentPhase();
|
|
100
|
+
expect(content).toContain('1. Full project scan');
|
|
101
|
+
expect(content).toContain('5. Present comprehensive summary');
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
describe('getOnboardTasksPrepend', () => {
|
|
105
|
+
it('contains re-onboard header', () => {
|
|
106
|
+
const content = getOnboardTasksPrepend();
|
|
107
|
+
expect(content).toContain('## Re-onboard Tasks');
|
|
108
|
+
});
|
|
109
|
+
it('has all 11 ONBOARD tasks', () => {
|
|
110
|
+
const content = getOnboardTasksPrepend();
|
|
111
|
+
for (let i = 1; i <= 11; i++) {
|
|
112
|
+
const taskId = `ONBOARD-${String(i).padStart(3, '0')}`;
|
|
113
|
+
expect(content).toContain(taskId);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
it('includes compare/update language for re-onboard', () => {
|
|
117
|
+
const content = getOnboardTasksPrepend();
|
|
118
|
+
expect(content).toContain('Compare');
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('getMemoryHeaders', () => {
|
|
122
|
+
it('returns all 5 memory files', () => {
|
|
123
|
+
const headers = getMemoryHeaders();
|
|
124
|
+
const expectedFiles = [
|
|
125
|
+
'hot.md',
|
|
126
|
+
'cold.md',
|
|
127
|
+
'best-practices.md',
|
|
128
|
+
'issues.md',
|
|
129
|
+
'governor-feedback.md',
|
|
130
|
+
];
|
|
131
|
+
for (const file of expectedFiles) {
|
|
132
|
+
expect(headers).toHaveProperty(file);
|
|
133
|
+
expect(headers[file].length).toBeGreaterThan(0);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
it('hot.md has three sections', () => {
|
|
137
|
+
const hot = getMemoryHeaders()['hot.md'];
|
|
138
|
+
expect(hot).toContain('## Compact');
|
|
139
|
+
expect(hot).toContain('## Summary');
|
|
140
|
+
expect(hot).toContain('## Recent');
|
|
141
|
+
});
|
|
142
|
+
it('cold.md has Cold Log header', () => {
|
|
143
|
+
expect(getMemoryHeaders()['cold.md']).toContain('# Cold Log');
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=templates.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.test.js","sourceRoot":"","sources":["../../src/core/templates.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|