@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.
Files changed (274) hide show
  1. package/README.md +270 -0
  2. package/dist/bin/cli.d.ts +3 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +188 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/commands/cleanup.d.ts +21 -0
  7. package/dist/commands/cleanup.d.ts.map +1 -0
  8. package/dist/commands/cleanup.js +380 -0
  9. package/dist/commands/cleanup.js.map +1 -0
  10. package/dist/commands/dispatch.d.ts +13 -0
  11. package/dist/commands/dispatch.d.ts.map +1 -0
  12. package/dist/commands/dispatch.js +85 -0
  13. package/dist/commands/dispatch.js.map +1 -0
  14. package/dist/commands/doctor.d.ts +2 -0
  15. package/dist/commands/doctor.d.ts.map +1 -0
  16. package/dist/commands/doctor.js +155 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/generate.d.ts +3 -0
  19. package/dist/commands/generate.d.ts.map +1 -0
  20. package/dist/commands/generate.js +167 -0
  21. package/dist/commands/generate.js.map +1 -0
  22. package/dist/commands/init.d.ts +10 -0
  23. package/dist/commands/init.d.ts.map +1 -0
  24. package/dist/commands/init.js +711 -0
  25. package/dist/commands/init.js.map +1 -0
  26. package/dist/commands/knowledge-sync.d.ts +69 -0
  27. package/dist/commands/knowledge-sync.d.ts.map +1 -0
  28. package/dist/commands/knowledge-sync.js +661 -0
  29. package/dist/commands/knowledge-sync.js.map +1 -0
  30. package/dist/commands/knowledge.d.ts +35 -0
  31. package/dist/commands/knowledge.d.ts.map +1 -0
  32. package/dist/commands/knowledge.js +254 -0
  33. package/dist/commands/knowledge.js.map +1 -0
  34. package/dist/commands/rollback.d.ts +13 -0
  35. package/dist/commands/rollback.d.ts.map +1 -0
  36. package/dist/commands/rollback.js +186 -0
  37. package/dist/commands/rollback.js.map +1 -0
  38. package/dist/commands/setup-config.d.ts +6 -0
  39. package/dist/commands/setup-config.d.ts.map +1 -0
  40. package/dist/commands/setup-config.js +663 -0
  41. package/dist/commands/setup-config.js.map +1 -0
  42. package/dist/commands/setup-project.d.ts +6 -0
  43. package/dist/commands/setup-project.d.ts.map +1 -0
  44. package/dist/commands/setup-project.js +361 -0
  45. package/dist/commands/setup-project.js.map +1 -0
  46. package/dist/commands/setup.d.ts +3 -0
  47. package/dist/commands/setup.d.ts.map +1 -0
  48. package/dist/commands/setup.js +293 -0
  49. package/dist/commands/setup.js.map +1 -0
  50. package/dist/commands/status.d.ts +51 -0
  51. package/dist/commands/status.d.ts.map +1 -0
  52. package/dist/commands/status.js +182 -0
  53. package/dist/commands/status.js.map +1 -0
  54. package/dist/commands/uninstall.d.ts +3 -0
  55. package/dist/commands/uninstall.d.ts.map +1 -0
  56. package/dist/commands/uninstall.js +173 -0
  57. package/dist/commands/uninstall.js.map +1 -0
  58. package/dist/commands/update.d.ts +10 -0
  59. package/dist/commands/update.d.ts.map +1 -0
  60. package/dist/commands/update.js +435 -0
  61. package/dist/commands/update.js.map +1 -0
  62. package/dist/commands/worktree.d.ts +30 -0
  63. package/dist/commands/worktree.d.ts.map +1 -0
  64. package/dist/commands/worktree.js +262 -0
  65. package/dist/commands/worktree.js.map +1 -0
  66. package/dist/generator/claude-cli.d.ts +24 -0
  67. package/dist/generator/claude-cli.d.ts.map +1 -0
  68. package/dist/generator/claude-cli.js +239 -0
  69. package/dist/generator/claude-cli.js.map +1 -0
  70. package/dist/generator/prompt-builder.d.ts +7 -0
  71. package/dist/generator/prompt-builder.d.ts.map +1 -0
  72. package/dist/generator/prompt-builder.js +144 -0
  73. package/dist/generator/prompt-builder.js.map +1 -0
  74. package/dist/index.d.ts +36 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +45 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mcp/embeddings.d.ts +53 -0
  79. package/dist/mcp/embeddings.d.ts.map +1 -0
  80. package/dist/mcp/embeddings.js +68 -0
  81. package/dist/mcp/embeddings.js.map +1 -0
  82. package/dist/mcp/hybrid-search.d.ts +25 -0
  83. package/dist/mcp/hybrid-search.d.ts.map +1 -0
  84. package/dist/mcp/hybrid-search.js +72 -0
  85. package/dist/mcp/hybrid-search.js.map +1 -0
  86. package/dist/mcp/knowledge-server.d.ts +4 -0
  87. package/dist/mcp/knowledge-server.d.ts.map +1 -0
  88. package/dist/mcp/knowledge-server.js +294 -0
  89. package/dist/mcp/knowledge-server.js.map +1 -0
  90. package/dist/mcp/knowledge-utils.d.ts +65 -0
  91. package/dist/mcp/knowledge-utils.d.ts.map +1 -0
  92. package/dist/mcp/knowledge-utils.js +207 -0
  93. package/dist/mcp/knowledge-utils.js.map +1 -0
  94. package/dist/mcp/search-factory.d.ts +9 -0
  95. package/dist/mcp/search-factory.d.ts.map +1 -0
  96. package/dist/mcp/search-factory.js +23 -0
  97. package/dist/mcp/search-factory.js.map +1 -0
  98. package/dist/mcp/search-index.d.ts +45 -0
  99. package/dist/mcp/search-index.d.ts.map +1 -0
  100. package/dist/mcp/search-index.js +2 -0
  101. package/dist/mcp/search-index.js.map +1 -0
  102. package/dist/mcp/search-minisearch.d.ts +46 -0
  103. package/dist/mcp/search-minisearch.d.ts.map +1 -0
  104. package/dist/mcp/search-minisearch.js +99 -0
  105. package/dist/mcp/search-minisearch.js.map +1 -0
  106. package/dist/mcp/search-sqlite.d.ts +30 -0
  107. package/dist/mcp/search-sqlite.d.ts.map +1 -0
  108. package/dist/mcp/search-sqlite.js +188 -0
  109. package/dist/mcp/search-sqlite.js.map +1 -0
  110. package/dist/mcp/vector-store.d.ts +52 -0
  111. package/dist/mcp/vector-store.d.ts.map +1 -0
  112. package/dist/mcp/vector-store.js +183 -0
  113. package/dist/mcp/vector-store.js.map +1 -0
  114. package/dist/scaffold/copy-core-agents.d.ts +2 -0
  115. package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
  116. package/dist/scaffold/copy-core-agents.js +90 -0
  117. package/dist/scaffold/copy-core-agents.js.map +1 -0
  118. package/dist/scaffold/create-claude-settings.d.ts +40 -0
  119. package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
  120. package/dist/scaffold/create-claude-settings.js +422 -0
  121. package/dist/scaffold/create-claude-settings.js.map +1 -0
  122. package/dist/scaffold/create-config.d.ts +14 -0
  123. package/dist/scaffold/create-config.d.ts.map +1 -0
  124. package/dist/scaffold/create-config.js +199 -0
  125. package/dist/scaffold/create-config.js.map +1 -0
  126. package/dist/scaffold/create-project-description.d.ts +12 -0
  127. package/dist/scaffold/create-project-description.d.ts.map +1 -0
  128. package/dist/scaffold/create-project-description.js +104 -0
  129. package/dist/scaffold/create-project-description.js.map +1 -0
  130. package/dist/scaffold/create-structure.d.ts +2 -0
  131. package/dist/scaffold/create-structure.d.ts.map +1 -0
  132. package/dist/scaffold/create-structure.js +146 -0
  133. package/dist/scaffold/create-structure.js.map +1 -0
  134. package/dist/types/dependency-analysis.d.ts +11 -0
  135. package/dist/types/dependency-analysis.d.ts.map +1 -0
  136. package/dist/types/dependency-analysis.js +2 -0
  137. package/dist/types/dependency-analysis.js.map +1 -0
  138. package/dist/types/index.d.ts +526 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +3 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/types/task.d.ts +25 -0
  143. package/dist/types/task.d.ts.map +1 -0
  144. package/dist/types/task.js +3 -0
  145. package/dist/types/task.js.map +1 -0
  146. package/dist/utils/analyze-files.d.ts +7 -0
  147. package/dist/utils/analyze-files.d.ts.map +1 -0
  148. package/dist/utils/analyze-files.js +27 -0
  149. package/dist/utils/analyze-files.js.map +1 -0
  150. package/dist/utils/backup.d.ts +102 -0
  151. package/dist/utils/backup.d.ts.map +1 -0
  152. package/dist/utils/backup.js +352 -0
  153. package/dist/utils/backup.js.map +1 -0
  154. package/dist/utils/ci-provider.d.ts +23 -0
  155. package/dist/utils/ci-provider.d.ts.map +1 -0
  156. package/dist/utils/ci-provider.js +525 -0
  157. package/dist/utils/ci-provider.js.map +1 -0
  158. package/dist/utils/ci-status.d.ts +57 -0
  159. package/dist/utils/ci-status.d.ts.map +1 -0
  160. package/dist/utils/ci-status.js +349 -0
  161. package/dist/utils/ci-status.js.map +1 -0
  162. package/dist/utils/dependency-analysis.d.ts +34 -0
  163. package/dist/utils/dependency-analysis.d.ts.map +1 -0
  164. package/dist/utils/dependency-analysis.js +298 -0
  165. package/dist/utils/dependency-analysis.js.map +1 -0
  166. package/dist/utils/detect-git.d.ts +57 -0
  167. package/dist/utils/detect-git.d.ts.map +1 -0
  168. package/dist/utils/detect-git.js +439 -0
  169. package/dist/utils/detect-git.js.map +1 -0
  170. package/dist/utils/detect-mcp.d.ts +32 -0
  171. package/dist/utils/detect-mcp.d.ts.map +1 -0
  172. package/dist/utils/detect-mcp.js +178 -0
  173. package/dist/utils/detect-mcp.js.map +1 -0
  174. package/dist/utils/detect-project.d.ts +3 -0
  175. package/dist/utils/detect-project.d.ts.map +1 -0
  176. package/dist/utils/detect-project.js +155 -0
  177. package/dist/utils/detect-project.js.map +1 -0
  178. package/dist/utils/file-comparison.d.ts +89 -0
  179. package/dist/utils/file-comparison.d.ts.map +1 -0
  180. package/dist/utils/file-comparison.js +301 -0
  181. package/dist/utils/file-comparison.js.map +1 -0
  182. package/dist/utils/file-merger.d.ts +74 -0
  183. package/dist/utils/file-merger.d.ts.map +1 -0
  184. package/dist/utils/file-merger.js +350 -0
  185. package/dist/utils/file-merger.js.map +1 -0
  186. package/dist/utils/logger.d.ts +26 -0
  187. package/dist/utils/logger.d.ts.map +1 -0
  188. package/dist/utils/logger.js +72 -0
  189. package/dist/utils/logger.js.map +1 -0
  190. package/dist/utils/managed-process.d.ts +109 -0
  191. package/dist/utils/managed-process.d.ts.map +1 -0
  192. package/dist/utils/managed-process.js +481 -0
  193. package/dist/utils/managed-process.js.map +1 -0
  194. package/dist/utils/merge-claude-settings.d.ts +65 -0
  195. package/dist/utils/merge-claude-settings.d.ts.map +1 -0
  196. package/dist/utils/merge-claude-settings.js +133 -0
  197. package/dist/utils/merge-claude-settings.js.map +1 -0
  198. package/dist/utils/migration.d.ts +74 -0
  199. package/dist/utils/migration.d.ts.map +1 -0
  200. package/dist/utils/migration.js +345 -0
  201. package/dist/utils/migration.js.map +1 -0
  202. package/dist/utils/process-health.d.ts +51 -0
  203. package/dist/utils/process-health.d.ts.map +1 -0
  204. package/dist/utils/process-health.js +123 -0
  205. package/dist/utils/process-health.js.map +1 -0
  206. package/dist/utils/process-registry.d.ts +20 -0
  207. package/dist/utils/process-registry.d.ts.map +1 -0
  208. package/dist/utils/process-registry.js +151 -0
  209. package/dist/utils/process-registry.js.map +1 -0
  210. package/dist/utils/process-tree.d.ts +51 -0
  211. package/dist/utils/process-tree.d.ts.map +1 -0
  212. package/dist/utils/process-tree.js +499 -0
  213. package/dist/utils/process-tree.js.map +1 -0
  214. package/dist/utils/repair-mcp-config.d.ts +15 -0
  215. package/dist/utils/repair-mcp-config.d.ts.map +1 -0
  216. package/dist/utils/repair-mcp-config.js +129 -0
  217. package/dist/utils/repair-mcp-config.js.map +1 -0
  218. package/dist/utils/task-lifecycle.d.ts +60 -0
  219. package/dist/utils/task-lifecycle.d.ts.map +1 -0
  220. package/dist/utils/task-lifecycle.js +310 -0
  221. package/dist/utils/task-lifecycle.js.map +1 -0
  222. package/dist/utils/update-agent-mcp.d.ts +7 -0
  223. package/dist/utils/update-agent-mcp.d.ts.map +1 -0
  224. package/dist/utils/update-agent-mcp.js +115 -0
  225. package/dist/utils/update-agent-mcp.js.map +1 -0
  226. package/dist/utils/update-agent-templates.d.ts +6 -0
  227. package/dist/utils/update-agent-templates.d.ts.map +1 -0
  228. package/dist/utils/update-agent-templates.js +56 -0
  229. package/dist/utils/update-agent-templates.js.map +1 -0
  230. package/dist/utils/update-config-ci.d.ts +7 -0
  231. package/dist/utils/update-config-ci.d.ts.map +1 -0
  232. package/dist/utils/update-config-ci.js +72 -0
  233. package/dist/utils/update-config-ci.js.map +1 -0
  234. package/dist/utils/update-config-git.d.ts +18 -0
  235. package/dist/utils/update-config-git.d.ts.map +1 -0
  236. package/dist/utils/update-config-git.js +146 -0
  237. package/dist/utils/update-config-git.js.map +1 -0
  238. package/dist/utils/update-config-mcp.d.ts +7 -0
  239. package/dist/utils/update-config-mcp.d.ts.map +1 -0
  240. package/dist/utils/update-config-mcp.js +98 -0
  241. package/dist/utils/update-config-mcp.js.map +1 -0
  242. package/dist/utils/validate-config.d.ts +3 -0
  243. package/dist/utils/validate-config.d.ts.map +1 -0
  244. package/dist/utils/validate-config.js +109 -0
  245. package/dist/utils/validate-config.js.map +1 -0
  246. package/dist/utils/version-tracker.d.ts +130 -0
  247. package/dist/utils/version-tracker.d.ts.map +1 -0
  248. package/dist/utils/version-tracker.js +298 -0
  249. package/dist/utils/version-tracker.js.map +1 -0
  250. package/dist/utils/worktree.d.ts +68 -0
  251. package/dist/utils/worktree.d.ts.map +1 -0
  252. package/dist/utils/worktree.js +446 -0
  253. package/dist/utils/worktree.js.map +1 -0
  254. package/package.json +77 -0
  255. package/templates/ARCHAI_README.md +329 -0
  256. package/templates/CLAUDE.md +67 -0
  257. package/templates/PROMPTS.md +506 -0
  258. package/templates/core-agents/boss-agent.md +671 -0
  259. package/templates/core-agents/cleanup-agent.md +145 -0
  260. package/templates/core-agents/code-reviewer.md +175 -0
  261. package/templates/core-agents/critical-reviewer.md +117 -0
  262. package/templates/core-agents/deep-analyst.md +216 -0
  263. package/templates/core-agents/finalization-agent.md +252 -0
  264. package/templates/core-agents/git-coordinator.md +240 -0
  265. package/templates/core-agents/implementation-agent.md +151 -0
  266. package/templates/core-agents/maestro-agent.md +413 -0
  267. package/templates/core-agents/maestro-headless-agent.md +422 -0
  268. package/templates/core-agents/plan-validator.md +198 -0
  269. package/templates/core-agents/quick-fix.md +56 -0
  270. package/templates/core-agents/routing-templates.md +338 -0
  271. package/templates/core-agents/task-orchestrator.md +143 -0
  272. package/templates/core-agents/task-prep.md +202 -0
  273. package/templates/core-agents/tdd-designer.md +143 -0
  274. 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,2 @@
1
+ export declare function doctor(): Promise<void>;
2
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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