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.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/dist/commands/add.d.ts +1 -0
  4. package/dist/commands/add.js +264 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/doctor.d.ts +1 -0
  7. package/dist/commands/doctor.js +97 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/init.d.ts +8 -0
  10. package/dist/commands/init.js +460 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/list.d.ts +7 -0
  13. package/dist/commands/list.js +52 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/remove.d.ts +1 -0
  16. package/dist/commands/remove.js +127 -0
  17. package/dist/commands/remove.js.map +1 -0
  18. package/dist/commands/update.d.ts +1 -0
  19. package/dist/commands/update.js +41 -0
  20. package/dist/commands/update.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +70 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/installers/mcps.d.ts +33 -0
  25. package/dist/installers/mcps.js +185 -0
  26. package/dist/installers/mcps.js.map +1 -0
  27. package/dist/installers/skills.d.ts +15 -0
  28. package/dist/installers/skills.js +55 -0
  29. package/dist/installers/skills.js.map +1 -0
  30. package/dist/utils/config.d.ts +22 -0
  31. package/dist/utils/config.js +36 -0
  32. package/dist/utils/config.js.map +1 -0
  33. package/dist/utils/detect.d.ts +18 -0
  34. package/dist/utils/detect.js +42 -0
  35. package/dist/utils/detect.js.map +1 -0
  36. package/dist/utils/logger.d.ts +12 -0
  37. package/dist/utils/logger.js +22 -0
  38. package/dist/utils/logger.js.map +1 -0
  39. package/package.json +64 -0
  40. package/registry/mcps.json +186 -0
  41. package/registry/providers.json +121 -0
  42. package/registry/skills.json +34 -0
  43. package/templates/crush/autonomous.md +38 -0
  44. package/templates/inventory.md +16 -0
  45. 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
+ [![CI](https://github.com/suzannekouemou/f2g-telco/actions/workflows/ci.yml/badge.svg)](https://github.com/suzannekouemou/f2g-telco/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
5
+ [![Node 18+](https://img.shields.io/badge/node-18+-blue.svg)](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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"}
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ provider?: string;
3
+ tool?: string;
4
+ yes?: boolean;
5
+ reconfigure?: boolean;
6
+ }
7
+ export declare function initCommand(options: InitOptions): Promise<void>;
8
+ export {};