hool-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +219 -0
  2. package/dist/adapters/claude-code.d.ts +8 -0
  3. package/dist/adapters/claude-code.js +119 -0
  4. package/dist/adapters/claude-code.js.map +1 -0
  5. package/dist/adapters/cursor.d.ts +8 -0
  6. package/dist/adapters/cursor.js +76 -0
  7. package/dist/adapters/cursor.js.map +1 -0
  8. package/dist/adapters/generic.d.ts +8 -0
  9. package/dist/adapters/generic.js +63 -0
  10. package/dist/adapters/generic.js.map +1 -0
  11. package/dist/adapters/index.d.ts +3 -0
  12. package/dist/adapters/index.js +11 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/types.d.ts +24 -0
  15. package/dist/adapters/types.js +2 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/core/scaffold.d.ts +6 -0
  18. package/dist/core/scaffold.js +156 -0
  19. package/dist/core/scaffold.js.map +1 -0
  20. package/dist/core/templates.d.ts +2 -0
  21. package/dist/core/templates.js +19 -0
  22. package/dist/core/templates.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +195 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/mcps/installer.d.ts +7 -0
  27. package/dist/mcps/installer.js +25 -0
  28. package/dist/mcps/installer.js.map +1 -0
  29. package/dist/mcps/registry.d.ts +4 -0
  30. package/dist/mcps/registry.js +44 -0
  31. package/dist/mcps/registry.js.map +1 -0
  32. package/package.json +37 -0
  33. package/prompts/agents/05-fe-tech-lead.md +177 -0
  34. package/prompts/agents/06-be-tech-lead.md +198 -0
  35. package/prompts/agents/08-be-dev.md +132 -0
  36. package/prompts/agents/08-fe-dev.md +122 -0
  37. package/prompts/agents/10-qa.md +238 -0
  38. package/prompts/agents/11-forensic.md +134 -0
  39. package/prompts/orchestrator.md +561 -0
  40. package/prompts/skills/01-brainstorm.md +96 -0
  41. package/prompts/skills/02-spec.md +151 -0
  42. package/prompts/skills/03-design.md +146 -0
  43. package/prompts/skills/04-architecture.md +298 -0
