0xray 3.1.0 â 3.2.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/.gitignore.default +59 -0
- package/.mcp.json +35 -0
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/auto-format.md +3 -3
- package/.opencode/commands/auto-summary-capture.md +2 -2
- package/.opencode/commands/dependency-audit.md +3 -3
- package/.opencode/commands/enforcer-daily-scan.md +3 -3
- package/.opencode/commands/framework-compliance-audit.md +4 -4
- package/.opencode/commands/interactive-validator.md +2 -2
- package/.opencode/commands/job-summary-logger.md +2 -2
- package/.opencode/commands/mode-switch.md +1 -1
- package/.opencode/commands/model-health-check.md +2 -2
- package/.opencode/commands/performance-analysis.md +2 -2
- package/.opencode/commands/pre-commit-introspection.md +3 -3
- package/.opencode/commands/security-scan.md +3 -3
- package/.opencode/commands/sisyphus-validation.md +3 -3
- package/.opencode/commands/summary-logger.md +6 -6
- package/.opencode/enforcer-config.json +2 -2
- package/.opencode/hooks/post-commit +1 -1
- package/.opencode/init.sh +6 -0
- package/.plugin/plugin.json +11 -0
- package/AGENTS-consumer.md +46 -0
- package/AGENTS.md +2 -12
- package/LICENSE +1 -1
- package/README.md +6 -6
- package/SKILLS.md +140 -0
- package/dist/.gitignore.default +59 -0
- package/dist/AGENTS.md +2 -12
- package/dist/CHANGELOG.md +54 -0
- package/dist/LICENSE +1 -1
- package/dist/README.md +6 -6
- package/dist/SKILLS.md +140 -0
- package/dist/agents/index.js +3 -1
- package/dist/agents/registry.js +13 -0
- package/dist/analytics/consent-manager.js +0 -1
- package/dist/analytics/emerging-pattern-detector.js +0 -1
- package/dist/analytics/pattern-learning-engine.js +0 -1
- package/dist/analytics/pattern-performance-tracker.js +0 -1
- package/dist/analytics/predictive-analytics.js +0 -1
- package/dist/analytics/prompt-pattern-analyzer.js +0 -1
- package/dist/analytics/routing-performance-analyzer.js +0 -1
- package/dist/analytics/routing-refiner.js +1 -2
- package/dist/analytics/simple-pattern-analyzer.js +0 -1
- package/dist/architect/architectural-integrity.js +3 -3
- package/dist/benchmark/performance-benchmark.js +1 -2
- package/dist/cli/commands/antigravity-status.js +23 -23
- package/dist/cli/commands/archive-logs.js +0 -1
- package/dist/cli/commands/credible-init.js +1 -1
- package/dist/cli/commands/hermes-install.js +8 -0
- package/dist/cli/commands/mcp-install.js +1 -1
- package/dist/cli/commands/openclaw-install.js +9 -0
- package/dist/cli/commands/opencode-install.js +35 -0
- package/dist/cli/commands/plugin-commands.js +0 -1
- package/dist/cli/commands/skill-install.js +39 -2
- package/dist/cli/commands/status.js +16 -13
- package/dist/cli/commands/storyteller.js +1 -1
- package/dist/cli/index.js +14 -13
- package/dist/core/activity-logger.js +4 -5
- package/dist/core/adaptive-kernel.js +0 -1
- package/dist/core/agent-spawn-gate.js +1 -1
- package/dist/core/boot-orchestrator.js +14 -25
- package/dist/core/bridge.mjs +4 -5
- package/dist/core/codex-formatter.js +1 -3
- package/dist/core/codex-injector.js +3 -4
- package/dist/core/config-loader.js +36 -29
- package/dist/core/config-paths.js +30 -23
- package/dist/core/context-loader.js +0 -4
- package/dist/core/context-validator.js +0 -1
- package/dist/core/features-config.js +38 -2
- package/dist/core/index.js +2 -2
- package/dist/core/kernel-patterns.js +0 -1
- package/dist/core/logging-config.js +7 -7
- package/dist/core/model-router.js +23 -64
- package/dist/core/orchestrator.js +1 -1
- package/dist/core/system-prompt-generator.js +0 -1
- package/dist/core/xray-activation.js +3 -4
- package/dist/delegation/agent-delegator.js +2 -3
- package/dist/delegation/agent-expertise.js +0 -1
- package/dist/delegation/analytics/index.js +0 -1
- package/dist/delegation/analytics/learning-engine.js +0 -1
- package/dist/delegation/analytics/outcome-tracker.js +0 -1
- package/dist/delegation/analytics/routing-analytics.js +0 -1
- package/dist/delegation/ast-code-parser.js +0 -1
- package/dist/delegation/complexity-analyzer.js +0 -1
- package/dist/delegation/dependency-graph-builder.js +0 -1
- package/dist/delegation/index.js +0 -1
- package/dist/delegation/metrics-aggregator.js +0 -1
- package/dist/delegation/session-coordinator.js +0 -1
- package/dist/delegation/strategy-selector.js +0 -1
- package/dist/delegation/voting-coordinator.js +0 -1
- package/dist/delegation/voting-types.js +0 -1
- package/dist/delegation/weighted-voting-aggregator.js +0 -1
- package/dist/enforcement/core/index.js +0 -1
- package/dist/enforcement/core/rule-executor.js +0 -1
- package/dist/enforcement/core/rule-hierarchy.js +0 -1
- package/dist/enforcement/core/rule-registry.js +0 -1
- package/dist/enforcement/core/violation-fixer.js +0 -1
- package/dist/enforcement/enforcer-tools.js +2 -2
- package/dist/enforcement/index.js +0 -1
- package/dist/enforcement/loaders/agent-triage-loader.js +0 -1
- package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -1
- package/dist/enforcement/loaders/base-loader.js +0 -1
- package/dist/enforcement/loaders/codex-loader.js +2 -3
- package/dist/enforcement/loaders/index.js +0 -1
- package/dist/enforcement/loaders/loader-orchestrator.js +0 -1
- package/dist/enforcement/loaders/processor-loader.js +0 -1
- package/dist/enforcement/types.js +0 -1
- package/dist/enforcement/validators/architecture-validators.js +0 -1
- package/dist/enforcement/validators/base-validator.js +0 -1
- package/dist/enforcement/validators/code-quality-validators.js +0 -1
- package/dist/enforcement/validators/index.js +0 -1
- package/dist/enforcement/validators/security-validators.js +0 -1
- package/dist/enforcement/validators/testing-validators.js +0 -1
- package/dist/enforcement/validators/validator-registry.js +0 -1
- package/dist/execution/opencode-cli-invoker.js +1 -1
- package/dist/governance/codex-policy.service.js +0 -1
- package/dist/governance/governance-service.js +1 -1
- package/dist/governance/llm-governance-provider.js +14 -1
- package/dist/index.js +3 -5
- package/dist/inference/inference-agent-invoker.js +67 -0
- package/dist/inference/inference-applier.js +178 -0
- package/dist/inference/inference-cycle.js +52 -828
- package/dist/inference/inference-proposal-generator.js +149 -0
- package/dist/infrastructure/iac-validator.js +465 -0
- package/dist/infrastructure/schemas/cloud-schemas.js +488 -0
- package/dist/integrations/base/ExampleIntegration.js +0 -1
- package/dist/integrations/base/Integration.js +0 -1
- package/dist/integrations/base/README.md +1 -1
- package/dist/integrations/base/index.js +0 -1
- package/dist/integrations/base/registry.js +0 -1
- package/dist/integrations/base/types.js +0 -1
- package/dist/integrations/enforcement-gate.js +5 -5
- package/dist/integrations/governance/governance-client.js +0 -1
- package/dist/integrations/governance/index.js +11 -19
- package/dist/integrations/governance/types.js +0 -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 +29 -14
- package/dist/integrations/hermes-agent/bridge.mjs +76 -4
- package/dist/integrations/hermes-agent/schemas.py +49 -0
- package/dist/integrations/hermes-agent/test_plugin.py +7 -7
- package/dist/integrations/hermes-agent/tools.py +107 -3
- package/dist/integrations/openclaw/README.md +6 -6
- package/dist/integrations/openclaw/api-server.js +0 -1
- package/dist/integrations/openclaw/client.js +0 -1
- package/dist/integrations/openclaw/config.js +1 -2
- package/dist/integrations/openclaw/hooks/{strray-hooks.js â xray-hooks.js} +0 -1
- package/dist/integrations/openclaw/index.js +2 -3
- package/dist/integrations/openclaw/types.js +3 -4
- package/dist/integrations/plugins/index.js +0 -1
- package/dist/integrations/plugins/plugin-integration.js +1 -2
- package/dist/integrations/plugins/plugin-registry.js +1 -2
- package/dist/mcps/agent-resolver.js +0 -1
- package/dist/mcps/architect-tools.server.js +121 -186
- package/dist/mcps/auto-format.server.js +57 -75
- package/dist/mcps/boot-orchestrator.server.js +68 -86
- package/dist/mcps/config/config-loader.js +46 -9
- package/dist/mcps/config/plugin-server-registry.js +0 -1
- package/dist/mcps/enforcer-tools.server.js +208 -274
- package/dist/mcps/estimation.server.js +65 -108
- package/dist/mcps/framework-compliance-audit.server.js +53 -82
- package/dist/mcps/framework-help.server.js +73 -90
- package/dist/mcps/governance.server.js +104 -152
- package/dist/mcps/knowledge-skills/api-design.server.js +35 -66
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +35 -66
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +125 -165
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +211 -238
- package/dist/mcps/knowledge-skills/code-review.server.js +109 -143
- package/dist/mcps/knowledge-skills/content-creator.server.js +205 -227
- package/dist/mcps/knowledge-skills/database-design.server.js +117 -151
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +125 -158
- package/dist/mcps/knowledge-skills/git-workflow.server.js +36 -68
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +303 -325
- package/dist/mcps/knowledge-skills/log-monitor.server.js +141 -161
- package/dist/mcps/knowledge-skills/mobile-development.server.js +172 -202
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +124 -160
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +89 -139
- package/dist/mcps/knowledge-skills/project-analysis.server.js +132 -219
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +117 -151
- package/dist/mcps/knowledge-skills/security-audit.server.js +17 -144
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +22 -214
- package/dist/mcps/knowledge-skills/session-management.server.js +15 -91
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +83 -359
- package/dist/mcps/knowledge-skills/strategist.server.js +12 -57
- package/dist/mcps/knowledge-skills/tech-writer.server.js +18 -193
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +20 -192
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +19 -157
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +24 -297
- package/dist/mcps/lint.server.js +51 -92
- package/dist/mcps/model-health-check.server.js +34 -61
- package/dist/mcps/orchestrator/aside-context.js +207 -0
- package/dist/mcps/orchestrator/handlers/complexity-handler.js +5 -1
- package/dist/mcps/orchestrator/handlers/status-handler.js +8 -1
- package/dist/mcps/orchestrator/handlers/task-handler.js +5 -0
- package/dist/mcps/orchestrator/index.js +5 -0
- package/dist/mcps/orchestrator/server.js +65 -9
- package/dist/mcps/orchestrator.server.js +2 -1
- package/dist/mcps/performance-analysis.server.js +57 -88
- package/dist/mcps/processor-pipeline.server.js +70 -100
- package/dist/mcps/registry.json +1 -1
- package/dist/mcps/researcher.server.js +81 -154
- package/dist/mcps/security-scan.server.js +57 -71
- package/dist/mcps/shared/knowledge-skill-base.js +11 -4
- package/dist/mcps/state-manager.server.js +127 -155
- package/dist/metrics/agent-metrics.js +1 -1
- package/dist/monitoring/nudge-watchdog.js +0 -1
- package/dist/nucleus/default-plugins.js +13 -19
- package/dist/nucleus/index.js +0 -1
- package/dist/orchestrator/agent-spawn-governor.js +0 -1
- package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +2 -2
- package/dist/orchestrator/intelligent-commit-batcher.js +2 -11
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +1 -2
- package/dist/orchestrator/orchestrator.js +8 -19
- package/dist/orchestrator/self-direction-activation.js +0 -1
- package/dist/orchestrator/universal-registry-bridge.js +1 -2
- package/dist/performance/performance-budget-enforcer.js +0 -1
- package/dist/performance/performance-regression-tester.js +0 -1
- package/dist/plugin/plugin-codex-context.js +87 -0
- package/dist/plugin/plugin-helpers.js +155 -0
- package/dist/plugin/plugin-logger.js +46 -0
- package/dist/plugin/plugin-modules.js +144 -0
- package/dist/plugin/plugin-quality-gate.js +88 -0
- package/dist/plugin/plugin-types.js +1 -0
- package/dist/plugin/xray-codex-injection.js +39 -558
- package/dist/postprocessor/PostProcessor.js +7 -13
- package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
- package/dist/postprocessor/config/ProcessorConfigLoader.js +16 -0
- package/dist/postprocessor/integration.js +194 -0
- package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +472 -0
- package/dist/postprocessor/metamorphosis/index.js +1 -0
- package/dist/postprocessor/redeploy/RetryHandler.js +118 -0
- package/dist/postprocessor/services/RegressionAnalysisService.js +2 -3
- package/dist/postprocessor/triggers/APITrigger.js +0 -1
- package/dist/postprocessor/triggers/GitHookTrigger.js +4 -4
- package/dist/postprocessor/triggers/WebhookTrigger.js +0 -1
- package/dist/processors/implementations/agents-md-validation-processor.js +0 -1
- package/dist/processors/implementations/async-pattern-processor.js +0 -1
- package/dist/processors/implementations/console-log-guard-processor.js +0 -1
- package/dist/processors/implementations/coverage-analysis-processor.js +0 -1
- package/dist/processors/implementations/inference-improvement-processor.js +2 -10
- package/dist/processors/implementations/log-protection-processor.js +0 -1
- package/dist/processors/implementations/nudge-processor.js +0 -1
- package/dist/processors/implementations/performance-budget-processor.js +0 -1
- package/dist/processors/implementations/postprocessor-chain-validator.js +0 -1
- package/dist/processors/implementations/publish-preflight-processor.js +4 -13
- package/dist/processors/implementations/session-summary-processor.js +8 -16
- package/dist/processors/implementations/spawn-governance-processor.js +0 -1
- package/dist/processors/implementations/storytelling-trigger-processor.js +3 -29
- package/dist/processors/implementations/test-auto-creation-processor.js +0 -1
- package/dist/processors/implementations/typescript-compilation-processor.js +0 -1
- package/dist/processors/implementations/version-compliance-processor.js +0 -1
- package/dist/processors/processor-interfaces.js +0 -1
- package/dist/processors/processor-types.js +0 -1
- 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 +2 -2
- package/dist/scripts/integration.js +0 -1
- package/dist/scripts/pre-command +1 -1
- package/dist/security/comprehensive-security-audit.js +0 -1
- package/dist/security/security-agent-coordinator.js +0 -1
- package/dist/security/security-auditor.js +0 -1
- package/dist/security/security-hardener.js +0 -1
- package/dist/security/security-hardening-system.js +0 -1
- package/dist/security/security-headers.js +0 -1
- package/dist/security/security-orchestration-layer.js +0 -1
- package/dist/services/inference-tuner.js +1 -2
- package/dist/session/session-cleanup-manager.js +0 -1
- package/dist/session/session-monitor.js +0 -1
- package/dist/session/session-state-manager.js +0 -1
- 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 +2 -2
- 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/skills/xray-orchestrator/index.js +0 -1
- package/dist/state/index.js +0 -1
- package/dist/state/state-manager.js +1 -2
- package/dist/utils/codex-parser.js +0 -1
- package/dist/utils/import-resolver.js +1 -1
- package/dist/utils/language-detector.js +0 -1
- package/dist/utils/path-resolver.js +2 -2
- package/dist/utils/shutdown-handler.js +0 -1
- package/dist/validation/agent-config-validator.js +280 -0
- package/dist/validation/orchestration-flow-validator.js +606 -0
- 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/release.mjs +2 -2
- package/scripts/node/setup-xai-oauth.mjs +244 -0
- package/scripts/node/setup.cjs +28 -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/agent-resolver.ts +0 -1
- package/src/mcps/architect-tools.server.ts +130 -212
- package/src/mcps/auto-format.server.ts +75 -104
- package/src/mcps/boot-orchestrator.server.ts +72 -97
- package/src/mcps/config/__tests__/config-loader.test.ts +33 -37
- package/src/mcps/config/config-loader.ts +57 -11
- package/src/mcps/config/plugin-server-registry.ts +0 -1
- package/src/mcps/enforcer-tools.server.ts +218 -295
- package/src/mcps/estimation.server.ts +64 -123
- package/src/mcps/framework-compliance-audit.server.ts +54 -96
- package/src/mcps/framework-help.server.ts +76 -97
- package/src/mcps/governance.server.ts +104 -164
- package/src/mcps/knowledge-skills/api-design.server.ts +35 -73
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +34 -73
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +149 -194
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +223 -255
- package/src/mcps/knowledge-skills/code-review.server.ts +116 -158
- package/src/mcps/knowledge-skills/content-creator.server.ts +221 -248
- package/src/mcps/knowledge-skills/database-design.server.ts +120 -161
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +128 -168
- package/src/mcps/knowledge-skills/git-workflow.server.ts +34 -78
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +324 -362
- package/src/mcps/knowledge-skills/log-monitor.server.ts +70 -97
- package/src/mcps/knowledge-skills/mobile-development.server.ts +18 -58
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +15 -61
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +14 -75
- package/src/mcps/knowledge-skills/project-analysis.server.ts +14 -121
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +15 -61
- package/src/mcps/knowledge-skills/security-audit.server.ts +20 -158
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +25 -228
- package/src/mcps/knowledge-skills/session-management.server.ts +19 -107
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +89 -380
- package/src/mcps/knowledge-skills/strategist.server.ts +15 -65
- package/src/mcps/knowledge-skills/tech-writer.server.ts +21 -206
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +23 -205
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +22 -166
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +27 -343
- package/src/mcps/lint.server.ts +53 -106
- package/src/mcps/model-health-check.server.ts +35 -71
- package/src/mcps/orchestrator/aside-context.ts +245 -0
- package/src/mcps/orchestrator/handlers/complexity-handler.ts +9 -3
- package/src/mcps/orchestrator/handlers/status-handler.ts +11 -1
- package/src/mcps/orchestrator/handlers/task-handler.ts +8 -1
- package/src/mcps/orchestrator/index.ts +29 -0
- package/src/mcps/orchestrator/server.ts +81 -25
- package/src/mcps/orchestrator/types.ts +37 -0
- package/src/mcps/orchestrator.server.ts +2 -1
- package/src/mcps/performance-analysis.server.ts +60 -103
- package/src/mcps/processor-pipeline.server.ts +72 -109
- package/src/mcps/registry.json +1 -1
- package/src/mcps/researcher.server.ts +88 -176
- package/src/mcps/security-scan.server.ts +58 -77
- package/src/mcps/shared/knowledge-skill-base.ts +12 -4
- package/src/mcps/state-manager.server.ts +132 -172
- package/src/opencode/codex.codex +1 -1
- package/src/opencode/commands/auto-format.md +3 -3
- package/src/opencode/commands/auto-summary-capture.md +2 -2
- package/src/opencode/commands/dependency-audit.md +3 -3
- package/src/opencode/commands/enforcer-daily-scan.md +3 -3
- package/src/opencode/commands/framework-compliance-audit.md +4 -4
- package/src/opencode/commands/interactive-validator.md +2 -2
- package/src/opencode/commands/job-summary-logger.md +2 -2
- package/src/opencode/commands/mode-switch.md +1 -1
- package/src/opencode/commands/model-health-check.md +2 -2
- package/src/opencode/commands/performance-analysis.md +2 -2
- package/src/opencode/commands/pre-commit-introspection.md +3 -3
- package/src/opencode/commands/security-scan.md +3 -3
- package/src/opencode/commands/sisyphus-validation.md +3 -3
- package/src/opencode/commands/summary-logger.md +6 -6
- 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 +2 -2
- 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/src/skills/xray-orchestrator/index.ts +0 -1
- package/xray/agents_template.md +46 -0
- package/xray/codex.json +598 -0
- package/dist/nucleus/orchestrator.js +0 -479
|
@@ -1,538 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Consumer runtime compat shim from prior 0xRay releases (1-line min per Scope Rule; xray codex injection +
|
|
2
|
+
* Consumer runtime compat shim from prior 0xRay releases (1-line min per Scope Rule; xray codex injection + .xray fallbacks).
|
|
3
3
|
*/
|
|
4
4
|
import * as fs from "fs";
|
|
5
5
|
import * as path from "path";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let _detectTaskType = null;
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Module loaders (candidate-based resolution for dev, dist, and consumer paths)
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
async function loadFrameworkLogger() {
|
|
22
|
-
if (_frameworkLogger)
|
|
23
|
-
return _frameworkLogger;
|
|
24
|
-
const candidates = [
|
|
25
|
-
"../core/framework-logger.js",
|
|
26
|
-
"../../node_modules/0xray/dist/core/framework-logger.js",
|
|
27
|
-
];
|
|
28
|
-
for (const p of candidates) {
|
|
29
|
-
try {
|
|
30
|
-
const mod = await import(p);
|
|
31
|
-
_frameworkLogger = mod.frameworkLogger;
|
|
32
|
-
return _frameworkLogger;
|
|
33
|
-
}
|
|
34
|
-
catch (_) {
|
|
35
|
-
// try next candidate
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
_frameworkLogger = {
|
|
39
|
-
log: (_module, _event, _status, _data) => { },
|
|
40
|
-
};
|
|
41
|
-
return _frameworkLogger;
|
|
42
|
-
}
|
|
43
|
-
async function loadConfigPaths() {
|
|
44
|
-
if (_resolveCodexPath && _resolveStateDir)
|
|
45
|
-
return;
|
|
46
|
-
const candidates = [
|
|
47
|
-
"../core/config-paths.js",
|
|
48
|
-
"../../node_modules/0xray/dist/core/config-paths.js",
|
|
49
|
-
];
|
|
50
|
-
for (const p of candidates) {
|
|
51
|
-
try {
|
|
52
|
-
const mod = await import(p);
|
|
53
|
-
_resolveCodexPath = mod.resolveCodexPath;
|
|
54
|
-
_resolveStateDir = mod.resolveStateDir;
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
catch (_) {
|
|
58
|
-
// try next candidate
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
const logger = await loadFrameworkLogger();
|
|
62
|
-
logger.log("xray-codex-plugin", "config-paths-load-failed", "warning", { warning: "Failed to load config-paths module from any location" });
|
|
63
|
-
}
|
|
64
|
-
async function resolveCodexPath(root) {
|
|
65
|
-
await loadConfigPaths();
|
|
66
|
-
if (!_resolveCodexPath)
|
|
67
|
-
throw new Error("resolveCodexPath not available after loading");
|
|
68
|
-
return _resolveCodexPath(root);
|
|
69
|
-
}
|
|
70
|
-
async function resolveStateDir(root) {
|
|
71
|
-
await loadConfigPaths();
|
|
72
|
-
if (!_resolveStateDir)
|
|
73
|
-
throw new Error("resolveStateDir not available after loading");
|
|
74
|
-
return _resolveStateDir(root);
|
|
75
|
-
}
|
|
76
|
-
async function importSystemPromptGenerator() {
|
|
77
|
-
if (_systemPromptGenerator)
|
|
78
|
-
return;
|
|
79
|
-
const candidates = [
|
|
80
|
-
"../core/system-prompt-generator.js",
|
|
81
|
-
"../../node_modules/0xray/dist/core/system-prompt-generator.js",
|
|
82
|
-
];
|
|
83
|
-
for (const p of candidates) {
|
|
84
|
-
try {
|
|
85
|
-
const module = await import(p);
|
|
86
|
-
_systemPromptGenerator = module.generateLeanSystemPrompt;
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
catch (_) {
|
|
90
|
-
// try next candidate
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
const logger = await loadFrameworkLogger();
|
|
94
|
-
logger.log("xray-codex-plugin", "system-prompt-generator-load-failed", "warning", { warning: "Failed to load lean system prompt generator, using fallback" });
|
|
95
|
-
}
|
|
96
|
-
function validateModulePath(resolvedPath, allowedPrefix) {
|
|
97
|
-
const normalized = path.resolve(resolvedPath);
|
|
98
|
-
const allowed = path.resolve(allowedPrefix);
|
|
99
|
-
if (!normalized.startsWith(allowed)) {
|
|
100
|
-
throw new Error(`Module path validation failed: ${normalized} is outside allowed path ${allowed}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
async function loadXrayComponents() {
|
|
104
|
-
if (_ProcessorManager && _XrayStateManager && _featuresConfigLoader)
|
|
105
|
-
return;
|
|
106
|
-
const logger = await getOrCreateLogger(process.cwd());
|
|
107
|
-
try {
|
|
108
|
-
// FIXED: Removed hardcoded ../../dist/ paths (source of dist/dist build corruption)
|
|
109
|
-
// Using dynamic resolution instead
|
|
110
|
-
const root = process.cwd();
|
|
111
|
-
const distPrefix = path.join(root, 'dist');
|
|
112
|
-
validateModulePath(`${root}/dist/processors/processor-manager.js`, distPrefix);
|
|
113
|
-
validateModulePath(`${root}/dist/state/state-manager.js`, distPrefix);
|
|
114
|
-
validateModulePath(`${root}/dist/core/features-config.js`, distPrefix);
|
|
115
|
-
const procModule = await import(`${root}/dist/processors/processor-manager.js`);
|
|
116
|
-
const stateModule = await import(`${root}/dist/state/state-manager.js`);
|
|
117
|
-
const featuresModule = await import(`${root}/dist/core/features-config.js`);
|
|
118
|
-
_ProcessorManager = procModule.ProcessorManager;
|
|
119
|
-
_XrayStateManager = stateModule.XrayStateManager ?? stateModule.StrRayStateManager;
|
|
120
|
-
_featuresConfigLoader = featuresModule.featuresConfigLoader;
|
|
121
|
-
_detectTaskType = featuresModule.detectTaskType;
|
|
122
|
-
logger.log(`â
Loaded from cwd/dist/`);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
catch (e) {
|
|
126
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
127
|
-
logger.log(`â Failed to load from cwd/dist/: ${message}`);
|
|
128
|
-
}
|
|
129
|
-
const pluginPaths = ["0xray"];
|
|
130
|
-
for (const pluginPath of pluginPaths) {
|
|
131
|
-
try {
|
|
132
|
-
// FIXED: Avoided hardcoded /dist/ in node_modules paths to prevent build corruption
|
|
133
|
-
const nodeModulesPrefix = path.join(process.cwd(), 'node_modules');
|
|
134
|
-
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`, nodeModulesPrefix);
|
|
135
|
-
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`, nodeModulesPrefix);
|
|
136
|
-
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`, nodeModulesPrefix);
|
|
137
|
-
const pm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`);
|
|
138
|
-
const sm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`);
|
|
139
|
-
const fm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`);
|
|
140
|
-
_ProcessorManager = pm.ProcessorManager;
|
|
141
|
-
_XrayStateManager = sm.XrayStateManager ?? sm.StrRayStateManager;
|
|
142
|
-
_featuresConfigLoader = fm.featuresConfigLoader;
|
|
143
|
-
_detectTaskType = fm.detectTaskType;
|
|
144
|
-
logger.log(`â
Loaded from node_modules/${pluginPath}/dist/`);
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
catch (e) {
|
|
148
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
149
|
-
logger.log(`â Failed to load from node_modules/${pluginPath}/dist/: ${message}`);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
// ---------------------------------------------------------------------------
|
|
154
|
-
// Helpers
|
|
155
|
-
// ---------------------------------------------------------------------------
|
|
156
|
-
function spawnPromise(command, args, cwd) {
|
|
157
|
-
return new Promise((resolve, reject) => {
|
|
158
|
-
const child = spawn(command, args, {
|
|
159
|
-
cwd,
|
|
160
|
-
stdio: ["ignore", "inherit", "pipe"],
|
|
161
|
-
});
|
|
162
|
-
let stderr = "";
|
|
163
|
-
if (child.stderr) {
|
|
164
|
-
child.stderr.on("data", (data) => {
|
|
165
|
-
stderr += data.toString();
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
child.on("close", (code) => {
|
|
169
|
-
if (code === 0) {
|
|
170
|
-
resolve({ stdout: "", stderr });
|
|
171
|
-
}
|
|
172
|
-
else {
|
|
173
|
-
reject(new Error(`Process exited with code ${code}: ${stderr}`));
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
child.on("error", (error) => {
|
|
177
|
-
reject(error);
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
class PluginLogger {
|
|
182
|
-
logPath;
|
|
183
|
-
constructor(directory) {
|
|
184
|
-
const logsDir = path.join(directory, ".opencode", "logs");
|
|
185
|
-
if (!fs.existsSync(logsDir)) {
|
|
186
|
-
fs.mkdirSync(logsDir, { recursive: true });
|
|
187
|
-
}
|
|
188
|
-
const today = new Date().toISOString().split("T")[0];
|
|
189
|
-
this.logPath = path.join(logsDir, `xray-plugin-${today}.log`);
|
|
190
|
-
}
|
|
191
|
-
async logAsync(message) {
|
|
192
|
-
try {
|
|
193
|
-
const timestamp = new Date().toISOString();
|
|
194
|
-
const logEntry = `[${timestamp}] ${message}\n`;
|
|
195
|
-
await fs.promises.appendFile(this.logPath, logEntry, "utf-8");
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
// Silent fail - logging failure should not break plugin
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
log(message) {
|
|
202
|
-
void this.logAsync(message);
|
|
203
|
-
}
|
|
204
|
-
error(message, error) {
|
|
205
|
-
const errorDetail = error instanceof Error ? `: ${error.message}` : "";
|
|
206
|
-
this.log(`ERROR: ${message}${errorDetail}`);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
let loggerInstance = null;
|
|
210
|
-
let loggerInitPromise = null;
|
|
211
|
-
async function getOrCreateLogger(directory) {
|
|
212
|
-
if (loggerInstance) {
|
|
213
|
-
return loggerInstance;
|
|
214
|
-
}
|
|
215
|
-
if (loggerInitPromise) {
|
|
216
|
-
return loggerInitPromise;
|
|
217
|
-
}
|
|
218
|
-
loggerInitPromise = (async () => {
|
|
219
|
-
const logger = new PluginLogger(directory);
|
|
220
|
-
loggerInstance = logger;
|
|
221
|
-
return logger;
|
|
222
|
-
})();
|
|
223
|
-
return loggerInitPromise;
|
|
224
|
-
}
|
|
225
|
-
function getFrameworkVersion() {
|
|
226
|
-
try {
|
|
227
|
-
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
228
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
229
|
-
return packageJson.version || "1.4.6";
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
return "1.4.6";
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
function getFrameworkIdentity() {
|
|
236
|
-
const version = getFrameworkVersion();
|
|
237
|
-
return `0xRay Framework v${version} - AI Orchestration
|
|
238
|
-
|
|
239
|
-
đ§ Core: architect, code-reviewer, refactorer, testing-lead, strategist
|
|
240
|
-
đ Codex: 5 Essential Terms (99.6% Error Prevention Target)
|
|
241
|
-
đ¯ Goal: Progressive, production-ready development workflow
|
|
242
|
-
|
|
243
|
-
đ Documentation: config dir (codex, config, agents docs) â resolved via config-paths
|
|
244
|
-
`;
|
|
245
|
-
}
|
|
246
|
-
// ---------------------------------------------------------------------------
|
|
247
|
-
// Enforcer quality gate
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
async function runEnforcerQualityGate(input, logger) {
|
|
250
|
-
const violations = [];
|
|
251
|
-
const { tool, args } = input;
|
|
252
|
-
try {
|
|
253
|
-
const { RuleEnforcer } = await import("../enforcement/rule-enforcer.js");
|
|
254
|
-
const ruleEnforcer = new RuleEnforcer();
|
|
255
|
-
const context = {
|
|
256
|
-
operation: tool === "write" ? "write" : tool === "edit" ? "edit" : "read",
|
|
257
|
-
};
|
|
258
|
-
if (args?.filePath) {
|
|
259
|
-
context.files = [args.filePath];
|
|
260
|
-
}
|
|
261
|
-
if (args?.content) {
|
|
262
|
-
context.newCode = args.content;
|
|
263
|
-
}
|
|
264
|
-
const report = await ruleEnforcer.validateOperation(tool, context);
|
|
265
|
-
const blockingViolations = [];
|
|
266
|
-
const allViolations = [];
|
|
267
|
-
if (report.errors && report.errors.length > 0) {
|
|
268
|
-
for (const error of report.errors) {
|
|
269
|
-
allViolations.push(error);
|
|
270
|
-
blockingViolations.push(error);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
if (report.results) {
|
|
274
|
-
for (const result of report.results) {
|
|
275
|
-
if (!result.passed) {
|
|
276
|
-
const isBlocking = result.severity === "error" || result.severity === "blocking" || result.severity === "high";
|
|
277
|
-
allViolations.push(result.message);
|
|
278
|
-
if (isBlocking) {
|
|
279
|
-
blockingViolations.push(result.message);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
if (allViolations.length > 0) {
|
|
285
|
-
logger.log(`â ī¸ ENFORCER: ${allViolations.length} rule violation(s) detected`);
|
|
286
|
-
for (const v of allViolations.slice(0, 5)) {
|
|
287
|
-
logger.log(` - ${v}`);
|
|
288
|
-
}
|
|
289
|
-
if (allViolations.length > 5) {
|
|
290
|
-
logger.log(` ... and ${allViolations.length - 5} more`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
const passed = blockingViolations.length === 0;
|
|
294
|
-
violations.push(...blockingViolations);
|
|
295
|
-
if (!passed) {
|
|
296
|
-
logger.error(`đĢ Quality Gate FAILED with ${blockingViolations.length} blocking violation(s)`);
|
|
297
|
-
}
|
|
298
|
-
else {
|
|
299
|
-
logger.log(`â
Quality Gate PASSED (${allViolations.length} warning(s))`);
|
|
300
|
-
}
|
|
301
|
-
return { passed, violations };
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
logger.log(`Warning: RuleEnforcer unavailable, using fallback checks: ${error instanceof Error ? error.message : String(error)}`);
|
|
305
|
-
if (tool === "write" && args?.filePath) {
|
|
306
|
-
const filePath = args.filePath;
|
|
307
|
-
if (filePath.endsWith(".ts") &&
|
|
308
|
-
!filePath.includes(".test.") &&
|
|
309
|
-
!filePath.includes(".spec.")) {
|
|
310
|
-
const testPath = filePath.replace(".ts", ".test.ts");
|
|
311
|
-
const specPath = filePath.replace(".ts", ".spec.ts");
|
|
312
|
-
if (!fs.existsSync(testPath) && !fs.existsSync(specPath)) {
|
|
313
|
-
violations.push(`tests-required: No test file found for ${filePath}`);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
if (args?.content) {
|
|
318
|
-
const errorPatterns = [/console\.log\s*\(/g, /TODO\s*:/gi, /FIXME\s*:/gi];
|
|
319
|
-
for (const pattern of errorPatterns) {
|
|
320
|
-
if (pattern.test(args.content)) {
|
|
321
|
-
violations.push(`resolve-all-errors: Found error pattern in code`);
|
|
322
|
-
break;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
const passed = violations.length === 0;
|
|
327
|
-
if (!passed) {
|
|
328
|
-
logger.error(`đĢ Fallback Quality Gate FAILED with ${violations.length} violation(s)`);
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
logger.log(`â
Fallback Quality Gate PASSED`);
|
|
332
|
-
}
|
|
333
|
-
return { passed, violations };
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
let cachedCodexContexts = null;
|
|
337
|
-
async function getCodexFileLocations(directory) {
|
|
338
|
-
const root = directory || process.cwd();
|
|
339
|
-
const resolved = await resolveCodexPath(root);
|
|
340
|
-
resolved.push(path.join(root, ".opencode", "codex.codex"), path.join(root, ".xray", "agents_template.md"), path.join(root, ".opencode", "xray", "agents_template.md"), path.join(root, "AGENTS.md"));
|
|
341
|
-
return resolved;
|
|
342
|
-
}
|
|
343
|
-
function readFileContent(filePath) {
|
|
344
|
-
try {
|
|
345
|
-
return fs.readFileSync(filePath, "utf-8");
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
const logger = new PluginLogger(process.cwd());
|
|
349
|
-
logger.error(`Failed to read file ${filePath}`, error);
|
|
350
|
-
return null;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
function extractCodexMetadata(content) {
|
|
354
|
-
if (content.trim().startsWith("{")) {
|
|
355
|
-
try {
|
|
356
|
-
const parsed = JSON.parse(content);
|
|
357
|
-
const version = parsed.version || "1.6.0";
|
|
358
|
-
const terms = parsed.terms || {};
|
|
359
|
-
const termCount = Object.keys(terms).length;
|
|
360
|
-
return { version, termCount };
|
|
361
|
-
}
|
|
362
|
-
catch {
|
|
363
|
-
// Not valid JSON, try markdown format
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
const versionMatch = content.match(/\*\*Version\*\*:\s*(\d+\.\d+\.\d+)/);
|
|
367
|
-
const version = versionMatch?.[1] ?? "1.6.0";
|
|
368
|
-
const termMatches = content.match(/####\s*\d+\.\s/g);
|
|
369
|
-
const termCount = termMatches ? termMatches.length : 0;
|
|
370
|
-
return { version, termCount };
|
|
371
|
-
}
|
|
372
|
-
function createCodexContextEntry(filePath, content) {
|
|
373
|
-
const metadata = extractCodexMetadata(content);
|
|
374
|
-
return {
|
|
375
|
-
id: `xray-codex-${path.basename(filePath)}`,
|
|
376
|
-
source: filePath,
|
|
377
|
-
content,
|
|
378
|
-
priority: "critical",
|
|
379
|
-
metadata: {
|
|
380
|
-
version: metadata.version,
|
|
381
|
-
termCount: metadata.termCount,
|
|
382
|
-
loadedAt: new Date().toISOString(),
|
|
383
|
-
},
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
async function loadCodexContext(directory) {
|
|
387
|
-
if (cachedCodexContexts) {
|
|
388
|
-
return cachedCodexContexts;
|
|
389
|
-
}
|
|
390
|
-
const codexContexts = [];
|
|
391
|
-
const locations = await getCodexFileLocations(directory);
|
|
392
|
-
for (const fileLocation of locations) {
|
|
393
|
-
const fullPath = path.isAbsolute(fileLocation) ? fileLocation : path.join(directory, fileLocation);
|
|
394
|
-
const content = readFileContent(fullPath);
|
|
395
|
-
if (content && content.trim().length > 0) {
|
|
396
|
-
const entry = createCodexContextEntry(fullPath, content);
|
|
397
|
-
if (entry.metadata.termCount > 0) {
|
|
398
|
-
codexContexts.push(entry);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
cachedCodexContexts = codexContexts;
|
|
403
|
-
if (codexContexts.length === 0) {
|
|
404
|
-
void getOrCreateLogger(directory).then((l) => l.error(`No valid codex files found. Checked: ${locations.join(", ")}`));
|
|
405
|
-
}
|
|
406
|
-
return codexContexts;
|
|
407
|
-
}
|
|
408
|
-
function formatCodexContext(contexts) {
|
|
409
|
-
if (contexts.length === 0) {
|
|
410
|
-
return "";
|
|
411
|
-
}
|
|
412
|
-
const parts = [];
|
|
413
|
-
for (const context of contexts) {
|
|
414
|
-
parts.push(`# 0xRay Codex Context v${context.metadata.version}`, `Source: ${context.source}`, `Terms Loaded: ${context.metadata.termCount}`, `Loaded At: ${context.metadata.loadedAt}`, "", context.content, "", "---", "");
|
|
415
|
-
}
|
|
416
|
-
return parts.join("\n");
|
|
417
|
-
}
|
|
418
|
-
// ---------------------------------------------------------------------------
|
|
419
|
-
// Analytics and task classification
|
|
420
|
-
// ---------------------------------------------------------------------------
|
|
6
|
+
import { getOrCreateLogger } from "./plugin-logger.js";
|
|
7
|
+
import { resolveStateDir, importSystemPromptGenerator, loadXrayComponents, getProcessorManager, getXrayStateManager, getFeaturesConfigLoader, getDetectTaskType, getSystemPromptGenerator, } from "./plugin-modules.js";
|
|
8
|
+
import { getFrameworkIdentity, classifyTaskType, isWriteEditOperation, isPublishOperation, resolveAgentName, registerAllProcessors, registerAfterPostProcessors, logPreProcessorResults, logPostProcessorResults, logTestAutoCreationResult, spawnPromise, } from "./plugin-helpers.js";
|
|
9
|
+
import { runEnforcerQualityGate } from "./plugin-quality-gate.js";
|
|
10
|
+
// Re-export all public API for test compatibility
|
|
11
|
+
export { classifyTaskType } from "./plugin-helpers.js";
|
|
12
|
+
export { validateModulePath } from "./plugin-modules.js";
|
|
13
|
+
export { extractCodexMetadata, createCodexContextEntry, formatCodexContext } from "./plugin-codex-context.js";
|
|
14
|
+
export { isWriteEditOperation, isPublishOperation, TOOL_AGENT_MAP, registerAllProcessors, registerAfterPostProcessors, resolveAgentName, getFrameworkVersion, getFrameworkIdentity } from "./plugin-helpers.js";
|
|
15
|
+
export { runEnforcerQualityGate } from "./plugin-quality-gate.js";
|
|
16
|
+
export { PluginLogger } from "./plugin-logger.js";
|
|
421
17
|
const INFERENCE_TUNE_INTERVAL = 100;
|
|
422
18
|
let _openCodeToolCallCount = 0;
|
|
423
19
|
let _lastTuneToolCallCount = 0;
|
|
424
|
-
const TOOL_AGENT_MAP = {
|
|
425
|
-
write: { agent: "code-reviewer", skill: "write" },
|
|
426
|
-
edit: { agent: "code-reviewer", skill: "edit" },
|
|
427
|
-
multiedit: { agent: "code-reviewer", skill: "multiedit" },
|
|
428
|
-
bash: { agent: "testing-lead", skill: "execution" },
|
|
429
|
-
search: { agent: "researcher", skill: "search" },
|
|
430
|
-
read: { agent: "researcher", skill: "read" },
|
|
431
|
-
glob: { agent: "researcher", skill: "glob" },
|
|
432
|
-
grep: { agent: "researcher", skill: "search" },
|
|
433
|
-
ls: { agent: "researcher", skill: "list" },
|
|
434
|
-
};
|
|
435
|
-
function classifyTaskType(tool, args) {
|
|
436
|
-
const cmd = String(args?.command ?? "").toLowerCase().trim();
|
|
437
|
-
if (tool === "bash" && cmd) {
|
|
438
|
-
if (/(npm|yarn|pnpm)\s+test|jest|vitest|mocha|pytest/.test(cmd))
|
|
439
|
-
return "testing";
|
|
440
|
-
if (/(npm|yarn|pnpm)\s+run|npx|cargo|go run|make\s/.test(cmd))
|
|
441
|
-
return "build";
|
|
442
|
-
if (/audit|security|snyk|owasp|bandit/.test(cmd))
|
|
443
|
-
return "security";
|
|
444
|
-
if (/eslint|prettier|black|ruff|lint|format/.test(cmd))
|
|
445
|
-
return "lint";
|
|
446
|
-
if (/git\s/.test(cmd))
|
|
447
|
-
return "git";
|
|
448
|
-
if (/(npm|yarn|pnpm)\s+install|pip install|cargo add/.test(cmd))
|
|
449
|
-
return "install";
|
|
450
|
-
if (/grep|rg |find |ls |cat |head |tail /.test(cmd))
|
|
451
|
-
return "search";
|
|
452
|
-
}
|
|
453
|
-
if (tool === "write")
|
|
454
|
-
return "write";
|
|
455
|
-
if (tool === "edit" || tool === "multiedit")
|
|
456
|
-
return "edit";
|
|
457
|
-
if (tool === "read")
|
|
458
|
-
return "read";
|
|
459
|
-
if (tool === "search" || tool === "grep" || tool === "glob")
|
|
460
|
-
return "search";
|
|
461
|
-
return "unknown";
|
|
462
|
-
}
|
|
463
|
-
// ---------------------------------------------------------------------------
|
|
464
|
-
// Shared helpers extracted from duplicated plugin logic
|
|
465
|
-
// ---------------------------------------------------------------------------
|
|
466
|
-
function isWriteEditOperation(tool) {
|
|
467
|
-
return tool === "write" || tool === "edit" || tool === "multiedit";
|
|
468
|
-
}
|
|
469
|
-
function isPublishOperation(tool) {
|
|
470
|
-
return tool === "publish" || tool === "release" || tool === "npm-publish" || tool === "xray-release";
|
|
471
|
-
}
|
|
472
|
-
function resolveAgentName(input) {
|
|
473
|
-
const globalAgent = globalThis.currentAgent;
|
|
474
|
-
if (globalAgent?.agentType)
|
|
475
|
-
return globalAgent.agentType;
|
|
476
|
-
if (globalAgent?.type)
|
|
477
|
-
return globalAgent.type;
|
|
478
|
-
if (input?.agentType)
|
|
479
|
-
return input.agentType;
|
|
480
|
-
return "architect";
|
|
481
|
-
}
|
|
482
|
-
function registerAllProcessors(pm) {
|
|
483
|
-
pm.registerProcessor({ name: "preValidate", type: "pre", priority: 10, enabled: true });
|
|
484
|
-
pm.registerProcessor({ name: "codexCompliance", type: "pre", priority: 20, enabled: true });
|
|
485
|
-
pm.registerProcessor({ name: "versionCompliance", type: "pre", priority: 25, enabled: true });
|
|
486
|
-
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 5, enabled: true });
|
|
487
|
-
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
488
|
-
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
489
|
-
}
|
|
490
|
-
function registerAfterPostProcessors(pm) {
|
|
491
|
-
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 50, enabled: true });
|
|
492
|
-
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
493
|
-
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
494
|
-
}
|
|
495
|
-
function logPreProcessorResults(results, logger) {
|
|
496
|
-
logger.log(`đ Pre-processor result: ${results.success ? "SUCCESS" : "FAILED"} (${results.results.length} processors)`);
|
|
497
|
-
if (!results.success) {
|
|
498
|
-
const failures = results.results.filter((r) => !r.success);
|
|
499
|
-
for (const f of failures) {
|
|
500
|
-
logger.error(`â Pre-processor ${f.processorName} failed: ${f.error}`);
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
else {
|
|
504
|
-
for (const r of results.results) {
|
|
505
|
-
logger.log(`â
Pre-processor ${r.processorName}: ${r.success ? "OK" : "FAILED"}`);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
function logPostProcessorResults(results, logger) {
|
|
510
|
-
const allSuccess = results.every((r) => r.success);
|
|
511
|
-
logger.log(`đ Post-processor result: ${allSuccess ? "SUCCESS" : "FAILED"} (${results.length} processors)`);
|
|
512
|
-
for (const r of results) {
|
|
513
|
-
if (r.success) {
|
|
514
|
-
logger.log(`â
Post-processor ${r.processorName}: OK`);
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
logger.error(`â Post-processor ${r.processorName} failed: ${r.error}`);
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
function logTestAutoCreationResult(results, logger) {
|
|
522
|
-
const testAutoResult = results.find((r) => r.processorName === "testAutoCreation");
|
|
523
|
-
if (testAutoResult) {
|
|
524
|
-
const data = testAutoResult.data;
|
|
525
|
-
if (testAutoResult.success && data?.testCreated && data?.testFile) {
|
|
526
|
-
logger.log(`â
TEST AUTO-CREATION: Created ${data.testFile}`);
|
|
527
|
-
}
|
|
528
|
-
else if (!testAutoResult.success) {
|
|
529
|
-
logger.log(`âšī¸ TEST AUTO-CREATION: ${testAutoResult.error ?? "skipped - no new files"}`);
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
|
-
// ---------------------------------------------------------------------------
|
|
534
|
-
// Main plugin function
|
|
535
|
-
// ---------------------------------------------------------------------------
|
|
536
20
|
export default async function xrayCodexPlugin(input) {
|
|
537
21
|
const { directory: inputDirectory } = input;
|
|
538
22
|
const directory = inputDirectory || process.cwd();
|
|
@@ -541,6 +25,7 @@ export default async function xrayCodexPlugin(input) {
|
|
|
541
25
|
try {
|
|
542
26
|
await importSystemPromptGenerator();
|
|
543
27
|
let leanPrompt = getFrameworkIdentity();
|
|
28
|
+
const _systemPromptGenerator = getSystemPromptGenerator();
|
|
544
29
|
if (_systemPromptGenerator) {
|
|
545
30
|
leanPrompt = await _systemPromptGenerator({
|
|
546
31
|
showWelcomeBanner: true,
|
|
@@ -569,6 +54,8 @@ export default async function xrayCodexPlugin(input) {
|
|
|
569
54
|
logger.log(`đ TOOL EXECUTE BEFORE HOOK FIRED: ${input.tool}`);
|
|
570
55
|
logger.log(`đĨ Full input: ${JSON.stringify(input)}`);
|
|
571
56
|
await loadXrayComponents();
|
|
57
|
+
const _featuresConfigLoader = getFeaturesConfigLoader();
|
|
58
|
+
const _detectTaskType = getDetectTaskType();
|
|
572
59
|
if (_featuresConfigLoader && _detectTaskType) {
|
|
573
60
|
try {
|
|
574
61
|
const config = _featuresConfigLoader.loadConfig();
|
|
@@ -595,6 +82,8 @@ export default async function xrayCodexPlugin(input) {
|
|
|
595
82
|
}
|
|
596
83
|
logger.log(`â
Quality gate passed for ${tool}`);
|
|
597
84
|
if (isWriteEditOperation(tool)) {
|
|
85
|
+
const _ProcessorManager = getProcessorManager();
|
|
86
|
+
const _XrayStateManager = getXrayStateManager();
|
|
598
87
|
if (!_ProcessorManager || !_XrayStateManager) {
|
|
599
88
|
logger.error("ProcessorManager or XrayStateManager not loaded");
|
|
600
89
|
return;
|
|
@@ -671,6 +160,7 @@ export default async function xrayCodexPlugin(input) {
|
|
|
671
160
|
const { tool, args, result } = input;
|
|
672
161
|
try {
|
|
673
162
|
const { routingOutcomeTracker } = await import("../delegation/analytics/outcome-tracker.js");
|
|
163
|
+
const { TOOL_AGENT_MAP } = await import("./plugin-helpers.js");
|
|
674
164
|
const mapping = TOOL_AGENT_MAP[tool];
|
|
675
165
|
const taskType = classifyTaskType(tool, args);
|
|
676
166
|
const rawDesc = args?.content
|
|
@@ -699,6 +189,8 @@ export default async function xrayCodexPlugin(input) {
|
|
|
699
189
|
}
|
|
700
190
|
logger.log(`đĨ After hook input: ${JSON.stringify({ tool, hasArgs: !!args, args, hasResult: !!result }).slice(0, 200)}`);
|
|
701
191
|
if (isWriteEditOperation(tool)) {
|
|
192
|
+
const _ProcessorManager = getProcessorManager();
|
|
193
|
+
const _XrayStateManager = getXrayStateManager();
|
|
702
194
|
if (!_ProcessorManager || !_XrayStateManager)
|
|
703
195
|
return;
|
|
704
196
|
const stateManager = new _XrayStateManager(await resolveStateDir(directory));
|
|
@@ -745,17 +237,6 @@ export default async function xrayCodexPlugin(input) {
|
|
|
745
237
|
catch {
|
|
746
238
|
// Tuner not available in this environment â skip silently
|
|
747
239
|
}
|
|
748
|
-
// DISABLED: Auto governance proposal voting causes runaway token consumption
|
|
749
|
-
// See bug fix: inference cycle auto-trigger disabled to prevent recursive
|
|
750
|
-
// opencode process spawning via invokeViaOpencode() â architect â task subagents
|
|
751
|
-
//
|
|
752
|
-
// try {
|
|
753
|
-
// const { InferenceCycle } = await import(
|
|
754
|
-
// "../inference/inference-cycle.js"
|
|
755
|
-
// );
|
|
756
|
-
// const cycle = new InferenceCycle(directory);
|
|
757
|
-
// cycle.maybeRunCycle()...
|
|
758
|
-
// } catch {}
|
|
759
240
|
}
|
|
760
241
|
},
|
|
761
242
|
"chat.message": async (input, output) => {
|
|
@@ -767,33 +248,33 @@ export default async function xrayCodexPlugin(input) {
|
|
|
767
248
|
if (!textContent) {
|
|
768
249
|
return;
|
|
769
250
|
}
|
|
770
|
-
const agentMentionRegex = /@(\w+)(?:\s+(.+?))?(?=$|\n\n|\r\r)/g;
|
|
251
|
+
const agentMentionRegex = /@([\w-]+)(?:\s+(.+?))?(?=$|\n\n|\r\r)/g;
|
|
771
252
|
let match;
|
|
772
253
|
let hasAgentMention = false;
|
|
773
254
|
let transformedText = textContent;
|
|
774
255
|
const knownAgents = {
|
|
775
256
|
"architect": "architect",
|
|
776
257
|
"strategist": "strategist",
|
|
777
|
-
"
|
|
778
|
-
"
|
|
779
|
-
"
|
|
780
|
-
"
|
|
258
|
+
"testinglead": "testing-lead",
|
|
259
|
+
"bugtriagespecialist": "bug-triage-specialist",
|
|
260
|
+
"codereviewer": "code-reviewer",
|
|
261
|
+
"securityauditor": "security-auditor",
|
|
781
262
|
"refactorer": "refactorer",
|
|
782
263
|
"researcher": "researcher",
|
|
783
|
-
"
|
|
784
|
-
"
|
|
785
|
-
"
|
|
786
|
-
"
|
|
787
|
-
"
|
|
788
|
-
"
|
|
789
|
-
"
|
|
790
|
-
"
|
|
791
|
-
"
|
|
792
|
-
"
|
|
793
|
-
"
|
|
794
|
-
"
|
|
795
|
-
"
|
|
796
|
-
"
|
|
264
|
+
"codeanalyzer": "code-analyzer",
|
|
265
|
+
"frontendengineer": "frontend-engineer",
|
|
266
|
+
"frontenduiuxengineer": "frontend-ui-ux-engineer",
|
|
267
|
+
"backendengineer": "backend-engineer",
|
|
268
|
+
"databaseengineer": "database-engineer",
|
|
269
|
+
"devopsengineer": "devops-engineer",
|
|
270
|
+
"performanceengineer": "performance-engineer",
|
|
271
|
+
"mobiledeveloper": "mobile-developer",
|
|
272
|
+
"contentcreator": "content-creator",
|
|
273
|
+
"growthstrategist": "growth-strategist",
|
|
274
|
+
"seoconsultant": "seo-consultant",
|
|
275
|
+
"techwriter": "tech-writer",
|
|
276
|
+
"multimodallooker": "multimodal-looker",
|
|
277
|
+
"logmonitor": "log-monitor",
|
|
797
278
|
};
|
|
798
279
|
while ((match = agentMentionRegex.exec(textContent)) !== null) {
|
|
799
280
|
const agentName = match[1].toLowerCase().replace(/-/g, "");
|