0xray 3.5.5 → 4.0.1

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 (233) hide show
  1. package/.mcp.json +18 -14
  2. package/.opencode/skills/api-design/SKILL.md +1 -1
  3. package/.opencode/skills/architect-tools/SKILL.md +1 -1
  4. package/.opencode/skills/architecture-patterns/SKILL.md +1 -1
  5. package/.opencode/skills/auto-format/SKILL.md +1 -1
  6. package/.opencode/skills/boot-orchestrator/SKILL.md +2 -6
  7. package/.opencode/skills/bug-triage/SKILL.md +1 -1
  8. package/.opencode/skills/code-analyzer/SKILL.md +1 -1
  9. package/.opencode/skills/code-review/SKILL.md +1 -1
  10. package/.opencode/skills/enforcer/SKILL.md +1 -1
  11. package/.opencode/skills/framework-compliance-audit/SKILL.md +1 -1
  12. package/.opencode/skills/git-workflow/SKILL.md +1 -1
  13. package/.opencode/skills/hermes-agent/SKILL.md +36 -36
  14. package/.opencode/skills/inference-improve/SKILL.md +1 -1
  15. package/.opencode/skills/lint/SKILL.md +1 -1
  16. package/.opencode/skills/log-monitor/SKILL.md +1 -1
  17. package/.opencode/skills/model-health-check/SKILL.md +1 -1
  18. package/.opencode/skills/multimodal-looker/SKILL.md +1 -1
  19. package/.opencode/skills/orchestrator/SKILL.md +38 -14
  20. package/.opencode/skills/performance-analysis/SKILL.md +1 -1
  21. package/.opencode/skills/performance-optimization/SKILL.md +1 -1
  22. package/.opencode/skills/processor-pipeline/SKILL.md +1 -1
  23. package/.opencode/skills/project-analysis/SKILL.md +1 -1
  24. package/.opencode/skills/refactoring-strategies/SKILL.md +1 -1
  25. package/.opencode/skills/registry.json +65 -0
  26. package/.opencode/skills/researcher/SKILL.md +18 -5
  27. package/.opencode/skills/security-audit/SKILL.md +1 -1
  28. package/.opencode/skills/security-scan/SKILL.md +1 -1
  29. package/.opencode/skills/session-management/SKILL.md +1 -1
  30. package/.opencode/skills/state-manager/SKILL.md +1 -1
  31. package/.opencode/skills/storyteller/SKILL.md +1 -1
  32. package/.opencode/skills/strategist/SKILL.md +12 -0
  33. package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
  34. package/.opencode/skills/testing-strategy/SKILL.md +14 -3
  35. package/.opencode/skills/ui-ux-design/SKILL.md +1 -1
  36. package/.opencode/skills/xray-orchestrator/index.ts +267 -0
  37. package/.xray/codex.json +12 -3
  38. package/.xray/features.json +28 -6
  39. package/.xray/features.schema.json +31 -0
  40. package/AGENTS-consumer.md +17 -7
  41. package/AGENTS.md +18 -10
  42. package/README.md +30 -27
  43. package/SKILLS.md +2 -2
  44. package/dist/AGENTS.md +18 -10
  45. package/dist/CHANGELOG.md +81 -11
  46. package/dist/README.md +30 -27
  47. package/dist/SKILLS.md +2 -2
  48. package/dist/cli/commands/hermes-install.js +3 -0
  49. package/dist/cli/commands/openclaw-install.js +14 -0
  50. package/dist/cli/index.js +10 -1
  51. package/dist/core/features-config.d.ts +15 -2
  52. package/dist/infrastructure/schemas/cloud-schemas.d.ts +1 -1
  53. package/dist/integrations/grok/grok-cli.d.ts +3 -0
  54. package/dist/integrations/grok/grok-cli.js +92 -4
  55. package/dist/integrations/grok/hooks/grok-hook-utils.js +53 -7
  56. package/dist/integrations/grok/hooks/post-tool-use.js +68 -46
  57. package/dist/integrations/grok/hooks/pre-tool-use.js +14 -31
  58. package/dist/integrations/grok/hooks/session-start.js +86 -4
  59. package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
  60. package/dist/integrations/hermes-agent/bridge.mjs +26 -1
  61. package/dist/integrations/hooks/delegation-gate-runtime.mjs +32 -3
  62. package/dist/integrations/hooks/pipeline-hook-runtime.mjs +1 -1
  63. package/dist/integrations/hooks/station-hook-runtime.cjs +421 -0
  64. package/dist/integrations/hooks/station-hook-runtime.mjs +24 -0
  65. package/dist/integrations/hooks/station-memory-ingest.mjs +45 -0
  66. package/dist/integrations/hooks/station-memory-match.mjs +47 -0
  67. package/dist/integrations/openclaw/client.d.ts +5 -1
  68. package/dist/integrations/openclaw/client.js +17 -9
  69. package/dist/integrations/openclaw/config.js +0 -1
  70. package/dist/integrations/openclaw/hooks/pre-tool-gate-runtime.mjs +102 -0
  71. package/dist/integrations/openclaw/index.js +17 -0
  72. package/dist/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
  73. package/dist/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
  74. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
  75. package/dist/integrations/openclaw/pre-tool-gate.d.ts +19 -0
  76. package/dist/integrations/openclaw/pre-tool-gate.js +39 -0
  77. package/dist/mcps/orchestrator/handlers/complexity-handler.js +2 -2
  78. package/dist/memory-routing/index.d.ts +1 -1
  79. package/dist/memory-routing/index.js +1 -1
  80. package/dist/memory-routing/provider-loader.d.ts +4 -0
  81. package/dist/memory-routing/provider-loader.js +44 -2
  82. package/dist/memory-routing/provider-registry.js +3 -2
  83. package/dist/nucleus/autonomy-kernel.d.ts +2 -2
  84. package/dist/nucleus/autonomy-kernel.js +17 -6
  85. package/dist/nucleus/confer.js +17 -3
  86. package/dist/nucleus/delegation-gate.d.ts +14 -8
  87. package/dist/nucleus/delegation-gate.js +151 -16
  88. package/dist/nucleus/suit-temperament.d.ts +40 -0
  89. package/dist/nucleus/suit-temperament.js +157 -0
  90. package/dist/nucleus/user-aside.js +1 -1
  91. package/dist/plugin/xray-codex-injection.js +14 -3
  92. package/dist/postprocessor/triggers/GitHookTrigger.js +11 -5
  93. package/opencode.json +80 -0
  94. package/package.json +15 -5
  95. package/scripts/hooks/install-hooks.cjs +18 -3
  96. package/scripts/hooks/run-hook.js +67 -3
  97. package/scripts/mjs/run-repertoire-mcp.mjs +39 -0
  98. package/scripts/mjs/verify-confer-core.mjs +1 -1
  99. package/scripts/mjs/verify-delegation-gate-core.mjs +29 -2
  100. package/scripts/mjs/verify-four-floor-compact.mjs +524 -0
  101. package/scripts/mjs/verify-pipeline-facets.mjs +215 -0
  102. package/scripts/mjs/verify-temperament-live.mjs +261 -0
  103. package/scripts/node/bridge-mcp-wiring.cjs +277 -29
  104. package/scripts/node/consumer-install-smoke.mjs +55 -2
  105. package/scripts/node/install-bridges.cjs +195 -33
  106. package/scripts/node/postinstall.cjs +50 -27
  107. package/scripts/node/reconcile-version.mjs +0 -4
  108. package/scripts/node/release-gate.mjs +1 -1
  109. package/scripts/node/release.mjs +2 -2
  110. package/scripts/node/universal-version-manager.js +1 -1
  111. package/scripts/node/validate-release-docs.mjs +20 -33
  112. package/scripts/node/version-manager.mjs +63 -18
  113. package/src/integrations/grok/plugin/0xray/hooks/hooks.json +31 -24
  114. package/src/integrations/openclaw/README.md +134 -0
  115. package/src/integrations/openclaw/plugin/xray-pre-tool/index.js +75 -0
  116. package/src/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +10 -0
  117. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +12 -0
  118. package/src/mcps/orchestrator/handlers/complexity-handler.ts +2 -1
  119. package/vendor/@0xray/repertoire/AGENTS.md +163 -0
  120. package/vendor/@0xray/repertoire/LICENSE +21 -0
  121. package/vendor/@0xray/repertoire/README.md +120 -0
  122. package/vendor/@0xray/repertoire/data/curated_signals.json +208 -0
  123. package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts +78 -0
  124. package/vendor/@0xray/repertoire/dist/RepertoireService.d.ts.map +1 -0
  125. package/vendor/@0xray/repertoire/dist/RepertoireService.js +153 -0
  126. package/vendor/@0xray/repertoire/dist/RepertoireService.js.map +1 -0
  127. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts +39 -0
  128. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.d.ts.map +1 -0
  129. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js +60 -0
  130. package/vendor/@0xray/repertoire/dist/governance/ontological-trap-enforcer.js.map +1 -0
  131. package/vendor/@0xray/repertoire/dist/index.d.ts +14 -0
  132. package/vendor/@0xray/repertoire/dist/index.d.ts.map +1 -0
  133. package/vendor/@0xray/repertoire/dist/index.js +14 -0
  134. package/vendor/@0xray/repertoire/dist/index.js.map +1 -0
  135. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts +26 -0
  136. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.d.ts.map +1 -0
  137. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js +109 -0
  138. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-ingester.js.map +1 -0
  139. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts +18 -0
  140. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.d.ts.map +1 -0
  141. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js +94 -0
  142. package/vendor/@0xray/repertoire/dist/ingestion/groover-log-parser.js.map +1 -0
  143. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts +7 -0
  144. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.d.ts.map +1 -0
  145. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js +18 -0
  146. package/vendor/@0xray/repertoire/dist/ingestion/orchestrator-feedback-ingester.js.map +1 -0
  147. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts +31 -0
  148. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.d.ts.map +1 -0
  149. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js +83 -0
  150. package/vendor/@0xray/repertoire/dist/ingestion/xray-session-ingester.js.map +1 -0
  151. package/vendor/@0xray/repertoire/dist/mcp/server.d.ts +6 -0
  152. package/vendor/@0xray/repertoire/dist/mcp/server.d.ts.map +1 -0
  153. package/vendor/@0xray/repertoire/dist/mcp/server.js +173 -0
  154. package/vendor/@0xray/repertoire/dist/mcp/server.js.map +1 -0
  155. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts +27 -0
  156. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.d.ts.map +1 -0
  157. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js +107 -0
  158. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/RepertoireOrchestratorBridge.js.map +1 -0
  159. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts +11 -0
  160. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.d.ts.map +1 -0
  161. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js +32 -0
  162. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/capability-enhancer.js.map +1 -0
  163. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts +9 -0
  164. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.d.ts.map +1 -0
  165. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js +72 -0
  166. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/confidence-gate.js.map +1 -0
  167. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts +5 -0
  168. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.d.ts.map +1 -0
  169. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js +18 -0
  170. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-agent-affinity.js.map +1 -0
  171. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts +31 -0
  172. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.d.ts.map +1 -0
  173. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js +218 -0
  174. package/vendor/@0xray/repertoire/dist/orchestrator-bridge/signal-injector.js.map +1 -0
  175. package/vendor/@0xray/repertoire/dist/paths.d.ts +24 -0
  176. package/vendor/@0xray/repertoire/dist/paths.d.ts.map +1 -0
  177. package/vendor/@0xray/repertoire/dist/paths.js +74 -0
  178. package/vendor/@0xray/repertoire/dist/paths.js.map +1 -0
  179. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts +141 -0
  180. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.d.ts.map +1 -0
  181. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js +210 -0
  182. package/vendor/@0xray/repertoire/dist/provider/memory-routing-provider.js.map +1 -0
  183. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts +48 -0
  184. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.d.ts.map +1 -0
  185. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js +221 -0
  186. package/vendor/@0xray/repertoire/dist/registry/CuratedSignalsManager.js.map +1 -0
  187. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts +11 -0
  188. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.d.ts.map +1 -0
  189. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js +43 -0
  190. package/vendor/@0xray/repertoire/dist/registry/InferenceStateManager.js.map +1 -0
  191. package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts +15 -0
  192. package/vendor/@0xray/repertoire/dist/registry/signal-prune.d.ts.map +1 -0
  193. package/vendor/@0xray/repertoire/dist/registry/signal-prune.js +35 -0
  194. package/vendor/@0xray/repertoire/dist/registry/signal-prune.js.map +1 -0
  195. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts +3 -0
  196. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.d.ts.map +1 -0
  197. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js +24 -0
  198. package/vendor/@0xray/repertoire/dist/synthesis/concrete-sections.js.map +1 -0
  199. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts +24 -0
  200. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.d.ts.map +1 -0
  201. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js +148 -0
  202. package/vendor/@0xray/repertoire/dist/synthesis/meta-inference-engine.js.map +1 -0
  203. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts +4 -0
  204. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.d.ts.map +1 -0
  205. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js +44 -0
  206. package/vendor/@0xray/repertoire/dist/synthesis/primitive-confidence-aggregator.js.map +1 -0
  207. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts +22 -0
  208. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.d.ts.map +1 -0
  209. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js +66 -0
  210. package/vendor/@0xray/repertoire/dist/synthesis/synthesis-prompt-builder.js.map +1 -0
  211. package/vendor/@0xray/repertoire/dist/types.d.ts +210 -0
  212. package/vendor/@0xray/repertoire/dist/types.d.ts.map +1 -0
  213. package/vendor/@0xray/repertoire/dist/types.js +2 -0
  214. package/vendor/@0xray/repertoire/dist/types.js.map +1 -0
  215. package/vendor/@0xray/repertoire/docs/MEMORY-ROUTING-PROVIDER.md +54 -0
  216. package/vendor/@0xray/repertoire/hermes-mcp.example.json +20 -0
  217. package/vendor/@0xray/repertoire/mcp-config.example.json +11 -0
  218. package/vendor/@0xray/repertoire/package.json +124 -0
  219. package/vendor/@0xray/repertoire/schemas/curated-signal.schema.json +68 -0
  220. package/vendor/@0xray/repertoire/schemas/inference-log.schema.json +82 -0
  221. package/vendor/@0xray/repertoire/scripts/confirm-suit-all.mjs +253 -0
  222. package/vendor/@0xray/repertoire/scripts/confirm-suit-harness.mjs +220 -0
  223. package/vendor/@0xray/repertoire/scripts/run-live-synthesis-checkpoint.mjs +215 -0
  224. package/vendor/@0xray/repertoire/scripts/suit-bridge-shared.mjs +139 -0
  225. package/vendor/@0xray/repertoire/scripts/verify-grok-suit.mjs +304 -0
  226. package/vendor/@0xray/repertoire/scripts/verify-hermes-suit.mjs +163 -0
  227. package/vendor/@0xray/repertoire/scripts/verify-openclaw-suit.mjs +125 -0
  228. package/vendor/@0xray/repertoire/scripts/verify-opencode-suit.mjs +127 -0
  229. package/vendor/@0xray/repertoire/scripts/verify-synthesis-dogfood.mjs +207 -0
  230. package/vendor/@0xray/repertoire/skills/repertoire-trap-handling/SKILL.md +206 -0
  231. package/xray/codex.json +12 -3
  232. package/xray/features.json +28 -6
  233. package/xray/features.schema.json +31 -0