@@ -0,0 +1,156 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { getOperationTemplates, getMemoryHeaders } from './templates.js';
4
+ import { MCP_REGISTRY } from '../mcps/registry.js';
5
+ const AGENTS = [
6
+ 'product-lead',
7
+ 'fe-tech-lead',
8
+ 'be-tech-lead',
9
+ 'fe-dev',
10
+ 'be-dev',
11
+ 'qa',
12
+ 'forensic',
13
+ ];
14
+ const PHASE_DIRS = [
15
+ 'phases/00-init',
16
+ 'phases/01-brainstorm',
17
+ 'phases/02-spec/features',
18
+ 'phases/03-design/cards',
19
+ 'phases/03-design/flows',
20
+ 'phases/04-architecture/contracts',
21
+ 'phases/04-architecture/flows',
22
+ 'phases/04-architecture/fe',
23
+ 'phases/04-architecture/be',
24
+ 'phases/05-fe-scaffold/pages',
25
+ 'phases/06-be-scaffold/services',
26
+ 'phases/07-test-plan/cases',
27
+ ];
28
+ const SKIP_PHASES = {
29
+ 'web-app': [],
30
+ 'browser-game': ['phases/06-be-scaffold'],
31
+ 'mobile-android': [],
32
+ 'animation': ['phases/06-be-scaffold'],
33
+ 'cli-tool': ['phases/03-design', 'phases/05-fe-scaffold'],
34
+ 'api-only': ['phases/03-design', 'phases/05-fe-scaffold'],
35
+ 'desktop': [],
36
+ 'other': [],
37
+ };
38
+ export async function scaffoldProject(projectDir, projectType, mode = 'interactive') {
39
+ const skip = SKIP_PHASES[projectType] || [];
40
+ // Create phase directories (empty — agents create the docs during their phases)
41
+ for (const dir of PHASE_DIRS) {
42
+ if (skip.some(s => dir.startsWith(s)))
43
+ continue;
44
+ await fs.mkdir(path.join(projectDir, dir), { recursive: true });
45
+ }
46
+ // Only create project-profile.md — the one doc that init itself produces
47
+ await fs.writeFile(path.join(projectDir, 'phases/00-init/project-profile.md'), `# Project Profile\n\n- **Type**: ${projectType}\n- **Mode**: ${mode}\n- **Created**: ${new Date().toISOString().split('T')[0]}\n`, 'utf-8');
48
+ // Create operations directory with templates
49
+ await fs.mkdir(path.join(projectDir, 'operations'), { recursive: true });
50
+ const opTemplates = getOperationTemplates();
51
+ for (const [filename, content] of Object.entries(opTemplates)) {
52
+ await fs.writeFile(path.join(projectDir, 'operations', filename), content, 'utf-8');
53
+ }
54
+ // Create memory directories for each agent
55
+ const memoryHeaders = getMemoryHeaders();
56
+ for (const agent of AGENTS) {
57
+ const agentDir = path.join(projectDir, 'memory', agent);
58
+ await fs.mkdir(agentDir, { recursive: true });
59
+ for (const [filename, content] of Object.entries(memoryHeaders)) {
60
+ await fs.writeFile(path.join(agentDir, filename), content, 'utf-8');
61
+ }
62
+ }
63
+ // Create .hool directory
64
+ await fs.mkdir(path.join(projectDir, '.hool/prompts'), { recursive: true });
65
+ // NOTE: src/, tests/, logs/ are NOT created here.
66
+ // Those are project concerns decided during architecture (Phase 4)
67
+ // and scaffolded by Tech Leads during Phases 5-6 (LLD).
68
+ }
69
+ export async function copyPrompts(projectDir, promptsSourceDir) {
70
+ const hoolPromptsDir = path.join(projectDir, '.hool/prompts');
71
+ async function copyDir(src, dest) {
72
+ await fs.mkdir(dest, { recursive: true });
73
+ const entries = await fs.readdir(src, { withFileTypes: true });
74
+ for (const entry of entries) {
75
+ const srcPath = path.join(src, entry.name);
76
+ const destPath = path.join(dest, entry.name);
77
+ if (entry.isDirectory()) {
78
+ await copyDir(srcPath, destPath);
79
+ }
80
+ else if (entry.name.endsWith('.md')) {
81
+ await fs.copyFile(srcPath, destPath);
82
+ }
83
+ }
84
+ }
85
+ await copyDir(promptsSourceDir, hoolPromptsDir);
86
+ }
87
+ export async function writeMcpManifest(projectDir, projectType, requiredMcps) {
88
+ const servers = {};
89
+ for (const name of requiredMcps) {
90
+ const def = MCP_REGISTRY[name];
91
+ if (def) {
92
+ servers[name] = def.configEntry;
93
+ }
94
+ }
95
+ const manifest = {
96
+ domain: projectType,
97
+ servers,
98
+ optional: ['hool-context-mcp'],
99
+ };
100
+ await fs.writeFile(path.join(projectDir, '.hool/mcps.json'), JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
101
+ }
102
+ const AGENT_MANIFEST = [
103
+ {
104
+ name: 'product-lead',
105
+ role: 'Vision, contracts, doc consistency, phase gating, agent dispatch',
106
+ prompt: '.hool/prompts/orchestrator.md',
107
+ memory: 'memory/product-lead/',
108
+ phases: [0, 1, 2, 3, 4, 12],
109
+ },
110
+ {
111
+ name: 'fe-tech-lead',
112
+ role: 'FE scaffold, LLD, code review, code-vs-doc consistency',
113
+ prompt: '.hool/prompts/agents/05-fe-tech-lead.md',
114
+ memory: 'memory/fe-tech-lead/',
115
+ phases: [4, 5, 9],
116
+ },
117
+ {
118
+ name: 'be-tech-lead',
119
+ role: 'BE scaffold, LLD, code review, code-vs-doc consistency',
120
+ prompt: '.hool/prompts/agents/06-be-tech-lead.md',
121
+ memory: 'memory/be-tech-lead/',
122
+ phases: [4, 6, 9],
123
+ },
124
+ {
125
+ name: 'fe-dev',
126
+ role: 'Frontend implementation',
127
+ prompt: '.hool/prompts/agents/08-fe-dev.md',
128
+ memory: 'memory/fe-dev/',
129
+ phases: [8],
130
+ },
131
+ {
132
+ name: 'be-dev',
133
+ role: 'Backend implementation',
134
+ prompt: '.hool/prompts/agents/08-be-dev.md',
135
+ memory: 'memory/be-dev/',
136
+ phases: [8],
137
+ },
138
+ {
139
+ name: 'qa',
140
+ role: 'Test plan, test execution, bug reporting',
141
+ prompt: '.hool/prompts/agents/10-qa.md',
142
+ memory: 'memory/qa/',
143
+ phases: [7, 10],
144
+ },
145
+ {
146
+ name: 'forensic',
147
+ role: 'Root cause analysis, bug triage, fix routing',
148
+ prompt: '.hool/prompts/agents/11-forensic.md',
149
+ memory: 'memory/forensic/',
150
+ phases: [11],
151
+ },
152
+ ];
153
+ export async function writeAgentManifest(projectDir) {
154
+ await fs.writeFile(path.join(projectDir, '.hool/agents.json'), JSON.stringify(AGENT_MANIFEST, null, 2) + '\n', 'utf-8');
155
+ }
156
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/core/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getOperationTemplates(): Record<string, string>;
2
+ export declare function getMemoryHeaders(): Record<string, string>;
@@ -0,0 +1,19 @@
1
+ export function getOperationTemplates() {
2
+ return {
3
+ 'current-phase.md': `# Current Phase\n\n## Current Phase: 0 (Project Init)\nAwaiting start.\n`,
4
+ 'task-board.md': `# Task Board\n\n## Active Tasks\n_No tasks yet._\n\n## Completed Tasks\n_None._\n`,
5
+ 'bugs.md': `# Bug Tracker\n\n_No bugs reported yet._\n`,
6
+ 'issues.md': `# Issues\n\n_No issues logged yet._\n`,
7
+ 'inconsistencies.md': `# Inconsistencies\n\n_No inconsistencies found yet._\n`,
8
+ 'needs-human-review.md': `# Needs Human Review\n\n_Nothing pending human review._\n`,
9
+ };
10
+ }
11
+ export function getMemoryHeaders() {
12
+ return {
13
+ 'hot.md': `## Compact\n_No history yet._\n\n## Summary\n_No history yet._\n\n## Recent\n_No history yet._\n`,
14
+ 'cold.md': `# Cold Log\n\n`,
15
+ 'best-practices.md': `# Best Practices\n\n_No patterns or gotchas logged yet._\n`,
16
+ 'issues.md': `# Personal Issues Log\n\n_No issues logged yet._\n`,
17
+ };
18
+ }
19
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,kBAAkB,EAAE,0EAA0E;QAE9F,eAAe,EAAE,mFAAmF;QAEpG,SAAS,EAAE,4CAA4C;QAEvD,WAAW,EAAE,uCAAuC;QAEpD,oBAAoB,EAAE,wDAAwD;QAE9E,uBAAuB,EAAE,2DAA2D;KACrF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,QAAQ,EAAE,kGAAkG;QAE5G,SAAS,EAAE,gBAAgB;QAE3B,mBAAmB,EAAE,4DAA4D;QAEjF,WAAW,EAAE,oDAAoD;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,195 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { select, confirm } from '@inquirer/prompts';
4
+ import chalk from 'chalk';
5
+ import path from 'path';
6
+ import fs from 'fs/promises';
7
+ import { fileURLToPath } from 'url';
8
+ import { scaffoldProject, copyPrompts, writeMcpManifest, writeAgentManifest } from './core/scaffold.js';
9
+ import { createAdapter } from './adapters/index.js';
10
+ import { checkAndInstallMcps } from './mcps/installer.js';
11
+ import { getRequiredMcpNames } from './mcps/registry.js';
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
13
+ // Prompts source: check bundled (npm install), then monorepo dev paths
14
+ async function getPromptsSourceDir() {
15
+ const candidates = [
16
+ path.resolve(__dirname, '..', 'prompts'), // npm: cli/dist/ -> cli/prompts/ (bundled)
17
+ path.resolve(__dirname, '..', '..', 'hool-mini', 'prompts'), // dev: cli/src/ -> hool/hool-mini/prompts/
18
+ path.resolve(__dirname, '..', '..', '..', 'hool-mini', 'prompts'), // dev: cli/dist/ -> hool/hool-mini/prompts/
19
+ ];
20
+ for (const dir of candidates) {
21
+ try {
22
+ await fs.access(dir);
23
+ return dir;
24
+ }
25
+ catch { /* not found, try next */ }
26
+ }
27
+ return candidates[0]; // fallback — will fail with a clear error
28
+ }
29
+ const program = new Command();
30
+ program
31
+ .name('hool')
32
+ .description('Agent-Driven SDLC — scaffold and configure HOOL for any project')
33
+ .version('0.1.0');
34
+ // ── hool init ──────────────────────────────────────────────
35
+ program
36
+ .command('init')
37
+ .description('Initialize HOOL in the current directory')
38
+ .option('-d, --dir <path>', 'Project directory', '.')
39
+ .option('-p, --platform <platform>', 'Platform (claude-code, cursor, generic)')
40
+ .option('-t, --type <type>', 'Project type (web-app, browser-game, mobile-android, animation, cli-tool, api-only, desktop, other)')
41
+ .option('-m, --mode <mode>', 'Execution mode (interactive, full-hool)')
42
+ .action(async (opts) => {
43
+ const projectDir = path.resolve(opts.dir);
44
+ console.log(chalk.bold('\n HOOL — Agent-Driven SDLC\n'));
45
+ // 1. Ask platform (or use flag)
46
+ const platform = opts.platform || await select({
47
+ message: 'Which AI coding tool are you using?',
48
+ choices: [
49
+ { name: 'Claude Code', value: 'claude-code' },
50
+ { name: 'Cursor', value: 'cursor' },
51
+ { name: 'Other / generic', value: 'generic' },
52
+ ],
53
+ });
54
+ // 2. Ask project type (or use flag)
55
+ const projectType = opts.type || await select({
56
+ message: 'What are you building?',
57
+ choices: [
58
+ { name: 'Web application', value: 'web-app' },
59
+ { name: 'Browser game', value: 'browser-game' },
60
+ { name: 'Mobile app (Android)', value: 'mobile-android' },
61
+ { name: 'Animation / motion', value: 'animation' },
62
+ { name: 'CLI tool', value: 'cli-tool' },
63
+ { name: 'API / backend only', value: 'api-only' },
64
+ { name: 'Desktop application', value: 'desktop' },
65
+ { name: 'Other', value: 'other' },
66
+ ],
67
+ });
68
+ // 3. Ask execution mode (or use flag)
69
+ const mode = opts.mode || await select({
70
+ message: 'How much control do you want?',
71
+ choices: [
72
+ { name: 'Interactive — review spec, design, architecture before building', value: 'interactive' },
73
+ { name: 'Full-HOOL — describe the idea, we handle everything', value: 'full-hool' },
74
+ ],
75
+ });
76
+ const adapter = createAdapter(platform);
77
+ const promptsDir = await getPromptsSourceDir();
78
+ const config = {
79
+ platform,
80
+ projectType,
81
+ projectDir,
82
+ promptsDir,
83
+ };
84
+ // 4. Scaffold project structure
85
+ console.log(chalk.dim('\n Scaffolding project structure...'));
86
+ await scaffoldProject(projectDir, projectType, mode);
87
+ console.log(chalk.green(' ✓ Project structure created'));
88
+ // 4. Copy prompt templates
89
+ console.log(chalk.dim(' Copying agent prompts...'));
90
+ try {
91
+ await copyPrompts(projectDir, promptsDir);
92
+ console.log(chalk.green(' ✓ Agent prompts copied to .hool/prompts/'));
93
+ }
94
+ catch {
95
+ console.log(chalk.yellow(' ⚠ Could not copy prompts (source not found). Copy them manually to .hool/prompts/'));
96
+ }
97
+ // 5. Inject platform instructions
98
+ console.log(chalk.dim(` Configuring for ${platform}...`));
99
+ await adapter.injectInstructions(config);
100
+ console.log(chalk.green(` ✓ ${platform} instructions injected`));
101
+ // 6. Check & install MCPs
102
+ if (platform !== 'generic') {
103
+ console.log(chalk.dim(' Checking MCPs...'));
104
+ const results = await checkAndInstallMcps(adapter, config);
105
+ for (const r of results) {
106
+ if (r.status === 'already-installed') {
107
+ console.log(chalk.green(` ✓ ${r.name} — already installed`));
108
+ }
109
+ else if (r.status === 'installed') {
110
+ console.log(chalk.green(` ✓ ${r.name} — installed`));
111
+ }
112
+ else {
113
+ console.log(chalk.red(` ✗ ${r.name} — failed: ${r.error}`));
114
+ }
115
+ }
116
+ }
117
+ // 7. Write MCP manifest + agent manifest
118
+ const requiredMcps = getRequiredMcpNames(projectType);
119
+ await writeMcpManifest(projectDir, projectType, requiredMcps);
120
+ console.log(chalk.green(' ✓ MCP manifest written to .hool/mcps.json'));
121
+ await writeAgentManifest(projectDir);
122
+ console.log(chalk.green(' ✓ Agent manifest written to .hool/agents.json'));
123
+ // 8. Done
124
+ console.log(chalk.bold.green(`\n HOOL initialized for: ${projectType}`));
125
+ console.log(chalk.dim(` Platform: ${platform}`));
126
+ console.log(chalk.dim(` Mode: ${mode}`));
127
+ console.log(chalk.dim(` MCPs: ${requiredMcps.join(', ')}`));
128
+ console.log(adapter.getCompletionMessage(config));
129
+ console.log('');
130
+ });
131
+ // ── hool status ────────────────────────────────────────────
132
+ program
133
+ .command('status')
134
+ .description('Show current phase and task board summary')
135
+ .option('-d, --dir <path>', 'Project directory', '.')
136
+ .action(async (opts) => {
137
+ const projectDir = path.resolve(opts.dir);
138
+ try {
139
+ const phase = await fs.readFile(path.join(projectDir, 'operations/current-phase.md'), 'utf-8');
140
+ const taskBoard = await fs.readFile(path.join(projectDir, 'operations/task-board.md'), 'utf-8');
141
+ const bugs = await fs.readFile(path.join(projectDir, 'operations/bugs.md'), 'utf-8');
142
+ const review = await fs.readFile(path.join(projectDir, 'operations/needs-human-review.md'), 'utf-8');
143
+ console.log(chalk.bold('\n HOOL Status\n'));
144
+ console.log(chalk.dim(' ── Phase ──'));
145
+ console.log(' ' + phase.split('\n').slice(0, 5).join('\n '));
146
+ const pendingTasks = (taskBoard.match(/- \[ \]/g) || []).length;
147
+ const completedTasks = (taskBoard.match(/- \[x\]/g) || []).length;
148
+ console.log(chalk.dim('\n ── Tasks ──'));
149
+ console.log(` Pending: ${pendingTasks} Completed: ${completedTasks}`);
150
+ const bugCount = (bugs.match(/## BUG-/g) || []).length;
151
+ console.log(chalk.dim('\n ── Bugs ──'));
152
+ console.log(` Open: ${bugCount}`);
153
+ const needsReview = !review.includes('Nothing pending');
154
+ console.log(chalk.dim('\n ── Human Review ──'));
155
+ console.log(` ${needsReview ? chalk.yellow('⚠ Items pending review') : chalk.green('✓ Nothing pending')}`);
156
+ console.log('');
157
+ }
158
+ catch {
159
+ console.log(chalk.red('\n Not a HOOL project (operations/ not found). Run `hool init` first.\n'));
160
+ }
161
+ });
162
+ // ── hool reset ─────────────────────────────────────────────
163
+ program
164
+ .command('reset')
165
+ .description('Reset operations and memory files (keeps phases/)')
166
+ .option('-d, --dir <path>', 'Project directory', '.')
167
+ .action(async (opts) => {
168
+ const projectDir = path.resolve(opts.dir);
169
+ const confirmed = await confirm({
170
+ message: 'This will reset all operations files and agent memory. Phase docs will be kept. Continue?',
171
+ default: false,
172
+ });
173
+ if (!confirmed) {
174
+ console.log(chalk.dim(' Cancelled.'));
175
+ return;
176
+ }
177
+ // Re-scaffold operations and memory only
178
+ const { getOperationTemplates, getMemoryHeaders } = await import('./core/templates.js');
179
+ const opTemplates = getOperationTemplates();
180
+ for (const [filename, content] of Object.entries(opTemplates)) {
181
+ await fs.writeFile(path.join(projectDir, 'operations', filename), content, 'utf-8');
182
+ }
183
+ const agents = ['product-lead', 'fe-tech-lead', 'be-tech-lead', 'fe-dev', 'be-dev', 'qa', 'forensic'];
184
+ const memoryHeaders = getMemoryHeaders();
185
+ for (const agent of agents) {
186
+ const agentDir = path.join(projectDir, 'memory', agent);
187
+ await fs.mkdir(agentDir, { recursive: true });
188
+ for (const [filename, content] of Object.entries(memoryHeaders)) {
189
+ await fs.writeFile(path.join(agentDir, filename), content, 'utf-8');
190
+ }
191
+ }
192
+ console.log(chalk.green('\n ✓ Operations and memory reset. Phase docs preserved.\n'));
193
+ });
194
+ program.parse();
195
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Adapter, AdapterConfig } from '../adapters/types.js';
2
+ export interface InstallResult {
3
+ name: string;
4
+ status: 'already-installed' | 'installed' | 'failed';
5
+ error?: string;
6
+ }
7
+ export declare function checkAndInstallMcps(adapter: Adapter, config: AdapterConfig): Promise<InstallResult[]>;
@@ -0,0 +1,25 @@
1
+ import { getRequiredMcps } from './registry.js';
2
+ export async function checkAndInstallMcps(adapter, config) {
3
+ const required = getRequiredMcps(config.projectType);
4
+ const results = [];
5
+ for (const mcp of required) {
6
+ const installed = await adapter.isMcpInstalled(mcp.name);
7
+ if (installed) {
8
+ results.push({ name: mcp.name, status: 'already-installed' });
9
+ continue;
10
+ }
11
+ try {
12
+ await adapter.installMcp(mcp);
13
+ results.push({ name: mcp.name, status: 'installed' });
14
+ }
15
+ catch (err) {
16
+ results.push({
17
+ name: mcp.name,
18
+ status: 'failed',
19
+ error: err instanceof Error ? err.message : String(err),
20
+ });
21
+ }
22
+ }
23
+ return results;
24
+ }
25
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/mcps/installer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAgB,EAChB,MAAqB;IAErB,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,OAAO,GAAoB,EAAE,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC9D,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpDefinition, ProjectType } from '../adapters/types.js';
2
+ export declare const MCP_REGISTRY: Record<string, McpDefinition>;
3
+ export declare function getRequiredMcps(projectType: ProjectType): McpDefinition[];
4
+ export declare function getRequiredMcpNames(projectType: ProjectType): string[];
@@ -0,0 +1,44 @@
1
+ export const MCP_REGISTRY = {
2
+ context7: {
3
+ name: 'context7',
4
+ installCommand: 'npx -y @context7/mcp',
5
+ configEntry: {
6
+ command: 'npx',
7
+ args: ['-y', '@context7/mcp'],
8
+ },
9
+ },
10
+ playwright: {
11
+ name: 'playwright',
12
+ installCommand: 'npx @anthropic/mcp-playwright',
13
+ configEntry: {
14
+ command: 'npx',
15
+ args: ['@anthropic/mcp-playwright'],
16
+ },
17
+ },
18
+ deepwiki: {
19
+ name: 'deepwiki',
20
+ installCommand: 'npx -y deepwiki-mcp',
21
+ configEntry: {
22
+ command: 'npx',
23
+ args: ['-y', 'deepwiki-mcp'],
24
+ },
25
+ },
26
+ };
27
+ const MCPS_BY_PROJECT_TYPE = {
28
+ 'web-app': ['context7', 'deepwiki', 'playwright'],
29
+ 'browser-game': ['context7', 'deepwiki', 'playwright'],
30
+ 'mobile-android': ['context7', 'deepwiki'],
31
+ 'animation': ['context7', 'deepwiki', 'playwright'],
32
+ 'cli-tool': ['context7', 'deepwiki'],
33
+ 'api-only': ['context7', 'deepwiki'],
34
+ 'desktop': ['context7', 'deepwiki'],
35
+ 'other': ['context7', 'deepwiki'],
36
+ };
37
+ export function getRequiredMcps(projectType) {
38
+ const names = MCPS_BY_PROJECT_TYPE[projectType] || ['context7'];
39
+ return names.map(name => MCP_REGISTRY[name]).filter(Boolean);
40
+ }
41
+ export function getRequiredMcpNames(projectType) {
42
+ return MCPS_BY_PROJECT_TYPE[projectType] || ['context7'];
43
+ }
44
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/mcps/registry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAkC;IACzD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,sBAAsB;QACtC,WAAW,EAAE;YACX,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC;SAC9B;KACF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE,+BAA+B;QAC/C,WAAW,EAAE;YACX,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,2BAA2B,CAAC;SACpC;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,qBAAqB;QACrC,WAAW,EAAE;YACX,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC;SAC7B;KACF;CACF,CAAC;AAEF,MAAM,oBAAoB,GAAkC;IAC1D,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC;IACjD,cAAc,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC;IACtD,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C,WAAW,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC;IACnD,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IACpC,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IACpC,SAAS,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;IACnC,OAAO,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;CAClC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,WAAwB;IACtD,MAAM,KAAK,GAAG,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,WAAwB;IAC1D,OAAO,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAC3D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "hool-cli",
3
+ "version": "0.1.0",
4
+ "description": "Agent-Driven SDLC — scaffold and configure HOOL for any project",
5
+ "bin": {
6
+ "hool": "./dist/index.js"
7
+ },
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "dev": "tsx src/index.ts",
11
+ "prepublishOnly": "npm run build && rm -rf ./prompts && cp -R ../hool-mini/prompts ./prompts"
12
+ },
13
+ "files": [
14
+ "dist",
15
+ "prompts"
16
+ ],
17
+ "dependencies": {
18
+ "@inquirer/prompts": "^8.3.0",
19
+ "chalk": "^5.3.0",
20
+ "commander": "^12.0.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.11.0",
24
+ "tsx": "^4.7.0",
25
+ "typescript": "^5.4.0"
26
+ },
27
+ "type": "module",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/the-wise-agents/hool.git"
32
+ },
33
+ "keywords": ["agent", "sdlc", "ai", "cli", "scaffold", "autonomous"],
34
+ "engines": {
35
+ "node": ">=18"
36
+ }
37
+ }