hool-cli 0.6.2 → 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 +22 -13
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/core/scaffold.d.ts +3 -0
- package/dist/core/scaffold.js +88 -10
- 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/index.js +5 -23
- package/dist/index.js.map +1 -1
- 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 +5 -2
- package/prompts/agents/06-be-tech-lead.md +5 -2
- 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 +3 -2
- package/prompts/orchestrator.md +130 -38
- package/prompts/skills/01-brainstorm.md +5 -0
- package/prompts/skills/02-spec.md +5 -0
- package/prompts/skills/03-design.md +5 -0
- package/prompts/skills/04-architecture.md +5 -0
- 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
package/dist/core/scaffold.js
CHANGED
|
@@ -59,6 +59,7 @@ export async function scaffoldProject(projectDir, projectType, mode = 'interacti
|
|
|
59
59
|
await fs.mkdir(path.join(projectDir, '.hool/operations'), { recursive: true });
|
|
60
60
|
await fs.mkdir(path.join(projectDir, '.hool/operations/context'), { recursive: true });
|
|
61
61
|
await fs.mkdir(path.join(projectDir, '.hool/operations/dispatch'), { recursive: true });
|
|
62
|
+
await fs.mkdir(path.join(projectDir, '.hool/operations/logs'), { recursive: true });
|
|
62
63
|
const opTemplates = getOperationTemplates(mode);
|
|
63
64
|
for (const [filename, content] of Object.entries(opTemplates)) {
|
|
64
65
|
await fs.writeFile(path.join(projectDir, '.hool/operations', filename), content, 'utf-8');
|
|
@@ -73,10 +74,11 @@ export async function scaffoldProject(projectDir, projectType, mode = 'interacti
|
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
// Create .hool directories
|
|
76
|
-
await fs.mkdir(path.join(projectDir, '.hool/
|
|
77
|
+
await fs.mkdir(path.join(projectDir, '.hool/checklists'), { recursive: true });
|
|
77
78
|
await fs.mkdir(path.join(projectDir, '.hool/hooks'), { recursive: true });
|
|
78
79
|
await fs.mkdir(path.join(projectDir, '.hool/logs'), { recursive: true });
|
|
79
80
|
await fs.mkdir(path.join(projectDir, '.hool/metrics'), { recursive: true });
|
|
81
|
+
await fs.mkdir(path.join(projectDir, '.hool/settings'), { recursive: true });
|
|
80
82
|
// NOTE: src/, tests/ are NOT created here.
|
|
81
83
|
// Those are project concerns decided during architecture (Phase 4)
|
|
82
84
|
// and scaffolded by Tech Leads during Phases 5-6 (LLD).
|
|
@@ -95,6 +97,7 @@ export async function scaffoldOnboard(projectDir, projectType, mode = 'interacti
|
|
|
95
97
|
await fs.mkdir(path.join(projectDir, '.hool/operations'), { recursive: true });
|
|
96
98
|
await fs.mkdir(path.join(projectDir, '.hool/operations/context'), { recursive: true });
|
|
97
99
|
await fs.mkdir(path.join(projectDir, '.hool/operations/dispatch'), { recursive: true });
|
|
100
|
+
await fs.mkdir(path.join(projectDir, '.hool/operations/logs'), { recursive: true });
|
|
98
101
|
const opTemplates = getOnboardOperationTemplates(mode);
|
|
99
102
|
for (const [filename, content] of Object.entries(opTemplates)) {
|
|
100
103
|
await fs.writeFile(path.join(projectDir, '.hool/operations', filename), content, 'utf-8');
|
|
@@ -109,10 +112,11 @@ export async function scaffoldOnboard(projectDir, projectType, mode = 'interacti
|
|
|
109
112
|
}
|
|
110
113
|
}
|
|
111
114
|
// Create .hool directories
|
|
112
|
-
await fs.mkdir(path.join(projectDir, '.hool/
|
|
115
|
+
await fs.mkdir(path.join(projectDir, '.hool/checklists'), { recursive: true });
|
|
113
116
|
await fs.mkdir(path.join(projectDir, '.hool/hooks'), { recursive: true });
|
|
114
117
|
await fs.mkdir(path.join(projectDir, '.hool/logs'), { recursive: true });
|
|
115
118
|
await fs.mkdir(path.join(projectDir, '.hool/metrics'), { recursive: true });
|
|
119
|
+
await fs.mkdir(path.join(projectDir, '.hool/settings'), { recursive: true });
|
|
116
120
|
}
|
|
117
121
|
export async function reonboard(projectDir, mode = 'interactive') {
|
|
118
122
|
// Only overwrite current-phase.md and prepend onboard tasks to task-board.md
|
|
@@ -131,7 +135,9 @@ export async function reonboard(projectDir, mode = 'interactive') {
|
|
|
131
135
|
const body = existing.startsWith('# Task Board') ? existing.replace(/^# Task Board\n*/, '') : existing;
|
|
132
136
|
await fs.writeFile(taskBoardPath, header + prepend + body, 'utf-8');
|
|
133
137
|
}
|
|
138
|
+
/** @deprecated Use copySkills + copyChecklists instead */
|
|
134
139
|
export async function copyPrompts(projectDir, promptsSourceDir) {
|
|
140
|
+
// Legacy: copies all prompts to .hool/prompts/ — kept for backwards compat
|
|
135
141
|
const hoolPromptsDir = path.join(projectDir, '.hool/prompts');
|
|
136
142
|
async function copyDir(src, dest) {
|
|
137
143
|
await fs.mkdir(dest, { recursive: true });
|
|
@@ -149,6 +155,35 @@ export async function copyPrompts(projectDir, promptsSourceDir) {
|
|
|
149
155
|
}
|
|
150
156
|
await copyDir(promptsSourceDir, hoolPromptsDir);
|
|
151
157
|
}
|
|
158
|
+
export async function copySkills(projectDir, promptsSourceDir) {
|
|
159
|
+
const skillsSourceDir = path.join(promptsSourceDir, 'skills');
|
|
160
|
+
try {
|
|
161
|
+
const entries = await fs.readdir(skillsSourceDir);
|
|
162
|
+
for (const entry of entries) {
|
|
163
|
+
if (!entry.endsWith('.md'))
|
|
164
|
+
continue;
|
|
165
|
+
const skillName = entry.replace(/^\d+-/, '').replace('.md', ''); // "01-brainstorm.md" -> "brainstorm"
|
|
166
|
+
const skillDir = path.join(projectDir, '.claude/skills', skillName);
|
|
167
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
168
|
+
await fs.copyFile(path.join(skillsSourceDir, entry), path.join(skillDir, 'SKILL.md'));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch { /* skills dir doesn't exist */ }
|
|
172
|
+
}
|
|
173
|
+
export async function copyChecklists(projectDir, promptsSourceDir) {
|
|
174
|
+
const checklistsSourceDir = path.join(promptsSourceDir, 'checklists');
|
|
175
|
+
const checklistsDest = path.join(projectDir, '.hool/checklists');
|
|
176
|
+
await fs.mkdir(checklistsDest, { recursive: true });
|
|
177
|
+
try {
|
|
178
|
+
const entries = await fs.readdir(checklistsSourceDir);
|
|
179
|
+
for (const entry of entries) {
|
|
180
|
+
if (!entry.endsWith('.md'))
|
|
181
|
+
continue;
|
|
182
|
+
await fs.copyFile(path.join(checklistsSourceDir, entry), path.join(checklistsDest, entry));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch { /* checklists dir doesn't exist */ }
|
|
186
|
+
}
|
|
152
187
|
export async function writeMcpManifest(projectDir, projectType, requiredMcps) {
|
|
153
188
|
const servers = {};
|
|
154
189
|
for (const name of requiredMcps) {
|
|
@@ -168,7 +203,7 @@ const AGENT_MANIFEST = [
|
|
|
168
203
|
{
|
|
169
204
|
name: 'product-lead',
|
|
170
205
|
role: 'Vision, contracts, doc consistency, phase gating, agent dispatch',
|
|
171
|
-
prompt: '.
|
|
206
|
+
prompt: 'CLAUDE.md',
|
|
172
207
|
'agent-definition': { 'claude-code': null, cursor: null },
|
|
173
208
|
memory: '.hool/memory/product-lead/',
|
|
174
209
|
phases: [0, 1, 2, 3, 4, 12],
|
|
@@ -176,7 +211,7 @@ const AGENT_MANIFEST = [
|
|
|
176
211
|
{
|
|
177
212
|
name: 'fe-tech-lead',
|
|
178
213
|
role: 'FE scaffold, LLD, code review, code-vs-doc consistency',
|
|
179
|
-
prompt: '.
|
|
214
|
+
prompt: '.claude/agents/fe-tech-lead.md',
|
|
180
215
|
'agent-definition': { 'claude-code': '.claude/agents/fe-tech-lead.md', cursor: '.cursor/agents/fe-tech-lead.md' },
|
|
181
216
|
'cursor-rule': '.cursor/rules/fe-tech-lead.mdc',
|
|
182
217
|
memory: '.hool/memory/fe-tech-lead/',
|
|
@@ -185,7 +220,7 @@ const AGENT_MANIFEST = [
|
|
|
185
220
|
{
|
|
186
221
|
name: 'be-tech-lead',
|
|
187
222
|
role: 'BE scaffold, LLD, code review, code-vs-doc consistency',
|
|
188
|
-
prompt: '.
|
|
223
|
+
prompt: '.claude/agents/be-tech-lead.md',
|
|
189
224
|
'agent-definition': { 'claude-code': '.claude/agents/be-tech-lead.md', cursor: '.cursor/agents/be-tech-lead.md' },
|
|
190
225
|
'cursor-rule': '.cursor/rules/be-tech-lead.mdc',
|
|
191
226
|
memory: '.hool/memory/be-tech-lead/',
|
|
@@ -194,7 +229,7 @@ const AGENT_MANIFEST = [
|
|
|
194
229
|
{
|
|
195
230
|
name: 'fe-dev',
|
|
196
231
|
role: 'Frontend implementation',
|
|
197
|
-
prompt: '.
|
|
232
|
+
prompt: '.claude/agents/fe-dev.md',
|
|
198
233
|
'agent-definition': { 'claude-code': '.claude/agents/fe-dev.md', cursor: '.cursor/agents/fe-dev.md' },
|
|
199
234
|
'cursor-rule': '.cursor/rules/fe-dev.mdc',
|
|
200
235
|
memory: '.hool/memory/fe-dev/',
|
|
@@ -203,7 +238,7 @@ const AGENT_MANIFEST = [
|
|
|
203
238
|
{
|
|
204
239
|
name: 'be-dev',
|
|
205
240
|
role: 'Backend implementation',
|
|
206
|
-
prompt: '.
|
|
241
|
+
prompt: '.claude/agents/be-dev.md',
|
|
207
242
|
'agent-definition': { 'claude-code': '.claude/agents/be-dev.md', cursor: '.cursor/agents/be-dev.md' },
|
|
208
243
|
'cursor-rule': '.cursor/rules/be-dev.mdc',
|
|
209
244
|
memory: '.hool/memory/be-dev/',
|
|
@@ -212,7 +247,7 @@ const AGENT_MANIFEST = [
|
|
|
212
247
|
{
|
|
213
248
|
name: 'qa',
|
|
214
249
|
role: 'Test plan, test execution, bug reporting',
|
|
215
|
-
prompt: '.
|
|
250
|
+
prompt: '.claude/agents/qa.md',
|
|
216
251
|
'agent-definition': { 'claude-code': '.claude/agents/qa.md', cursor: '.cursor/agents/qa.md' },
|
|
217
252
|
'cursor-rule': '.cursor/rules/qa.mdc',
|
|
218
253
|
memory: '.hool/memory/qa/',
|
|
@@ -221,7 +256,7 @@ const AGENT_MANIFEST = [
|
|
|
221
256
|
{
|
|
222
257
|
name: 'forensic',
|
|
223
258
|
role: 'Root cause analysis, bug triage, fix routing',
|
|
224
|
-
prompt: '.
|
|
259
|
+
prompt: '.claude/agents/forensic.md',
|
|
225
260
|
'agent-definition': { 'claude-code': '.claude/agents/forensic.md', cursor: '.cursor/agents/forensic.md' },
|
|
226
261
|
'cursor-rule': '.cursor/rules/forensic.mdc',
|
|
227
262
|
memory: '.hool/memory/forensic/',
|
|
@@ -230,7 +265,7 @@ const AGENT_MANIFEST = [
|
|
|
230
265
|
{
|
|
231
266
|
name: 'governor',
|
|
232
267
|
role: 'Behavioral auditor, rule enforcement, corrective feedback',
|
|
233
|
-
prompt: '.
|
|
268
|
+
prompt: '.claude/agents/governor.md',
|
|
234
269
|
'agent-definition': { 'claude-code': '.claude/agents/governor.md', cursor: '.cursor/agents/governor.md' },
|
|
235
270
|
'cursor-rule': '.cursor/rules/governor.mdc',
|
|
236
271
|
memory: '.hool/memory/governor/',
|
|
@@ -307,6 +342,49 @@ export async function copyPlatformFiles(projectDir, templateRootDir, platform) {
|
|
|
307
342
|
}
|
|
308
343
|
}
|
|
309
344
|
catch { /* ok */ }
|
|
345
|
+
// Copy skills to .claude/skills/
|
|
346
|
+
const skillsSrc = path.join(hoolMiniDir, 'prompts/skills');
|
|
347
|
+
try {
|
|
348
|
+
const skillEntries = await fs.readdir(skillsSrc);
|
|
349
|
+
for (const entry of skillEntries) {
|
|
350
|
+
if (!entry.endsWith('.md'))
|
|
351
|
+
continue;
|
|
352
|
+
const skillName = entry.replace(/^\d+-/, '').replace('.md', '');
|
|
353
|
+
const skillDir = path.join(projectDir, '.claude/skills', skillName);
|
|
354
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
355
|
+
await fs.copyFile(path.join(skillsSrc, entry), path.join(skillDir, 'SKILL.md'));
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
catch { /* ok */ }
|
|
359
|
+
// Copy checklists to .hool/checklists/
|
|
360
|
+
const checklistsSrc = path.join(hoolMiniDir, 'prompts/checklists');
|
|
361
|
+
const checklistsDest = path.join(projectDir, '.hool/checklists');
|
|
362
|
+
await fs.mkdir(checklistsDest, { recursive: true });
|
|
363
|
+
try {
|
|
364
|
+
const checklistEntries = await fs.readdir(checklistsSrc);
|
|
365
|
+
for (const entry of checklistEntries) {
|
|
366
|
+
if (!entry.endsWith('.md'))
|
|
367
|
+
continue;
|
|
368
|
+
await fs.copyFile(path.join(checklistsSrc, entry), path.join(checklistsDest, entry));
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
catch { /* ok */ }
|
|
372
|
+
// Copy per-role settings to .hool/settings/
|
|
373
|
+
const roleSettingsSrc = path.join(hoolMiniDir, 'settings');
|
|
374
|
+
const roleSettingsDest = path.join(projectDir, '.hool/settings');
|
|
375
|
+
await fs.mkdir(roleSettingsDest, { recursive: true });
|
|
376
|
+
try {
|
|
377
|
+
const settingsEntries = await fs.readdir(roleSettingsSrc);
|
|
378
|
+
for (const entry of settingsEntries) {
|
|
379
|
+
// Skip the PL settings file (claude-settings.json) — it goes to .claude/settings.json
|
|
380
|
+
if (entry === 'claude-settings.json')
|
|
381
|
+
continue;
|
|
382
|
+
if (!entry.endsWith('.json'))
|
|
383
|
+
continue;
|
|
384
|
+
await fs.copyFile(path.join(roleSettingsSrc, entry), path.join(roleSettingsDest, entry));
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch { /* ok */ }
|
|
310
388
|
}
|
|
311
389
|
if (platform === 'cursor') {
|
|
312
390
|
// Copy .cursor/agents/*.md
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvJ,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,MAAM,GAAG;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,UAAU;CACF,CAAC;AAEX,MAAM,SAAS,GAAG;IAChB,cAAc;IACd,cAAc;IACd,QAAQ;IACR,QAAQ;IACR,IAAI;IACJ,UAAU;IACV,UAAU;CACF,CAAC;AAEX,MAAM,UAAU,GAAG;IACjB,sBAAsB;IACtB,4BAA4B;IAC5B,+BAA+B;IAC/B,8BAA8B;IAC9B,8BAA8B;IAC9B,wCAAwC;IACxC,oCAAoC;IACpC,iCAAiC;IACjC,iCAAiC;IACjC,mCAAmC;IACnC,sCAAsC;IACtC,iCAAiC;CAClC,CAAC;AAEF,MAAM,WAAW,GAAkC;IACjD,SAAS,EAAE,EAAE;IACb,cAAc,EAAE,CAAC,6BAA6B,CAAC;IAC/C,gBAAgB,EAAE,EAAE;IACpB,WAAW,EAAE,CAAC,6BAA6B,CAAC;IAC5C,UAAU,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;IACrE,UAAU,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;IACrE,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,WAAwB,EAAE,OAAsB,aAAa;IACrH,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAE5C,gFAAgF;IAChF,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,yEAAyE;IACzE,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,yCAAyC,CAAC,EAChE,oCAAoC,WAAW,iBAAiB,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAClI,OAAO,CACR,CAAC;IAEF,6CAA6C;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAChD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IAED,2CAA2C;IAC3C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7E,2CAA2C;IAC3C,mEAAmE;IACnE,wDAAwD;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,WAAwB,EAAE,OAAsB,aAAa;IACrH,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAE5C,8EAA8E;IAC9E,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,qDAAqD;IACrD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,yCAAyC,CAAC,EAChE,oCAAoC,WAAW,iBAAiB,IAAI,iEAAiE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAC/K,OAAO,CACR,CAAC;IAEF,8DAA8D;IAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,0BAA0B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5F,CAAC;IAED,2CAA2C;IAC3C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAChE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAAkB,EAAE,OAAsB,aAAa;IACrF,6EAA6E;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAEzD,2BAA2B;IAC3B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAEjG,+CAA+C;IAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACzD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;IAEnC,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,kBAAkB,CAAC;IAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACvG,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,gBAAwB;IAC5E,2EAA2E;IAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IAE9D,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;QAC9C,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,UAAkB,EAAE,gBAAwB;IAC3E,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAClD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,qCAAqC;YACtG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;YACpE,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC,QAAQ,CACf,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,EACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,gBAAwB;IAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACtE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IACjE,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACtD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,MAAM,EAAE,CAAC,QAAQ,CACf,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,CAAC,EACrC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CACjC,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,WAAwB,EACxB,YAAsB;IAEtB,MAAM,OAAO,GAAwD,EAAE,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAkD,CAAC;QACzE,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,MAAM,EAAE,WAAW;QACnB,OAAO;QACP,QAAQ,EAAE,CAAC,kBAAkB,CAAC;KAC/B,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACxC,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG;IACrB;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,kEAAkE;QACxE,MAAM,EAAE,WAAW;QACnB,kBAAkB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QACzD,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;KAC5B;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,wDAAwD;QAC9D,MAAM,EAAE,gCAAgC;QACxC,kBAAkB,EAAE,EAAE,aAAa,EAAE,gCAAgC,EAAE,MAAM,EAAE,gCAAgC,EAAE;QACjH,aAAa,EAAE,gCAAgC;QAC/C,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAClB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,wDAAwD;QAC9D,MAAM,EAAE,gCAAgC;QACxC,kBAAkB,EAAE,EAAE,aAAa,EAAE,gCAAgC,EAAE,MAAM,EAAE,gCAAgC,EAAE;QACjH,aAAa,EAAE,gCAAgC;QAC/C,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,EAAE;QACrG,aAAa,EAAE,0BAA0B;QACzC,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,CAAC,CAAC,CAAC;KACZ;IACD;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,wBAAwB;QAC9B,MAAM,EAAE,0BAA0B;QAClC,kBAAkB,EAAE,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,EAAE,0BAA0B,EAAE;QACrG,aAAa,EAAE,0BAA0B;QACzC,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,CAAC,CAAC,CAAC;KACZ;IACD;QACE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,sBAAsB;QAC9B,kBAAkB,EAAE,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,EAAE,sBAAsB,EAAE;QAC7F,aAAa,EAAE,sBAAsB;QACrC,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KAChB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,8CAA8C;QACpD,MAAM,EAAE,4BAA4B;QACpC,kBAAkB,EAAE,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,EAAE,4BAA4B,EAAE;QACzG,aAAa,EAAE,4BAA4B;QAC3C,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,CAAC,EAAE,CAAC;KACb;IACD;QACE,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,2DAA2D;QACjE,MAAM,EAAE,4BAA4B;QACpC,kBAAkB,EAAE,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,EAAE,4BAA4B,EAAE;QACzG,aAAa,EAAE,4BAA4B;QAC3C,MAAM,EAAE,wBAAwB;QAChC,MAAM,EAAE,YAAY;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAC1C,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAC9C,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAkB,EAAE,eAAuB,EAAE,QAAuB;IAC1G,oGAAoG;IACpG,MAAM,WAAW,GAAG,eAAe,CAAC;IAEpC,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAC/B,2BAA2B;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,MAAM,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAErD,8DAA8D;QAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAEjD,0CAA0C;YAC1C,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;gBACtE,iDAAiD;gBACjD,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,KAAK;wBAAE,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;oBACzC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;wBAChE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC3B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;wBAChC,CAAC;6BAAM,CAAC;4BACN,iDAAiD;4BACjD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAA8C,CAAC,OAAO,CAAC,CAAC,CAAoC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAqB,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BACxM,KAAK,MAAM,SAAS,IAAI,KAAiD,EAAE,CAAC;gCAC1E,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAqB,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;gCAClG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oCACxB,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gCAChE,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YACtF,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;QAED,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE3C,wBAAwB;QACxB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtB,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpB,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACjD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;gBACpE,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpB,uCAAuC;QACvC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACzD,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;gBACrC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,SAAS;gBACrC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEpB,4CAA4C;QAC5C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC3D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QACjE,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC1D,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;gBACpC,sFAAsF;gBACtF,IAAI,KAAK,KAAK,sBAAsB;oBAAE,SAAS;gBAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,SAAS;gBACvC,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,2BAA2B;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC7D,MAAM,eAAe,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAErD,2BAA2B;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAC9D,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,eAAe,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,IAAY;IACtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnB,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -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
|