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.
@@ -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,
@@ -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
- // Dashboard command - Real-time monitoring dashboard (temporarily disabled)
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