@bhimudev/gnanai 0.4.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 +270 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +188 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/cleanup.d.ts +21 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +380 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/dispatch.d.ts +13 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +85 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +155 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +167 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +711 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge-sync.d.ts +69 -0
- package/dist/commands/knowledge-sync.d.ts.map +1 -0
- package/dist/commands/knowledge-sync.js +661 -0
- package/dist/commands/knowledge-sync.js.map +1 -0
- package/dist/commands/knowledge.d.ts +35 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +254 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +186 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/setup-config.d.ts +6 -0
- package/dist/commands/setup-config.d.ts.map +1 -0
- package/dist/commands/setup-config.js +663 -0
- package/dist/commands/setup-config.js.map +1 -0
- package/dist/commands/setup-project.d.ts +6 -0
- package/dist/commands/setup-project.d.ts.map +1 -0
- package/dist/commands/setup-project.js +361 -0
- package/dist/commands/setup-project.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +293 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +51 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +173 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +435 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/worktree.d.ts +30 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +262 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/generator/claude-cli.d.ts +24 -0
- package/dist/generator/claude-cli.d.ts.map +1 -0
- package/dist/generator/claude-cli.js +239 -0
- package/dist/generator/claude-cli.js.map +1 -0
- package/dist/generator/prompt-builder.d.ts +7 -0
- package/dist/generator/prompt-builder.d.ts.map +1 -0
- package/dist/generator/prompt-builder.js +144 -0
- package/dist/generator/prompt-builder.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/embeddings.d.ts +53 -0
- package/dist/mcp/embeddings.d.ts.map +1 -0
- package/dist/mcp/embeddings.js +68 -0
- package/dist/mcp/embeddings.js.map +1 -0
- package/dist/mcp/hybrid-search.d.ts +25 -0
- package/dist/mcp/hybrid-search.d.ts.map +1 -0
- package/dist/mcp/hybrid-search.js +72 -0
- package/dist/mcp/hybrid-search.js.map +1 -0
- package/dist/mcp/knowledge-server.d.ts +4 -0
- package/dist/mcp/knowledge-server.d.ts.map +1 -0
- package/dist/mcp/knowledge-server.js +294 -0
- package/dist/mcp/knowledge-server.js.map +1 -0
- package/dist/mcp/knowledge-utils.d.ts +65 -0
- package/dist/mcp/knowledge-utils.d.ts.map +1 -0
- package/dist/mcp/knowledge-utils.js +207 -0
- package/dist/mcp/knowledge-utils.js.map +1 -0
- package/dist/mcp/search-factory.d.ts +9 -0
- package/dist/mcp/search-factory.d.ts.map +1 -0
- package/dist/mcp/search-factory.js +23 -0
- package/dist/mcp/search-factory.js.map +1 -0
- package/dist/mcp/search-index.d.ts +45 -0
- package/dist/mcp/search-index.d.ts.map +1 -0
- package/dist/mcp/search-index.js +2 -0
- package/dist/mcp/search-index.js.map +1 -0
- package/dist/mcp/search-minisearch.d.ts +46 -0
- package/dist/mcp/search-minisearch.d.ts.map +1 -0
- package/dist/mcp/search-minisearch.js +99 -0
- package/dist/mcp/search-minisearch.js.map +1 -0
- package/dist/mcp/search-sqlite.d.ts +30 -0
- package/dist/mcp/search-sqlite.d.ts.map +1 -0
- package/dist/mcp/search-sqlite.js +188 -0
- package/dist/mcp/search-sqlite.js.map +1 -0
- package/dist/mcp/vector-store.d.ts +52 -0
- package/dist/mcp/vector-store.d.ts.map +1 -0
- package/dist/mcp/vector-store.js +183 -0
- package/dist/mcp/vector-store.js.map +1 -0
- package/dist/scaffold/copy-core-agents.d.ts +2 -0
- package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
- package/dist/scaffold/copy-core-agents.js +90 -0
- package/dist/scaffold/copy-core-agents.js.map +1 -0
- package/dist/scaffold/create-claude-settings.d.ts +40 -0
- package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
- package/dist/scaffold/create-claude-settings.js +422 -0
- package/dist/scaffold/create-claude-settings.js.map +1 -0
- package/dist/scaffold/create-config.d.ts +14 -0
- package/dist/scaffold/create-config.d.ts.map +1 -0
- package/dist/scaffold/create-config.js +199 -0
- package/dist/scaffold/create-config.js.map +1 -0
- package/dist/scaffold/create-project-description.d.ts +12 -0
- package/dist/scaffold/create-project-description.d.ts.map +1 -0
- package/dist/scaffold/create-project-description.js +104 -0
- package/dist/scaffold/create-project-description.js.map +1 -0
- package/dist/scaffold/create-structure.d.ts +2 -0
- package/dist/scaffold/create-structure.d.ts.map +1 -0
- package/dist/scaffold/create-structure.js +146 -0
- package/dist/scaffold/create-structure.js.map +1 -0
- package/dist/types/dependency-analysis.d.ts +11 -0
- package/dist/types/dependency-analysis.d.ts.map +1 -0
- package/dist/types/dependency-analysis.js +2 -0
- package/dist/types/dependency-analysis.js.map +1 -0
- package/dist/types/index.d.ts +526 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task.d.ts +25 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +3 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/analyze-files.d.ts +7 -0
- package/dist/utils/analyze-files.d.ts.map +1 -0
- package/dist/utils/analyze-files.js +27 -0
- package/dist/utils/analyze-files.js.map +1 -0
- package/dist/utils/backup.d.ts +102 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +352 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/ci-provider.d.ts +23 -0
- package/dist/utils/ci-provider.d.ts.map +1 -0
- package/dist/utils/ci-provider.js +525 -0
- package/dist/utils/ci-provider.js.map +1 -0
- package/dist/utils/ci-status.d.ts +57 -0
- package/dist/utils/ci-status.d.ts.map +1 -0
- package/dist/utils/ci-status.js +349 -0
- package/dist/utils/ci-status.js.map +1 -0
- package/dist/utils/dependency-analysis.d.ts +34 -0
- package/dist/utils/dependency-analysis.d.ts.map +1 -0
- package/dist/utils/dependency-analysis.js +298 -0
- package/dist/utils/dependency-analysis.js.map +1 -0
- package/dist/utils/detect-git.d.ts +57 -0
- package/dist/utils/detect-git.d.ts.map +1 -0
- package/dist/utils/detect-git.js +439 -0
- package/dist/utils/detect-git.js.map +1 -0
- package/dist/utils/detect-mcp.d.ts +32 -0
- package/dist/utils/detect-mcp.d.ts.map +1 -0
- package/dist/utils/detect-mcp.js +178 -0
- package/dist/utils/detect-mcp.js.map +1 -0
- package/dist/utils/detect-project.d.ts +3 -0
- package/dist/utils/detect-project.d.ts.map +1 -0
- package/dist/utils/detect-project.js +155 -0
- package/dist/utils/detect-project.js.map +1 -0
- package/dist/utils/file-comparison.d.ts +89 -0
- package/dist/utils/file-comparison.d.ts.map +1 -0
- package/dist/utils/file-comparison.js +301 -0
- package/dist/utils/file-comparison.js.map +1 -0
- package/dist/utils/file-merger.d.ts +74 -0
- package/dist/utils/file-merger.d.ts.map +1 -0
- package/dist/utils/file-merger.js +350 -0
- package/dist/utils/file-merger.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/managed-process.d.ts +109 -0
- package/dist/utils/managed-process.d.ts.map +1 -0
- package/dist/utils/managed-process.js +481 -0
- package/dist/utils/managed-process.js.map +1 -0
- package/dist/utils/merge-claude-settings.d.ts +65 -0
- package/dist/utils/merge-claude-settings.d.ts.map +1 -0
- package/dist/utils/merge-claude-settings.js +133 -0
- package/dist/utils/merge-claude-settings.js.map +1 -0
- package/dist/utils/migration.d.ts +74 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +345 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/process-health.d.ts +51 -0
- package/dist/utils/process-health.d.ts.map +1 -0
- package/dist/utils/process-health.js +123 -0
- package/dist/utils/process-health.js.map +1 -0
- package/dist/utils/process-registry.d.ts +20 -0
- package/dist/utils/process-registry.d.ts.map +1 -0
- package/dist/utils/process-registry.js +151 -0
- package/dist/utils/process-registry.js.map +1 -0
- package/dist/utils/process-tree.d.ts +51 -0
- package/dist/utils/process-tree.d.ts.map +1 -0
- package/dist/utils/process-tree.js +499 -0
- package/dist/utils/process-tree.js.map +1 -0
- package/dist/utils/repair-mcp-config.d.ts +15 -0
- package/dist/utils/repair-mcp-config.d.ts.map +1 -0
- package/dist/utils/repair-mcp-config.js +129 -0
- package/dist/utils/repair-mcp-config.js.map +1 -0
- package/dist/utils/task-lifecycle.d.ts +60 -0
- package/dist/utils/task-lifecycle.d.ts.map +1 -0
- package/dist/utils/task-lifecycle.js +310 -0
- package/dist/utils/task-lifecycle.js.map +1 -0
- package/dist/utils/update-agent-mcp.d.ts +7 -0
- package/dist/utils/update-agent-mcp.d.ts.map +1 -0
- package/dist/utils/update-agent-mcp.js +115 -0
- package/dist/utils/update-agent-mcp.js.map +1 -0
- package/dist/utils/update-agent-templates.d.ts +6 -0
- package/dist/utils/update-agent-templates.d.ts.map +1 -0
- package/dist/utils/update-agent-templates.js +56 -0
- package/dist/utils/update-agent-templates.js.map +1 -0
- package/dist/utils/update-config-ci.d.ts +7 -0
- package/dist/utils/update-config-ci.d.ts.map +1 -0
- package/dist/utils/update-config-ci.js +72 -0
- package/dist/utils/update-config-ci.js.map +1 -0
- package/dist/utils/update-config-git.d.ts +18 -0
- package/dist/utils/update-config-git.d.ts.map +1 -0
- package/dist/utils/update-config-git.js +146 -0
- package/dist/utils/update-config-git.js.map +1 -0
- package/dist/utils/update-config-mcp.d.ts +7 -0
- package/dist/utils/update-config-mcp.d.ts.map +1 -0
- package/dist/utils/update-config-mcp.js +98 -0
- package/dist/utils/update-config-mcp.js.map +1 -0
- package/dist/utils/validate-config.d.ts +3 -0
- package/dist/utils/validate-config.d.ts.map +1 -0
- package/dist/utils/validate-config.js +109 -0
- package/dist/utils/validate-config.js.map +1 -0
- package/dist/utils/version-tracker.d.ts +130 -0
- package/dist/utils/version-tracker.d.ts.map +1 -0
- package/dist/utils/version-tracker.js +298 -0
- package/dist/utils/version-tracker.js.map +1 -0
- package/dist/utils/worktree.d.ts +68 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +446 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +77 -0
- package/templates/ARCHAI_README.md +329 -0
- package/templates/CLAUDE.md +67 -0
- package/templates/PROMPTS.md +506 -0
- package/templates/core-agents/boss-agent.md +671 -0
- package/templates/core-agents/cleanup-agent.md +145 -0
- package/templates/core-agents/code-reviewer.md +175 -0
- package/templates/core-agents/critical-reviewer.md +117 -0
- package/templates/core-agents/deep-analyst.md +216 -0
- package/templates/core-agents/finalization-agent.md +252 -0
- package/templates/core-agents/git-coordinator.md +240 -0
- package/templates/core-agents/implementation-agent.md +151 -0
- package/templates/core-agents/maestro-agent.md +413 -0
- package/templates/core-agents/maestro-headless-agent.md +422 -0
- package/templates/core-agents/plan-validator.md +198 -0
- package/templates/core-agents/quick-fix.md +56 -0
- package/templates/core-agents/routing-templates.md +338 -0
- package/templates/core-agents/task-orchestrator.md +143 -0
- package/templates/core-agents/task-prep.md +202 -0
- package/templates/core-agents/tdd-designer.md +143 -0
- package/templates/specialist-meta.md +275 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
import { loadVersionFile, saveVersionFile, getOrphanedFiles, removeFile, } from '../utils/version-tracker.js';
|
|
8
|
+
import { listBackups, pruneOldBackups, } from '../utils/backup.js';
|
|
9
|
+
import { getTemplateHashes, getCustomFiles, } from '../utils/migration.js';
|
|
10
|
+
import { ProcessStateManager } from '../utils/managed-process.js';
|
|
11
|
+
import { isAlive, killTree } from '../utils/process-tree.js';
|
|
12
|
+
const CLAUDE_DIR = '.claude';
|
|
13
|
+
/**
|
|
14
|
+
* Find deprecated files (files that exist but are no longer in templates).
|
|
15
|
+
*/
|
|
16
|
+
async function findDeprecatedFiles() {
|
|
17
|
+
const versionFile = await loadVersionFile(CLAUDE_DIR);
|
|
18
|
+
if (!versionFile) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
// Get orphaned files from version tracking
|
|
22
|
+
const orphaned = getOrphanedFiles(versionFile);
|
|
23
|
+
// Also check for files that exist on disk but aren't in templates
|
|
24
|
+
const templateHashes = await getTemplateHashes();
|
|
25
|
+
const templatePaths = new Set(templateHashes.keys());
|
|
26
|
+
const customFiles = await getCustomFiles(CLAUDE_DIR);
|
|
27
|
+
// Deprecated = orphaned from tracking AND not in current templates
|
|
28
|
+
// AND not a custom file (user-created)
|
|
29
|
+
const deprecated = [];
|
|
30
|
+
for (const orphanPath of orphaned) {
|
|
31
|
+
if (!templatePaths.has(orphanPath)) {
|
|
32
|
+
deprecated.push(orphanPath);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return deprecated;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Find files that exist but aren't tracked or templated.
|
|
39
|
+
*/
|
|
40
|
+
async function findUnknownFiles() {
|
|
41
|
+
const customFiles = await getCustomFiles(CLAUDE_DIR);
|
|
42
|
+
const versionFile = await loadVersionFile(CLAUDE_DIR);
|
|
43
|
+
if (!versionFile) {
|
|
44
|
+
return customFiles;
|
|
45
|
+
}
|
|
46
|
+
// Files that are custom AND not tracked
|
|
47
|
+
const trackedPaths = new Set(Object.keys(versionFile.files));
|
|
48
|
+
return customFiles.filter(f => !trackedPaths.has(f));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Clean up deprecated files.
|
|
52
|
+
*/
|
|
53
|
+
async function cleanupDeprecated(options) {
|
|
54
|
+
const deprecated = await findDeprecatedFiles();
|
|
55
|
+
if (deprecated.length === 0) {
|
|
56
|
+
logger.info('No deprecated files found.');
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
console.log('');
|
|
60
|
+
logger.section('Deprecated Files');
|
|
61
|
+
console.log('');
|
|
62
|
+
for (const file of deprecated) {
|
|
63
|
+
console.log(chalk.yellow(` ${file}`));
|
|
64
|
+
}
|
|
65
|
+
console.log('');
|
|
66
|
+
if (options.dryRun) {
|
|
67
|
+
logger.info(chalk.yellow(`Would remove ${deprecated.length} deprecated file(s).`));
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
if (!options.yes) {
|
|
71
|
+
const { confirm } = await inquirer.prompt([{
|
|
72
|
+
type: 'confirm',
|
|
73
|
+
name: 'confirm',
|
|
74
|
+
message: `Remove ${deprecated.length} deprecated file(s)?`,
|
|
75
|
+
default: false,
|
|
76
|
+
}]);
|
|
77
|
+
if (!confirm) {
|
|
78
|
+
logger.info('Cleanup cancelled.');
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const spinner = ora('Removing deprecated files...').start();
|
|
83
|
+
let removed = 0;
|
|
84
|
+
// Load version file once before the loop
|
|
85
|
+
let versionFile = await loadVersionFile(CLAUDE_DIR);
|
|
86
|
+
for (const file of deprecated) {
|
|
87
|
+
try {
|
|
88
|
+
const fullPath = file.startsWith('.claude/')
|
|
89
|
+
? file
|
|
90
|
+
: path.join(CLAUDE_DIR, file);
|
|
91
|
+
if (await fs.pathExists(fullPath)) {
|
|
92
|
+
await fs.remove(fullPath);
|
|
93
|
+
removed++;
|
|
94
|
+
logger.debug(`Removed: ${file}`);
|
|
95
|
+
}
|
|
96
|
+
// Remove from version tracking (in-memory)
|
|
97
|
+
if (versionFile) {
|
|
98
|
+
versionFile = removeFile(versionFile, file);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
logger.debug(`Failed to remove ${file}`, error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Save version file once after all removals
|
|
106
|
+
if (versionFile) {
|
|
107
|
+
await saveVersionFile(CLAUDE_DIR, versionFile);
|
|
108
|
+
}
|
|
109
|
+
spinner.succeed(`Removed ${removed} deprecated file(s)`);
|
|
110
|
+
return removed;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Clean up old backups.
|
|
114
|
+
*/
|
|
115
|
+
async function cleanupBackups(options) {
|
|
116
|
+
const keepCount = options.keepBackups ?? 5;
|
|
117
|
+
const backups = await listBackups(CLAUDE_DIR);
|
|
118
|
+
if (backups.length === 0) {
|
|
119
|
+
logger.info('No backups found.');
|
|
120
|
+
return 0;
|
|
121
|
+
}
|
|
122
|
+
if (backups.length <= keepCount) {
|
|
123
|
+
logger.info(`Only ${backups.length} backup(s) found, keeping all (limit: ${keepCount}).`);
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
const toRemove = backups.slice(keepCount);
|
|
127
|
+
console.log('');
|
|
128
|
+
logger.section('Old Backups');
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log(chalk.gray(` Keeping ${keepCount} most recent backup(s)`));
|
|
131
|
+
console.log('');
|
|
132
|
+
console.log(' Would remove:');
|
|
133
|
+
for (const backup of toRemove) {
|
|
134
|
+
const date = backup.createdAt.toLocaleString();
|
|
135
|
+
console.log(chalk.yellow(` ${backup.timestamp} (${date})`));
|
|
136
|
+
}
|
|
137
|
+
console.log('');
|
|
138
|
+
if (options.dryRun) {
|
|
139
|
+
logger.info(chalk.yellow(`Would remove ${toRemove.length} old backup(s).`));
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
if (!options.yes) {
|
|
143
|
+
const { confirm } = await inquirer.prompt([{
|
|
144
|
+
type: 'confirm',
|
|
145
|
+
name: 'confirm',
|
|
146
|
+
message: `Remove ${toRemove.length} old backup(s)?`,
|
|
147
|
+
default: false,
|
|
148
|
+
}]);
|
|
149
|
+
if (!confirm) {
|
|
150
|
+
logger.info('Cleanup cancelled.');
|
|
151
|
+
return 0;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
const spinner = ora('Removing old backups...').start();
|
|
155
|
+
const removed = await pruneOldBackups(CLAUDE_DIR, keepCount);
|
|
156
|
+
spinner.succeed(`Removed ${removed} old backup(s)`);
|
|
157
|
+
return removed;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Clean up zombie processes and prune stale state files.
|
|
161
|
+
*/
|
|
162
|
+
export async function cleanupZombies(options) {
|
|
163
|
+
const stateDir = path.join(process.cwd(), '.claude', 'state', 'proc');
|
|
164
|
+
const allStates = ProcessStateManager.readAll(stateDir);
|
|
165
|
+
if (allStates.length === 0) {
|
|
166
|
+
logger.info('No process state files found.');
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
// Classify processes
|
|
170
|
+
const toPrune = [];
|
|
171
|
+
const toKill = [];
|
|
172
|
+
const skipped = [];
|
|
173
|
+
for (const data of allStates) {
|
|
174
|
+
const filePath = path.join(stateDir, `${data.id}.json`);
|
|
175
|
+
if (data.state === 'exited') {
|
|
176
|
+
toPrune.push({ data, filePath });
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const alive = isAlive(data.pid, data.processName);
|
|
180
|
+
if (!alive) {
|
|
181
|
+
toPrune.push({ data, filePath });
|
|
182
|
+
}
|
|
183
|
+
else if (data.state === 'result_received' || data.state === 'killing') {
|
|
184
|
+
toKill.push({ data, filePath });
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// state === 'running' or 'spawning' — skip, warn user
|
|
188
|
+
skipped.push({ data, reason: `alive (state: ${data.state})` });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Display summary
|
|
192
|
+
console.log('');
|
|
193
|
+
logger.section('Process State Cleanup');
|
|
194
|
+
console.log('');
|
|
195
|
+
if (toKill.length > 0) {
|
|
196
|
+
console.log(chalk.red(` Zombie processes to kill: ${toKill.length}`));
|
|
197
|
+
for (const entry of toKill) {
|
|
198
|
+
console.log(chalk.gray(` - ${entry.data.id} (pid: ${entry.data.pid}, state: ${entry.data.state})`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (toPrune.length > 0) {
|
|
202
|
+
console.log(chalk.yellow(` Stale state files to prune: ${toPrune.length}`));
|
|
203
|
+
for (const entry of toPrune) {
|
|
204
|
+
console.log(chalk.gray(` - ${entry.data.id} (pid: ${entry.data.pid}, state: ${entry.data.state})`));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (skipped.length > 0) {
|
|
208
|
+
console.log(chalk.blue(` Active processes skipped: ${skipped.length}`));
|
|
209
|
+
for (const entry of skipped) {
|
|
210
|
+
console.log(chalk.gray(` - ${entry.data.id} (pid: ${entry.data.pid}, ${entry.reason})`));
|
|
211
|
+
logger.warn(`Skipping ${entry.data.id}: process is ${entry.reason}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
console.log('');
|
|
215
|
+
const totalActionable = toKill.length + toPrune.length;
|
|
216
|
+
if (totalActionable === 0) {
|
|
217
|
+
logger.info('Nothing to clean up.');
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
if (options.dryRun) {
|
|
221
|
+
logger.info(chalk.yellow(`Would kill ${toKill.length} zombie(s) and prune ${toPrune.length} stale file(s).`));
|
|
222
|
+
return 0;
|
|
223
|
+
}
|
|
224
|
+
if (!options.yes) {
|
|
225
|
+
const { confirm } = await inquirer.prompt([{
|
|
226
|
+
type: 'confirm',
|
|
227
|
+
name: 'confirm',
|
|
228
|
+
message: `Kill ${toKill.length} zombie process(es) and prune ${toPrune.length} stale state file(s)?`,
|
|
229
|
+
default: false,
|
|
230
|
+
}]);
|
|
231
|
+
if (!confirm) {
|
|
232
|
+
logger.info('Cleanup cancelled.');
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const spinner = ora('Cleaning up process state...').start();
|
|
237
|
+
let removed = 0;
|
|
238
|
+
// Kill zombie processes
|
|
239
|
+
for (const entry of toKill) {
|
|
240
|
+
const result = killTree(entry.data.pid);
|
|
241
|
+
if (result.survived.length > 0) {
|
|
242
|
+
logger.warn(`Some processes survived kill for ${entry.data.id}: PIDs ${result.survived.join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
fs.removeSync(entry.filePath);
|
|
246
|
+
removed++;
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
logger.warn(`Failed to delete state file: ${entry.filePath}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Prune stale state files
|
|
253
|
+
for (const entry of toPrune) {
|
|
254
|
+
try {
|
|
255
|
+
fs.removeSync(entry.filePath);
|
|
256
|
+
removed++;
|
|
257
|
+
}
|
|
258
|
+
catch (err) {
|
|
259
|
+
logger.warn(`Failed to delete state file: ${entry.filePath}`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
spinner.succeed(`Cleaned ${removed} process state file(s) (${toKill.length} killed, ${toPrune.length} pruned, ${skipped.length} skipped)`);
|
|
263
|
+
return removed;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Show cleanup status without removing anything.
|
|
267
|
+
*/
|
|
268
|
+
async function showStatus() {
|
|
269
|
+
console.log('');
|
|
270
|
+
logger.section('Cleanup Status');
|
|
271
|
+
console.log('');
|
|
272
|
+
// Deprecated files
|
|
273
|
+
const deprecated = await findDeprecatedFiles();
|
|
274
|
+
if (deprecated.length > 0) {
|
|
275
|
+
console.log(chalk.yellow(` Deprecated files: ${deprecated.length}`));
|
|
276
|
+
for (const file of deprecated.slice(0, 5)) {
|
|
277
|
+
console.log(chalk.gray(` - ${file}`));
|
|
278
|
+
}
|
|
279
|
+
if (deprecated.length > 5) {
|
|
280
|
+
console.log(chalk.gray(` ... and ${deprecated.length - 5} more`));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log(chalk.green(' Deprecated files: 0'));
|
|
285
|
+
}
|
|
286
|
+
console.log('');
|
|
287
|
+
// Unknown files (custom, not tracked)
|
|
288
|
+
const unknown = await findUnknownFiles();
|
|
289
|
+
if (unknown.length > 0) {
|
|
290
|
+
console.log(chalk.blue(` Custom files (not tracked): ${unknown.length}`));
|
|
291
|
+
for (const file of unknown.slice(0, 5)) {
|
|
292
|
+
console.log(chalk.gray(` - ${file}`));
|
|
293
|
+
}
|
|
294
|
+
if (unknown.length > 5) {
|
|
295
|
+
console.log(chalk.gray(` ... and ${unknown.length - 5} more`));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
console.log(chalk.green(' Custom files: 0'));
|
|
300
|
+
}
|
|
301
|
+
console.log('');
|
|
302
|
+
// Backups
|
|
303
|
+
const backups = await listBackups(CLAUDE_DIR);
|
|
304
|
+
console.log(` Backups: ${backups.length}`);
|
|
305
|
+
if (backups.length > 5) {
|
|
306
|
+
console.log(chalk.yellow(` ${backups.length - 5} can be pruned (keeping 5)`));
|
|
307
|
+
}
|
|
308
|
+
console.log('');
|
|
309
|
+
// Process state files
|
|
310
|
+
const stateDir = path.join(process.cwd(), '.claude', 'state', 'proc');
|
|
311
|
+
const procStates = ProcessStateManager.readAll(stateDir);
|
|
312
|
+
if (procStates.length > 0) {
|
|
313
|
+
const exited = procStates.filter(s => s.state === 'exited').length;
|
|
314
|
+
const nonExited = procStates.length - exited;
|
|
315
|
+
console.log(` Process state files: ${procStates.length}`);
|
|
316
|
+
if (exited > 0) {
|
|
317
|
+
console.log(chalk.yellow(` ${exited} exited (can be pruned)`));
|
|
318
|
+
}
|
|
319
|
+
if (nonExited > 0) {
|
|
320
|
+
console.log(chalk.blue(` ${nonExited} active/zombie`));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
console.log(chalk.green(' Process state files: 0'));
|
|
325
|
+
}
|
|
326
|
+
console.log('');
|
|
327
|
+
// Show available cleanup commands
|
|
328
|
+
logger.info('Available cleanup commands:');
|
|
329
|
+
console.log('');
|
|
330
|
+
console.log(` ${chalk.cyan('archai cleanup --deprecated')} Remove deprecated files`);
|
|
331
|
+
console.log(` ${chalk.cyan('archai cleanup --backups')} Prune old backups`);
|
|
332
|
+
console.log(` ${chalk.cyan('archai cleanup --zombies')} Kill zombie processes and prune stale state files`);
|
|
333
|
+
console.log(` ${chalk.cyan('archai cleanup --all')} Clean everything`);
|
|
334
|
+
console.log('');
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Main cleanup command.
|
|
338
|
+
*/
|
|
339
|
+
export async function cleanup(options = {}) {
|
|
340
|
+
logger.banner();
|
|
341
|
+
// If no specific option, show status
|
|
342
|
+
if (!options.deprecated && !options.backups && !options.zombies && !options.all) {
|
|
343
|
+
await showStatus();
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
let totalRemoved = 0;
|
|
347
|
+
// Clean deprecated files
|
|
348
|
+
if (options.deprecated || options.all) {
|
|
349
|
+
const removed = await cleanupDeprecated(options);
|
|
350
|
+
totalRemoved += removed;
|
|
351
|
+
}
|
|
352
|
+
// Clean old backups
|
|
353
|
+
if (options.backups || options.all) {
|
|
354
|
+
if (options.deprecated || options.all) {
|
|
355
|
+
console.log(''); // Add spacing between sections
|
|
356
|
+
}
|
|
357
|
+
const removed = await cleanupBackups(options);
|
|
358
|
+
totalRemoved += removed;
|
|
359
|
+
}
|
|
360
|
+
// Clean zombie processes and stale state files
|
|
361
|
+
if (options.zombies || options.all) {
|
|
362
|
+
if (options.deprecated || options.backups || options.all) {
|
|
363
|
+
console.log('');
|
|
364
|
+
}
|
|
365
|
+
const removed = await cleanupZombies(options);
|
|
366
|
+
totalRemoved += removed;
|
|
367
|
+
}
|
|
368
|
+
console.log('');
|
|
369
|
+
if (options.dryRun) {
|
|
370
|
+
logger.info('Dry run complete. No files were removed.');
|
|
371
|
+
}
|
|
372
|
+
else if (totalRemoved > 0) {
|
|
373
|
+
logger.success(`Cleanup complete! Removed ${totalRemoved} item(s).`);
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
logger.info('Nothing to clean up.');
|
|
377
|
+
}
|
|
378
|
+
console.log('');
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/commands/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DispatchOptions } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Spawn `claude -p` as a managed child process.
|
|
4
|
+
*
|
|
5
|
+
* All process lifecycle (spawn, monitoring, timeout, signal handling, cleanup)
|
|
6
|
+
* is delegated to ManagedProcess. This function handles:
|
|
7
|
+
* - Prompt file validation
|
|
8
|
+
* - Argument building
|
|
9
|
+
* - Output file writing
|
|
10
|
+
* - Exit code forwarding
|
|
11
|
+
*/
|
|
12
|
+
export declare function dispatch(opts: DispatchOptions): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DnE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { ManagedProcess } from '../utils/managed-process.js';
|
|
5
|
+
/**
|
|
6
|
+
* Spawn `claude -p` as a managed child process.
|
|
7
|
+
*
|
|
8
|
+
* All process lifecycle (spawn, monitoring, timeout, signal handling, cleanup)
|
|
9
|
+
* is delegated to ManagedProcess. This function handles:
|
|
10
|
+
* - Prompt file validation
|
|
11
|
+
* - Argument building
|
|
12
|
+
* - Output file writing
|
|
13
|
+
* - Exit code forwarding
|
|
14
|
+
*/
|
|
15
|
+
export async function dispatch(opts) {
|
|
16
|
+
const { agent, promptFile, output, exitCodeFile, cwd, maxTurns, timeout } = opts;
|
|
17
|
+
// BC-7: Prompt file validation (RETAINED)
|
|
18
|
+
const resolvedPromptFile = path.resolve(promptFile);
|
|
19
|
+
if (!fs.existsSync(resolvedPromptFile)) {
|
|
20
|
+
logger.error(`Prompt file not found: ${resolvedPromptFile}`);
|
|
21
|
+
process.exitCode = 1;
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// BC-7: Arg building (RETAINED)
|
|
25
|
+
const args = ['-p', '--agent', agent, '--output-format', 'stream-json', '--verbose'];
|
|
26
|
+
if (maxTurns) {
|
|
27
|
+
args.push('--max-turns', String(maxTurns));
|
|
28
|
+
}
|
|
29
|
+
// BC-7: Output directory creation (RETAINED)
|
|
30
|
+
const resolvedOutput = path.resolve(output);
|
|
31
|
+
const outputDir = path.dirname(resolvedOutput);
|
|
32
|
+
if (!fs.existsSync(outputDir)) {
|
|
33
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
logger.info(`Dispatching claude -p --agent ${agent}`);
|
|
36
|
+
// BC-6: Delegate ALL lifecycle to ManagedProcess
|
|
37
|
+
const mp = ManagedProcess.spawn({
|
|
38
|
+
id: opts.taskId || `dispatch-${Date.now()}`,
|
|
39
|
+
cmd: 'claude',
|
|
40
|
+
args,
|
|
41
|
+
cwd: cwd ? path.resolve(cwd) : process.cwd(),
|
|
42
|
+
stdin: resolvedPromptFile,
|
|
43
|
+
stdout: 'stream-json',
|
|
44
|
+
timeout,
|
|
45
|
+
});
|
|
46
|
+
// Await completion
|
|
47
|
+
const completion = await mp.completion;
|
|
48
|
+
// BC-7: Write output file from accumulated text (RETAINED)
|
|
49
|
+
fs.writeFileSync(resolvedOutput, completion.textOutput || '', 'utf-8');
|
|
50
|
+
// Await actual exit
|
|
51
|
+
const exit = await mp.exit;
|
|
52
|
+
const exitCode = completion.timedOut ? 124 : (exit.exitCode ?? 1);
|
|
53
|
+
// BC-7: Write exit code file (RETAINED)
|
|
54
|
+
if (exitCodeFile) {
|
|
55
|
+
writeExitCode(exitCodeFile, exitCode);
|
|
56
|
+
}
|
|
57
|
+
if (completion.timedOut) {
|
|
58
|
+
logger.warn('Process timed out (exit code 124)');
|
|
59
|
+
}
|
|
60
|
+
else if (exitCode !== 0) {
|
|
61
|
+
logger.warn(`Process exited with code ${exitCode}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
logger.success('Dispatch complete (exit code 0)');
|
|
65
|
+
}
|
|
66
|
+
// BC-7: Exit code forwarding (RETAINED)
|
|
67
|
+
process.exitCode = exitCode;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Write exit code to a file (for parallel task patterns).
|
|
71
|
+
*/
|
|
72
|
+
function writeExitCode(filePath, code) {
|
|
73
|
+
try {
|
|
74
|
+
const resolved = path.resolve(filePath);
|
|
75
|
+
const dir = path.dirname(resolved);
|
|
76
|
+
if (!fs.existsSync(dir)) {
|
|
77
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
fs.writeFileSync(resolved, String(code), 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
logger.warn(`Failed to write exit code file: ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAWA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA0J5C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { getClaudeCliInfo } from '../generator/claude-cli.js';
|
|
5
|
+
import { diagnoseMcpConfig } from '../utils/repair-mcp-config.js';
|
|
6
|
+
export async function doctor() {
|
|
7
|
+
logger.banner();
|
|
8
|
+
logger.section('System Health Check');
|
|
9
|
+
console.log('');
|
|
10
|
+
const checks = [
|
|
11
|
+
{
|
|
12
|
+
name: 'Node.js version',
|
|
13
|
+
check: async () => {
|
|
14
|
+
const version = process.version;
|
|
15
|
+
const major = parseInt(version.slice(1).split('.')[0]);
|
|
16
|
+
return {
|
|
17
|
+
pass: major >= 18,
|
|
18
|
+
message: major >= 18 ? `${version} (OK)` : `${version} (requires 18+)`,
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: 'Claude Code CLI',
|
|
24
|
+
check: async () => {
|
|
25
|
+
const info = getClaudeCliInfo();
|
|
26
|
+
if (!info.available) {
|
|
27
|
+
return { pass: false, message: 'Not found - install from https://claude.ai/code' };
|
|
28
|
+
}
|
|
29
|
+
if (!info.compatible) {
|
|
30
|
+
return {
|
|
31
|
+
pass: false,
|
|
32
|
+
message: `Version ${info.version} - upgrade recommended`
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return { pass: true, message: `${info.version || 'Installed'}` };
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Folder structure',
|
|
40
|
+
check: async () => {
|
|
41
|
+
const required = [
|
|
42
|
+
'.claude/agents',
|
|
43
|
+
'.claude/state',
|
|
44
|
+
'.claude/plans',
|
|
45
|
+
'.knowledge/context',
|
|
46
|
+
'.tasks/inbox',
|
|
47
|
+
'.tasks/templates',
|
|
48
|
+
'.supervisor',
|
|
49
|
+
'.agents',
|
|
50
|
+
];
|
|
51
|
+
const missing = [];
|
|
52
|
+
for (const dir of required) {
|
|
53
|
+
if (!(await fs.pathExists(dir))) {
|
|
54
|
+
missing.push(dir);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
pass: missing.length === 0,
|
|
59
|
+
message: missing.length === 0 ? 'Complete' : `Missing: ${missing.join(', ')}`,
|
|
60
|
+
};
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: 'Configuration file',
|
|
65
|
+
check: async () => {
|
|
66
|
+
const exists = await fs.pathExists('archai.config.md');
|
|
67
|
+
return {
|
|
68
|
+
pass: exists,
|
|
69
|
+
message: exists ? 'Found' : 'Not found - run "archai init"',
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'Project description',
|
|
75
|
+
check: async () => {
|
|
76
|
+
const path = '.knowledge/context/project-description.md';
|
|
77
|
+
const exists = await fs.pathExists(path);
|
|
78
|
+
if (!exists) {
|
|
79
|
+
return { pass: false, message: 'Not found' };
|
|
80
|
+
}
|
|
81
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
82
|
+
const hasPlaceholders = content.includes('[Project Name]') || content.includes('[What does this');
|
|
83
|
+
return {
|
|
84
|
+
pass: !hasPlaceholders,
|
|
85
|
+
message: hasPlaceholders ? 'Found but needs to be filled in' : 'Configured',
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'MCP configuration',
|
|
91
|
+
check: async () => {
|
|
92
|
+
const result = await diagnoseMcpConfig(process.cwd());
|
|
93
|
+
if (result.fixed.length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
pass: false,
|
|
96
|
+
message: `${result.fixed.length} issue(s) found — run "archai update" to fix`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { pass: true, message: 'OK' };
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'Core agents',
|
|
104
|
+
check: async () => {
|
|
105
|
+
const coreAgents = [
|
|
106
|
+
'maestro-agent',
|
|
107
|
+
'maestro-headless-agent',
|
|
108
|
+
'deep-analyst',
|
|
109
|
+
'plan-validator',
|
|
110
|
+
'tdd-designer',
|
|
111
|
+
'critical-reviewer',
|
|
112
|
+
'implementation-agent',
|
|
113
|
+
'code-reviewer',
|
|
114
|
+
'cleanup-agent',
|
|
115
|
+
'finalization-agent',
|
|
116
|
+
'task-orchestrator',
|
|
117
|
+
'task-prep',
|
|
118
|
+
'quick-fix',
|
|
119
|
+
'git-coordinator',
|
|
120
|
+
'boss-agent',
|
|
121
|
+
];
|
|
122
|
+
const missing = [];
|
|
123
|
+
for (const agent of coreAgents) {
|
|
124
|
+
if (!(await fs.pathExists(`.claude/agents/${agent}.md`))) {
|
|
125
|
+
missing.push(agent);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
pass: missing.length === 0,
|
|
130
|
+
message: missing.length === 0 ? `${coreAgents.length} agents installed` : `Missing: ${missing.join(', ')}`,
|
|
131
|
+
};
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
];
|
|
135
|
+
let allPassed = true;
|
|
136
|
+
for (const check of checks) {
|
|
137
|
+
const result = await check.check();
|
|
138
|
+
const icon = result.pass ? chalk.green('✓') : chalk.red('✗');
|
|
139
|
+
const status = result.pass ? chalk.green(result.message) : chalk.red(result.message);
|
|
140
|
+
console.log(` ${icon} ${check.name}: ${status}`);
|
|
141
|
+
if (!result.pass)
|
|
142
|
+
allPassed = false;
|
|
143
|
+
}
|
|
144
|
+
console.log('');
|
|
145
|
+
logger.divider();
|
|
146
|
+
console.log('');
|
|
147
|
+
if (allPassed) {
|
|
148
|
+
logger.success('All checks passed! Your archai setup is healthy.');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
logger.warn('Some checks failed. Fix the issues above and run "archai doctor" again.');
|
|
152
|
+
}
|
|
153
|
+
console.log('');
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=doctor.js.map
|