@@ -166,7 +166,8 @@ export function getFrameworkCounts(baseDir = rootDir) {
166
166
  const counts = {
167
167
  agents: 0,
168
168
  mcps: 0,
169
- skills: 0
169
+ skills: 0,
170
+ codexTerms: 68,
170
171
  };
171
172
 
172
173
  // Count agents (.yml files in src/opencode/agents/ — source of truth)
@@ -183,7 +184,8 @@ export function getFrameworkCounts(baseDir = rootDir) {
183
184
  try {
184
185
  const mcpJson = JSON.parse(fs.readFileSync(mcpJsonPath, 'utf-8'));
185
186
  const servers = mcpJson.mcpServers || mcpJson.servers || {};
186
- counts.mcps = Object.keys(servers).length;
187
+ const xrayServers = Object.keys(servers).filter((name) => name.startsWith('xray-'));
188
+ counts.mcps = xrayServers.length || 7;
187
189
  } catch {
188
190
  counts.mcps = 7;
189
191
  }
@@ -199,6 +201,17 @@ export function getFrameworkCounts(baseDir = rootDir) {
199
201
  .filter(f => fs.existsSync(path.join(skillsDir, f, 'SKILL.md')))
200
202
  .length;
201
203
  }
204
+
205
+ const codexPath = path.join(baseDir, 'xray/codex.json');
206
+ if (fs.existsSync(codexPath)) {
207
+ try {
208
+ const codex = JSON.parse(fs.readFileSync(codexPath, 'utf-8'));
209
+ const terms = codex.terms && typeof codex.terms === 'object' ? Object.keys(codex.terms) : [];
210
+ if (terms.length > 0) counts.codexTerms = terms.length;
211
+ } catch {
212
+ /* keep default */
213
+ }
214
+ }
202
215
 
203
216
  return counts;
204
217
  }
@@ -271,10 +284,11 @@ function updateReadme(counts, newVersion) {
271
284
 
272
285
  let readme = fs.readFileSync(readmePath, 'utf-8');
273
286
 
274
- // Update header line: **v3.4.1** — 42 agents · 45 skills · 7 MCP servers · ...
287
+ // Kernel header (4.0): exo, not catalog counts
288
+ const kernel = buildDocsHeader(counts, newVersion);
275
289
  readme = readme.replace(
276
- /^\*\*v[\d.]+\*\* — \d+ agents · \d+ skills · \d+ MCP servers? · \d+ codex terms(?: · [\d,]+ tests)?/m,
277
- `**v${newVersion}** — ${counts.agents} agents · ${counts.skills} skills · ${counts.mcps} MCP servers · 68 codex terms · 3,226 tests`
290
+ /^\*\*v[\d.]+\*\* — (?:\d+ agents · \d+ skills · \d+ MCP servers? · \d+ codex terms(?: · [\d,]+ tests)?|a suit that survives the context window.*)$/m,
291
+ kernel,
278
292
  );
279
293
 
280
294
  // Update version badge: [![Version](https://img.shields.io/badge/version-1.6.x-blue...)]
@@ -306,20 +320,23 @@ function updateReadme(counts, newVersion) {
306
320
  }
307
321
 
308
322
  export const DOCS_SITE_HEADER_FILES = [
309
- 'docs-site/docs/README.md',
310
323
  'docs-site/docs/index.md',
311
324
  'docs-site/docs/introduction.md',
312
325
  'docs-site/docs/guides/getting-started.md',
313
326
  'docs-site/docs/full-reference.md',
327
+ 'docs-site/docs/architecture/GROK_GUIDE.md',
328
+ 'docs-site/docs/mcp/README.md',
329
+ 'docs-site/docs/agents/README.md',
314
330
  ];
315
331
 
316
- export function buildDocsHeader(counts, newVersion) {
317
- return `**v${newVersion}** — ${counts.agents} agents · ${counts.skills} skills · ${counts.mcps} MCP servers · 68 codex terms · 3,226 tests`;
332
+ export function buildDocsHeader(_counts, newVersion) {
333
+ return `**v${newVersion}** — a suit that survives the context window`;
318
334
  }
319
335
 
320
336
  function syncDocsSiteHeaders(counts, newVersion) {
321
337
  const header = buildDocsHeader(counts, newVersion);
322
- const headerRe = /^\*{0,2}v?[\d.]*\*{0,2}\s*—?\s*\d+ agents · \d+ skills · \d+ MCP servers? · \d+ codex terms(?: · [\d,]+ tests)?/m;
338
+ const headerRe =
339
+ /^\*{0,2}v?[\d.]*\*{0,2}\s*—?\s*(?:\d+ agents · \d+ skills · \d+ MCP servers? · \d+ codex terms(?: · [\d,]+ tests)?|a suit that survives the context window.*|exo, not toolset.*|wear the exo.*)/im;
323
340
  for (const rel of DOCS_SITE_HEADER_FILES) {
324
341
  const filePath = path.join(rootDir, rel);
325
342
  if (!fs.existsSync(filePath)) continue;
@@ -341,13 +358,29 @@ function updatePluginJsonVersion(newVersion) {
341
358
  console.log(`✅ Updated .grok-plugin/plugin.json (version: ${newVersion})`);
342
359
  }
343
360
 
361
+ function updateJsonVersionField(relPath, newVersion) {
362
+ const full = path.join(rootDir, relPath);
363
+ if (!fs.existsSync(full)) return;
364
+ const data = JSON.parse(fs.readFileSync(full, 'utf-8'));
365
+ data.version = newVersion;
366
+ fs.writeFileSync(full, JSON.stringify(data, null, 2) + '\n');
367
+ }
368
+
369
+ function updateFeaturesJsonVersion(newVersion) {
370
+ updateJsonVersionField('xray/features.json', newVersion);
371
+ }
372
+
373
+ function updateOpenclawPluginVersion(newVersion) {
374
+ updateJsonVersionField('src/integrations/openclaw/plugin/xray-pre-tool/package.json', newVersion);
375
+ }
376
+
344
377
  function updateConsumerAgentsHeader(newVersion, counts) {
345
378
  const consumerPath = path.join(rootDir, 'AGENTS-consumer.md');
346
379
  if (!fs.existsSync(consumerPath)) return;
347
380
  let content = fs.readFileSync(consumerPath, 'utf-8');
348
381
  content = content.replace(
349
- /^\*\*v[\d.]+\*\* — \d+ MCP servers · \d+ skills · \d+ codex terms/m,
350
- `**v${newVersion}** — ${counts.mcps} MCP servers · ${counts.skills} skills · 68 codex terms`
382
+ /^\*\*v[\d.]+\*\* — .+$/m,
383
+ buildDocsHeader(counts, newVersion),
351
384
  );
352
385
  fs.writeFileSync(consumerPath, content);
353
386
  console.log(`✅ Updated AGENTS-consumer.md version header`);
@@ -386,15 +419,20 @@ function applyAgentCountUpdates(content, counts) {
386
419
  /**
387
420
  * Update AGENTS.md with actual framework counts
388
421
  */
389
- function updateAgentsMd(counts) {
422
+ function updateAgentsMd(counts, newVersion = getCurrentVersion()) {
390
423
  const agentsPath = path.join(rootDir, 'AGENTS.md');
391
424
  if (!fs.existsSync(agentsPath)) {
392
- console.log(`⚠️ AGENTS.md not found, skipping`);
393
425
  return;
394
426
  }
395
427
 
396
- fs.writeFileSync(agentsPath, applyAgentCountUpdates(fs.readFileSync(agentsPath, 'utf-8'), counts));
397
- console.log(`✅ Updated AGENTS.md`);
428
+ let agentsMd = applyAgentCountUpdates(fs.readFileSync(agentsPath, 'utf-8'), counts);
429
+ agentsMd = agentsMd.replace(/\(\*\*v[\d.]+\*\*\)/, `(**v${newVersion}**)`);
430
+ agentsMd = agentsMd.replace(
431
+ /^\*\*v[\d.]+\*\* — a suit that survives the context window\.?$/m,
432
+ buildDocsHeader(counts, newVersion),
433
+ );
434
+ agentsMd = agentsMd.replace(/^## Postinstall \(v[\d.]+\)$/m, `## Postinstall (v${newVersion})`);
435
+ fs.writeFileSync(agentsPath, agentsMd);
398
436
  }
399
437
 
400
438
  function updateAgentsConsumerMd(counts) {
@@ -501,8 +539,10 @@ function updateVersion(newVersion, changeDescription = '') {
501
539
  updateReadme(counts, newVersion);
502
540
  syncDocsSiteHeaders(counts, newVersion);
503
541
  updatePluginJsonVersion(newVersion);
542
+ updateFeaturesJsonVersion(newVersion);
543
+ updateOpenclawPluginVersion(newVersion);
504
544
  updateConsumerAgentsHeader(newVersion, counts);
505
- updateAgentsMd(counts);
545
+ updateAgentsMd(counts, newVersion);
506
546
  updateAgentsConsumerMd(counts);
507
547
  updateSkillsMd(counts, newVersion);
508
548
 
@@ -540,7 +580,6 @@ export function getReleaseArtifactPaths() {
540
580
  'SKILLS.md',
541
581
  '.grok-plugin/plugin.json',
542
582
  'docs/README.md',
543
- 'docs-site/docs/README.md',
544
583
  'docs-site/docs/index.md',
545
584
  'docs-site/docs/introduction.md',
546
585
  'docs-site/docs/guides/getting-started.md',
@@ -554,7 +593,9 @@ export function getReleaseArtifactPaths() {
554
593
  'docs-site/docs/guides/consumer-migration.md',
555
594
  'docs-site/docs/mcp/README.md',
556
595
  'docs-site/docs/agents/README.md',
596
+ 'docs-site/docs/architecture/GROK_GUIDE.md',
557
597
  'docs-site/sidebars.ts',
598
+ 'xray/features.json',
558
599
  ];
559
600
  return candidates.filter((rel) => fs.existsSync(path.join(rootDir, rel)));
560
601
  }
@@ -569,9 +610,11 @@ function updateReleaseArtifactsOnly(changeDescription = '') {
569
610
  updateReadme(counts, current);
570
611
  syncDocsSiteHeaders(counts, current);
571
612
  updatePluginJsonVersion(current);
613
+ updateFeaturesJsonVersion(current);
614
+ updateOpenclawPluginVersion(current);
572
615
  updateConsumerAgentsHeader(current, counts);
573
616
  updateDocsReadme(current);
574
- updateAgentsMd(counts);
617
+ updateAgentsMd(counts, current);
575
618
  updateAgentsConsumerMd(counts);
576
619
  updateSkillsMd(counts, current);
577
620
  runReleaseDocsValidation();
@@ -633,6 +676,8 @@ function main() {
633
676
  updateReadme(counts, current);
634
677
  syncDocsSiteHeaders(counts, current);
635
678
  updatePluginJsonVersion(current);
679
+ updateFeaturesJsonVersion(current);
680
+ updateOpenclawPluginVersion(current);
636
681
  updateConsumerAgentsHeader(current, counts);
637
682
  updateDocsReadme(current);
638
683
  updateAgentsMd(counts);
@@ -2,15 +2,11 @@
2
2
  "hooks": {
3
3
  "PreToolUse": [
4
4
  {
5
- "matcher": ".*",
6
5
  "hooks": [
7
6
  {
8
7
  "type": "command",
9
- "command": "node",
10
- "args": [
11
- "${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/pre-tool-use.js"
12
- ],
13
- "timeout": 30000
8
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/pre-tool-use.js\"",
9
+ "timeout": 30
14
10
  }
15
11
  ]
16
12
  }
@@ -20,11 +16,8 @@
20
16
  "hooks": [
21
17
  {
22
18
  "type": "command",
23
- "command": "node",
24
- "args": [
25
- "${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js"
26
- ],
27
- "timeout": 15000
19
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js\"",
20
+ "timeout": 30
28
21
  }
29
22
  ]
30
23
  }
@@ -34,30 +27,44 @@
34
27
  "hooks": [
35
28
  {
36
29
  "type": "command",
37
- "command": "node",
38
- "args": [
39
- "${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js",
40
- "--hook-event=user_prompt_submit"
41
- ],
42
- "timeout": 15000
30
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js\" --hook-event=user_prompt_submit",
31
+ "timeout": 30
43
32
  }
44
33
  ]
45
34
  }
46
35
  ],
47
36
  "PostToolUse": [
48
37
  {
49
- "matcher": ".*",
50
38
  "hooks": [
51
39
  {
52
40
  "type": "command",
53
- "command": "node",
54
- "args": [
55
- "${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/post-tool-use.js"
56
- ],
57
- "timeout": 15000
41
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/post-tool-use.js\"",
42
+ "timeout": 30
43
+ }
44
+ ]
45
+ }
46
+ ],
47
+ "PreCompact": [
48
+ {
49
+ "hooks": [
50
+ {
51
+ "type": "command",
52
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js\" --hook-event=pre_compact",
53
+ "timeout": 30
54
+ }
55
+ ]
56
+ }
57
+ ],
58
+ "PostCompact": [
59
+ {
60
+ "hooks": [
61
+ {
62
+ "type": "command",
63
+ "command": "XRAY_AI_PATH=\"${XRAY_AI_PATH:-node_modules/0xray}\" node \"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/session-start.js\" --hook-event=post_compact",
64
+ "timeout": 30
58
65
  }
59
66
  ]
60
67
  }
61
68
  ]
62
69
  }
63
- }
70
+ }
@@ -0,0 +1,134 @@
1
+ # OpenClaw Integration
2
+
3
+ 0xray integration for OpenClaw - a self-hosted AI gateway that connects messaging platforms to AI coding agents.
4
+
5
+ ## Overview
6
+
7
+ This integration allows 0xray to:
8
+ - Connect to OpenClaw Gateway via WebSocket
9
+ - Expose 0xray capabilities through OpenClaw skills
10
+ - Send tool execution events to OpenClaw for real-time tracking
11
+ - Receive commands from OpenClaw channels (WhatsApp, Telegram, Discord, etc.)
12
+
13
+ ## Architecture
14
+
15
+ ```
16
+ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
17
+ │ User │────▶│ OpenClaw │────▶│ 0xray │
18
+ │ (WhatsApp, │ │ Gateway │ │ Skills │
19
+ │ Discord, │ │ │ │ │
20
+ │ Telegram) │◀────│ │◀────│ │
21
+ └──────────────┘ └──────────────┘ └──────────────┘
22
+ │
23
+ ▼
24
+ ┌──────────────┐
25
+ │ WebSocket │
26
+ │ Client │
27
+ └──────────────┘
28
+ ```
29
+
30
+ ## Installation
31
+
32
+ ### 1. Install Dependencies
33
+
34
+ ```bash
35
+ npm install ws
36
+ ```
37
+
38
+ ### 2. Configure OpenClaw
39
+
40
+ Create `.xray/config/openclaw.json`:
41
+
42
+ ```json
43
+ {
44
+ "gatewayUrl": "ws://127.0.0.1:18789",
45
+ "authToken": "your-auth-token",
46
+ "deviceId": "your-device-id",
47
+ "apiServer": {
48
+ "enabled": true,
49
+ "port": 18431,
50
+ "host": "127.0.0.1",
51
+ "apiKey": "your-api-key"
52
+ },
53
+ "hooks": {
54
+ "enabled": true
55
+ },
56
+ "enabled": true
57
+ }
58
+ ```
59
+
60
+ ### 3. Install OpenClaw Skills
61
+
62
+ Copy skills to your OpenClaw skills directory:
63
+
64
+ ```bash
65
+ cp -r skills/* ~/.openclaw/skills/
66
+ ```
67
+
68
+ ## Usage
69
+
70
+ ### Initialize Integration
71
+
72
+ ```typescript
73
+ import { initializeOpenClawIntegration } from './src/integrations/openclaw/index.js';
74
+
75
+ const integration = await initializeOpenClawIntegration();
76
+
77
+ // Or with custom agent invoker
78
+ const integration = await initializeOpenClawIntegration('/path/to/config.json', myAgentInvoker);
79
+ ```
80
+
81
+ ### Using OpenClaw Commands
82
+
83
+ After installation, use these commands in any OpenClaw channel:
84
+
85
+ - `/xray` - Show status
86
+ - `/xray-analyze <file>` - Analyze code
87
+ - `/xray-code <file>` - Code review
88
+ - `/xray-file <file>` - Read file
89
+ - `/xray-exec <command>` - Execute command
90
+
91
+ ## Configuration
92
+
93
+ | Option | Type | Default | Description |
94
+ |--------|------|---------|-------------|
95
+ | `gatewayUrl` | string | `ws://127.0.0.1:18789` | OpenClaw WebSocket URL |
96
+ | `authToken` | string | - | Authentication token |
97
+ | `deviceId` | string | - | Device ID for pairing |
98
+ | `apiServer.enabled` | boolean | `true` | Enable HTTP API server |
99
+ | `apiServer.port` | number | `18431` | API server port |
100
+ | `apiServer.host` | string | `127.0.0.1` | API server host |
101
+ | `apiServer.apiKey` | string | - | API key for auth |
102
+ | `hooks.enabled` | boolean | `true` | Enable tool hooks |
103
+ | `autoReconnect` | boolean | `true` | Auto reconnect |
104
+ | `enabled` | boolean | `true` | Enable integration |
105
+
106
+ ## API Server
107
+
108
+ The integration exposes a local HTTP API on port 18431:
109
+
110
+ - `GET /health` - Health check
111
+ - `POST /api/agent/invoke` - Invoke agent
112
+ - `GET /api/agent/status` - Agent status
113
+
114
+ ## Skills
115
+
116
+ ### 0xray-orchestrator
117
+
118
+ Main skill providing 0xray commands:
119
+
120
+ ```markdown
121
+ /xray - Show status
122
+ /xray-analyze <file> - Analyze code
123
+ /xray-code <file> - Code review
124
+ /xray-file <file> - Read file
125
+ /xray-exec <command> - Execute command
126
+ ```
127
+
128
+ ## Documentation
129
+
130
+ See `docs/research/openclaw/` for detailed documentation.
131
+
132
+ ## License
133
+
134
+ MIT
@@ -0,0 +1,75 @@
1
+ import { createRequire } from 'node:module';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { definePluginEntry } from 'openclaw/plugin-sdk/plugin-entry';
7
+
8
+ const require = createRequire(import.meta.url);
9
+ const pluginDir = dirname(fileURLToPath(import.meta.url));
10
+
11
+ function hasGate(root) {
12
+ return Boolean(root) && existsSync(join(root, 'dist/nucleus/delegation-gate.js'));
13
+ }
14
+
15
+ function resolveXrayRoot() {
16
+ if (hasGate(process.env.XRAY_AI_PATH || '')) {
17
+ return process.env.XRAY_AI_PATH;
18
+ }
19
+ const marker = join(homedir(), '.openclaw', 'xray-consumer-root.txt');
20
+ const marked = existsSync(marker) ? readFileSync(marker, 'utf8').trim() : '';
21
+ const candidates = [
22
+ marked,
23
+ marked ? join(marked, 'node_modules', '0xray') : '',
24
+ marked ? join(marked, '..', 'xray') : '',
25
+ // Linked plugin lives at src/integrations/openclaw/plugin/xray-pre-tool
26
+ join(pluginDir, '..', '..', '..', '..', '..'),
27
+ ].filter(Boolean);
28
+ for (const candidate of candidates) {
29
+ if (hasGate(candidate)) {
30
+ return candidate;
31
+ }
32
+ }
33
+ return '';
34
+ }
35
+
36
+ export default definePluginEntry({
37
+ id: 'xray-pre-tool',
38
+ name: '0xRay PreToolUse',
39
+ register(api) {
40
+ api.on(
41
+ 'before_tool_call',
42
+ (event, ctx) => {
43
+ try {
44
+ const xrayRoot = resolveXrayRoot();
45
+ if (!xrayRoot) {
46
+ return { block: true, blockReason: '0xRay dist missing — set XRAY_AI_PATH' };
47
+ }
48
+ const gate = require(join(xrayRoot, 'dist/nucleus/delegation-gate.js'));
49
+ const projectRoot =
50
+ process.env.XRAY_ROOT ||
51
+ ctx?.workspaceDir ||
52
+ ctx?.cwd ||
53
+ process.cwd();
54
+ const features = gate.loadDelegationGateFeatures(projectRoot, 'openclaw');
55
+ const outcome = gate.evaluatePreToolGate(event.toolName, event.params || {}, {
56
+ projectRoot,
57
+ sessionId: ctx?.sessionId || ctx?.sessionKey || 'openclaw',
58
+ features,
59
+ host: 'openclaw',
60
+ });
61
+ if (!outcome.allow) {
62
+ return { block: true, blockReason: outcome.reason || '0xRay constitution' };
63
+ }
64
+ return undefined;
65
+ } catch (err) {
66
+ return {
67
+ block: true,
68
+ blockReason: err instanceof Error ? err.message : String(err),
69
+ };
70
+ }
71
+ },
72
+ { priority: 80 },
73
+ );
74
+ },
75
+ });
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "xray-pre-tool",
3
+ "name": "0xRay PreToolUse",
4
+ "description": "Constitution and temperament gate for OpenClaw tool calls (Codex 11/29/69, spawn plan).",
5
+ "configSchema": {
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "properties": {}
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "xray-pre-tool",
3
+ "version": "4.0.1",
4
+ "private": true,
5
+ "type": "module",
6
+ "description": "0xRay constitution + temperament PreToolUse for OpenClaw",
7
+ "openclaw": {
8
+ "extensions": [
9
+ "./index.js"
10
+ ]
11
+ }
12
+ }
@@ -133,7 +133,7 @@ export class ComplexityHandler {
133
133
 
134
134
  let userAsideReport = '';
135
135
  let leadDevPlan = synthesisCheckpoint
136
- ? buildSynthesisCheckpointPlan(args.synthesisDueReason ?? null)
136
+ ? buildSynthesisCheckpointPlan(args.synthesisDueReason ?? null, projectRoot)
137
137
  : userAsideIntake
138
138
  ? null
139
139
  : isLeadDevModeActive() && (primaryDescription || planTaskInputs.length > 0)
@@ -142,6 +142,7 @@ export class ComplexityHandler {
142
142
  taskTypes.length ? taskTypes : ['implement'],
143
143
  planTaskInputs,
144
144
  analysis.overallComplexity,
145
+ projectRoot,
145
146
  )
146
147
  : null;
147
148