f2g-telco 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +83 -0
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.js +264 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +97 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +460 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +7 -0
- package/dist/commands/list.js +52 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +1 -0
- package/dist/commands/remove.js +127 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/update.d.ts +1 -0
- package/dist/commands/update.js +41 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +70 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/mcps.d.ts +33 -0
- package/dist/installers/mcps.js +185 -0
- package/dist/installers/mcps.js.map +1 -0
- package/dist/installers/skills.d.ts +15 -0
- package/dist/installers/skills.js +55 -0
- package/dist/installers/skills.js.map +1 -0
- package/dist/utils/config.d.ts +22 -0
- package/dist/utils/config.js +36 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/detect.d.ts +18 -0
- package/dist/utils/detect.js +42 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.js +22 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +64 -0
- package/registry/mcps.json +186 -0
- package/registry/providers.json +121 -0
- package/registry/skills.json +34 -0
- package/templates/crush/autonomous.md +38 -0
- package/templates/inventory.md +16 -0
- package/templates/kiro/orchestrator.md +17 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 suzannekouemou
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# F2G-Telco
|
|
2
|
+
|
|
3
|
+
[](https://github.com/suzannekouemou/f2g-telco/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
|
|
7
|
+
CLI to set up a fully configured AI coding environment in one command—MCPs, providers, skills, orchestrators, and inventories for Crush and Kiro.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx f2g-telco init
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What You Get
|
|
16
|
+
- **13 MCP servers** for memory, knowledge, reasoning, browser automation, diagrams, GitHub, databases
|
|
17
|
+
- **Curated skills** from multiple sources with orchestrator templates
|
|
18
|
+
- **Provider-agnostic configs** for Copilot, Ollama, NVIDIA NIM, Google AI Studio, and any OpenAI-compatible API
|
|
19
|
+
- **Complete tool wiring**: MCPs, providers, models, permissions, LSPs, orchestrator agent, INVENTORY.md
|
|
20
|
+
|
|
21
|
+
## Why F2G-Telco vs. Manual Setup
|
|
22
|
+
| Step | f2g-telco | Manual setup |
|
|
23
|
+
|------|-----------|--------------|
|
|
24
|
+
| Install MCP servers | Auto-installs with user prefix and fallbacks | Repeated npm/pip commands, sudo issues |
|
|
25
|
+
| Tool config | Writes full Crush/Kiro configs (MCPs, providers, models, permissions, LSP) | Hand-edit JSON with multiple schemas |
|
|
26
|
+
| Skills & orchestrator | Clones, symlinks, and wires orchestrator templates | Manual git clone + path wiring |
|
|
27
|
+
| Provider keys | Guided boxed prompts with skip/retry | Ad hoc env collection |
|
|
28
|
+
| Inventory | Generates INVENTORY.md for agents | Manual docs |
|
|
29
|
+
| Recovery | Verbose mode + doctor checks | Debug on your own |
|
|
30
|
+
|
|
31
|
+
## Command Reference
|
|
32
|
+
| Command | Description |
|
|
33
|
+
|---------|-------------|
|
|
34
|
+
| `f2g-telco init` | Interactive setup wizard (tools, providers, MCPs, skills, configs) |
|
|
35
|
+
| `f2g-telco add <mcp>` | Install and configure a single MCP by id |
|
|
36
|
+
| `f2g-telco remove <mcp>` | Uninstall and remove a single MCP by id |
|
|
37
|
+
| `f2g-telco list [--mcps|--providers|--skills]` | Show available components and installed status |
|
|
38
|
+
| `f2g-telco update` | Pull latest registries and refresh configs |
|
|
39
|
+
| `f2g-telco doctor` | Health check (Node, git, PATH, MCP binaries) |
|
|
40
|
+
|
|
41
|
+
## Providers
|
|
42
|
+
| Provider | Free? | Models | Description |
|
|
43
|
+
|----------|-------|--------|-------------|
|
|
44
|
+
| **GitHub Copilot** | Subscription | Claude Opus/Sonnet/Haiku, GPT, Gemini, Grok | Full catalog via Copilot |
|
|
45
|
+
| **Ollama** | ✅ Free | Qwen3, Llama, Mistral, etc. | Local models, private |
|
|
46
|
+
| **NVIDIA NIM** | ✅ Free tier | Llama 3.3 70B, DeepSeek R1, Kimi K2.5 | 1000 free credits |
|
|
47
|
+
| **Google AI Studio** | ✅ Free tier | Gemini 2.5 Pro/Flash | Free key from aistudio.google.com |
|
|
48
|
+
| **OpenAI-Compatible** | Varies | Any compatible model | LM Studio, vLLM, custom endpoints |
|
|
49
|
+
|
|
50
|
+
## MCP Servers Included
|
|
51
|
+
| Server | Category | Free | Description |
|
|
52
|
+
|--------|----------|------|-------------|
|
|
53
|
+
| mem0 | Memory | ✅ | Long-term memory across sessions |
|
|
54
|
+
| contextgraph | Memory | ✅ | Shared memory with provenance + entities |
|
|
55
|
+
| memory | Memory | ✅ | Knowledge graph — entities and relations |
|
|
56
|
+
| context7 | Knowledge | ✅ | Up-to-date library documentation |
|
|
57
|
+
| sequential-thinking | Reasoning | ✅ | Multi-step reasoning with branching |
|
|
58
|
+
| filesystem | Core | ✅ | File operations |
|
|
59
|
+
| fetch | Core | ✅ | HTTP requests |
|
|
60
|
+
| github | Dev | ✅ | PRs, issues, commits |
|
|
61
|
+
| gitnexus | Dev | ✅ | Codebase knowledge graph |
|
|
62
|
+
| postgresql | Dev | ✅ | Database queries |
|
|
63
|
+
| playwright | Testing | ✅ | Browser automation, E2E |
|
|
64
|
+
| mermaid | Docs | ✅ | Diagram rendering |
|
|
65
|
+
| notion | Productivity | ✅ | Notion pages and databases |
|
|
66
|
+
|
|
67
|
+
## What Gets Configured
|
|
68
|
+
### Crush
|
|
69
|
+
- MCP servers with env vars
|
|
70
|
+
- Providers and model mappings (large/small)
|
|
71
|
+
- Permissions (38+ tools auto-approved)
|
|
72
|
+
- LSP servers (pyright, typescript-language-server)
|
|
73
|
+
- Skills paths, orchestrator agent, metrics/notifications off
|
|
74
|
+
|
|
75
|
+
### Kiro
|
|
76
|
+
- MCP servers with autoApprove arrays
|
|
77
|
+
- Env vars per MCP, orchestrator settings
|
|
78
|
+
|
|
79
|
+
## Contributing
|
|
80
|
+
Pull requests are welcome. Please run `npm run build` and `npm test` before submitting.
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function addCommand(mcpId: string): Promise<void>;
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import os from 'os';
|
|
6
|
+
import { execSync } from 'child_process';
|
|
7
|
+
import { log, isVerbose } from '../utils/logger.js';
|
|
8
|
+
import { loadConfig, saveConfig, getToolPaths } from '../utils/config.js';
|
|
9
|
+
const __dirname = path.dirname(new URL(import.meta.url).pathname);
|
|
10
|
+
const registryDir = path.resolve(__dirname, '..', '..', 'registry');
|
|
11
|
+
/**
|
|
12
|
+
* Draw a boxed panel for guided API key setup
|
|
13
|
+
*/
|
|
14
|
+
function drawSetupBox(name, description, steps) {
|
|
15
|
+
const width = 60;
|
|
16
|
+
const topBorder = '╔' + '═'.repeat(width - 2) + '╗';
|
|
17
|
+
const bottomBorder = '╚' + '═'.repeat(width - 2) + '╝';
|
|
18
|
+
const emptyLine = '║' + ' '.repeat(width - 2) + '║';
|
|
19
|
+
const padLine = (text) => {
|
|
20
|
+
const visible = text.replace(/\x1B\[[0-9;]*m/g, '');
|
|
21
|
+
const padding = width - 2 - visible.length;
|
|
22
|
+
return '║ ' + text + ' '.repeat(Math.max(0, padding - 2)) + '║';
|
|
23
|
+
};
|
|
24
|
+
console.log('\n' + chalk.cyan(topBorder));
|
|
25
|
+
console.log(chalk.cyan(padLine(chalk.bold(`📦 ${name}`) + chalk.dim(` — ${description}`))));
|
|
26
|
+
console.log(chalk.cyan(emptyLine));
|
|
27
|
+
steps.forEach((step, i) => {
|
|
28
|
+
const numbered = `${i + 1}. ${step}`;
|
|
29
|
+
console.log(chalk.cyan(padLine(numbered)));
|
|
30
|
+
});
|
|
31
|
+
console.log(chalk.cyan(emptyLine));
|
|
32
|
+
console.log(chalk.cyan(bottomBorder));
|
|
33
|
+
}
|
|
34
|
+
export async function addCommand(mcpId) {
|
|
35
|
+
try {
|
|
36
|
+
await runAdd(mcpId);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
40
|
+
log.error(message);
|
|
41
|
+
if (isVerbose() && err instanceof Error && err.stack) {
|
|
42
|
+
console.error(chalk.dim(err.stack));
|
|
43
|
+
}
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function runAdd(mcpId) {
|
|
48
|
+
// Load existing config
|
|
49
|
+
const config = await loadConfig();
|
|
50
|
+
if (!config) {
|
|
51
|
+
log.error('No existing configuration found. Run `f2g-telco init` first.');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
// Load MCP registry
|
|
55
|
+
const registry = await fs.readJson(path.join(registryDir, 'mcps.json'));
|
|
56
|
+
const mcp = registry.mcps.find((m) => m.id === mcpId);
|
|
57
|
+
if (!mcp) {
|
|
58
|
+
log.error(`MCP "${mcpId}" not found in registry`);
|
|
59
|
+
log.dim(' Available MCPs:');
|
|
60
|
+
for (const m of registry.mcps) {
|
|
61
|
+
log.dim(` ${m.id} — ${m.description}`);
|
|
62
|
+
}
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
// Check if already installed
|
|
66
|
+
if (config.installedMcps.includes(mcpId)) {
|
|
67
|
+
log.warn(`${mcp.name} is already installed`);
|
|
68
|
+
const { reinstall } = await inquirer.prompt([{
|
|
69
|
+
type: 'confirm',
|
|
70
|
+
name: 'reinstall',
|
|
71
|
+
message: 'Reinstall it?',
|
|
72
|
+
default: false,
|
|
73
|
+
}]);
|
|
74
|
+
if (!reinstall)
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Collect API key if needed
|
|
78
|
+
const envVars = {};
|
|
79
|
+
if (mcp.requiresEnv && mcp.requiresEnv.length > 0) {
|
|
80
|
+
for (const envKey of mcp.requiresEnv) {
|
|
81
|
+
if (process.env[envKey]) {
|
|
82
|
+
log.info(`Using ${envKey} from environment`);
|
|
83
|
+
envVars[envKey] = process.env[envKey];
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const steps = mcp.setupSteps || [mcp.envSetup || `Get API key for ${mcp.name}`];
|
|
87
|
+
drawSetupBox(mcp.name, mcp.description, steps);
|
|
88
|
+
const { action } = await inquirer.prompt([{
|
|
89
|
+
type: 'list',
|
|
90
|
+
name: 'action',
|
|
91
|
+
message: 'What would you like to do?',
|
|
92
|
+
choices: [
|
|
93
|
+
{ name: chalk.green('Enter API key'), value: 'enter' },
|
|
94
|
+
{ name: chalk.yellow('Skip — cancel installation'), value: 'skip' },
|
|
95
|
+
],
|
|
96
|
+
}]);
|
|
97
|
+
if (action === 'skip') {
|
|
98
|
+
log.warn('Installation cancelled');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const { value } = await inquirer.prompt([{
|
|
102
|
+
type: 'password',
|
|
103
|
+
name: 'value',
|
|
104
|
+
message: `${envKey}:`,
|
|
105
|
+
mask: '*',
|
|
106
|
+
}]);
|
|
107
|
+
if (!value) {
|
|
108
|
+
log.error(`${envKey} is required for ${mcp.name}`);
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
envVars[envKey] = value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Install the MCP
|
|
115
|
+
log.info(`Installing ${mcp.name}...`);
|
|
116
|
+
const home = os.homedir();
|
|
117
|
+
const userPrefix = path.join(home, '.local');
|
|
118
|
+
try {
|
|
119
|
+
if (mcp.python) {
|
|
120
|
+
execSync(`pip3 install --user ${mcp.install.replace('pip install ', '')}`, { stdio: 'pipe', timeout: 120_000 });
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const packageName = mcp.install.replace('npm install -g ', '');
|
|
124
|
+
execSync(`npm install --prefix "${userPrefix}" ${packageName}`, { stdio: 'pipe', timeout: 120_000 });
|
|
125
|
+
}
|
|
126
|
+
log.success(`${mcp.name} installed`);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
log.warn(`npm install failed, will use npx`);
|
|
130
|
+
}
|
|
131
|
+
// Update tool config
|
|
132
|
+
const paths = getToolPaths(config.tool);
|
|
133
|
+
if (config.tool === 'crush') {
|
|
134
|
+
await updateCrushConfig(mcp, paths.mcpConfig, envVars, home);
|
|
135
|
+
}
|
|
136
|
+
else if (config.tool === 'kiro') {
|
|
137
|
+
await updateKiroConfig(mcp, paths.mcpConfig, envVars, home);
|
|
138
|
+
}
|
|
139
|
+
// Update saved config
|
|
140
|
+
if (!config.installedMcps.includes(mcpId)) {
|
|
141
|
+
config.installedMcps.push(mcpId);
|
|
142
|
+
await saveConfig(config);
|
|
143
|
+
}
|
|
144
|
+
// Update INVENTORY.md
|
|
145
|
+
await updateInventory(config.paths.inventory, mcp, config.installedMcps, registry.mcps, config.tool);
|
|
146
|
+
log.success(`${mcp.name} added successfully!`);
|
|
147
|
+
log.dim(` Restart your ${config.tool} session to load the new MCP.`);
|
|
148
|
+
}
|
|
149
|
+
async function updateCrushConfig(mcp, configPath, envVars, home) {
|
|
150
|
+
let config = {};
|
|
151
|
+
if (await fs.pathExists(configPath)) {
|
|
152
|
+
config = await fs.readJson(configPath);
|
|
153
|
+
}
|
|
154
|
+
const mcpConfig = config.mcp || {};
|
|
155
|
+
const env = { ...(mcp.env || {}) };
|
|
156
|
+
for (const key of mcp.requiresEnv) {
|
|
157
|
+
if (envVars[key])
|
|
158
|
+
env[key] = envVars[key];
|
|
159
|
+
}
|
|
160
|
+
let command;
|
|
161
|
+
if (mcp.npxCommand) {
|
|
162
|
+
command = mcp.npxCommand;
|
|
163
|
+
}
|
|
164
|
+
else if (mcp.bridge && mcp.id === 'contextgraph') {
|
|
165
|
+
command = [`${home}/.local/bin/contextgraph-mcp`];
|
|
166
|
+
}
|
|
167
|
+
else if (mcp.args) {
|
|
168
|
+
command = [mcp.command, ...mcp.args];
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
command = [mcp.command];
|
|
172
|
+
}
|
|
173
|
+
mcpConfig[mcp.id] = {
|
|
174
|
+
type: 'local',
|
|
175
|
+
command,
|
|
176
|
+
enabled: true,
|
|
177
|
+
...(Object.keys(env).length > 0 ? { environment: env } : {}),
|
|
178
|
+
};
|
|
179
|
+
config.mcp = mcpConfig;
|
|
180
|
+
// Update permissions with new autoApprove tools
|
|
181
|
+
const permissions = config.permissions || { allowed_tools: [] };
|
|
182
|
+
const allowedTools = permissions.allowed_tools || [];
|
|
183
|
+
if (mcp.autoApprove) {
|
|
184
|
+
for (const tool of mcp.autoApprove) {
|
|
185
|
+
const fullName = `mcp_${mcp.id}_${tool}`;
|
|
186
|
+
if (!allowedTools.includes(fullName)) {
|
|
187
|
+
allowedTools.push(fullName);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
config.permissions = { allowed_tools: allowedTools };
|
|
192
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
193
|
+
log.success(`Updated ${configPath}`);
|
|
194
|
+
}
|
|
195
|
+
async function updateKiroConfig(mcp, configPath, envVars, home) {
|
|
196
|
+
let config = {};
|
|
197
|
+
if (await fs.pathExists(configPath)) {
|
|
198
|
+
config = await fs.readJson(configPath);
|
|
199
|
+
}
|
|
200
|
+
const mcpServers = config.mcpServers || {};
|
|
201
|
+
const env = { ...(mcp.env || {}) };
|
|
202
|
+
for (const key of mcp.requiresEnv) {
|
|
203
|
+
if (envVars[key])
|
|
204
|
+
env[key] = envVars[key];
|
|
205
|
+
}
|
|
206
|
+
let command;
|
|
207
|
+
let args;
|
|
208
|
+
if (mcp.bridge && mcp.id === 'contextgraph') {
|
|
209
|
+
command = `${home}/.local/bin/contextgraph-mcp`;
|
|
210
|
+
args = [];
|
|
211
|
+
}
|
|
212
|
+
else if (mcp.npxCommand) {
|
|
213
|
+
command = mcp.npxCommand[0];
|
|
214
|
+
args = mcp.npxCommand.slice(1);
|
|
215
|
+
}
|
|
216
|
+
else if (mcp.args) {
|
|
217
|
+
command = mcp.command;
|
|
218
|
+
args = mcp.args;
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
command = mcp.command;
|
|
222
|
+
args = [];
|
|
223
|
+
}
|
|
224
|
+
mcpServers[mcp.id] = {
|
|
225
|
+
command,
|
|
226
|
+
args,
|
|
227
|
+
disabled: false,
|
|
228
|
+
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
229
|
+
...(mcp.autoApprove && mcp.autoApprove.length > 0 ? { autoApprove: mcp.autoApprove } : {}),
|
|
230
|
+
};
|
|
231
|
+
config.mcpServers = mcpServers;
|
|
232
|
+
await fs.writeJson(configPath, config, { spaces: 2 });
|
|
233
|
+
log.success(`Updated ${configPath}`);
|
|
234
|
+
}
|
|
235
|
+
async function updateInventory(inventoryPath, newMcp, installedIds, allMcps, tool) {
|
|
236
|
+
const rows = allMcps
|
|
237
|
+
.filter(m => installedIds.includes(m.id))
|
|
238
|
+
.map(m => `| ${m.name} | ${m.description} |`)
|
|
239
|
+
.join('\n');
|
|
240
|
+
await fs.writeFile(inventoryPath, `# AI Environment Inventory
|
|
241
|
+
> Generated by F2G-Telco v0.1.0. Agents: read this to know what's available.
|
|
242
|
+
|
|
243
|
+
## MCP Servers (active)
|
|
244
|
+
| Server | Purpose |
|
|
245
|
+
|--------|---------|
|
|
246
|
+
${rows}
|
|
247
|
+
|
|
248
|
+
## Skills Discovery
|
|
249
|
+
Skills are in the tool's skills directory. Each has a SKILL.md with a \`description\` field.
|
|
250
|
+
Match task to skill by reading descriptions. Do NOT preload all skills.
|
|
251
|
+
|
|
252
|
+
## Key Rules
|
|
253
|
+
- **gitnexus**: Run \`npx gitnexus analyze\` in a repo before querying
|
|
254
|
+
- **context7**: Use for up-to-date library documentation
|
|
255
|
+
- **sequential-thinking**: Use for complex multi-step reasoning
|
|
256
|
+
- **mem0**: Check for prior context before starting work
|
|
257
|
+
- **contextgraph**: Use for structured recall with entity relationships
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
*Tool: ${tool} | Generated: ${new Date().toISOString().split('T')[0]} | F2G-Telco v0.1.0*
|
|
261
|
+
`);
|
|
262
|
+
log.success(`Updated INVENTORY.md`);
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function doctorCommand(): Promise<void>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { execSync } from 'child_process';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { detectEnvironment } from '../utils/detect.js';
|
|
7
|
+
import { loadConfig, getToolPaths } from '../utils/config.js';
|
|
8
|
+
import { log } from '../utils/logger.js';
|
|
9
|
+
export async function doctorCommand() {
|
|
10
|
+
log.header('F2G-Telco Doctor');
|
|
11
|
+
const config = await loadConfig();
|
|
12
|
+
if (!config) {
|
|
13
|
+
log.error('No F2G-Telco config found. Run: f2g-telco init');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const env = await detectEnvironment();
|
|
17
|
+
let pass = 0;
|
|
18
|
+
let fail = 0;
|
|
19
|
+
const check = (name, ok, detail) => {
|
|
20
|
+
if (ok) {
|
|
21
|
+
console.log(chalk.green(' ✔'), name, detail ? chalk.dim(detail) : '');
|
|
22
|
+
pass++;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
console.log(chalk.red(' ✖'), name, detail ? chalk.dim(detail) : '');
|
|
26
|
+
fail++;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
// Prerequisites
|
|
30
|
+
log.header('Prerequisites');
|
|
31
|
+
check('Node.js', !!env.node, env.node || 'not found');
|
|
32
|
+
check('Git', !!env.git, env.git || 'not found');
|
|
33
|
+
check('Python', !!env.python, env.python || 'optional');
|
|
34
|
+
// Check ~/.local/bin in PATH (required for user-prefix npm installs)
|
|
35
|
+
const home = os.homedir();
|
|
36
|
+
const localBin = path.join(home, '.local', 'bin');
|
|
37
|
+
const pathEnv = process.env.PATH || '';
|
|
38
|
+
const localBinInPath = pathEnv.split(':').some(p => p === localBin || p === `${home}/.local/bin`);
|
|
39
|
+
check('~/.local/bin in PATH', localBinInPath, localBinInPath ? localBin : 'add to PATH for npm --prefix installs');
|
|
40
|
+
// Tool
|
|
41
|
+
log.header(`Tool: ${config.tool}`);
|
|
42
|
+
const toolInstalled = config.tool === 'crush' ? env.tools.crush : env.tools.kiro;
|
|
43
|
+
check(`${config.tool} installed`, toolInstalled);
|
|
44
|
+
const paths = getToolPaths(config.tool);
|
|
45
|
+
check('Config directory exists', await fs.pathExists(paths.config), paths.config);
|
|
46
|
+
check('MCP config exists', await fs.pathExists(paths.mcpConfig), paths.mcpConfig);
|
|
47
|
+
check('Skills directory exists', await fs.pathExists(paths.skills), paths.skills);
|
|
48
|
+
// MCPs — check if npx can find them (more reliable than which)
|
|
49
|
+
log.header('MCP Servers');
|
|
50
|
+
for (const mcpId of config.installedMcps) {
|
|
51
|
+
let found = false;
|
|
52
|
+
// For contextgraph, check the Python bridge
|
|
53
|
+
if (mcpId === 'contextgraph') {
|
|
54
|
+
const bridgePath = path.join(home, '.local', 'bin', 'contextgraph-mcp');
|
|
55
|
+
found = await fs.pathExists(bridgePath);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Check if npx can resolve the package (works even without global install)
|
|
59
|
+
try {
|
|
60
|
+
// Try common binary names
|
|
61
|
+
const binNames = [
|
|
62
|
+
mcpId,
|
|
63
|
+
`mcp-server-${mcpId}`,
|
|
64
|
+
`${mcpId}-mcp`,
|
|
65
|
+
`${mcpId}-mcp-server`,
|
|
66
|
+
];
|
|
67
|
+
for (const bin of binNames) {
|
|
68
|
+
try {
|
|
69
|
+
execSync(`which ${bin} 2>/dev/null`, { encoding: 'utf-8' });
|
|
70
|
+
found = true;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
catch { /* continue */ }
|
|
74
|
+
}
|
|
75
|
+
// If not found via which, npx will still work
|
|
76
|
+
if (!found) {
|
|
77
|
+
// Mark as "found" since npx -y will auto-install
|
|
78
|
+
found = true;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch { /* not found */ }
|
|
82
|
+
}
|
|
83
|
+
check(mcpId, found, found ? '' : '(npx will auto-install)');
|
|
84
|
+
}
|
|
85
|
+
// INVENTORY.md
|
|
86
|
+
log.header('Discovery');
|
|
87
|
+
check('INVENTORY.md exists', await fs.pathExists(config.paths.inventory), config.paths.inventory);
|
|
88
|
+
// Summary
|
|
89
|
+
console.log(`\n${chalk.bold('Summary:')} ${chalk.green(`${pass} passed`)}, ${fail > 0 ? chalk.red(`${fail} failed`) : chalk.green('0 failed')}\n`);
|
|
90
|
+
// Hint if ~/.local/bin not in PATH
|
|
91
|
+
if (!localBinInPath) {
|
|
92
|
+
console.log(chalk.yellow('Tip: Add ~/.local/bin to your PATH:'));
|
|
93
|
+
console.log(chalk.dim(' echo \'export PATH="$HOME/.local/bin:$PATH"\' >> ~/.bashrc && source ~/.bashrc'));
|
|
94
|
+
console.log('');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|