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.
- package/README.md +219 -0
- package/dist/adapters/claude-code.d.ts +8 -0
- package/dist/adapters/claude-code.js +119 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/cursor.d.ts +8 -0
- package/dist/adapters/cursor.js +76 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/generic.d.ts +8 -0
- package/dist/adapters/generic.js +63 -0
- package/dist/adapters/generic.js.map +1 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.js +11 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/types.d.ts +24 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/core/scaffold.d.ts +6 -0
- package/dist/core/scaffold.js +156 -0
- package/dist/core/scaffold.js.map +1 -0
- package/dist/core/templates.d.ts +2 -0
- package/dist/core/templates.js +19 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +195 -0
- package/dist/index.js.map +1 -0
- package/dist/mcps/installer.d.ts +7 -0
- package/dist/mcps/installer.js +25 -0
- package/dist/mcps/installer.js.map +1 -0
- package/dist/mcps/registry.d.ts +4 -0
- package/dist/mcps/registry.js +44 -0
- package/dist/mcps/registry.js.map +1 -0
- package/package.json +37 -0
- package/prompts/agents/05-fe-tech-lead.md +177 -0
- package/prompts/agents/06-be-tech-lead.md +198 -0
- package/prompts/agents/08-be-dev.md +132 -0
- package/prompts/agents/08-fe-dev.md +122 -0
- package/prompts/agents/10-qa.md +238 -0
- package/prompts/agents/11-forensic.md +134 -0
- package/prompts/orchestrator.md +561 -0
- package/prompts/skills/01-brainstorm.md +96 -0
- package/prompts/skills/02-spec.md +151 -0
- package/prompts/skills/03-design.md +146 -0
- 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,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"}
|
package/dist/index.d.ts
ADDED
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
|
+
}
|