strray-ai 1.22.14 → 1.22.15
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/.opencode/strray/features.json +17 -0
- package/.strray/features.json +17 -0
- package/AGENTS.md +44 -1
- package/dist/AGENTS.md +44 -1
- package/dist/CHANGELOG.md +26 -0
- package/dist/cli/commands/mcp-install.d.ts +5 -0
- package/dist/cli/commands/mcp-install.d.ts.map +1 -0
- package/dist/cli/commands/mcp-install.js +253 -0
- package/dist/cli/commands/mcp-install.js.map +1 -0
- package/dist/cli/index.js +35 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/monitoring/nudge-watchdog.d.ts +89 -0
- package/dist/monitoring/nudge-watchdog.d.ts.map +1 -0
- package/dist/monitoring/nudge-watchdog.js +357 -0
- package/dist/monitoring/nudge-watchdog.js.map +1 -0
- package/dist/processors/implementations/nudge-processor.d.ts +23 -0
- package/dist/processors/implementations/nudge-processor.d.ts.map +1 -0
- package/dist/processors/implementations/nudge-processor.js +131 -0
- package/dist/processors/implementations/nudge-processor.js.map +1 -0
- package/package.json +1 -1
- package/scripts/mjs/test-consumer-readiness.mjs +13 -5
- package/scripts/mjs/validate-postinstall-config.mjs +17 -57
- package/scripts/node/auto-reflection-generator.mjs +12 -1
- package/scripts/node/postinstall.cjs +46 -0
|
@@ -157,6 +157,14 @@
|
|
|
157
157
|
"remind_user": true
|
|
158
158
|
}
|
|
159
159
|
},
|
|
160
|
+
"context_window_reflection": {
|
|
161
|
+
"enabled": true,
|
|
162
|
+
"threshold_percent": 95,
|
|
163
|
+
"check_interval_commands": 5,
|
|
164
|
+
"story_type": "reflection",
|
|
165
|
+
"max_reflections_per_session": 3,
|
|
166
|
+
"cooldown_minutes": 10
|
|
167
|
+
},
|
|
160
168
|
"story_types": {
|
|
161
169
|
"reflection": {
|
|
162
170
|
"location": "docs/reflections/",
|
|
@@ -378,6 +386,15 @@
|
|
|
378
386
|
]
|
|
379
387
|
}
|
|
380
388
|
},
|
|
389
|
+
"nudge_watchdog": {
|
|
390
|
+
"description": "Nudge watchdog for detecting and breaking stuck AI patterns",
|
|
391
|
+
"enabled": true,
|
|
392
|
+
"think_loop_threshold": 3,
|
|
393
|
+
"syntax_loop_threshold": 3,
|
|
394
|
+
"tool_loop_threshold": 5,
|
|
395
|
+
"death_spiral_threshold": 3,
|
|
396
|
+
"cooldown_ms": 120000
|
|
397
|
+
},
|
|
381
398
|
"enforcement": {
|
|
382
399
|
"description": "Rule enforcement and validation configuration",
|
|
383
400
|
"enabled": true,
|
package/.strray/features.json
CHANGED
|
@@ -157,6 +157,14 @@
|
|
|
157
157
|
"remind_user": true
|
|
158
158
|
}
|
|
159
159
|
},
|
|
160
|
+
"context_window_reflection": {
|
|
161
|
+
"enabled": true,
|
|
162
|
+
"threshold_percent": 95,
|
|
163
|
+
"check_interval_commands": 5,
|
|
164
|
+
"story_type": "reflection",
|
|
165
|
+
"max_reflections_per_session": 3,
|
|
166
|
+
"cooldown_minutes": 10
|
|
167
|
+
},
|
|
160
168
|
"story_types": {
|
|
161
169
|
"reflection": {
|
|
162
170
|
"location": "docs/reflections/",
|
|
@@ -378,6 +386,15 @@
|
|
|
378
386
|
]
|
|
379
387
|
}
|
|
380
388
|
},
|
|
389
|
+
"nudge_watchdog": {
|
|
390
|
+
"description": "Nudge watchdog for detecting and breaking stuck AI patterns",
|
|
391
|
+
"enabled": true,
|
|
392
|
+
"think_loop_threshold": 3,
|
|
393
|
+
"syntax_loop_threshold": 3,
|
|
394
|
+
"tool_loop_threshold": 5,
|
|
395
|
+
"death_spiral_threshold": 3,
|
|
396
|
+
"cooldown_ms": 120000
|
|
397
|
+
},
|
|
381
398
|
"enforcement": {
|
|
382
399
|
"description": "Rule enforcement and validation configuration",
|
|
383
400
|
"enabled": true,
|
package/AGENTS.md
CHANGED
|
@@ -614,13 +614,56 @@ npx strray-ai status
|
|
|
614
614
|
### Common Issues
|
|
615
615
|
|
|
616
616
|
| Issue | Symptom | Solution |
|
|
617
|
-
|
|
617
|
+
|-------|--------|----------|
|
|
618
618
|
| Agents not spawning | Timeout on @invoke | Run `npx strray-ai health` |
|
|
619
619
|
| Validation failures | Pre-commit blocks | Run `npx strray-ai validate --fix` |
|
|
620
620
|
| Memory issues | Slow performance | `npx strray-ai session clear-cache` |
|
|
621
621
|
| Config not loading | Settings ignored | Check `.opencode/opencode.json` syntax |
|
|
622
622
|
| MCP servers unavailable | Tools missing | `npx strray-ai capabilities --mcp` |
|
|
623
623
|
|
|
624
|
+
### Nudge Watchdog
|
|
625
|
+
|
|
626
|
+
The Nudge Watchdog detects and breaks stuck AI patterns that prevent progress. It monitors agent actions in real-time and injects corrective nudges when patterns are detected.
|
|
627
|
+
|
|
628
|
+
**Stuck Patterns Detected:**
|
|
629
|
+
|
|
630
|
+
| Pattern | Detection | Nudge Action |
|
|
631
|
+
|---------|-----------|-------------|
|
|
632
|
+
| **think-loop** | >3 thinking tags without code changes | "STOP THINKING. Write code now." |
|
|
633
|
+
| **syntax-loop** | >3 fix attempts on same error | "git checkout HEAD -- file && re-apply" |
|
|
634
|
+
| **death-spiral** | >3 explanations without fixes | "Delegate to different agent" |
|
|
635
|
+
| **tool-loop** | >5 same tool calls with similar args | "Try alternative tool" |
|
|
636
|
+
| **repair-failure** | Fix indicated but error persists | "Trigger different processor" |
|
|
637
|
+
|
|
638
|
+
**Configuration (features.json):**
|
|
639
|
+
```json
|
|
640
|
+
{
|
|
641
|
+
"nudge_watchdog": {
|
|
642
|
+
"enabled": true,
|
|
643
|
+
"think_loop_threshold": 3,
|
|
644
|
+
"syntax_loop_threshold": 3,
|
|
645
|
+
"tool_loop_threshold": 5,
|
|
646
|
+
"death_spiral_threshold": 3,
|
|
647
|
+
"cooldown_ms": 120000
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
**Commands:**
|
|
653
|
+
```bash
|
|
654
|
+
# Check nudge stats
|
|
655
|
+
npx strray-ai status | grep nudge
|
|
656
|
+
|
|
657
|
+
# Disable nudge watchdog
|
|
658
|
+
npx strray-ai config set --feature nudge_watchdog.enabled --value false
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
**Integration:**
|
|
662
|
+
- Runs as post-processor via `nudge-processor.ts`
|
|
663
|
+
- Logs to framework logger
|
|
664
|
+
- Non-blocking: only suggests, never forces
|
|
665
|
+
- 2-minute cooldown between nudges
|
|
666
|
+
|
|
624
667
|
### Getting Help
|
|
625
668
|
|
|
626
669
|
```bash
|
package/dist/AGENTS.md
CHANGED
|
@@ -614,13 +614,56 @@ npx strray-ai status
|
|
|
614
614
|
### Common Issues
|
|
615
615
|
|
|
616
616
|
| Issue | Symptom | Solution |
|
|
617
|
-
|
|
617
|
+
|-------|--------|----------|
|
|
618
618
|
| Agents not spawning | Timeout on @invoke | Run `npx strray-ai health` |
|
|
619
619
|
| Validation failures | Pre-commit blocks | Run `npx strray-ai validate --fix` |
|
|
620
620
|
| Memory issues | Slow performance | `npx strray-ai session clear-cache` |
|
|
621
621
|
| Config not loading | Settings ignored | Check `.opencode/opencode.json` syntax |
|
|
622
622
|
| MCP servers unavailable | Tools missing | `npx strray-ai capabilities --mcp` |
|
|
623
623
|
|
|
624
|
+
### Nudge Watchdog
|
|
625
|
+
|
|
626
|
+
The Nudge Watchdog detects and breaks stuck AI patterns that prevent progress. It monitors agent actions in real-time and injects corrective nudges when patterns are detected.
|
|
627
|
+
|
|
628
|
+
**Stuck Patterns Detected:**
|
|
629
|
+
|
|
630
|
+
| Pattern | Detection | Nudge Action |
|
|
631
|
+
|---------|-----------|-------------|
|
|
632
|
+
| **think-loop** | >3 thinking tags without code changes | "STOP THINKING. Write code now." |
|
|
633
|
+
| **syntax-loop** | >3 fix attempts on same error | "git checkout HEAD -- file && re-apply" |
|
|
634
|
+
| **death-spiral** | >3 explanations without fixes | "Delegate to different agent" |
|
|
635
|
+
| **tool-loop** | >5 same tool calls with similar args | "Try alternative tool" |
|
|
636
|
+
| **repair-failure** | Fix indicated but error persists | "Trigger different processor" |
|
|
637
|
+
|
|
638
|
+
**Configuration (features.json):**
|
|
639
|
+
```json
|
|
640
|
+
{
|
|
641
|
+
"nudge_watchdog": {
|
|
642
|
+
"enabled": true,
|
|
643
|
+
"think_loop_threshold": 3,
|
|
644
|
+
"syntax_loop_threshold": 3,
|
|
645
|
+
"tool_loop_threshold": 5,
|
|
646
|
+
"death_spiral_threshold": 3,
|
|
647
|
+
"cooldown_ms": 120000
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
**Commands:**
|
|
653
|
+
```bash
|
|
654
|
+
# Check nudge stats
|
|
655
|
+
npx strray-ai status | grep nudge
|
|
656
|
+
|
|
657
|
+
# Disable nudge watchdog
|
|
658
|
+
npx strray-ai config set --feature nudge_watchdog.enabled --value false
|
|
659
|
+
```
|
|
660
|
+
|
|
661
|
+
**Integration:**
|
|
662
|
+
- Runs as post-processor via `nudge-processor.ts`
|
|
663
|
+
- Logs to framework logger
|
|
664
|
+
- Non-blocking: only suggests, never forces
|
|
665
|
+
- 2-minute cooldown between nudges
|
|
666
|
+
|
|
624
667
|
### Getting Help
|
|
625
668
|
|
|
626
669
|
```bash
|
package/dist/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,32 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Conventional Commits](https://www.conventionalcommits.org/).
|
|
6
6
|
|
|
7
|
+
## [1.22.15] - 2026-04-27
|
|
8
|
+
|
|
9
|
+
### 🔄 Changes
|
|
10
|
+
|
|
11
|
+
### ✨ Features
|
|
12
|
+
- feat: add Nudge Watchdog for stuck AI pattern detection (f923265a1)
|
|
13
|
+
- feat: add community MCP registry and mcp:install command (d0f45a86b)
|
|
14
|
+
- feat: comprehensive validation + context-aware reflection hook (194a0e6e9)
|
|
15
|
+
|
|
16
|
+
### 🐛 Bug Fixes
|
|
17
|
+
- fix: opencode.json now replaces 0xRay agents, keeps other settings (d9a969423)
|
|
18
|
+
- fix: add smart merge for opencode.json on npm install (0f73ead02)
|
|
19
|
+
|
|
20
|
+
### 📚 Documentation
|
|
21
|
+
- docs: update MCP commands with setup instructions (2b362d390)
|
|
22
|
+
- docs: remove duplicate sections from system-design (b548bdf4d)
|
|
23
|
+
- docs: consolidate duplicate 'What is 0xRay' sections (4afb17c32)
|
|
24
|
+
- docs: add honest 'what is 0xRay' assessment (00c1fd4a8)
|
|
25
|
+
- docs: add honest differentiation section to system-design (174afe0b3)
|
|
26
|
+
- docs: update system-design with full diagram v1.22.14 (7ea1d3598)
|
|
27
|
+
|
|
28
|
+
### 🔧 Maintenance
|
|
29
|
+
- chore: add mcp commands to CLI (3db119fbf)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
7
33
|
## [1.22.13] - 2026-04-22
|
|
8
34
|
|
|
9
35
|
### 🔄 Changes
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function listMCPsCommand(): void;
|
|
2
|
+
export declare function showMCPStatusCommand(): void;
|
|
3
|
+
export declare function installMCPCommand(name: string): Promise<void>;
|
|
4
|
+
export declare function removeMCPCommand(name: string): void;
|
|
5
|
+
//# sourceMappingURL=mcp-install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/mcp-install.ts"],"names":[],"mappings":"AAkRA,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMnD"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
import { getConfigDir } from "../../core/config-paths.js";
|
|
5
|
+
function getMCPConfigPath() {
|
|
6
|
+
return join(process.cwd(), ".opencode", "strray", "mcp-registry.json");
|
|
7
|
+
}
|
|
8
|
+
function getBundledMCPRegistry() {
|
|
9
|
+
const paths = [
|
|
10
|
+
join(process.cwd(), "src", "mcps", "registry.json"),
|
|
11
|
+
join(process.cwd(), "node_modules", "strray-ai", "dist", "mcps", "registry.json"),
|
|
12
|
+
];
|
|
13
|
+
for (const p of paths) {
|
|
14
|
+
if (existsSync(p)) {
|
|
15
|
+
return JSON.parse(readFileSync(p, "utf-8"));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
function getMCPRegistry() {
|
|
21
|
+
const bundled = getBundledMCPRegistry();
|
|
22
|
+
const localPath = getMCPConfigPath();
|
|
23
|
+
if (existsSync(localPath)) {
|
|
24
|
+
const local = JSON.parse(readFileSync(localPath, "utf-8"));
|
|
25
|
+
if (bundled) {
|
|
26
|
+
const names = new Set(bundled.sources.map((s) => s.name));
|
|
27
|
+
for (const s of local.sources) {
|
|
28
|
+
if (!names.has(s.name))
|
|
29
|
+
bundled.sources.push(s);
|
|
30
|
+
}
|
|
31
|
+
return bundled;
|
|
32
|
+
}
|
|
33
|
+
return local;
|
|
34
|
+
}
|
|
35
|
+
return bundled ?? { sources: [] };
|
|
36
|
+
}
|
|
37
|
+
function findMCPSource(name) {
|
|
38
|
+
return getMCPRegistry().sources.find((s) => s.name === name || s.url.includes(name));
|
|
39
|
+
}
|
|
40
|
+
function getInstalledMCPsPath() {
|
|
41
|
+
const configDir = getConfigDir();
|
|
42
|
+
return join(configDir, "installed-mcps.json");
|
|
43
|
+
}
|
|
44
|
+
function getInstalledMCPs() {
|
|
45
|
+
const path = getInstalledMCPsPath();
|
|
46
|
+
if (!existsSync(path))
|
|
47
|
+
return {};
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function saveInstalledMCPs(mcps) {
|
|
56
|
+
const path = getInstalledMCPsPath();
|
|
57
|
+
const configDir = dirname(path);
|
|
58
|
+
if (!existsSync(configDir)) {
|
|
59
|
+
mkdirSync(configDir, { recursive: true });
|
|
60
|
+
}
|
|
61
|
+
writeFileSync(path, JSON.stringify(mcps, null, 2), "utf-8");
|
|
62
|
+
}
|
|
63
|
+
function showHelp() {
|
|
64
|
+
console.log(`
|
|
65
|
+
0xRay MCP Installer
|
|
66
|
+
|
|
67
|
+
Usage:
|
|
68
|
+
npx strray-ai mcp:install <name> Install an MCP server from registry
|
|
69
|
+
npx strray-ai mcp:list List available MCP servers
|
|
70
|
+
npx strray-ai mcp:status Show installed MCPs
|
|
71
|
+
npx strray-ai mcp:remove <name> Remove an installed MCP
|
|
72
|
+
|
|
73
|
+
Examples:
|
|
74
|
+
npx strray-ai mcp:install xmcp # Install X (Twitter) MCP
|
|
75
|
+
npx strray-ai mcp:install github-mcp # Install GitHub MCP
|
|
76
|
+
npx strray-ai mcp:list # See all available
|
|
77
|
+
npx strray-ai mcp:remove xmcp # Remove X MCP
|
|
78
|
+
|
|
79
|
+
Environment Variables:
|
|
80
|
+
Each MCP requires specific env vars. Check documentation at:
|
|
81
|
+
https://github.com/0xRay-community/<name>
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
84
|
+
function listMCPs() {
|
|
85
|
+
const registry = getMCPRegistry();
|
|
86
|
+
console.log("\n📦 Available Community MCPs:\n");
|
|
87
|
+
console.log("| Name | Category | Description |");
|
|
88
|
+
console.log("|----------------|-------------------|-------------|");
|
|
89
|
+
for (const mcp of registry.sources) {
|
|
90
|
+
const cat = mcp.category || "other";
|
|
91
|
+
const desc = mcp.description?.slice(0, 30) || "-";
|
|
92
|
+
console.log(`| ${mcp.name.padEnd(15)} | ${cat.padEnd(16)} | ${desc} |`);
|
|
93
|
+
}
|
|
94
|
+
console.log(`\nTotal: ${registry.sources.length} MCPs`);
|
|
95
|
+
console.log("\nInstall: npx strray-ai mcp:install <name>");
|
|
96
|
+
}
|
|
97
|
+
function showStatus() {
|
|
98
|
+
const installed = getInstalledMCPs();
|
|
99
|
+
const keys = Object.keys(installed);
|
|
100
|
+
if (keys.length === 0) {
|
|
101
|
+
console.log("\n❌ No MCPs installed.\n");
|
|
102
|
+
console.log("Run: npx strray-ai mcp:list to see available MCPs\n");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
console.log("\n✅ Installed MCPs:\n");
|
|
106
|
+
for (const [name, mcp] of Object.entries(installed)) {
|
|
107
|
+
console.log(` - ${name}: ${mcp.description || mcp.url}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function installMCP(name) {
|
|
111
|
+
const source = findMCPSource(name);
|
|
112
|
+
if (!source) {
|
|
113
|
+
console.error(`\n❌ MCP "${name}" not found in registry.`);
|
|
114
|
+
console.log("\nRun: npx strray-ai mcp:list to see available MCPs");
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
const installed = getInstalledMCPs();
|
|
118
|
+
if (installed[source.name]) {
|
|
119
|
+
console.log(`\n⚠️ ${source.name} is already installed.`);
|
|
120
|
+
console.log(`Run: npx strray-ai mcp:remove ${source.name} first`);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
console.log(`\n📦 Installing ${source.name}...`);
|
|
124
|
+
console.log(` Source: ${source.url}`);
|
|
125
|
+
try {
|
|
126
|
+
const installDir = join(process.cwd(), ".opencode", "mcps", source.name);
|
|
127
|
+
if (!existsSync(dirname(installDir))) {
|
|
128
|
+
mkdirSync(dirname(installDir), { recursive: true });
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(installDir)) {
|
|
131
|
+
mkdirSync(installDir, { recursive: true });
|
|
132
|
+
}
|
|
133
|
+
execSync(`git clone ${source.url} "${installDir}"`, {
|
|
134
|
+
stdio: "inherit",
|
|
135
|
+
});
|
|
136
|
+
installed[source.name] = source;
|
|
137
|
+
saveInstalledMCPs(installed);
|
|
138
|
+
console.log(`\n✅ ${source.name} installed successfully!`);
|
|
139
|
+
console.log(`\n📝 Environment variables needed:`);
|
|
140
|
+
if (source.env) {
|
|
141
|
+
for (const env of source.env) {
|
|
142
|
+
console.log(` - ${env}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
console.log(`\n📁 Location: ${installDir}`);
|
|
146
|
+
console.log(`\n─── SETUP INSTRUCTIONS ───`);
|
|
147
|
+
console.log(`\n1. Configure environment variables:`);
|
|
148
|
+
console.log(` export ${source.env?.[0] || 'API_KEY'}=your_key_here`);
|
|
149
|
+
console.log(`\n2. Add to your MCP client:\n`);
|
|
150
|
+
if (source.name === 'xmcp') {
|
|
151
|
+
console.log(` Claude Desktop: Add to claude_desktop_config.json`);
|
|
152
|
+
console.log(` {"mcpServers":{"xmcp":{"command":"node","args":["${installDir}/dist/index.js"],"env":{"X_BEARER_TOKEN":"your_token"}}}`);
|
|
153
|
+
}
|
|
154
|
+
else if (source.name === 'github-mcp') {
|
|
155
|
+
console.log(` Add: {"mcpServers":{"github-mcp":{"command":"npx","args":["-y","@divyanshvn/github-mcp-server"],"env":{"GITHUB_TOKEN":"ghp_..."}}}`);
|
|
156
|
+
}
|
|
157
|
+
else if (source.name === 'discord-mcp') {
|
|
158
|
+
console.log(` Add: {"mcpServers":{"discord-mcp":{"command":"docker","args":["run","--rm","-i","-e","DISCORD_TOKEN=your_token","pasympa/discord-mcp"]}}`);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
console.log(` Claude Desktop: Edit ~/Library/Application\\ Support/Claude/claude_desktop_config.json`);
|
|
162
|
+
console.log(` Cursor: Edit ~/.cursor/mcp.json`);
|
|
163
|
+
}
|
|
164
|
+
console.log(`\n3. Start the MCP server:`);
|
|
165
|
+
console.log(` cd ${installDir} && npm install && npm start`);
|
|
166
|
+
console.log(`\n4. Restart your MCP client to load the new server.`);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error(`\n❌ Failed to install ${source.name}:`, error);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function removeMCP(name) {
|
|
174
|
+
const installed = getInstalledMCPs();
|
|
175
|
+
if (!installed[name]) {
|
|
176
|
+
console.error(`\n❌ ${name} is not installed.`);
|
|
177
|
+
process.exit(1);
|
|
178
|
+
}
|
|
179
|
+
const installDir = join(process.cwd(), ".opencode", "mcps", name);
|
|
180
|
+
if (existsSync(installDir)) {
|
|
181
|
+
rmSync(installDir, { recursive: true, force: true });
|
|
182
|
+
}
|
|
183
|
+
delete installed[name];
|
|
184
|
+
saveInstalledMCPs(installed);
|
|
185
|
+
console.log(`\n✅ Removed ${name}`);
|
|
186
|
+
}
|
|
187
|
+
async function main() {
|
|
188
|
+
const args = process.argv.slice(2);
|
|
189
|
+
const command = args[0];
|
|
190
|
+
switch (command) {
|
|
191
|
+
case "list":
|
|
192
|
+
listMCPs();
|
|
193
|
+
break;
|
|
194
|
+
case "status":
|
|
195
|
+
case undefined:
|
|
196
|
+
showStatus();
|
|
197
|
+
break;
|
|
198
|
+
case "install":
|
|
199
|
+
case undefined:
|
|
200
|
+
const name = args[1];
|
|
201
|
+
if (!name) {
|
|
202
|
+
console.error("\nUsage: npx strray-ai mcp:install <name>");
|
|
203
|
+
console.log("Run: npx strray-ai mcp:list to see available MCPs");
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
await installMCP(name);
|
|
207
|
+
break;
|
|
208
|
+
case "remove":
|
|
209
|
+
const removeName = args[1];
|
|
210
|
+
if (!removeName) {
|
|
211
|
+
console.error("\nUsage: npx strray-ai mcp:remove <name>");
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
removeMCP(removeName);
|
|
215
|
+
break;
|
|
216
|
+
case "help":
|
|
217
|
+
case "--help":
|
|
218
|
+
case "-h":
|
|
219
|
+
showHelp();
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
console.error(`\nUnknown command: ${command}`);
|
|
223
|
+
showHelp();
|
|
224
|
+
process.exit(1);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
main().catch((error) => {
|
|
228
|
+
console.error("Error:", error);
|
|
229
|
+
process.exit(1);
|
|
230
|
+
});
|
|
231
|
+
// Export CLI entry points
|
|
232
|
+
export function listMCPsCommand() {
|
|
233
|
+
listMCPs();
|
|
234
|
+
}
|
|
235
|
+
export function showMCPStatusCommand() {
|
|
236
|
+
showStatus();
|
|
237
|
+
}
|
|
238
|
+
export async function installMCPCommand(name) {
|
|
239
|
+
if (!name) {
|
|
240
|
+
console.error("\nUsage: npx strray-ai mcp:install <name>");
|
|
241
|
+
console.log("Run: npx strray-ai mcp:list to see available MCPs");
|
|
242
|
+
process.exit(1);
|
|
243
|
+
}
|
|
244
|
+
await installMCP(name);
|
|
245
|
+
}
|
|
246
|
+
export function removeMCPCommand(name) {
|
|
247
|
+
if (!name) {
|
|
248
|
+
console.error("\nUsage: npx strray-ai mcp:remove <name>");
|
|
249
|
+
process.exit(1);
|
|
250
|
+
}
|
|
251
|
+
removeMCP(name);
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=mcp-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-install.js","sourceRoot":"","sources":["../../../src/cli/commands/mcp-install.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -741,7 +741,40 @@ program
|
|
|
741
741
|
const { storytellerCommand } = await import('./commands/storyteller.js');
|
|
742
742
|
await storytellerCommand(type, options);
|
|
743
743
|
});
|
|
744
|
-
//
|
|
744
|
+
// MCP install commands - support both hyphen and colon formats
|
|
745
|
+
program
|
|
746
|
+
.command('mcp-list')
|
|
747
|
+
.alias('mcp:list')
|
|
748
|
+
.description('List available community MCP servers')
|
|
749
|
+
.action(async () => {
|
|
750
|
+
const { listMCPsCommand } = await import('./commands/mcp-install.js');
|
|
751
|
+
listMCPsCommand();
|
|
752
|
+
});
|
|
753
|
+
program
|
|
754
|
+
.command('mcp-status')
|
|
755
|
+
.alias('mcp:status')
|
|
756
|
+
.description('Show installed MCP servers')
|
|
757
|
+
.action(async () => {
|
|
758
|
+
const { showMCPStatusCommand } = await import('./commands/mcp-install.js');
|
|
759
|
+
showMCPStatusCommand();
|
|
760
|
+
});
|
|
761
|
+
program
|
|
762
|
+
.command('mcp-install <name>')
|
|
763
|
+
.alias('mcp:install')
|
|
764
|
+
.description('Install an MCP server from the registry')
|
|
765
|
+
.action(async (name) => {
|
|
766
|
+
const { installMCPCommand } = await import('./commands/mcp-install.js');
|
|
767
|
+
await installMCPCommand(name);
|
|
768
|
+
});
|
|
769
|
+
program
|
|
770
|
+
.command('mcp-remove <name>')
|
|
771
|
+
.alias('mcp:remove')
|
|
772
|
+
.description('Remove an installed MCP server')
|
|
773
|
+
.action(async (name) => {
|
|
774
|
+
const { removeMCPCommand } = await import('./commands/mcp-install.js');
|
|
775
|
+
removeMCPCommand(name);
|
|
776
|
+
});
|
|
777
|
+
// Analytics enable command
|
|
745
778
|
// TODO: Re-enable after fixing dashboard module
|
|
746
779
|
// program
|
|
747
780
|
// .command('dashboard')
|
|
@@ -867,5 +900,6 @@ Quick Start:
|
|
|
867
900
|
For more information, visit: https://github.com/htafolla/stringray
|
|
868
901
|
`);
|
|
869
902
|
// Parse command line arguments
|
|
903
|
+
program.exitOverride();
|
|
870
904
|
program.parse();
|
|
871
905
|
//# sourceMappingURL=index.js.map
|