@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,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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"}
|