0xray 3.0.14 → 3.1.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.
- package/.gitignore.default +59 -0
- package/.mcp.json +35 -0
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/dependency-audit.md +3 -3
- package/.opencode/commands/summary-logger.md +4 -4
- package/.opencode/enforcer-config.json +2 -2
- package/.opencode/hooks/post-commit +1 -1
- package/.opencode/init.sh +10 -4
- package/.plugin/plugin.json +11 -0
- package/AGENTS-consumer.md +46 -0
- package/AGENTS.md +10 -10
- package/LICENSE +1 -1
- package/README.md +8 -8
- package/SKILLS.md +140 -0
- package/dist/.gitignore.default +59 -0
- package/dist/AGENTS.md +10 -10
- package/dist/CHANGELOG.md +34 -0
- package/dist/LICENSE +1 -1
- package/dist/README.md +8 -8
- package/dist/SKILLS.md +140 -0
- package/dist/agents/index.js +3 -1
- package/dist/agents/registry.js +13 -0
- package/dist/analytics/routing-refiner.js +1 -1
- package/dist/architect/architectural-integrity.js +3 -3
- package/dist/benchmark/performance-benchmark.js +4 -3
- package/dist/cli/commands/antigravity-status.js +23 -23
- package/dist/cli/commands/credible-init.js +1 -1
- package/dist/cli/commands/hermes-install.js +12 -4
- package/dist/cli/commands/mcp-install.js +1 -1
- package/dist/cli/commands/openclaw-install.js +10 -1
- package/dist/cli/commands/opencode-install.js +22 -0
- 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 +39 -2
- package/dist/cli/commands/status.js +8 -3
- package/dist/cli/commands/storyteller.js +2 -2
- package/dist/cli/index.js +17 -11
- package/dist/cli/server.js +4 -4
- package/dist/core/activity-logger.js +4 -4
- package/dist/core/agent-spawn-gate.js +1 -1
- package/dist/core/boot-orchestrator.js +30 -31
- package/dist/core/bridge.mjs +26 -26
- package/dist/core/codex-formatter.js +2 -3
- package/dist/core/codex-injector.js +7 -7
- package/dist/core/config-loader.js +3 -2
- package/dist/core/config-paths.js +38 -31
- package/dist/core/context-loader.js +5 -5
- package/dist/core/features-config.js +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/logging-config.js +7 -7
- package/dist/core/orchestrator.js +2 -2
- package/dist/core/system-prompt-generator.js +2 -2
- package/dist/core/xray-activation.js +42 -41
- package/dist/delegation/agent-delegator.js +3 -3
- package/dist/enforcement/enforcer-tools.js +4 -4
- package/dist/enforcement/loaders/codex-loader.js +2 -2
- package/dist/execution/opencode-cli-invoker.js +1 -1
- package/dist/governance/governance-service.js +1 -1
- package/dist/governance/llm-governance-provider.js +223 -0
- package/dist/index.js +6 -6
- package/dist/inference/deploy-verifier.js +1 -1
- package/dist/inference/inference-cycle.js +16 -16
- package/dist/integrations/base/README.md +1 -1
- package/dist/integrations/enforcement-gate.js +2 -2
- package/dist/integrations/governance/index.js +1 -1
- package/dist/integrations/grok/grok-cli.js +20 -6
- package/dist/integrations/grok/hooks/pre-tool-use.js +3 -3
- package/dist/integrations/grok/plugin/0xray/.mcp.json +16 -4
- package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +2 -2
- package/dist/integrations/hermes-agent/__init__.py +90 -79
- package/dist/integrations/hermes-agent/after-install.md +14 -14
- package/dist/integrations/hermes-agent/bridge.mjs +60 -25
- package/dist/integrations/hermes-agent/plugin.yaml +5 -5
- package/dist/integrations/hermes-agent/schemas.py +61 -12
- package/dist/integrations/hermes-agent/test_plugin.py +124 -124
- package/dist/integrations/hermes-agent/tools.py +129 -25
- package/dist/integrations/openclaw/README.md +6 -6
- package/dist/integrations/openclaw/config.js +1 -1
- package/dist/integrations/openclaw/index.js +2 -2
- package/dist/integrations/openclaw/types.js +3 -3
- package/dist/integrations/plugins/plugin-integration.js +1 -1
- package/dist/integrations/plugins/plugin-registry.js +3 -3
- package/dist/mcps/architect-tools.server.js +3 -2
- package/dist/mcps/auto-format.server.js +2 -2
- package/dist/mcps/boot-orchestrator.server.js +2 -2
- package/dist/mcps/config/config-loader.js +40 -9
- package/dist/mcps/config/server-config-registry.js +10 -10
- package/dist/mcps/connection/mcp-connection.js +1 -1
- package/dist/mcps/enforcer-tools.server.js +2 -2
- package/dist/mcps/estimation.server.js +3 -2
- package/dist/mcps/framework-compliance-audit.server.js +2 -2
- package/dist/mcps/framework-help.server.js +9 -8
- package/dist/mcps/governance.server.js +8 -4
- package/dist/mcps/knowledge-skills/api-design.server.js +3 -2
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +3 -2
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +3 -3
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +2 -2
- package/dist/mcps/knowledge-skills/code-review.server.js +14 -39
- package/dist/mcps/knowledge-skills/content-creator.server.js +3 -3
- package/dist/mcps/knowledge-skills/database-design.server.js +2 -2
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +3 -2
- package/dist/mcps/knowledge-skills/git-workflow.server.js +3 -2
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +3 -3
- package/dist/mcps/knowledge-skills/log-monitor.server.js +3 -3
- package/dist/mcps/knowledge-skills/mobile-development.server.js +3 -3
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +3 -3
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +2 -2
- package/dist/mcps/knowledge-skills/project-analysis.server.js +2 -2
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +3 -2
- package/dist/mcps/knowledge-skills/security-audit.server.js +14 -44
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +3 -2
- package/dist/mcps/knowledge-skills/session-management.server.js +3 -2
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +105 -3
- package/dist/mcps/knowledge-skills/strategist.server.js +3 -3
- package/dist/mcps/knowledge-skills/tech-writer.server.js +3 -3
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +3 -2
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +2 -2
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +5 -4
- package/dist/mcps/lint.server.js +4 -4
- package/dist/mcps/mcp-client.js +5 -5
- package/dist/mcps/model-health-check.server.js +3 -2
- package/dist/mcps/orchestrator/server.js +4 -3
- package/dist/mcps/orchestrator.server.js +2 -1
- package/dist/mcps/performance-analysis.server.js +2 -2
- package/dist/mcps/processor-pipeline.server.js +3 -2
- package/dist/mcps/registry.json +1 -1
- package/dist/mcps/researcher.server.js +14 -39
- package/dist/mcps/security-scan.server.js +2 -2
- package/dist/mcps/simulation/server-simulations.js +3 -3
- package/dist/mcps/state-manager.server.js +5 -5
- package/dist/metrics/agent-metrics.js +1 -1
- package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +4 -4
- package/dist/orchestrator/intelligent-commit-batcher.js +2 -3
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +9 -9
- package/dist/orchestrator/orchestrator.js +9 -8
- package/dist/orchestrator/universal-registry-bridge.js +4 -4
- package/dist/postprocessor/PostProcessor.js +9 -9
- package/dist/postprocessor/services/RegressionAnalysisService.js +4 -4
- package/dist/postprocessor/triggers/GitHookTrigger.js +18 -18
- package/dist/processors/implementations/agents-md-validation-processor.js +2 -2
- package/dist/processors/implementations/inference-improvement-processor.js +1 -2
- package/dist/processors/implementations/log-protection-processor.js +2 -2
- package/dist/processors/implementations/publish-preflight-processor.js +2 -3
- package/dist/processors/implementations/regression-testing-processor.js +2 -2
- package/dist/processors/implementations/session-summary-processor.js +2 -2
- package/dist/processors/implementations/storytelling-trigger-processor.js +1 -2
- package/dist/public/about.html +6 -6
- package/dist/public/enterprise.html +1 -1
- package/dist/public/features.html +2 -2
- package/dist/public/index.html +4 -4
- package/dist/reporting/report-formatter.js +1 -1
- package/dist/scripts/activate-kernel-pipeline.js +4 -4
- package/dist/scripts/pre-command +1 -1
- package/dist/services/inference-tuner.js +2 -2
- package/dist/skills/api-design/SKILL.md +1 -1
- package/dist/skills/architect-tools/SKILL.md +1 -1
- package/dist/skills/architecture-patterns/SKILL.md +1 -1
- package/dist/skills/auto-format/SKILL.md +1 -1
- package/dist/skills/boot-orchestrator/SKILL.md +1 -1
- package/dist/skills/bug-triage/SKILL.md +1 -1
- package/dist/skills/code-analyzer/SKILL.md +1 -1
- package/dist/skills/code-review/SKILL.md +1 -1
- package/dist/skills/enforcer/SKILL.md +1 -1
- package/dist/skills/framework-compliance-audit/SKILL.md +1 -1
- package/dist/skills/git-workflow/SKILL.md +1 -1
- package/dist/skills/hermes-agent/SKILL.md +42 -42
- package/dist/skills/inference-improve/SKILL.md +1 -1
- package/dist/skills/lint/SKILL.md +1 -1
- package/dist/skills/log-monitor/SKILL.md +1 -1
- package/dist/skills/model-health-check/SKILL.md +1 -1
- package/dist/skills/multimodal-looker/SKILL.md +1 -1
- package/dist/skills/orchestrator/SKILL.md +1 -1
- package/dist/skills/performance-analysis/SKILL.md +1 -1
- package/dist/skills/performance-optimization/SKILL.md +1 -1
- package/dist/skills/processor-pipeline/SKILL.md +1 -1
- package/dist/skills/project-analysis/SKILL.md +1 -1
- package/dist/skills/refactoring-strategies/SKILL.md +1 -1
- package/dist/skills/registry.json +1 -1
- package/dist/skills/researcher/SKILL.md +1 -1
- package/dist/skills/security-audit/SKILL.md +1 -1
- package/dist/skills/security-scan/SKILL.md +1 -1
- package/dist/skills/session-management/SKILL.md +1 -1
- package/dist/skills/state-manager/SKILL.md +1 -1
- package/dist/skills/storyteller/SKILL.md +1 -1
- package/dist/skills/testing-best-practices/SKILL.md +1 -1
- package/dist/skills/testing-strategy/SKILL.md +1 -1
- package/dist/skills/ui-ux-design/SKILL.md +1 -1
- package/dist/state/index.js +1 -1
- package/dist/state/state-manager.js +3 -4
- package/dist/utils/import-resolver.js +1 -1
- package/dist/utils/path-resolver.js +2 -2
- package/dist/utils/token-manager.js +1 -1
- package/dist/validation/estimation-validator.js +1 -1
- package/package.json +10 -3
- package/scripts/hooks/pre-command +1 -1
- package/scripts/hooks/run-hook.js +2 -2
- package/scripts/node/auto-reflection-generator.mjs +30 -36
- package/scripts/node/govern-reflection.mjs +1 -1
- package/scripts/node/postinstall.cjs +37 -2
- package/scripts/node/pre-publish-guard.js +13 -9
- package/scripts/node/setup-xai-oauth.mjs +244 -0
- package/scripts/node/universal-version-manager.js +8 -8
- package/scripts/node/version-manager.mjs +1 -1
- package/src/integrations/grok/plugin/0xray/.mcp.json +16 -4
- package/src/integrations/grok/plugin/0xray/hooks/hooks.json +2 -2
- package/src/mcps/architect-tools.server.ts +2 -2
- package/src/mcps/auto-format.server.ts +2 -2
- package/src/mcps/boot-orchestrator.server.ts +2 -2
- package/src/mcps/config/__tests__/config-loader.test.ts +29 -33
- package/src/mcps/config/__tests__/server-config-registry.test.ts +12 -12
- package/src/mcps/config/config-loader.ts +50 -11
- package/src/mcps/config/server-config-registry.ts +10 -10
- package/src/mcps/connection/mcp-connection.ts +1 -1
- package/src/mcps/enforcer-tools.server.ts +2 -2
- package/src/mcps/estimation.server.ts +3 -2
- package/src/mcps/framework-compliance-audit.server.ts +2 -2
- package/src/mcps/framework-help.server.ts +9 -8
- package/src/mcps/governance.server.ts +8 -3
- package/src/mcps/knowledge-skills/api-design.server.ts +3 -2
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +2 -2
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +2 -2
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +2 -2
- package/src/mcps/knowledge-skills/code-review.server.ts +21 -36
- package/src/mcps/knowledge-skills/content-creator.server.ts +3 -3
- package/src/mcps/knowledge-skills/database-design.server.ts +2 -2
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +3 -2
- package/src/mcps/knowledge-skills/git-workflow.server.ts +3 -2
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +3 -3
- package/src/mcps/knowledge-skills/log-monitor.server.ts +3 -3
- package/src/mcps/knowledge-skills/mobile-development.server.ts +3 -3
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +3 -3
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +2 -2
- package/src/mcps/knowledge-skills/project-analysis.server.ts +2 -2
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +3 -2
- package/src/mcps/knowledge-skills/security-audit.server.ts +21 -40
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +3 -2
- package/src/mcps/knowledge-skills/session-management.server.ts +3 -2
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +113 -3
- package/src/mcps/knowledge-skills/strategist.server.ts +3 -3
- package/src/mcps/knowledge-skills/tech-writer.server.ts +3 -3
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +3 -2
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +2 -2
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +5 -4
- package/src/mcps/lint.server.ts +4 -4
- package/src/mcps/mcp-client.ts +5 -5
- package/src/mcps/model-health-check.server.ts +2 -2
- package/src/mcps/orchestrator/server.ts +4 -3
- package/src/mcps/orchestrator.server.ts +2 -1
- package/src/mcps/performance-analysis.server.ts +2 -2
- package/src/mcps/processor-pipeline.server.ts +3 -2
- package/src/mcps/registry.json +1 -1
- package/src/mcps/researcher.server.ts +21 -36
- package/src/mcps/security-scan.server.ts +2 -2
- package/src/mcps/simulation/server-simulations.ts +3 -3
- package/src/mcps/state-manager.server.ts +5 -5
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/dependency-audit.md +3 -3
- package/src/opencode/commands/summary-logger.md +4 -4
- package/src/opencode/enforcer-config.json +2 -2
- package/src/skills/api-design/SKILL.md +1 -1
- package/src/skills/architect-tools/SKILL.md +1 -1
- package/src/skills/architecture-patterns/SKILL.md +1 -1
- package/src/skills/auto-format/SKILL.md +1 -1
- package/src/skills/boot-orchestrator/SKILL.md +1 -1
- package/src/skills/bug-triage/SKILL.md +1 -1
- package/src/skills/code-analyzer/SKILL.md +1 -1
- package/src/skills/code-review/SKILL.md +1 -1
- package/src/skills/enforcer/SKILL.md +1 -1
- package/src/skills/framework-compliance-audit/SKILL.md +1 -1
- package/src/skills/git-workflow/SKILL.md +1 -1
- package/src/skills/hermes-agent/SKILL.md +42 -42
- package/src/skills/inference-improve/SKILL.md +1 -1
- package/src/skills/lint/SKILL.md +1 -1
- package/src/skills/log-monitor/SKILL.md +1 -1
- package/src/skills/model-health-check/SKILL.md +1 -1
- package/src/skills/multimodal-looker/SKILL.md +1 -1
- package/src/skills/orchestrator/SKILL.md +1 -1
- package/src/skills/performance-analysis/SKILL.md +1 -1
- package/src/skills/performance-optimization/SKILL.md +1 -1
- package/src/skills/processor-pipeline/SKILL.md +1 -1
- package/src/skills/project-analysis/SKILL.md +1 -1
- package/src/skills/refactoring-strategies/SKILL.md +1 -1
- package/src/skills/registry.json +1 -1
- package/src/skills/researcher/SKILL.md +1 -1
- package/src/skills/security-audit/SKILL.md +1 -1
- package/src/skills/security-scan/SKILL.md +1 -1
- package/src/skills/session-management/SKILL.md +1 -1
- package/src/skills/state-manager/SKILL.md +1 -1
- package/src/skills/storyteller/SKILL.md +1 -1
- package/src/skills/testing-best-practices/SKILL.md +1 -1
- package/src/skills/testing-strategy/SKILL.md +1 -1
- package/src/skills/ui-ux-design/SKILL.md +1 -1
- package/xray/agents_template.md +46 -0
- package/xray/codex.json +598 -0
- package/dist/plugin/xray-codex-injection.js +0 -857
- /package/dist/integrations/openclaw/hooks/{strray-hooks.js → xray-hooks.js} +0 -0
|
@@ -12,7 +12,7 @@ import { frameworkLogger } from '../core/framework-logger.js';
|
|
|
12
12
|
export class EstimationValidator {
|
|
13
13
|
estimations = new Map();
|
|
14
14
|
calibrations = new Map();
|
|
15
|
-
STORAGE_KEY = '
|
|
15
|
+
STORAGE_KEY = 'xray-estimations';
|
|
16
16
|
constructor() {
|
|
17
17
|
this.loadFromStorage();
|
|
18
18
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "0xray",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.1",
|
|
4
4
|
"description": "Multi-agent orchestration and Codex governance for OpenCode, Hermes, Grok Build, and OpenClaw",
|
|
5
5
|
"readme": "README.md",
|
|
6
6
|
"license": "MIT",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"version:bump": "node scripts/node/version-manager.mjs",
|
|
61
61
|
"version": "node scripts/node/version-manager.mjs",
|
|
62
62
|
"prebuild": "rm -rf dist tsconfig.tsbuildinfo tsconfig.*.tsbuildinfo",
|
|
63
|
-
"build": "tsc && mkdir -p dist/public dist/scripts && cp -r public/* dist/public/ && cp scripts/hooks/pre-command dist/scripts/ && cp scripts/hooks/pre-command.mjs dist/scripts/ && cp README.md AGENTS.md CHANGELOG.md LICENSE dist/ && find src -name '*.mjs' ! -path '*/__tests__/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done && for dir in skills integrations mcps; do find src/$dir -type f ! -name '*.ts' ! -path '*/.pytest_cache/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done; done && mkdir -p dist/plugin && (find dist/plugin -name '*codex-injection*.js' -exec cp {} dist/plugin/xray-codex-injection.js \\; 2>/dev/null || true) && cp -r src/opencode/ .opencode/ &&
|
|
63
|
+
"build": "tsc && mkdir -p dist/public dist/scripts && cp -r public/* dist/public/ && cp scripts/hooks/pre-command dist/scripts/ && cp scripts/hooks/pre-command.mjs dist/scripts/ && cp README.md AGENTS.md SKILLS.md CHANGELOG.md LICENSE .gitignore.default dist/ && find src -name '*.mjs' ! -path '*/__tests__/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done && for dir in skills integrations mcps; do find src/$dir -type f ! -name '*.ts' ! -path '*/.pytest_cache/*' | while read f; do tgt=\"dist/${f#src/}\"; mkdir -p \"$(dirname $tgt)\"; cp \"$f\" \"$tgt\"; done; done && mkdir -p dist/plugin && (find dist/plugin -name '*codex-injection*.js' -exec cp {} dist/plugin/xray-codex-injection.js \\; 2>/dev/null || true) && cp -r src/opencode/ .opencode/ && mkdir -p .xray && cp xray/codex.json .xray/codex.json 2>/dev/null || true",
|
|
64
64
|
"build:all": "npm run build",
|
|
65
65
|
"ci-install": "npm ci",
|
|
66
66
|
"clean": "rm -rf dist tsconfig.tsbuildinfo tsconfig.*.tsbuildinfo",
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"test:e2e": "node scripts/node/validate-mcp-connectivity.js && node scripts/node/validate-external-processes.js",
|
|
97
97
|
"validate": "echo \"[xray] Use 'npm test' or 'npm run test:comprehensive'.\"",
|
|
98
98
|
"validate:quick": "npm run validate",
|
|
99
|
-
"debug:inference:force": "
|
|
99
|
+
"debug:inference:force": "XRAY_FORCE_MCP_GOVERNANCE=true XRAY_DEV_PATH=dist node dist/cli/index.js inference:run --force",
|
|
100
100
|
"validate:full": "npm run validate",
|
|
101
101
|
"test:unified": "node scripts/test/test-unified-framework.mjs",
|
|
102
102
|
"test:consumer": "node scripts/test/test-consumer-readiness.cjs",
|
|
@@ -138,6 +138,7 @@
|
|
|
138
138
|
"src/integrations/grok/plugin/0xray/",
|
|
139
139
|
"src/skills/",
|
|
140
140
|
"src/mcps/",
|
|
141
|
+
".plugin/",
|
|
141
142
|
".opencode/agents/",
|
|
142
143
|
".opencode/commands/",
|
|
143
144
|
".opencode/hooks/",
|
|
@@ -148,7 +149,13 @@
|
|
|
148
149
|
".opencode/enforcer-config.json",
|
|
149
150
|
"opencode.json",
|
|
150
151
|
"README.md",
|
|
152
|
+
".mcp.json",
|
|
151
153
|
"AGENTS.md",
|
|
154
|
+
"AGENTS-consumer.md",
|
|
155
|
+
"SKILLS.md",
|
|
156
|
+
"xray/agents_template.md",
|
|
157
|
+
"xray/codex.json",
|
|
158
|
+
".gitignore.default",
|
|
152
159
|
"LICENSE"
|
|
153
160
|
],
|
|
154
161
|
"dependencies": {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* 0xRay Git Hook Runner
|
|
5
5
|
*
|
|
6
6
|
* Called by git hooks (pre-commit, post-commit, pre-push, post-push)
|
|
7
7
|
* to perform validation, logging, and monitoring.
|
|
@@ -565,6 +565,6 @@ handler()
|
|
|
565
565
|
})
|
|
566
566
|
.catch((err) => {
|
|
567
567
|
logError(`Hook crashed: ${err.message}`);
|
|
568
|
-
console.error(`
|
|
568
|
+
console.error(`0xRay hook error: ${err.message}`);
|
|
569
569
|
process.exit(1);
|
|
570
570
|
});
|
|
@@ -107,47 +107,41 @@ function getChangedFiles(count = 20) {
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
function loadConfig() {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
mode: "minimal",
|
|
128
|
-
triggers: {
|
|
129
|
-
commit_threshold: {
|
|
130
|
-
enabled: triggers.commit_count?.enabled ?? true,
|
|
131
|
-
threshold: triggers.commit_count?.threshold ?? 10,
|
|
132
|
-
},
|
|
133
|
-
time_threshold: {
|
|
134
|
-
enabled: true,
|
|
135
|
-
days: 7,
|
|
136
|
-
},
|
|
110
|
+
const configPath = join(process.cwd(), ".xray", "features.json");
|
|
111
|
+
|
|
112
|
+
if (existsSync(configPath)) {
|
|
113
|
+
try {
|
|
114
|
+
const content = readFileSync(configPath, "utf-8");
|
|
115
|
+
const parsed = JSON.parse(content);
|
|
116
|
+
if (parsed.auto_reflection) {
|
|
117
|
+
return parsed.auto_reflection;
|
|
118
|
+
}
|
|
119
|
+
if (parsed.storytelling?.reflection_triggers) {
|
|
120
|
+
const triggers = parsed.storytelling.reflection_triggers;
|
|
121
|
+
return {
|
|
122
|
+
mode: "minimal",
|
|
123
|
+
triggers: {
|
|
124
|
+
commit_threshold: {
|
|
125
|
+
enabled: triggers.commit_count?.enabled ?? true,
|
|
126
|
+
threshold: triggers.commit_count?.threshold ?? 10,
|
|
137
127
|
},
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
off: { commit_threshold: 999, days_threshold: 365 },
|
|
128
|
+
time_threshold: {
|
|
129
|
+
enabled: true,
|
|
130
|
+
days: 7,
|
|
142
131
|
},
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
132
|
+
},
|
|
133
|
+
thresholds: {
|
|
134
|
+
full: { commit_threshold: 10, days_threshold: 5 },
|
|
135
|
+
minimal: { commit_threshold: 25, days_threshold: 14 },
|
|
136
|
+
off: { commit_threshold: 999, days_threshold: 365 },
|
|
137
|
+
},
|
|
138
|
+
};
|
|
147
139
|
}
|
|
140
|
+
} catch {
|
|
141
|
+
// ignore
|
|
148
142
|
}
|
|
149
143
|
}
|
|
150
|
-
|
|
144
|
+
|
|
151
145
|
// Default config
|
|
152
146
|
return {
|
|
153
147
|
mode: "minimal",
|
|
@@ -147,7 +147,7 @@ async function main() {
|
|
|
147
147
|
console.log(` Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
148
148
|
console.log("═══════════════════════════════════════\n");
|
|
149
149
|
|
|
150
|
-
// v2 path under logs/ (fwLogger discipline) + .
|
|
150
|
+
// v2 path under logs/ (fwLogger discipline) + .xray/
|
|
151
151
|
const outputPath = path.join(process.cwd(), "logs", "framework", "governance-result.json");
|
|
152
152
|
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
153
153
|
fs.writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
|
@@ -34,6 +34,41 @@ if (fs.existsSync(agentsConsumer) && resolvedPackage !== resolvedTarget) {
|
|
|
34
34
|
fs.copyFileSync(agentsConsumer, agentsDest);
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
// Copy .gitignore.default → .gitignore (never overwrite existing)
|
|
38
|
+
const gitignoreSource = path.join(packageRoot, ".gitignore.default");
|
|
39
|
+
const gitignoreDest = path.join(targetDir, ".gitignore");
|
|
40
|
+
if (!fs.existsSync(gitignoreDest) && resolvedPackage !== resolvedTarget) {
|
|
41
|
+
fs.copyFileSync(gitignoreSource, gitignoreDest);
|
|
42
|
+
structuredLog('postinstall', 'Created .gitignore from template', 'info');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Sync core skills from dist/ → .opencode/skills/
|
|
46
|
+
const skillsSource = path.join(packageRoot, 'dist', 'skills');
|
|
47
|
+
const skillsDest = path.join(targetDir, '.opencode', 'skills');
|
|
48
|
+
if (fs.existsSync(skillsSource) && resolvedPackage !== resolvedTarget) {
|
|
49
|
+
try {
|
|
50
|
+
if (!fs.existsSync(skillsDest)) fs.mkdirSync(skillsDest, { recursive: true });
|
|
51
|
+
const skillDirs = fs.readdirSync(skillsSource, { withFileTypes: true });
|
|
52
|
+
let copied = 0, skipped = 0;
|
|
53
|
+
for (const entry of skillDirs) {
|
|
54
|
+
if (!entry.isDirectory()) continue;
|
|
55
|
+
const skillMd = path.join(skillsSource, entry.name, 'SKILL.md');
|
|
56
|
+
if (!fs.existsSync(skillMd)) continue;
|
|
57
|
+
const destMd = path.join(skillsDest, entry.name, 'SKILL.md');
|
|
58
|
+
const destDir = path.dirname(destMd);
|
|
59
|
+
if (!fs.existsSync(destDir)) fs.mkdirSync(destDir, { recursive: true });
|
|
60
|
+
if (fs.existsSync(destMd)) {
|
|
61
|
+
if (fs.statSync(skillMd).mtime <= fs.statSync(destMd).mtime) continue;
|
|
62
|
+
}
|
|
63
|
+
fs.copyFileSync(skillMd, destMd);
|
|
64
|
+
copied++;
|
|
65
|
+
}
|
|
66
|
+
if (copied > 0) structuredLog('postinstall', `Skills: ${copied} installed to .opencode/skills/`, 'info');
|
|
67
|
+
} catch (e) {
|
|
68
|
+
structuredLog('postinstall', `Skills sync skipped: ${e.message}`, 'warn');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
37
72
|
// Register MCP servers with Grok CLI (if available) using absolute paths to installed dist
|
|
38
73
|
// Full v2 surface: governance + skills + orchestrator + enforcer (additive, preserves prior behavior)
|
|
39
74
|
if (resolvedPackage !== resolvedTarget) {
|
|
@@ -41,12 +76,12 @@ if (resolvedPackage !== resolvedTarget) {
|
|
|
41
76
|
execSync('which grok', { stdio: 'ignore' });
|
|
42
77
|
const govServer = path.join(packageRoot, 'dist/mcps/governance.server.js');
|
|
43
78
|
const skillsServer = path.join(packageRoot, 'dist/mcps/knowledge-skills/skill-invocation.server.js');
|
|
44
|
-
const orchServer = path.join(packageRoot, 'dist/mcps/orchestrator
|
|
79
|
+
const orchServer = path.join(packageRoot, 'dist/mcps/orchestrator.server.js');
|
|
45
80
|
const enforcerServer = path.join(packageRoot, 'dist/mcps/enforcer-tools.server.js');
|
|
46
81
|
const xrayRoot = targetDir;
|
|
47
82
|
|
|
48
83
|
execSync(
|
|
49
|
-
`grok mcp add xray-governance --command node --args "${govServer}" --env "
|
|
84
|
+
`grok mcp add xray-governance --command node --args "${govServer}" --env "XRAY_FORCE_MCP_GOVERNANCE=true" --env "XRAY_ROOT=${xrayRoot}"`,
|
|
50
85
|
{ stdio: 'pipe' }
|
|
51
86
|
);
|
|
52
87
|
structuredLog('postinstall', 'Registered xray-governance with Grok CLI', 'info');
|
|
@@ -166,15 +166,19 @@ function checkVersionManagerRan() {
|
|
|
166
166
|
|
|
167
167
|
// Check that files have been updated (look for recent timestamps or version)
|
|
168
168
|
const { resolveConfigPath } = require('../helpers/resolve-config-path.cjs');
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
169
|
+
let features;
|
|
170
|
+
try {
|
|
171
|
+
const featuresPath = resolveConfigPath('features.json', rootDir);
|
|
172
|
+
features = JSON.parse(fs.readFileSync(featuresPath, 'utf-8'));
|
|
173
|
+
// Version manager should have updated version fields
|
|
174
|
+
if (!features.version && !features.xray_version) {
|
|
175
|
+
warnings.push('features.json may not have been synced by version manager');
|
|
176
|
+
log('features.json may need version sync', 'warn');
|
|
177
|
+
} else {
|
|
178
|
+
log('Version manager appears to have run', 'success');
|
|
179
|
+
}
|
|
180
|
+
} catch {
|
|
181
|
+
log('features.json not found — skipping version sync check', 'warn');
|
|
178
182
|
}
|
|
179
183
|
|
|
180
184
|
return true;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* xAI OAuth PKCE setup — saves verifier to temp file so it survives aborts.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node setup-xai-oauth.mjs # prints URL, waits for callback
|
|
7
|
+
* node setup-xai-oauth.mjs <code> # exchange previously gotten code
|
|
8
|
+
* node setup-xai-oauth.mjs daemon # non-blocking: prints URL & exits,
|
|
9
|
+
* # child server handles callback + deploy
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { randomBytes, createHash } from "node:crypto";
|
|
13
|
+
import { writeFileSync, readFileSync, unlinkSync, existsSync, mkdirSync } from "node:fs";
|
|
14
|
+
import { join } from "node:path";
|
|
15
|
+
import { homedir, tmpdir } from "node:os";
|
|
16
|
+
import { fork } from "node:child_process";
|
|
17
|
+
import http from "node:http";
|
|
18
|
+
|
|
19
|
+
const PORT = 56121;
|
|
20
|
+
const HERMES_AUTH_PATH = join(homedir(), ".hermes", "auth.json");
|
|
21
|
+
const VERIFIER_PATH = join(tmpdir(), "xray-xai-oauth-verifier.txt");
|
|
22
|
+
const XAI_AUTH_URL = "https://auth.x.ai/oauth2/authorize";
|
|
23
|
+
const XAI_TOKEN_URL = "https://auth.x.ai/oauth2/token";
|
|
24
|
+
const XAI_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
|
|
25
|
+
const REDIRECT_URI = `http://127.0.0.1:${PORT}/callback`;
|
|
26
|
+
|
|
27
|
+
function generateVerifier() {
|
|
28
|
+
return randomBytes(32).toString("base64")
|
|
29
|
+
.replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function challenge(verifier) {
|
|
33
|
+
return createHash("sha256").update(verifier).digest()
|
|
34
|
+
.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function printUrl(verifier) {
|
|
38
|
+
const codeChallenge = challenge(verifier);
|
|
39
|
+
const state = randomBytes(16).toString("hex");
|
|
40
|
+
const nonce = randomBytes(16).toString("hex");
|
|
41
|
+
|
|
42
|
+
const params = new URLSearchParams({
|
|
43
|
+
response_type: "code",
|
|
44
|
+
client_id: XAI_CLIENT_ID,
|
|
45
|
+
redirect_uri: REDIRECT_URI,
|
|
46
|
+
scope: "openid profile email offline_access grok-cli:access api:access",
|
|
47
|
+
code_challenge: codeChallenge,
|
|
48
|
+
code_challenge_method: "S256",
|
|
49
|
+
state, nonce,
|
|
50
|
+
plan: "generic",
|
|
51
|
+
referrer: "hermes-agent",
|
|
52
|
+
}).toString();
|
|
53
|
+
|
|
54
|
+
console.log("\n========================================");
|
|
55
|
+
console.log(" xAI OAuth Setup");
|
|
56
|
+
console.log("========================================");
|
|
57
|
+
console.log("\nOpen this URL in your browser:\n");
|
|
58
|
+
console.log(` ${XAI_AUTH_URL}?${params}\n`);
|
|
59
|
+
console.log("Authorize → callback handled → token saved → Railway deployed.");
|
|
60
|
+
console.log("You can close the browser tab when it says ✅ Authorized.\n");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function startServer(verifier) {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const server = http.createServer((req, res) => {
|
|
66
|
+
const url = new URL(req.url, `http://127.0.0.1:${PORT}`);
|
|
67
|
+
|
|
68
|
+
if (url.pathname === "/callback" && url.searchParams.has("code")) {
|
|
69
|
+
const code = url.searchParams.get("code");
|
|
70
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
71
|
+
res.end(wrapHtml("<h1>✅ Authorized!</h1><p>Token saved. Railway deploying. You can close this window.</p>"));
|
|
72
|
+
try { unlinkSync(VERIFIER_PATH); } catch {}
|
|
73
|
+
// Give response a moment to send, then close
|
|
74
|
+
setTimeout(() => { server.close(); resolve(code); }, 100);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (url.pathname === "/callback") {
|
|
79
|
+
res.writeHead(400);
|
|
80
|
+
res.end("Missing code parameter");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
res.writeHead(404, { "Content-Type": "text/html" });
|
|
85
|
+
res.end(wrapHtml("<h1>404</h1><p>This server only handles xAI OAuth callbacks.</p>"));
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
server.listen(PORT, "127.0.0.1", () => {
|
|
89
|
+
// Persist verifier so it survives script abort
|
|
90
|
+
writeFileSync(VERIFIER_PATH, verifier, "utf-8");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
server.on("error", (err) => {
|
|
94
|
+
if (err.code === "EADDRINUSE") {
|
|
95
|
+
console.error(`Port ${PORT} is already in use.`);
|
|
96
|
+
}
|
|
97
|
+
reject(err);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function wrapHtml(body) {
|
|
103
|
+
return `<html><head><style>body{font-family:sans-serif;display:flex;justify-content:center;align-items:center;height:100vh;background:#0f172a;color:#e2e8f0;text-align:center}</style></head><body>${body}</body></html>`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function exchangeCode(code, verifier) {
|
|
107
|
+
const body = new URLSearchParams({
|
|
108
|
+
grant_type: "authorization_code",
|
|
109
|
+
code,
|
|
110
|
+
redirect_uri: REDIRECT_URI,
|
|
111
|
+
code_verifier: verifier,
|
|
112
|
+
client_id: XAI_CLIENT_ID,
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const response = await fetch(XAI_TOKEN_URL, {
|
|
116
|
+
method: "POST",
|
|
117
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
118
|
+
body: body.toString(),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
const text = await response.text();
|
|
123
|
+
throw new Error(`Token exchange failed (${response.status}): ${text}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return response.json();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function saveToken(tokens) {
|
|
130
|
+
const authData = {
|
|
131
|
+
"xai-oauth": {
|
|
132
|
+
access_token: tokens.access_token,
|
|
133
|
+
refresh_token: tokens.refresh_token,
|
|
134
|
+
expires_at: Math.floor(Date.now() / 1000) + (tokens.expires_in || 86400),
|
|
135
|
+
token_type: tokens.token_type || "Bearer",
|
|
136
|
+
scope: tokens.scope || "openid profile email offline_access grok-cli:access api:access",
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
mkdirSync(join(homedir(), ".hermes"), { recursive: true });
|
|
141
|
+
writeFileSync(HERMES_AUTH_PATH, JSON.stringify(authData, null, 2));
|
|
142
|
+
|
|
143
|
+
console.log(`\n✅ Token saved to ${HERMES_AUTH_PATH}`);
|
|
144
|
+
console.log(` Expires: ${new Date(Date.now() + (tokens.expires_in || 86400) * 1000).toISOString()}\n`);
|
|
145
|
+
return authData;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
async function deployToRailway() {
|
|
149
|
+
const { execSync } = await import("node:child_process");
|
|
150
|
+
const authContent = readFileSync(HERMES_AUTH_PATH, "utf-8");
|
|
151
|
+
const base64 = Buffer.from(authContent).toString("base64");
|
|
152
|
+
|
|
153
|
+
console.log("Setting Railway env var XRAY_HERMES_AUTH...");
|
|
154
|
+
|
|
155
|
+
// Use Railway API to set the variable
|
|
156
|
+
const projectId = execSync("railway project --json 2>/dev/null || echo ''", { encoding: "utf-8" }).trim();
|
|
157
|
+
console.log("Project info:", projectId || "(no project info)");
|
|
158
|
+
|
|
159
|
+
// We need to set the var via Railway env edit API or similar
|
|
160
|
+
// For now, fall back to railway run with the var
|
|
161
|
+
try {
|
|
162
|
+
execSync(`railway env edit --json -v XRAY_HERMES_AUTH="${base64}" 2>/dev/null`, {
|
|
163
|
+
stdio: "inherit",
|
|
164
|
+
timeout: 15000,
|
|
165
|
+
});
|
|
166
|
+
} catch {
|
|
167
|
+
// env edit might not support --json; try railway up instead
|
|
168
|
+
console.log("Attempting deploy with implicit env...");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
console.log("Deploying to Railway...");
|
|
172
|
+
try {
|
|
173
|
+
execSync("railway up --service governance", { stdio: "inherit", timeout: 120000 });
|
|
174
|
+
console.log("\n✅ Deployed to Railway!");
|
|
175
|
+
} catch (err) {
|
|
176
|
+
console.error("\n⚠️ Deploy failed:", err.message);
|
|
177
|
+
console.log("Token was saved locally. Deploy manually: railway up --service governance");
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// ── Daemon mode (non-blocking) ──────────────────────────────
|
|
182
|
+
async function daemonMain() {
|
|
183
|
+
const verifier = generateVerifier();
|
|
184
|
+
printUrl(verifier);
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
const code = await startServer(verifier);
|
|
188
|
+
try { unlinkSync(VERIFIER_PATH); } catch {}
|
|
189
|
+
|
|
190
|
+
console.log("Exchanging code for tokens...");
|
|
191
|
+
const tokens = await exchangeCode(code, verifier);
|
|
192
|
+
saveToken(tokens);
|
|
193
|
+
await deployToRailway();
|
|
194
|
+
} catch (err) {
|
|
195
|
+
console.error("\n❌ Failed:", err.message);
|
|
196
|
+
try { unlinkSync(VERIFIER_PATH); } catch {}
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ── Interactive mode (blocking for code exchange) ────────────
|
|
202
|
+
async function interactiveMain() {
|
|
203
|
+
const existingCode = process.argv[2];
|
|
204
|
+
|
|
205
|
+
let verifier;
|
|
206
|
+
if (existingCode) {
|
|
207
|
+
verifier = readFileSync(VERIFIER_PATH, "utf-8").trim();
|
|
208
|
+
console.log("Using saved verifier from", VERIFIER_PATH);
|
|
209
|
+
} else {
|
|
210
|
+
verifier = generateVerifier();
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
try {
|
|
214
|
+
const code = existingCode || await startServer(verifier);
|
|
215
|
+
try { unlinkSync(VERIFIER_PATH); } catch {}
|
|
216
|
+
|
|
217
|
+
console.log("Exchanging code for tokens...");
|
|
218
|
+
const tokens = await exchangeCode(code, verifier);
|
|
219
|
+
saveToken(tokens);
|
|
220
|
+
} catch (err) {
|
|
221
|
+
console.error("\n❌ Setup failed:", err.message);
|
|
222
|
+
process.exit(1);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// ── Entry ────────────────────────────────────────────────────
|
|
227
|
+
const isDaemon = process.argv[2] === "daemon";
|
|
228
|
+
|
|
229
|
+
if (isDaemon) {
|
|
230
|
+
// Fork a child process that runs the daemon so the parent can exit immediately
|
|
231
|
+
const child = fork(process.argv[1], ["_daemon"], {
|
|
232
|
+
stdio: ["ignore", "pipe", "pipe", "ipc"],
|
|
233
|
+
detached: true,
|
|
234
|
+
});
|
|
235
|
+
child.stdout.on("data", (d) => process.stdout.write(d));
|
|
236
|
+
child.stderr.on("data", (d) => process.stderr.write(d));
|
|
237
|
+
child.unref();
|
|
238
|
+
// Give child a moment to start and print the URL
|
|
239
|
+
setTimeout(() => process.exit(0), 500);
|
|
240
|
+
} else if (process.argv[2] === "_daemon") {
|
|
241
|
+
daemonMain();
|
|
242
|
+
} else {
|
|
243
|
+
interactiveMain();
|
|
244
|
+
}
|
|
@@ -136,9 +136,9 @@ const CALCULATED_COUNTS = calculateCounts();
|
|
|
136
136
|
const OFFICIAL_VERSIONS = {
|
|
137
137
|
// Framework version
|
|
138
138
|
framework: {
|
|
139
|
-
version: "3.
|
|
139
|
+
version: "3.1.1",
|
|
140
140
|
displayName: "xray: Self-Healing AI Governance OS",
|
|
141
|
-
lastUpdated: "2026-06-
|
|
141
|
+
lastUpdated: "2026-06-16",
|
|
142
142
|
// Counts (auto-calculated, but can be overridden)
|
|
143
143
|
...CALCULATED_COUNTS,
|
|
144
144
|
},
|
|
@@ -327,29 +327,29 @@ const UPDATE_PATTERNS = [
|
|
|
327
327
|
},
|
|
328
328
|
|
|
329
329
|
// === BADGE AND COUNT PATTERNS ===
|
|
330
|
-
// Test count in docs badge (e.g., tests-
|
|
330
|
+
// Test count in docs badge (e.g., tests-2500-brightgreen)
|
|
331
331
|
{
|
|
332
332
|
pattern: /tests-[0-9]+(?=-brightgreen)/g,
|
|
333
333
|
replacement: `tests-${OFFICIAL_VERSIONS.framework.tests}`,
|
|
334
334
|
},
|
|
335
|
-
// Test count in npm badge (e.g., tests-
|
|
335
|
+
// Test count in npm badge (e.g., tests-2500%20passed-brightgreen)
|
|
336
336
|
{
|
|
337
337
|
pattern: /tests-[0-9,]+%20passed/g,
|
|
338
338
|
replacement: `tests-${OFFICIAL_VERSIONS.framework.tests}%20passed`,
|
|
339
339
|
},
|
|
340
|
-
// Test count in prose (e.g., "2,
|
|
340
|
+
// Test count in prose (e.g., "2,2500 Tests" or "2500 Tests" but NOT in badge URLs)
|
|
341
341
|
{
|
|
342
342
|
pattern: /(\*\s*✅\s*)([0-9]{1,3},?[0-9]{3})(\s*Tests)/g,
|
|
343
343
|
replacement: (match, p1, p2, p3) => {
|
|
344
344
|
return `${p1}${OFFICIAL_VERSIONS.framework.tests}${p3}`;
|
|
345
345
|
},
|
|
346
346
|
},
|
|
347
|
-
// Test count in feature bullets (e.g., "✅
|
|
347
|
+
// Test count in feature bullets (e.g., "✅ 2500 Tests")
|
|
348
348
|
{
|
|
349
349
|
pattern: /[0-9]+ Tests/g,
|
|
350
350
|
replacement: `${OFFICIAL_VERSIONS.framework.tests} Tests`,
|
|
351
351
|
},
|
|
352
|
-
// Test count in config tree (e.g., "
|
|
352
|
+
// Test count in config tree (e.g., "2500 tests")
|
|
353
353
|
{
|
|
354
354
|
pattern: /[0-9]+ tests/g,
|
|
355
355
|
replacement: `${OFFICIAL_VERSIONS.framework.tests} tests`,
|
|
@@ -384,7 +384,7 @@ const UPDATE_PATTERNS = [
|
|
|
384
384
|
pattern: /xray AI v[0-9]+\.[0-9]+\.[0-9]+/g,
|
|
385
385
|
replacement: `xray AI v${OFFICIAL_VERSIONS.framework.version}`,
|
|
386
386
|
},
|
|
387
|
-
// Footer bare version (e.g., "**Version**: 1.
|
|
387
|
+
// Footer bare version (e.g., "**Version**: 3.1.0")
|
|
388
388
|
{
|
|
389
389
|
pattern: /\*\*Version\*\*:\s*[0-9]+\.[0-9]+\.[0-9]+/g,
|
|
390
390
|
replacement: `**Version**: ${OFFICIAL_VERSIONS.framework.version}`,
|
|
@@ -308,7 +308,7 @@ function updateAgentsMd(counts) {
|
|
|
308
308
|
|
|
309
309
|
// Legacy header count update (min compat for old consumer AGENTS.md files only; xray v2 YML SSOT primary)
|
|
310
310
|
agentsMd = agentsMd.replace(
|
|
311
|
-
/0xRay\s*2\.0\s*-\s*\d+\s+Agents|
|
|
311
|
+
/0xRay\s*2\.0\s*-\s*\d+\s+Agents|0xRay\s*-\s*\d+\s+Agents/,
|
|
312
312
|
`xray v2 - ${counts.agents} Agents`
|
|
313
313
|
);
|
|
314
314
|
|
|
@@ -1,23 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mcpServers": {
|
|
3
|
-
"
|
|
3
|
+
"xray-governance": {
|
|
4
4
|
"command": "npx",
|
|
5
5
|
"args": ["-y", "0xray", "mcp", "governance"],
|
|
6
6
|
"env": {
|
|
7
7
|
"XRAY_FORCE_MCP_GOVERNANCE": "true"
|
|
8
8
|
}
|
|
9
9
|
},
|
|
10
|
-
"
|
|
10
|
+
"xray-skills": {
|
|
11
11
|
"command": "npx",
|
|
12
12
|
"args": ["-y", "0xray", "mcp", "skills"]
|
|
13
13
|
},
|
|
14
|
-
"
|
|
14
|
+
"xray-orchestrator": {
|
|
15
15
|
"command": "npx",
|
|
16
16
|
"args": ["-y", "0xray", "mcp", "orchestrator"]
|
|
17
17
|
},
|
|
18
|
-
"
|
|
18
|
+
"xray-enforcer": {
|
|
19
19
|
"command": "npx",
|
|
20
20
|
"args": ["-y", "0xray", "mcp", "enforcer"]
|
|
21
|
+
},
|
|
22
|
+
"xray-researcher": {
|
|
23
|
+
"command": "npx",
|
|
24
|
+
"args": ["-y", "0xray", "mcp", "researcher"]
|
|
25
|
+
},
|
|
26
|
+
"xray-code-review": {
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": ["-y", "0xray", "mcp", "code-review"]
|
|
29
|
+
},
|
|
30
|
+
"xray-architect-tools": {
|
|
31
|
+
"command": "npx",
|
|
32
|
+
"args": ["-y", "0xray", "mcp", "architect-tools"]
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node",
|
|
10
10
|
"args": [
|
|
11
|
-
"${
|
|
11
|
+
"${XRAY_AI_PATH:-node_modules/0xray}/dist/integrations/grok/hooks/pre-tool-use.js"
|
|
12
12
|
],
|
|
13
13
|
"timeout": 30000
|
|
14
14
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
{
|
|
22
22
|
"type": "command",
|
|
23
23
|
"command": "echo",
|
|
24
|
-
"args": ["[0xRay] Grok session started with
|
|
24
|
+
"args": ["[0xRay] Grok session started with 0xRay governance enabled"]
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
}
|
|
@@ -41,7 +41,7 @@ class XrayArchitectToolsServer {
|
|
|
41
41
|
constructor() {
|
|
42
42
|
this.server = new Server(
|
|
43
43
|
{
|
|
44
|
-
name: "architect-tools", version: "1.
|
|
44
|
+
name: "architect-tools", version: "3.1.0",
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
capabilities: {
|
|
@@ -335,7 +335,7 @@ class XrayArchitectToolsServer {
|
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
337
|
|
|
338
|
-
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
338
|
+
if (import.meta.url === `file://${fs.realpathSync(process.argv[1]!)}`) {
|
|
339
339
|
const server = new XrayArchitectToolsServer();
|
|
340
340
|
server.run().catch((error) => frameworkLogger.log("mcps/architect-tools", "run", "error", { error: String(error) }));
|
|
341
341
|
}
|