@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,499 @@
1
+ import { execSync } from 'child_process';
2
+ import path from 'path';
3
+ import { logger } from './logger.js';
4
+ // ============================================================
5
+ // Internal helpers
6
+ // ============================================================
7
+ const MAX_BUFFER = 10 * 1024 * 1024; // 10 MB
8
+ /**
9
+ * Synchronous sleep using Atomics.wait (Node.js 18+).
10
+ */
11
+ function syncSleep(ms) {
12
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
13
+ }
14
+ /**
15
+ * Parse PowerShell Get-CimInstance JSON output into ProcessNode[].
16
+ */
17
+ function parsePowerShellJson(raw) {
18
+ const cleaned = raw.trim().replace(/^\uFEFF/, ''); // strip BOM
19
+ if (!cleaned)
20
+ return [];
21
+ try {
22
+ const parsed = JSON.parse(cleaned);
23
+ const arr = Array.isArray(parsed) ? parsed : [parsed]; // single object -> array
24
+ return arr.map((p) => ({
25
+ pid: p.ProcessId,
26
+ ppid: p.ParentProcessId,
27
+ name: p.Name || '',
28
+ cmd: p.CommandLine || '', // null CommandLine -> ''
29
+ }));
30
+ }
31
+ catch {
32
+ logger.warn('Failed to parse PowerShell JSON output');
33
+ return [];
34
+ }
35
+ }
36
+ /**
37
+ * Fallback: parse tasklist CSV output. Returns nodes with ppid=0 (no parent info).
38
+ */
39
+ function getAllProcessesTasklist() {
40
+ try {
41
+ const raw = execSync('tasklist /FO CSV /NH', {
42
+ encoding: 'utf-8',
43
+ maxBuffer: MAX_BUFFER,
44
+ windowsHide: true,
45
+ timeout: 10_000,
46
+ stdio: ['pipe', 'pipe', 'pipe'],
47
+ });
48
+ return raw
49
+ .trim()
50
+ .split('\n')
51
+ .filter(Boolean)
52
+ .map((line) => {
53
+ const fields = line.match(/"([^"]*)"/g)?.map((f) => f.replace(/"/g, ''));
54
+ if (!fields || fields.length < 2)
55
+ return null;
56
+ return {
57
+ pid: parseInt(fields[1], 10),
58
+ ppid: 0,
59
+ name: fields[0],
60
+ cmd: '',
61
+ };
62
+ })
63
+ .filter((p) => p !== null && !isNaN(p.pid));
64
+ }
65
+ catch {
66
+ logger.warn('tasklist also failed');
67
+ return [];
68
+ }
69
+ }
70
+ /**
71
+ * Get all processes on Windows using PowerShell, with tasklist fallback.
72
+ */
73
+ function getAllProcessesWindows() {
74
+ try {
75
+ const raw = execSync('powershell -NoProfile -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine | ConvertTo-Json -Compress"', {
76
+ encoding: 'utf-8',
77
+ maxBuffer: MAX_BUFFER,
78
+ windowsHide: true,
79
+ timeout: 15_000,
80
+ stdio: ['pipe', 'pipe', 'pipe'],
81
+ });
82
+ return parsePowerShellJson(raw);
83
+ }
84
+ catch (err) {
85
+ // ENOENT: PowerShell not found. Non-zero exit: PowerShell error.
86
+ if (err?.code === 'ENOENT' || err?.status !== undefined) {
87
+ logger.warn('PowerShell unavailable, falling back to tasklist (no tree enumeration)');
88
+ return getAllProcessesTasklist();
89
+ }
90
+ return [];
91
+ }
92
+ }
93
+ /**
94
+ * Get all processes on Unix using ps.
95
+ */
96
+ function getAllProcessesUnix() {
97
+ try {
98
+ const raw = execSync('ps -eo pid=,ppid=,args=', {
99
+ encoding: 'utf-8',
100
+ maxBuffer: MAX_BUFFER,
101
+ timeout: 10_000,
102
+ stdio: ['pipe', 'pipe', 'pipe'],
103
+ });
104
+ return raw
105
+ .trim()
106
+ .split('\n')
107
+ .filter(Boolean)
108
+ .map((line) => {
109
+ const match = line.trim().match(/^(\d+)\s+(\d+)\s+(.*)$/);
110
+ if (!match)
111
+ return null;
112
+ const pid = parseInt(match[1], 10);
113
+ const ppid = parseInt(match[2], 10);
114
+ const args = match[3].trim();
115
+ const name = path.basename(args.split(/\s+/)[0]);
116
+ return { pid, ppid, name, cmd: args };
117
+ })
118
+ .filter((p) => p !== null);
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ /**
125
+ * Get all processes (platform-dispatched).
126
+ */
127
+ export function getAllProcesses() {
128
+ return process.platform === 'win32'
129
+ ? getAllProcessesWindows()
130
+ : getAllProcessesUnix();
131
+ }
132
+ /**
133
+ * Build a map of parent PID -> child PIDs.
134
+ */
135
+ function buildChildMap(processes) {
136
+ const map = new Map();
137
+ for (const proc of processes) {
138
+ const children = map.get(proc.ppid);
139
+ if (children) {
140
+ children.push(proc.pid);
141
+ }
142
+ else {
143
+ map.set(proc.ppid, [proc.pid]);
144
+ }
145
+ }
146
+ return map;
147
+ }
148
+ // ============================================================
149
+ // Exported functions
150
+ // ============================================================
151
+ /**
152
+ * Enumerate the full process tree rooted at rootPid, including root.
153
+ * Each node includes a `depth` field (root = 0).
154
+ * Returns empty array if rootPid is not found in the process table.
155
+ */
156
+ export function enumerateTree(rootPid) {
157
+ const allProcs = getAllProcesses();
158
+ const procMap = new Map();
159
+ for (const p of allProcs) {
160
+ procMap.set(p.pid, p);
161
+ }
162
+ const childMap = buildChildMap(allProcs);
163
+ const result = [];
164
+ const visited = new Set();
165
+ // Check if rootPid is in the process table AND has children
166
+ const hasRoot = procMap.has(rootPid);
167
+ const hasChildren = childMap.has(rootPid);
168
+ // If root not found and no children reference it, return empty
169
+ if (!hasRoot && !hasChildren)
170
+ return [];
171
+ // BFS from rootPid
172
+ const queue = [
173
+ { pid: rootPid, depth: 0 },
174
+ ];
175
+ while (queue.length > 0) {
176
+ const { pid, depth } = queue.shift();
177
+ if (visited.has(pid))
178
+ continue;
179
+ visited.add(pid);
180
+ const proc = procMap.get(pid);
181
+ // Only add to result if the process exists in the table
182
+ if (proc) {
183
+ result.push({ ...proc, depth });
184
+ }
185
+ const children = childMap.get(pid) || [];
186
+ for (const childPid of children) {
187
+ if (!visited.has(childPid)) {
188
+ queue.push({ pid: childPid, depth: depth + 1 });
189
+ }
190
+ }
191
+ }
192
+ return result;
193
+ }
194
+ /**
195
+ * Enumerate descendants of rootPid (NOT including root itself).
196
+ * Returns flat array of ProcessNode[].
197
+ */
198
+ export function enumerateChildren(rootPid) {
199
+ const tree = enumerateTree(rootPid);
200
+ return tree
201
+ .filter((n) => n.pid !== rootPid)
202
+ .map(({ depth: _, ...rest }) => rest);
203
+ }
204
+ /**
205
+ * Check if a process is alive. Optionally verify process name matches.
206
+ */
207
+ export function isAlive(pid, expectedName) {
208
+ if (process.platform === 'win32') {
209
+ return isAliveWindows(pid, expectedName);
210
+ }
211
+ return isAliveUnix(pid, expectedName);
212
+ }
213
+ function isAliveWindows(pid, expectedName) {
214
+ try {
215
+ const raw = execSync(`tasklist /FI "PID eq ${pid}" /FO CSV /NH`, {
216
+ encoding: 'utf-8',
217
+ windowsHide: true,
218
+ timeout: 5_000,
219
+ stdio: ['pipe', 'pipe', 'pipe'],
220
+ });
221
+ if (raw.includes('INFO: No tasks'))
222
+ return false;
223
+ if (!expectedName)
224
+ return true;
225
+ // Parse CSV: "name.exe","pid","Session Name","Session#","Mem Usage"
226
+ const match = raw.match(/"([^"]+)"/);
227
+ if (!match)
228
+ return true; // can't parse but process exists
229
+ return match[1].toLowerCase() === expectedName.toLowerCase();
230
+ }
231
+ catch {
232
+ return false;
233
+ }
234
+ }
235
+ function isAliveUnix(pid, expectedName) {
236
+ try {
237
+ process.kill(pid, 0);
238
+ }
239
+ catch (err) {
240
+ if (err?.code === 'EPERM')
241
+ return true; // exists but no permission
242
+ return false; // ESRCH = not found
243
+ }
244
+ if (!expectedName)
245
+ return true;
246
+ // Check name via ps
247
+ try {
248
+ const raw = execSync(`ps -p ${pid} -o comm=`, {
249
+ encoding: 'utf-8',
250
+ timeout: 5_000,
251
+ stdio: ['pipe', 'pipe', 'pipe'],
252
+ });
253
+ return raw.trim().toLowerCase() === expectedName.toLowerCase();
254
+ }
255
+ catch {
256
+ return true; // can't verify name but process exists
257
+ }
258
+ }
259
+ /**
260
+ * Find processes whose working directory or command line relates to dirPath.
261
+ * Excludes own PID.
262
+ */
263
+ export function findByCwd(dirPath) {
264
+ if (process.platform === 'win32') {
265
+ return findByCwdWindows(dirPath);
266
+ }
267
+ return findByCwdUnix(dirPath);
268
+ }
269
+ function findByCwdWindows(dirPath) {
270
+ const allProcs = getAllProcessesWindows();
271
+ // Normalize: lowercase + backslashes for consistent matching
272
+ const normalized = dirPath.replace(/\//g, '\\').toLowerCase();
273
+ return allProcs.filter((p) => p.pid !== process.pid &&
274
+ p.cmd.toLowerCase().replace(/\//g, '\\').includes(normalized));
275
+ }
276
+ function findByCwdUnix(dirPath) {
277
+ let pids;
278
+ try {
279
+ const raw = execSync(`lsof +D "${dirPath}" -t 2>/dev/null || true`, {
280
+ encoding: 'utf-8',
281
+ maxBuffer: MAX_BUFFER,
282
+ timeout: 10_000,
283
+ stdio: ['pipe', 'pipe', 'pipe'],
284
+ });
285
+ pids = raw
286
+ .trim()
287
+ .split('\n')
288
+ .filter(Boolean)
289
+ .map((s) => parseInt(s.trim(), 10))
290
+ .filter((n) => !isNaN(n) && n !== process.pid);
291
+ }
292
+ catch (err) {
293
+ if (err?.code === 'ENOENT') {
294
+ logger.warn('lsof not available, cannot find processes by directory');
295
+ }
296
+ return [];
297
+ }
298
+ if (pids.length === 0)
299
+ return [];
300
+ // B2: cross-reference with full process table for ProcessNode fields
301
+ const allProcs = getAllProcessesUnix();
302
+ const pidSet = new Set(pids);
303
+ return allProcs.filter((p) => pidSet.has(p.pid));
304
+ }
305
+ /**
306
+ * Kill a process tree rooted at rootPid. Synchronous.
307
+ * Returns accounting of killed/survived/errors.
308
+ */
309
+ export function killTree(rootPid, opts) {
310
+ if (process.platform === 'win32') {
311
+ return killTreeWindows(rootPid, opts);
312
+ }
313
+ return killTreeUnix(rootPid, opts);
314
+ }
315
+ function killTreeWindows(rootPid, opts) {
316
+ const killed = [];
317
+ const survived = [];
318
+ const errors = [];
319
+ let tree;
320
+ try {
321
+ tree = enumerateTree(rootPid);
322
+ }
323
+ catch {
324
+ // Fallback: best-effort kill without enumeration
325
+ try {
326
+ execSync(`taskkill /F /T /PID ${rootPid}`, {
327
+ windowsHide: true,
328
+ stdio: 'pipe',
329
+ timeout: 5000,
330
+ });
331
+ }
332
+ catch {
333
+ /* truly nothing we can do */
334
+ }
335
+ return { killed: [], survived: [], errors: [] };
336
+ }
337
+ if (tree.length === 0) {
338
+ return { killed, survived, errors };
339
+ }
340
+ // Sort by depth descending (leaf-to-root)
341
+ const sorted = [...tree].sort((a, b) => b.depth - a.depth);
342
+ // Kill each process
343
+ for (const proc of sorted) {
344
+ if (proc.pid === process.pid)
345
+ continue;
346
+ try {
347
+ execSync(`taskkill /F /PID ${proc.pid}`, {
348
+ windowsHide: true,
349
+ stdio: 'pipe',
350
+ timeout: 5000,
351
+ });
352
+ }
353
+ catch {
354
+ // Process may already be dead -- that's OK
355
+ }
356
+ }
357
+ // Re-enumerate survivors
358
+ let survivors;
359
+ try {
360
+ survivors = enumerateTree(rootPid);
361
+ }
362
+ catch {
363
+ survivors = [];
364
+ }
365
+ if (survivors.length > 0) {
366
+ // Retry survivors once
367
+ const retrySorted = [...survivors].sort((a, b) => b.depth - a.depth);
368
+ for (const proc of retrySorted) {
369
+ if (proc.pid === process.pid)
370
+ continue;
371
+ try {
372
+ execSync(`taskkill /F /PID ${proc.pid}`, {
373
+ windowsHide: true,
374
+ stdio: 'pipe',
375
+ timeout: 5000,
376
+ });
377
+ }
378
+ catch {
379
+ // Process may already be dead
380
+ }
381
+ }
382
+ }
383
+ // Verify all dead
384
+ for (const proc of sorted) {
385
+ if (proc.pid === process.pid)
386
+ continue;
387
+ if (isAlive(proc.pid)) {
388
+ survived.push(proc.pid);
389
+ }
390
+ else {
391
+ killed.push(proc.pid);
392
+ }
393
+ }
394
+ return { killed, survived, errors };
395
+ }
396
+ function killTreeUnix(rootPid, opts) {
397
+ const killed = [];
398
+ const survived = [];
399
+ const errors = [];
400
+ const gracePeriodMs = opts?.gracePeriodMs ?? 3000;
401
+ // B1: When gracePeriodMs === 0, skip SIGTERM group kill entirely.
402
+ if (gracePeriodMs > 0) {
403
+ let groupKillAttempted = false;
404
+ try {
405
+ // Check if rootPid is a process group leader
406
+ process.kill(-rootPid, 0);
407
+ // If no throw, it IS a group leader -- send SIGTERM to the group
408
+ process.kill(-rootPid, 'SIGTERM');
409
+ groupKillAttempted = true;
410
+ }
411
+ catch {
412
+ // Not a process group leader, or group doesn't exist
413
+ // Skip group kill, go straight to individual enumeration+kill
414
+ }
415
+ if (groupKillAttempted) {
416
+ // Wait up to gracePeriodMs, polling isAlive in 100ms increments
417
+ const deadline = Date.now() + gracePeriodMs;
418
+ while (Date.now() < deadline && isAlive(rootPid)) {
419
+ syncSleep(100);
420
+ }
421
+ }
422
+ }
423
+ // Enumerate survivors and kill individually (leaf-to-root)
424
+ let tree;
425
+ try {
426
+ tree = enumerateTree(rootPid);
427
+ }
428
+ catch {
429
+ // Fallback: best-effort kill without enumeration
430
+ try {
431
+ process.kill(-rootPid, 'SIGKILL');
432
+ }
433
+ catch {
434
+ /* truly nothing we can do */
435
+ }
436
+ return { killed: [], survived: [], errors: [] };
437
+ }
438
+ const sorted = [...tree].sort((a, b) => b.depth - a.depth);
439
+ for (const proc of sorted) {
440
+ if (proc.pid === process.pid)
441
+ continue;
442
+ try {
443
+ process.kill(proc.pid, 'SIGKILL');
444
+ }
445
+ catch {
446
+ /* ESRCH = already dead */
447
+ }
448
+ }
449
+ // Verify all dead
450
+ for (const proc of sorted) {
451
+ if (proc.pid === process.pid)
452
+ continue;
453
+ if (isAlive(proc.pid)) {
454
+ survived.push(proc.pid);
455
+ }
456
+ else {
457
+ killed.push(proc.pid);
458
+ }
459
+ }
460
+ return { killed, survived, errors };
461
+ }
462
+ /**
463
+ * Kill a single process by PID. Returns true if process is now dead.
464
+ * Self-PID protected: will not kill own process.
465
+ */
466
+ export function killSingle(pid) {
467
+ // Self-PID protection
468
+ if (pid === process.pid)
469
+ return false;
470
+ if (process.platform === 'win32') {
471
+ try {
472
+ execSync(`taskkill /F /PID ${pid}`, {
473
+ windowsHide: true,
474
+ stdio: 'pipe',
475
+ timeout: 5000,
476
+ });
477
+ }
478
+ catch {
479
+ // Process may not exist or permission denied
480
+ }
481
+ return !isAlive(pid);
482
+ }
483
+ // Unix
484
+ try {
485
+ process.kill(pid, 'SIGKILL');
486
+ }
487
+ catch (err) {
488
+ if (err?.code === 'ESRCH') {
489
+ // Already dead -- that's what we wanted
490
+ return false;
491
+ }
492
+ if (err?.code === 'EPERM') {
493
+ return false;
494
+ }
495
+ return false;
496
+ }
497
+ return !isAlive(pid);
498
+ }
499
+ //# sourceMappingURL=process-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-tree.js","sourceRoot":"","sources":["../../src/utils/process-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface McpRepairResult {
2
+ fixed: string[];
3
+ warnings: string[];
4
+ }
5
+ /**
6
+ * Detect and repair broken MCP configurations from v0.3.0.
7
+ * Reads, fixes, and writes config files.
8
+ */
9
+ export declare function repairMcpConfig(projectRoot: string): Promise<McpRepairResult>;
10
+ /**
11
+ * Read-only diagnosis of MCP configuration issues.
12
+ * Returns what would be fixed without modifying any files.
13
+ */
14
+ export declare function diagnoseMcpConfig(projectRoot: string): Promise<McpRepairResult>;
15
+ //# sourceMappingURL=repair-mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-mcp-config.d.ts","sourceRoot":"","sources":["../../src/utils/repair-mcp-config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAgJD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAEnF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAErF"}
@@ -0,0 +1,129 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import { readMcpJson, readClaudeSettings, writeClaudeSettings } from './merge-claude-settings.js';
4
+ /**
5
+ * Atomically write .mcp.json for a project root.
6
+ */
7
+ async function writeMcpJson(projectRoot, data) {
8
+ const mcpJsonPath = path.join(projectRoot, '.mcp.json');
9
+ const tmpPath = path.join(projectRoot, `.mcp.json.tmp.${Date.now()}`);
10
+ await fs.writeFile(tmpPath, JSON.stringify(data, null, 2) + '\n');
11
+ await fs.rename(tmpPath, mcpJsonPath);
12
+ }
13
+ function isArchiKnowledgeServer(name) {
14
+ return name.startsWith('archai-knowledge-');
15
+ }
16
+ /**
17
+ * Check if an MCP entry has the broken cmd /c wrapper pattern.
18
+ * Returns true if command === "cmd" && args[0] === "/c" && args[1] === "npx".
19
+ */
20
+ function hasCmdWrapper(entry) {
21
+ return (entry.command === 'cmd' &&
22
+ Array.isArray(entry.args) &&
23
+ entry.args.length >= 2 &&
24
+ entry.args[0] === '/c' &&
25
+ entry.args[1] === 'npx');
26
+ }
27
+ /**
28
+ * Fix the cmd /c wrapper: rewrite to { command: "npx", args: args.slice(2) }.
29
+ */
30
+ function fixCmdWrapper(entry) {
31
+ const args = entry.args;
32
+ return { ...entry, command: 'npx', args: args.slice(2) };
33
+ }
34
+ /**
35
+ * Validate an MCP entry has the required shape (command: string, args: string[]).
36
+ */
37
+ function validateEntryShape(name, entry) {
38
+ if (typeof entry.command !== 'string') {
39
+ return `MCP server "${name}": missing or invalid "command" (expected string)`;
40
+ }
41
+ if (!Array.isArray(entry.args)) {
42
+ return `MCP server "${name}": missing or invalid "args" (expected string[])`;
43
+ }
44
+ return null;
45
+ }
46
+ /**
47
+ * Core logic shared by repair and diagnose.
48
+ * When dryRun is true, no files are written.
49
+ */
50
+ async function runMcpChecks(projectRoot, dryRun) {
51
+ const fixed = [];
52
+ const warnings = [];
53
+ // Read current .mcp.json
54
+ const mcpJson = (await readMcpJson(projectRoot));
55
+ let mcpDirty = false;
56
+ if (!mcpJson.mcpServers) {
57
+ mcpJson.mcpServers = {};
58
+ }
59
+ // Fix 2: Migrate archai-knowledge-* entries from .claude/settings.json → .mcp.json
60
+ const claudeSettings = await readClaudeSettings(projectRoot);
61
+ const settingsServers = (claudeSettings.mcpServers ?? {});
62
+ let settingsDirty = false;
63
+ for (const [name, entry] of Object.entries(settingsServers)) {
64
+ if (!isArchiKnowledgeServer(name))
65
+ continue;
66
+ // Migrate to .mcp.json (apply cmd /c fix during migration too)
67
+ let migratedEntry = { ...entry };
68
+ if (hasCmdWrapper(migratedEntry)) {
69
+ migratedEntry = fixCmdWrapper(migratedEntry);
70
+ fixed.push(`${name}: removed cmd /c wrapper (migrated from settings.json)`);
71
+ }
72
+ else {
73
+ fixed.push(`${name}: migrated from .claude/settings.json to .mcp.json`);
74
+ }
75
+ mcpJson.mcpServers[name] = migratedEntry;
76
+ mcpDirty = true;
77
+ delete settingsServers[name];
78
+ settingsDirty = true;
79
+ }
80
+ // Fix 1: cmd /c wrapper removal in .mcp.json entries
81
+ for (const [name, entry] of Object.entries(mcpJson.mcpServers)) {
82
+ if (!isArchiKnowledgeServer(name))
83
+ continue;
84
+ if (hasCmdWrapper(entry)) {
85
+ mcpJson.mcpServers[name] = fixCmdWrapper(entry);
86
+ mcpDirty = true;
87
+ fixed.push(`${name}: removed cmd /c wrapper from .mcp.json`);
88
+ }
89
+ }
90
+ // Check 3: Validate entry shapes (all servers, not just archai ones)
91
+ for (const [name, entry] of Object.entries(mcpJson.mcpServers)) {
92
+ const warning = validateEntryShape(name, entry);
93
+ if (warning) {
94
+ warnings.push(warning);
95
+ }
96
+ }
97
+ // Write changes if not dry run
98
+ if (!dryRun) {
99
+ if (mcpDirty) {
100
+ await writeMcpJson(projectRoot, mcpJson);
101
+ }
102
+ if (settingsDirty) {
103
+ // Update settings with removed entries
104
+ if (Object.keys(settingsServers).length === 0) {
105
+ delete claudeSettings.mcpServers;
106
+ }
107
+ else {
108
+ claudeSettings.mcpServers = settingsServers;
109
+ }
110
+ await writeClaudeSettings(projectRoot, claudeSettings);
111
+ }
112
+ }
113
+ return { fixed, warnings };
114
+ }
115
+ /**
116
+ * Detect and repair broken MCP configurations from v0.3.0.
117
+ * Reads, fixes, and writes config files.
118
+ */
119
+ export async function repairMcpConfig(projectRoot) {
120
+ return runMcpChecks(projectRoot, false);
121
+ }
122
+ /**
123
+ * Read-only diagnosis of MCP configuration issues.
124
+ * Returns what would be fixed without modifying any files.
125
+ */
126
+ export async function diagnoseMcpConfig(projectRoot) {
127
+ return runMcpChecks(projectRoot, true);
128
+ }
129
+ //# sourceMappingURL=repair-mcp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-mcp-config.js","sourceRoot":"","sources":["../../src/utils/repair-mcp-config.ts"],"names":[],"mappings":"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"}