0xray 3.0.14 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/hooks/post-commit +1 -1
- package/.opencode/init.sh +4 -4
- package/AGENTS.md +2 -2
- package/dist/AGENTS.md +2 -2
- package/dist/CHANGELOG.md +9 -0
- package/dist/benchmark/performance-benchmark.js +4 -2
- package/dist/cli/commands/hermes-install.js +4 -4
- package/dist/cli/commands/mcp-install.js +1 -1
- package/dist/cli/commands/openclaw-install.js +1 -1
- package/dist/cli/commands/plugin-commands.js +2 -2
- package/dist/cli/commands/publish-agent.js +5 -5
- package/dist/cli/commands/skill-install.js +1 -1
- package/dist/cli/commands/status.js +3 -3
- package/dist/cli/commands/storyteller.js +1 -1
- package/dist/cli/index.js +6 -6
- package/dist/cli/server.js +4 -4
- package/dist/core/boot-orchestrator.js +24 -24
- package/dist/core/bridge.mjs +22 -22
- package/dist/core/codex-formatter.js +2 -2
- package/dist/core/codex-injector.js +5 -5
- package/dist/core/config-loader.js +4 -2
- package/dist/core/config-paths.js +14 -14
- package/dist/core/context-loader.js +8 -5
- package/dist/core/index.js +1 -1
- package/dist/core/orchestrator.js +1 -1
- package/dist/core/system-prompt-generator.js +2 -2
- package/dist/core/xray-activation.js +42 -40
- package/dist/delegation/agent-delegator.js +2 -2
- package/dist/enforcement/enforcer-tools.js +2 -2
- package/dist/enforcement/loaders/codex-loader.js +2 -2
- package/dist/governance/llm-governance-provider.js +210 -0
- package/dist/index.js +8 -6
- package/dist/inference/deploy-verifier.js +1 -1
- package/dist/inference/inference-cycle.js +7 -7
- package/dist/integrations/hermes-agent/__init__.py +72 -72
- package/dist/integrations/hermes-agent/after-install.md +14 -14
- package/dist/integrations/hermes-agent/bridge.mjs +24 -24
- package/dist/integrations/hermes-agent/plugin.yaml +5 -5
- package/dist/integrations/hermes-agent/schemas.py +12 -12
- package/dist/integrations/hermes-agent/test_plugin.py +117 -117
- package/dist/integrations/hermes-agent/tools.py +25 -25
- package/dist/integrations/plugins/plugin-registry.js +2 -2
- package/dist/mcps/config/server-config-registry.js +10 -10
- package/dist/mcps/connection/mcp-connection.js +1 -1
- package/dist/mcps/framework-help.server.js +6 -6
- package/dist/mcps/knowledge-skills/code-review.server.js +12 -37
- package/dist/mcps/knowledge-skills/security-audit.server.js +12 -42
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +2 -2
- package/dist/mcps/lint.server.js +2 -2
- package/dist/mcps/mcp-client.js +5 -5
- package/dist/mcps/orchestrator/server.js +2 -2
- package/dist/mcps/researcher.server.js +12 -37
- package/dist/mcps/simulation/server-simulations.js +3 -3
- package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +2 -2
- package/dist/orchestrator/intelligent-commit-batcher.js +3 -3
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +9 -9
- package/dist/orchestrator/orchestrator.js +10 -8
- package/dist/orchestrator/universal-registry-bridge.js +3 -3
- package/dist/plugin/xray-codex-injection.js +21 -21
- package/dist/postprocessor/PostProcessor.js +5 -5
- package/dist/postprocessor/services/RegressionAnalysisService.js +2 -2
- package/dist/postprocessor/triggers/GitHookTrigger.js +14 -14
- package/dist/processors/implementations/agents-md-validation-processor.js +2 -2
- package/dist/processors/implementations/inference-improvement-processor.js +1 -1
- package/dist/processors/implementations/log-protection-processor.js +2 -2
- package/dist/processors/implementations/publish-preflight-processor.js +3 -3
- package/dist/processors/implementations/regression-testing-processor.js +2 -2
- package/dist/processors/implementations/session-summary-processor.js +1 -1
- package/dist/processors/implementations/storytelling-trigger-processor.js +1 -1
- package/dist/reporting/report-formatter.js +1 -1
- package/dist/scripts/activate-kernel-pipeline.js +2 -2
- package/dist/services/inference-tuner.js +2 -2
- package/dist/skills/hermes-agent/SKILL.md +42 -42
- package/dist/skills/storyteller/SKILL.md +1 -1
- package/dist/state/index.js +2 -1
- package/dist/state/state-manager.js +3 -3
- package/dist/utils/token-manager.js +1 -1
- package/dist/validation/estimation-validator.js +1 -1
- package/package.json +1 -1
- package/scripts/node/pre-publish-guard.js +13 -9
- package/scripts/node/universal-version-manager.js +2 -2
- package/src/mcps/config/__tests__/server-config-registry.test.ts +12 -12
- package/src/mcps/config/server-config-registry.ts +10 -10
- package/src/mcps/connection/mcp-connection.ts +1 -1
- package/src/mcps/framework-help.server.ts +6 -6
- package/src/mcps/knowledge-skills/code-review.server.ts +19 -34
- package/src/mcps/knowledge-skills/security-audit.server.ts +19 -38
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +2 -2
- package/src/mcps/lint.server.ts +2 -2
- package/src/mcps/mcp-client.ts +5 -5
- package/src/mcps/orchestrator/server.ts +2 -2
- package/src/mcps/researcher.server.ts +19 -34
- package/src/mcps/simulation/server-simulations.ts +3 -3
- package/src/skills/hermes-agent/SKILL.md +42 -42
- package/src/skills/storyteller/SKILL.md +1 -1
package/src/mcps/lint.server.ts
CHANGED
|
@@ -51,7 +51,7 @@ class XrayLintServer {
|
|
|
51
51
|
this.setupToolHandlers();
|
|
52
52
|
void frameworkLogger.log(
|
|
53
53
|
"lint.server",
|
|
54
|
-
"-
|
|
54
|
+
"-xray-lint-mcp-server-initialized-",
|
|
55
55
|
"info",
|
|
56
56
|
{ message: "0xRay Lint MCP Server initialized" },
|
|
57
57
|
);
|
|
@@ -467,7 +467,7 @@ ${checkResults.details.map((d) => `• ${d}`).join("\n")}
|
|
|
467
467
|
await this.server.connect(transport);
|
|
468
468
|
await frameworkLogger.log(
|
|
469
469
|
"lint.server",
|
|
470
|
-
"-
|
|
470
|
+
"-xray-lint-mcp-server-started-",
|
|
471
471
|
"info",
|
|
472
472
|
{ message: "0xRay Lint MCP Server started" },
|
|
473
473
|
);
|
package/src/mcps/mcp-client.ts
CHANGED
|
@@ -153,7 +153,7 @@ export class MCPClient extends EventEmitter {
|
|
|
153
153
|
* Pure MCP mode — simulation and generic fallbacks are disabled.
|
|
154
154
|
*/
|
|
155
155
|
private get isPureMcpMode(): boolean {
|
|
156
|
-
return process.env.
|
|
156
|
+
return process.env.XRAY_FORCE_MCP_GOVERNANCE === 'true';
|
|
157
157
|
}
|
|
158
158
|
|
|
159
159
|
/**
|
|
@@ -344,17 +344,17 @@ export class MCPClient extends EventEmitter {
|
|
|
344
344
|
],
|
|
345
345
|
'framework-help': [
|
|
346
346
|
{
|
|
347
|
-
name: '
|
|
347
|
+
name: 'xray_get_capabilities',
|
|
348
348
|
description: 'Get 0xRay framework capabilities',
|
|
349
349
|
inputSchema: { type: 'object', properties: {} },
|
|
350
350
|
},
|
|
351
351
|
{
|
|
352
|
-
name: '
|
|
352
|
+
name: 'xray_get_commands',
|
|
353
353
|
description: 'Get available 0xRay commands',
|
|
354
354
|
inputSchema: { type: 'object', properties: {} },
|
|
355
355
|
},
|
|
356
356
|
{
|
|
357
|
-
name: '
|
|
357
|
+
name: 'xray_explain_capability',
|
|
358
358
|
description: 'Explain a specific capability',
|
|
359
359
|
inputSchema: {
|
|
360
360
|
type: 'object',
|
|
@@ -470,7 +470,7 @@ export class MCPClient extends EventEmitter {
|
|
|
470
470
|
if (this.isPureMcpMode) {
|
|
471
471
|
throw new Error(
|
|
472
472
|
`[PURE MCP] No real response for ${serverName}/${toolName}. ` +
|
|
473
|
-
`All fallbacks are disabled when
|
|
473
|
+
`All fallbacks are disabled when XRAY_FORCE_MCP_GOVERNANCE=true.`
|
|
474
474
|
);
|
|
475
475
|
}
|
|
476
476
|
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
ListToolsRequestSchema,
|
|
13
13
|
} from '@modelcontextprotocol/sdk/types.js';
|
|
14
14
|
import { frameworkLogger } from '../../core/framework-logger.js';
|
|
15
|
-
import {
|
|
15
|
+
import { XrayStateManager } from '../../state/state-manager.js';
|
|
16
16
|
import { MultiAgentOrchestrationCoordinator } from '../../orchestrator/multi-agent-orchestration-coordinator.js';
|
|
17
17
|
|
|
18
18
|
import { TaskHandler } from './handlers/task-handler.js';
|
|
@@ -45,7 +45,7 @@ export class OrchestratorServer {
|
|
|
45
45
|
|
|
46
46
|
constructor() {
|
|
47
47
|
// Initialize actual coordinator
|
|
48
|
-
const stateManager = new
|
|
48
|
+
const stateManager = new XrayStateManager();
|
|
49
49
|
this.coordinator = new MultiAgentOrchestrationCoordinator(stateManager);
|
|
50
50
|
|
|
51
51
|
// Initialize handlers
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
import * as fs from "fs";
|
|
19
19
|
import * as path from "path";
|
|
20
20
|
import { frameworkLogger } from "../core/framework-logger.js";
|
|
21
|
+
import { tryLLMGovernance } from "../governance/llm-governance-provider.js";
|
|
21
22
|
|
|
22
23
|
interface SearchResult {
|
|
23
24
|
file: string;
|
|
@@ -482,47 +483,31 @@ class XrayLibrarianServer {
|
|
|
482
483
|
*/
|
|
483
484
|
async analyzeProposal(args: AnalyzeProposalArgs): Promise<CallToolResult> {
|
|
484
485
|
const { proposalTitle = "", proposalDescription = "", evidence = [], proposalType = "" } = args || {};
|
|
485
|
-
const text = `${proposalTitle} ${proposalDescription} ${(evidence || []).join(" ")}`.toLowerCase();
|
|
486
|
-
|
|
487
|
-
let decision: "approve" | "reject" | "abstain" = "approve";
|
|
488
|
-
let confidence = 0.80;
|
|
489
|
-
let reasoning = "From a project-wide analysis perspective, the proposal aligns with observed recurring patterns and has supporting evidence in the corpus.";
|
|
490
|
-
|
|
491
|
-
if (text.includes("aml") || text.includes("kyc") || text.includes("anti-money")) {
|
|
492
|
-
decision = "approve";
|
|
493
|
-
confidence = 0.86;
|
|
494
|
-
reasoning = "AML/KYC compliance integration is a recurring pattern across financial services codebases. The corpus shows that automated transaction monitoring reduces regulatory incident frequency by approximately 60% when properly integrated with sanction list APIs.";
|
|
495
|
-
} else if (text.includes("psd2") || text.includes("strong customer authentication") || text.includes("payment initiation")) {
|
|
496
|
-
decision = "approve";
|
|
497
|
-
confidence = 0.88;
|
|
498
|
-
reasoning = "PSD2 SCA patterns are well-established in the corpus across multiple implementations. The Berlin Group standards provide a reliable reference architecture, and existing integrations show consistent compliance with EBA regulatory technical standards.";
|
|
499
|
-
} else if (text.includes("gdpr") || text.includes("right to erasure") || text.includes("data protection")) {
|
|
500
|
-
decision = "approve";
|
|
501
|
-
confidence = 0.91;
|
|
502
|
-
reasoning = "GDPR data erasure pipeline patterns appear in approximately 35% of enterprise codebases in the corpus. The most successful implementations use the saga pattern with compensating transactions for cross-system consistency.";
|
|
503
|
-
} else if (text.includes("extract method")) {
|
|
504
|
-
decision = "approve";
|
|
505
|
-
confidence = 0.89;
|
|
506
|
-
reasoning = "The Extract Method pattern is a core refactoring technique that improves modularity; the corpus shows consistent positive outcomes when applied to repeated logic across many sessions.";
|
|
507
|
-
} else if (text.includes("test coverage")) {
|
|
508
|
-
decision = "approve";
|
|
509
|
-
confidence = 0.94;
|
|
510
|
-
reasoning = "Test coverage expansion is one of the highest-leverage improvements for long-term project health, directly reducing regression incidents across 100+ sessions in the historical data.";
|
|
511
|
-
} else if (text.includes("technical debt")) {
|
|
512
|
-
decision = "approve";
|
|
513
|
-
confidence = 0.85;
|
|
514
|
-
reasoning = "Systematic technical debt reduction is strongly supported by historical data showing fewer critical violations and faster feature delivery in low-debt modules.";
|
|
515
|
-
}
|
|
516
486
|
|
|
517
|
-
|
|
518
|
-
|
|
487
|
+
const vote = await tryLLMGovernance(
|
|
488
|
+
"researcher",
|
|
489
|
+
proposalTitle || "",
|
|
490
|
+
proposalDescription || "",
|
|
491
|
+
evidence || [],
|
|
492
|
+
proposalType || "",
|
|
493
|
+
);
|
|
494
|
+
|
|
495
|
+
if (!vote) {
|
|
496
|
+
return {
|
|
497
|
+
content: [
|
|
498
|
+
{
|
|
499
|
+
type: "text",
|
|
500
|
+
text: "DECISION: abstain\nCONFIDENCE: 0.50\nREASONING: No LLM governance provider configured. Set XRAY_GOVERNANCE_LLM_ENABLED=true + XRAY_LLM_ENDPOINT, or install Hermes and run: hermes auth add xai-oauth --no-browser",
|
|
501
|
+
},
|
|
502
|
+
],
|
|
503
|
+
};
|
|
519
504
|
}
|
|
520
505
|
|
|
521
506
|
return {
|
|
522
507
|
content: [
|
|
523
508
|
{
|
|
524
509
|
type: "text",
|
|
525
|
-
text: `DECISION: ${decision}\nCONFIDENCE: ${confidence.toFixed(2)}\nREASONING: ${reasoning}`,
|
|
510
|
+
text: `DECISION: ${vote.decision}\nCONFIDENCE: ${vote.confidence.toFixed(2)}\nREASONING: ${vote.reasoning}`,
|
|
526
511
|
},
|
|
527
512
|
],
|
|
528
513
|
};
|
|
@@ -86,7 +86,7 @@ export const researcherSimulations: Record<string, SimulatorFunction> = {
|
|
|
86
86
|
* Framework Help server simulations
|
|
87
87
|
*/
|
|
88
88
|
export const frameworkHelpSimulations: Record<string, SimulatorFunction> = {
|
|
89
|
-
|
|
89
|
+
xray_get_capabilities: (): MCPToolResult => ({
|
|
90
90
|
content: [
|
|
91
91
|
{
|
|
92
92
|
type: 'text',
|
|
@@ -118,7 +118,7 @@ export const frameworkHelpSimulations: Record<string, SimulatorFunction> = {
|
|
|
118
118
|
],
|
|
119
119
|
}),
|
|
120
120
|
|
|
121
|
-
|
|
121
|
+
xray_get_commands: (): MCPToolResult => ({
|
|
122
122
|
content: [
|
|
123
123
|
{
|
|
124
124
|
type: 'text',
|
|
@@ -146,7 +146,7 @@ framework-reporting-system - Generate comprehensive framework reports
|
|
|
146
146
|
],
|
|
147
147
|
}),
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
xray_explain_capability: (): MCPToolResult => ({
|
|
150
150
|
content: [
|
|
151
151
|
{
|
|
152
152
|
type: 'text',
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: hermes-agent
|
|
3
|
-
description: Manage
|
|
3
|
+
description: Manage 0xRay framework from Hermes Agent via the native xray-hermes plugin. Covers the 4 plugin tools (validate, codex_check, health, hooks), lifecycle hooks, slash commands, bridge architecture, and CLI fallback.
|
|
4
4
|
version: 2.1.0
|
|
5
|
-
author:
|
|
5
|
+
author: 0xRay AI
|
|
6
6
|
metadata:
|
|
7
7
|
hermes:
|
|
8
|
-
tags: [
|
|
8
|
+
tags: [0xRay, Plugin, Validation, Codex, GitHooks, Bridge]
|
|
9
9
|
related_skills: []
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
#
|
|
12
|
+
# 0xRay Hermes Plugin (xray-hermes)
|
|
13
13
|
|
|
14
|
-
Native Hermes plugin providing
|
|
14
|
+
Native Hermes plugin providing 0xRay framework integration — quality gates, codex enforcement, git hooks, and full pre/post processing pipeline. Runs via a Node.js bridge to compiled framework components.
|
|
15
15
|
|
|
16
16
|
## When to Use
|
|
17
17
|
|
|
18
|
-
- User asks about
|
|
18
|
+
- User asks about 0xRay health, validation, or codex checks
|
|
19
19
|
- User wants to install/manage git hooks for automated enforcement
|
|
20
20
|
- User asks about the plugin's tools, hooks, or slash commands
|
|
21
21
|
- User asks about bridge errors or framework not loading
|
|
@@ -24,11 +24,11 @@ Native Hermes plugin providing StringRay framework integration — quality gates
|
|
|
24
24
|
## Plugin Architecture
|
|
25
25
|
|
|
26
26
|
```
|
|
27
|
-
~/.hermes/plugins/
|
|
27
|
+
~/.hermes/plugins/xray-hermes/
|
|
28
28
|
├── __init__.py # Plugin registration, hooks, slash commands
|
|
29
29
|
├── tools.py # 4 tool handlers (validate, codex_check, health, hooks)
|
|
30
30
|
├── schemas.py # JSON schemas the LLM sees
|
|
31
|
-
├── bridge.mjs # Node.js bridge to compiled
|
|
31
|
+
├── bridge.mjs # Node.js bridge to compiled 0xRay framework
|
|
32
32
|
├── plugin.yaml # Plugin metadata (name, version, tools, hooks)
|
|
33
33
|
├── types.py # TypeScript-equivalent type definitions
|
|
34
34
|
├── after-install.md # Post-install instructions
|
|
@@ -43,17 +43,17 @@ Native Hermes plugin providing StringRay framework integration — quality gates
|
|
|
43
43
|
|
|
44
44
|
**Fallback:** When bridge is unavailable, tools fall back to `npx 0xray` CLI commands.
|
|
45
45
|
|
|
46
|
-
**Config path resolution:** `
|
|
46
|
+
**Config path resolution:** `XRAY_CONFIG_DIR/` > `.xray/` > `.opencode/xray/` > built-in defaults.
|
|
47
47
|
|
|
48
48
|
## 4 Tools
|
|
49
49
|
|
|
50
|
-
###
|
|
50
|
+
### xray_validate
|
|
51
51
|
|
|
52
52
|
Run pre-commit validation on files. Uses bridge quality gate + processor pipeline, falls back to CLI.
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
xray_validate(files=["src/my-module.ts"], operation="commit")
|
|
56
|
+
xray_validate(files=["src/auth.ts", "src/auth.test.ts"], operation="modify")
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
Parameters:
|
|
@@ -62,13 +62,13 @@ Parameters:
|
|
|
62
62
|
|
|
63
63
|
Returns: pass/fail with per-file results and violations.
|
|
64
64
|
|
|
65
|
-
###
|
|
65
|
+
### xray_codex_check
|
|
66
66
|
|
|
67
67
|
Validate code against the 60-term Universal Development Codex. Checks error-handling, type-safety, performance, security, architecture.
|
|
68
68
|
|
|
69
69
|
```
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
xray_codex_check(code="const x: any = foo()", operation="create")
|
|
71
|
+
xray_codex_check(code=snippet, operation="modify", focus_areas=["security", "error-handling"])
|
|
72
72
|
```
|
|
73
73
|
|
|
74
74
|
Parameters:
|
|
@@ -78,25 +78,25 @@ Parameters:
|
|
|
78
78
|
|
|
79
79
|
Returns: violations list with actionable remediation.
|
|
80
80
|
|
|
81
|
-
###
|
|
81
|
+
### xray_health
|
|
82
82
|
|
|
83
83
|
Framework health check. Returns version, loaded components, project root.
|
|
84
84
|
|
|
85
85
|
```
|
|
86
|
-
|
|
86
|
+
xray_health()
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
Returns: framework status, version, component availability, node version.
|
|
90
90
|
|
|
91
|
-
###
|
|
91
|
+
### xray_hooks
|
|
92
92
|
|
|
93
|
-
Manage
|
|
93
|
+
Manage 0xRay git hooks (install, uninstall, list, status).
|
|
94
94
|
|
|
95
95
|
```
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
xray_hooks(action="install")
|
|
97
|
+
xray_hooks(action="status")
|
|
98
|
+
xray_hooks(action="list")
|
|
99
|
+
xray_hooks(action="uninstall", hooks=["pre-commit"])
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
Parameters:
|
|
@@ -122,7 +122,7 @@ Fires before ANY tool executes:
|
|
|
122
122
|
1. Tracks session stats
|
|
123
123
|
2. Logs tool-start event to `logs/framework/plugin-tool-events.log`
|
|
124
124
|
3. For code-producing tools (write_file, patch, execute_code, write, edit): runs quality gate + pre-processors via bridge
|
|
125
|
-
4. For other tools: nudges when a
|
|
125
|
+
4. For other tools: nudges when a 0xRay MCP alternative exists (e.g., grep → search_codebase, eslint → xray_lint)
|
|
126
126
|
|
|
127
127
|
### post_tool_call
|
|
128
128
|
|
|
@@ -137,16 +137,16 @@ Fires when a new session starts. Resets stats and logs to disk. Registration is
|
|
|
137
137
|
## Slash Command
|
|
138
138
|
|
|
139
139
|
```
|
|
140
|
-
/
|
|
141
|
-
/
|
|
142
|
-
/
|
|
140
|
+
/xray status — Plugin and framework health (calls bridge)
|
|
141
|
+
/xray stats — Session pipeline statistics
|
|
142
|
+
/xray help — Show available commands
|
|
143
143
|
/sr status — Alias
|
|
144
144
|
```
|
|
145
145
|
|
|
146
146
|
## Session Stats (tracked automatically)
|
|
147
147
|
|
|
148
|
-
The plugin tracks per-session counters visible via `/
|
|
149
|
-
- total_tool_calls, code_operations,
|
|
148
|
+
The plugin tracks per-session counters visible via `/xray stats`:
|
|
149
|
+
- total_tool_calls, code_operations, xray_mcp_calls, native_tool_calls
|
|
150
150
|
- quality_gate_runs, quality_gate_blocks
|
|
151
151
|
- pre_processor_runs, post_processor_runs
|
|
152
152
|
- bridge_calls, bridge_errors
|
|
@@ -164,13 +164,13 @@ All logs go to `logs/framework/` in the project root:
|
|
|
164
164
|
|
|
165
165
|
| User Says | Tool / Command |
|
|
166
166
|
|----------|---------------|
|
|
167
|
-
| "Is
|
|
168
|
-
| "Check these files before I commit" | `
|
|
169
|
-
| "Is this code codex compliant?" | `
|
|
170
|
-
| "Set up git hooks" | `
|
|
171
|
-
| "What hooks are installed?" | `
|
|
172
|
-
| "Show session stats" | `/
|
|
173
|
-
| "Why is the bridge failing?" | Check `
|
|
167
|
+
| "Is 0xRay working?" | `xray_health()` or `/xray status` |
|
|
168
|
+
| "Check these files before I commit" | `xray_validate(files=[...], operation="commit")` |
|
|
169
|
+
| "Is this code codex compliant?" | `xray_codex_check(code=..., operation="create")` |
|
|
170
|
+
| "Set up git hooks" | `xray_hooks(action="install")` |
|
|
171
|
+
| "What hooks are installed?" | `xray_hooks(action="status")` |
|
|
172
|
+
| "Show session stats" | `/xray stats` |
|
|
173
|
+
| "Why is the bridge failing?" | Check `xray_health()` → if `framework: "not_loaded"`, verify `dist/` symlink |
|
|
174
174
|
|
|
175
175
|
## Bridge Commands (internal)
|
|
176
176
|
|
|
@@ -188,8 +188,8 @@ These are called by the Python tools via `bridge.mjs`, not directly by the LLM:
|
|
|
188
188
|
|
|
189
189
|
Bridge can be invoked directly for debugging:
|
|
190
190
|
```bash
|
|
191
|
-
echo '{"command":"health"}' | node ~/.hermes/plugins/
|
|
192
|
-
node ~/.hermes/plugins/
|
|
191
|
+
echo '{"command":"health"}' | node ~/.hermes/plugins/xray-hermes/bridge.mjs
|
|
192
|
+
node ~/.hermes/plugins/xray-hermes/bridge.mjs health --cwd /path/to/project
|
|
193
193
|
```
|
|
194
194
|
|
|
195
195
|
## Relationship to MCP Servers
|
|
@@ -198,15 +198,15 @@ The plugin and MCP servers are complementary:
|
|
|
198
198
|
- **Plugin tools** = offline-first, always available, lightweight (validate, codex check, health, hooks)
|
|
199
199
|
- **MCP servers** = deeper analysis requiring running Node.js (lint, security scan, architecture assessment, orchestration, codebase search)
|
|
200
200
|
|
|
201
|
-
The plugin's pre_tool_call hook nudges when an MCP alternative exists (e.g., "use
|
|
201
|
+
The plugin's pre_tool_call hook nudges when an MCP alternative exists (e.g., "use mcp_xray_lint_lint instead of raw eslint"). This is advisory, not blocking.
|
|
202
202
|
|
|
203
203
|
## Pitfalls
|
|
204
204
|
|
|
205
205
|
- Plugin requires restart after install/edit: Hermes loads plugins once at session start.
|
|
206
206
|
- Bridge needs `dist/` symlink: The bridge loads compiled `.js` from `dist/` → `node_modules/0xray/dist/`. If the symlink breaks, bridge returns `framework: "not_loaded"`.
|
|
207
|
-
- `
|
|
207
|
+
- `xray_codex_check` without `code` param returns health, not a codex check. Pass `code` for actual validation.
|
|
208
208
|
- CLI fallback requires `npx 0xray` in PATH. If bridge fails and CLI isn't available, tools return errors.
|
|
209
209
|
- Quality gate blocks are logged but NOT enforced (advisory). The tool returns violations; the agent decides what to do.
|
|
210
|
-
- Git hooks use symlinks from `.git/hooks/` → `hooks/`. If the `hooks/` directory doesn't exist in the project, `
|
|
211
|
-
- Project root detection walks up from CWD looking for `node_modules/0xray`, `.opencode/
|
|
210
|
+
- Git hooks use symlinks from `.git/hooks/` → `hooks/`. If the `hooks/` directory doesn't exist in the project, `xray_hooks(action="install")` skips those hooks.
|
|
211
|
+
- Project root detection walks up from CWD looking for `node_modules/0xray`, `.opencode/xray/features.json`, or `package.json`. Override with `XRAY_PROJECT_ROOT` env var.
|
|
212
212
|
- `logs/framework/` is created automatically. Never breaks the agent if permissions fail.
|
|
@@ -96,7 +96,7 @@ codex_terms: [5, 7, 32] # Related Codex term numbers
|
|
|
96
96
|
```markdown
|
|
97
97
|
## What Next?
|
|
98
98
|
|
|
99
|
-
- Related Codex terms: [codex.json](../../.opencode/
|
|
99
|
+
- Related Codex terms: [codex.json](../../.opencode/xray/codex.json)
|
|
100
100
|
- Next story to write: [suggestion]
|
|
101
101
|
```
|
|
102
102
|
|