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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { resolveCodexPath } from "./plugin-modules.js";
|
|
4
|
+
import { PluginLogger } from "./plugin-logger.js";
|
|
5
|
+
let cachedCodexContexts = null;
|
|
6
|
+
async function getCodexFileLocations(directory) {
|
|
7
|
+
const root = directory || process.cwd();
|
|
8
|
+
const resolved = await resolveCodexPath(root);
|
|
9
|
+
resolved.push(path.join(root, ".opencode", "codex.codex"), path.join(root, ".xray", "agents_template.md"), path.join(root, "AGENTS.md"));
|
|
10
|
+
return resolved;
|
|
11
|
+
}
|
|
12
|
+
function readFileContent(filePath) {
|
|
13
|
+
try {
|
|
14
|
+
return fs.readFileSync(filePath, "utf-8");
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
const logger = new PluginLogger(process.cwd());
|
|
18
|
+
logger.error(`Failed to read file ${filePath}`, error);
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function extractCodexMetadata(content) {
|
|
23
|
+
if (content.trim().startsWith("{")) {
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(content);
|
|
26
|
+
const version = parsed.version || "1.6.0";
|
|
27
|
+
const terms = parsed.terms || {};
|
|
28
|
+
const termCount = Object.keys(terms).length;
|
|
29
|
+
return { version, termCount };
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// Not valid JSON, try markdown format
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const versionMatch = content.match(/\*\*Version\*\*:\s*(\d+\.\d+\.\d+)/);
|
|
36
|
+
const version = versionMatch?.[1] ?? "1.6.0";
|
|
37
|
+
const termMatches = content.match(/####\s*\d+\.\s/g);
|
|
38
|
+
const termCount = termMatches ? termMatches.length : 0;
|
|
39
|
+
return { version, termCount };
|
|
40
|
+
}
|
|
41
|
+
export function createCodexContextEntry(filePath, content) {
|
|
42
|
+
const metadata = extractCodexMetadata(content);
|
|
43
|
+
return {
|
|
44
|
+
id: `xray-codex-${path.basename(filePath)}`,
|
|
45
|
+
source: filePath,
|
|
46
|
+
content,
|
|
47
|
+
priority: "critical",
|
|
48
|
+
metadata: {
|
|
49
|
+
version: metadata.version,
|
|
50
|
+
termCount: metadata.termCount,
|
|
51
|
+
loadedAt: new Date().toISOString(),
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export async function loadCodexContext(directory) {
|
|
56
|
+
if (cachedCodexContexts) {
|
|
57
|
+
return cachedCodexContexts;
|
|
58
|
+
}
|
|
59
|
+
const codexContexts = [];
|
|
60
|
+
const locations = await getCodexFileLocations(directory);
|
|
61
|
+
for (const fileLocation of locations) {
|
|
62
|
+
const fullPath = path.isAbsolute(fileLocation) ? fileLocation : path.join(directory, fileLocation);
|
|
63
|
+
const content = readFileContent(fullPath);
|
|
64
|
+
if (content && content.trim().length > 0) {
|
|
65
|
+
const entry = createCodexContextEntry(fullPath, content);
|
|
66
|
+
if (entry.metadata.termCount > 0) {
|
|
67
|
+
codexContexts.push(entry);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
cachedCodexContexts = codexContexts;
|
|
72
|
+
if (codexContexts.length === 0) {
|
|
73
|
+
const { getOrCreateLogger } = await import("./plugin-logger.js");
|
|
74
|
+
void getOrCreateLogger(directory).then((l) => l.error(`No valid codex files found. Checked: ${locations.join(", ")}`));
|
|
75
|
+
}
|
|
76
|
+
return codexContexts;
|
|
77
|
+
}
|
|
78
|
+
export function formatCodexContext(contexts) {
|
|
79
|
+
if (contexts.length === 0) {
|
|
80
|
+
return "";
|
|
81
|
+
}
|
|
82
|
+
const parts = [];
|
|
83
|
+
for (const context of contexts) {
|
|
84
|
+
parts.push(`# 0xRay Codex Context v${context.metadata.version}`, `Source: ${context.source}`, `Terms Loaded: ${context.metadata.termCount}`, `Loaded At: ${context.metadata.loadedAt}`, "", context.content, "", "---", "");
|
|
85
|
+
}
|
|
86
|
+
return parts.join("\n");
|
|
87
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { spawn } from "child_process";
|
|
4
|
+
export function spawnPromise(command, args, cwd) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const child = spawn(command, args, {
|
|
7
|
+
cwd,
|
|
8
|
+
stdio: ["ignore", "inherit", "pipe"],
|
|
9
|
+
});
|
|
10
|
+
let stderr = "";
|
|
11
|
+
if (child.stderr) {
|
|
12
|
+
child.stderr.on("data", (data) => {
|
|
13
|
+
stderr += data.toString();
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
child.on("close", (code) => {
|
|
17
|
+
if (code === 0) {
|
|
18
|
+
resolve({ stdout: "", stderr });
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
reject(new Error(`Process exited with code ${code}: ${stderr}`));
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
child.on("error", (error) => {
|
|
25
|
+
reject(error);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export function getFrameworkVersion() {
|
|
30
|
+
try {
|
|
31
|
+
const packageJsonPath = path.join(process.cwd(), "package.json");
|
|
32
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
33
|
+
return packageJson.version || "1.4.6";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return "1.4.6";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function getFrameworkIdentity() {
|
|
40
|
+
const version = getFrameworkVersion();
|
|
41
|
+
return `0xRay Framework v${version} - AI Orchestration
|
|
42
|
+
|
|
43
|
+
🔧 Core: architect, code-reviewer, refactorer, testing-lead, strategist
|
|
44
|
+
📚 Codex: 5 Essential Terms (99.6% Error Prevention Target)
|
|
45
|
+
🎯 Goal: Progressive, production-ready development workflow
|
|
46
|
+
|
|
47
|
+
📖 Documentation: config dir (codex, config, agents docs) — resolved via config-paths
|
|
48
|
+
`;
|
|
49
|
+
}
|
|
50
|
+
export const TOOL_AGENT_MAP = {
|
|
51
|
+
write: { agent: "code-reviewer", skill: "write" },
|
|
52
|
+
edit: { agent: "code-reviewer", skill: "edit" },
|
|
53
|
+
multiedit: { agent: "code-reviewer", skill: "multiedit" },
|
|
54
|
+
bash: { agent: "testing-lead", skill: "execution" },
|
|
55
|
+
search: { agent: "researcher", skill: "search" },
|
|
56
|
+
read: { agent: "researcher", skill: "read" },
|
|
57
|
+
glob: { agent: "researcher", skill: "glob" },
|
|
58
|
+
grep: { agent: "researcher", skill: "search" },
|
|
59
|
+
ls: { agent: "researcher", skill: "list" },
|
|
60
|
+
};
|
|
61
|
+
export function classifyTaskType(tool, args) {
|
|
62
|
+
const cmd = String(args?.command ?? "").toLowerCase().trim();
|
|
63
|
+
if (tool === "bash" && cmd) {
|
|
64
|
+
if (/(npm|yarn|pnpm)\s+test|jest|vitest|mocha|pytest/.test(cmd))
|
|
65
|
+
return "testing";
|
|
66
|
+
if (/(npm|yarn|pnpm)\s+run|npx|cargo|go run|make\s/.test(cmd))
|
|
67
|
+
return "build";
|
|
68
|
+
if (/audit|security|snyk|owasp|bandit/.test(cmd))
|
|
69
|
+
return "security";
|
|
70
|
+
if (/eslint|prettier|black|ruff|lint|format/.test(cmd))
|
|
71
|
+
return "lint";
|
|
72
|
+
if (/git\s/.test(cmd))
|
|
73
|
+
return "git";
|
|
74
|
+
if (/(npm|yarn|pnpm)\s+install|pip install|cargo add/.test(cmd))
|
|
75
|
+
return "install";
|
|
76
|
+
if (/grep|rg |find |ls |cat |head |tail /.test(cmd))
|
|
77
|
+
return "search";
|
|
78
|
+
}
|
|
79
|
+
if (tool === "write")
|
|
80
|
+
return "write";
|
|
81
|
+
if (tool === "edit" || tool === "multiedit")
|
|
82
|
+
return "edit";
|
|
83
|
+
if (tool === "read")
|
|
84
|
+
return "read";
|
|
85
|
+
if (tool === "search" || tool === "grep" || tool === "glob")
|
|
86
|
+
return "search";
|
|
87
|
+
return "unknown";
|
|
88
|
+
}
|
|
89
|
+
export function isWriteEditOperation(tool) {
|
|
90
|
+
return tool === "write" || tool === "edit" || tool === "multiedit";
|
|
91
|
+
}
|
|
92
|
+
export function isPublishOperation(tool) {
|
|
93
|
+
return tool === "publish" || tool === "release" || tool === "npm-publish" || tool === "xray-release";
|
|
94
|
+
}
|
|
95
|
+
export function resolveAgentName(input) {
|
|
96
|
+
const globalAgent = globalThis.currentAgent;
|
|
97
|
+
if (globalAgent?.agentType)
|
|
98
|
+
return globalAgent.agentType;
|
|
99
|
+
if (globalAgent?.type)
|
|
100
|
+
return globalAgent.type;
|
|
101
|
+
if (input?.agentType)
|
|
102
|
+
return input.agentType;
|
|
103
|
+
return "architect";
|
|
104
|
+
}
|
|
105
|
+
export function registerAllProcessors(pm) {
|
|
106
|
+
pm.registerProcessor({ name: "preValidate", type: "pre", priority: 10, enabled: true });
|
|
107
|
+
pm.registerProcessor({ name: "codexCompliance", type: "pre", priority: 20, enabled: true });
|
|
108
|
+
pm.registerProcessor({ name: "versionCompliance", type: "pre", priority: 25, enabled: true });
|
|
109
|
+
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 5, enabled: true });
|
|
110
|
+
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
111
|
+
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
112
|
+
}
|
|
113
|
+
export function registerAfterPostProcessors(pm) {
|
|
114
|
+
pm.registerProcessor({ name: "testAutoCreation", type: "post", priority: 50, enabled: true });
|
|
115
|
+
pm.registerProcessor({ name: "testExecution", type: "post", priority: 10, enabled: true });
|
|
116
|
+
pm.registerProcessor({ name: "coverageAnalysis", type: "post", priority: 20, enabled: true });
|
|
117
|
+
}
|
|
118
|
+
export function logPreProcessorResults(results, logger) {
|
|
119
|
+
logger.log(`📊 Pre-processor result: ${results.success ? "SUCCESS" : "FAILED"} (${results.results.length} processors)`);
|
|
120
|
+
if (!results.success) {
|
|
121
|
+
const failures = results.results.filter((r) => !r.success);
|
|
122
|
+
for (const f of failures) {
|
|
123
|
+
logger.error(`❌ Pre-processor ${f.processorName} failed: ${f.error}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
for (const r of results.results) {
|
|
128
|
+
logger.log(`✅ Pre-processor ${r.processorName}: ${r.success ? "OK" : "FAILED"}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function logPostProcessorResults(results, logger) {
|
|
133
|
+
const allSuccess = results.every((r) => r.success);
|
|
134
|
+
logger.log(`📊 Post-processor result: ${allSuccess ? "SUCCESS" : "FAILED"} (${results.length} processors)`);
|
|
135
|
+
for (const r of results) {
|
|
136
|
+
if (r.success) {
|
|
137
|
+
logger.log(`✅ Post-processor ${r.processorName}: OK`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
logger.error(`❌ Post-processor ${r.processorName} failed: ${r.error}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function logTestAutoCreationResult(results, logger) {
|
|
145
|
+
const testAutoResult = results.find((r) => r.processorName === "testAutoCreation");
|
|
146
|
+
if (testAutoResult) {
|
|
147
|
+
const data = testAutoResult.data;
|
|
148
|
+
if (testAutoResult.success && data?.testCreated && data?.testFile) {
|
|
149
|
+
logger.log(`✅ TEST AUTO-CREATION: Created ${data.testFile}`);
|
|
150
|
+
}
|
|
151
|
+
else if (!testAutoResult.success) {
|
|
152
|
+
logger.log(`ℹ️ TEST AUTO-CREATION: ${testAutoResult.error ?? "skipped - no new files"}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
export class PluginLogger {
|
|
4
|
+
logPath;
|
|
5
|
+
constructor(directory) {
|
|
6
|
+
const logsDir = path.join(directory, ".opencode", "logs");
|
|
7
|
+
if (!fs.existsSync(logsDir)) {
|
|
8
|
+
fs.mkdirSync(logsDir, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
const today = new Date().toISOString().split("T")[0];
|
|
11
|
+
this.logPath = path.join(logsDir, `xray-plugin-${today}.log`);
|
|
12
|
+
}
|
|
13
|
+
async logAsync(message) {
|
|
14
|
+
try {
|
|
15
|
+
const timestamp = new Date().toISOString();
|
|
16
|
+
const logEntry = `[${timestamp}] ${message}\n`;
|
|
17
|
+
await fs.promises.appendFile(this.logPath, logEntry, "utf-8");
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Silent fail - logging failure should not break plugin
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
log(message) {
|
|
24
|
+
void this.logAsync(message);
|
|
25
|
+
}
|
|
26
|
+
error(message, error) {
|
|
27
|
+
const errorDetail = error instanceof Error ? `: ${error.message}` : "";
|
|
28
|
+
this.log(`ERROR: ${message}${errorDetail}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let loggerInstance = null;
|
|
32
|
+
let loggerInitPromise = null;
|
|
33
|
+
export async function getOrCreateLogger(directory) {
|
|
34
|
+
if (loggerInstance) {
|
|
35
|
+
return loggerInstance;
|
|
36
|
+
}
|
|
37
|
+
if (loggerInitPromise) {
|
|
38
|
+
return loggerInitPromise;
|
|
39
|
+
}
|
|
40
|
+
loggerInitPromise = (async () => {
|
|
41
|
+
const logger = new PluginLogger(directory);
|
|
42
|
+
loggerInstance = logger;
|
|
43
|
+
return logger;
|
|
44
|
+
})();
|
|
45
|
+
return loggerInitPromise;
|
|
46
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { getOrCreateLogger } from "./plugin-logger.js";
|
|
3
|
+
let _resolveCodexPath = null;
|
|
4
|
+
let _resolveStateDir = null;
|
|
5
|
+
let _frameworkLogger = null;
|
|
6
|
+
let _systemPromptGenerator = null;
|
|
7
|
+
let _ProcessorManager = null;
|
|
8
|
+
let _XrayStateManager = null;
|
|
9
|
+
let _featuresConfigLoader = null;
|
|
10
|
+
let _detectTaskType = null;
|
|
11
|
+
export function getProcessorManager() { return _ProcessorManager; }
|
|
12
|
+
export function getXrayStateManager() { return _XrayStateManager; }
|
|
13
|
+
export function getFeaturesConfigLoader() { return _featuresConfigLoader; }
|
|
14
|
+
export function getDetectTaskType() { return _detectTaskType; }
|
|
15
|
+
export function getSystemPromptGenerator() { return _systemPromptGenerator; }
|
|
16
|
+
async function loadFrameworkLogger() {
|
|
17
|
+
if (_frameworkLogger)
|
|
18
|
+
return _frameworkLogger;
|
|
19
|
+
const candidates = [
|
|
20
|
+
"../core/framework-logger.js",
|
|
21
|
+
"../../node_modules/0xray/dist/core/framework-logger.js",
|
|
22
|
+
];
|
|
23
|
+
for (const p of candidates) {
|
|
24
|
+
try {
|
|
25
|
+
const mod = await import(p);
|
|
26
|
+
_frameworkLogger = mod.frameworkLogger;
|
|
27
|
+
return _frameworkLogger;
|
|
28
|
+
}
|
|
29
|
+
catch (_) {
|
|
30
|
+
// try next candidate
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
_frameworkLogger = {
|
|
34
|
+
log: (_module, _event, _status, _data) => { },
|
|
35
|
+
};
|
|
36
|
+
return _frameworkLogger;
|
|
37
|
+
}
|
|
38
|
+
async function loadConfigPaths() {
|
|
39
|
+
if (_resolveCodexPath && _resolveStateDir)
|
|
40
|
+
return;
|
|
41
|
+
const candidates = [
|
|
42
|
+
"../core/config-paths.js",
|
|
43
|
+
"../../node_modules/0xray/dist/core/config-paths.js",
|
|
44
|
+
];
|
|
45
|
+
for (const p of candidates) {
|
|
46
|
+
try {
|
|
47
|
+
const mod = await import(p);
|
|
48
|
+
_resolveCodexPath = mod.resolveCodexPath;
|
|
49
|
+
_resolveStateDir = mod.resolveStateDir;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
catch (_) {
|
|
53
|
+
// try next candidate
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const logger = await loadFrameworkLogger();
|
|
57
|
+
logger.log("xray-codex-plugin", "config-paths-load-failed", "warning", { warning: "Failed to load config-paths module from any location" });
|
|
58
|
+
}
|
|
59
|
+
export async function resolveCodexPath(root) {
|
|
60
|
+
await loadConfigPaths();
|
|
61
|
+
if (!_resolveCodexPath)
|
|
62
|
+
throw new Error("resolveCodexPath not available after loading");
|
|
63
|
+
return _resolveCodexPath(root);
|
|
64
|
+
}
|
|
65
|
+
export async function resolveStateDir(root) {
|
|
66
|
+
await loadConfigPaths();
|
|
67
|
+
if (!_resolveStateDir)
|
|
68
|
+
throw new Error("resolveStateDir not available after loading");
|
|
69
|
+
return _resolveStateDir(root);
|
|
70
|
+
}
|
|
71
|
+
export async function importSystemPromptGenerator() {
|
|
72
|
+
if (_systemPromptGenerator)
|
|
73
|
+
return;
|
|
74
|
+
const candidates = [
|
|
75
|
+
"../core/system-prompt-generator.js",
|
|
76
|
+
"../../node_modules/0xray/dist/core/system-prompt-generator.js",
|
|
77
|
+
];
|
|
78
|
+
for (const p of candidates) {
|
|
79
|
+
try {
|
|
80
|
+
const module = await import(p);
|
|
81
|
+
_systemPromptGenerator = module.generateLeanSystemPrompt;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
catch (_) {
|
|
85
|
+
// try next candidate
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const logger = await loadFrameworkLogger();
|
|
89
|
+
logger.log("xray-codex-plugin", "system-prompt-generator-load-failed", "warning", { warning: "Failed to load lean system prompt generator, using fallback" });
|
|
90
|
+
}
|
|
91
|
+
export function validateModulePath(resolvedPath, allowedPrefix) {
|
|
92
|
+
const normalized = path.resolve(resolvedPath);
|
|
93
|
+
const allowed = path.resolve(allowedPrefix);
|
|
94
|
+
if (!normalized.startsWith(allowed)) {
|
|
95
|
+
throw new Error(`Module path validation failed: ${normalized} is outside allowed path ${allowed}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export async function loadXrayComponents() {
|
|
99
|
+
if (_ProcessorManager && _XrayStateManager && _featuresConfigLoader)
|
|
100
|
+
return;
|
|
101
|
+
const logger = await getOrCreateLogger(process.cwd());
|
|
102
|
+
try {
|
|
103
|
+
const root = process.cwd();
|
|
104
|
+
const distPrefix = path.join(root, 'dist');
|
|
105
|
+
validateModulePath(`${root}/dist/processors/processor-manager.js`, distPrefix);
|
|
106
|
+
validateModulePath(`${root}/dist/state/state-manager.js`, distPrefix);
|
|
107
|
+
validateModulePath(`${root}/dist/core/features-config.js`, distPrefix);
|
|
108
|
+
const procModule = await import(`${root}/dist/processors/processor-manager.js`);
|
|
109
|
+
const stateModule = await import(`${root}/dist/state/state-manager.js`);
|
|
110
|
+
const featuresModule = await import(`${root}/dist/core/features-config.js`);
|
|
111
|
+
_ProcessorManager = procModule.ProcessorManager;
|
|
112
|
+
_XrayStateManager = stateModule.XrayStateManager;
|
|
113
|
+
_featuresConfigLoader = featuresModule.featuresConfigLoader;
|
|
114
|
+
_detectTaskType = featuresModule.detectTaskType;
|
|
115
|
+
logger.log(`✅ Loaded from cwd/dist/`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
120
|
+
logger.log(`❌ Failed to load from cwd/dist/: ${message}`);
|
|
121
|
+
}
|
|
122
|
+
const pluginPaths = ["0xray"];
|
|
123
|
+
for (const pluginPath of pluginPaths) {
|
|
124
|
+
try {
|
|
125
|
+
const nodeModulesPrefix = path.join(process.cwd(), 'node_modules');
|
|
126
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`, nodeModulesPrefix);
|
|
127
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`, nodeModulesPrefix);
|
|
128
|
+
validateModulePath(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`, nodeModulesPrefix);
|
|
129
|
+
const pm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/processors/processor-manager.js`);
|
|
130
|
+
const sm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/state/state-manager.js`);
|
|
131
|
+
const fm = await import(`${process.cwd()}/node_modules/${pluginPath}/dist/core/features-config.js`);
|
|
132
|
+
_ProcessorManager = pm.ProcessorManager;
|
|
133
|
+
_XrayStateManager = sm.XrayStateManager;
|
|
134
|
+
_featuresConfigLoader = fm.featuresConfigLoader;
|
|
135
|
+
_detectTaskType = fm.detectTaskType;
|
|
136
|
+
logger.log(`✅ Loaded from node_modules/${pluginPath}/dist/`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
141
|
+
logger.log(`❌ Failed to load from node_modules/${pluginPath}/dist/: ${message}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
export async function runEnforcerQualityGate(input, logger) {
|
|
3
|
+
const violations = [];
|
|
4
|
+
const { tool, args } = input;
|
|
5
|
+
try {
|
|
6
|
+
const { RuleEnforcer } = await import("../enforcement/rule-enforcer.js");
|
|
7
|
+
const ruleEnforcer = new RuleEnforcer();
|
|
8
|
+
const context = {
|
|
9
|
+
operation: tool === "write" ? "write" : tool === "edit" ? "edit" : "read",
|
|
10
|
+
};
|
|
11
|
+
if (args?.filePath) {
|
|
12
|
+
context.files = [args.filePath];
|
|
13
|
+
}
|
|
14
|
+
if (args?.content) {
|
|
15
|
+
context.newCode = args.content;
|
|
16
|
+
}
|
|
17
|
+
const report = await ruleEnforcer.validateOperation(tool, context);
|
|
18
|
+
const blockingViolations = [];
|
|
19
|
+
const allViolations = [];
|
|
20
|
+
if (report.errors && report.errors.length > 0) {
|
|
21
|
+
for (const error of report.errors) {
|
|
22
|
+
allViolations.push(error);
|
|
23
|
+
blockingViolations.push(error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (report.results) {
|
|
27
|
+
for (const result of report.results) {
|
|
28
|
+
if (!result.passed) {
|
|
29
|
+
const isBlocking = result.severity === "error" || result.severity === "blocking" || result.severity === "high";
|
|
30
|
+
allViolations.push(result.message);
|
|
31
|
+
if (isBlocking) {
|
|
32
|
+
blockingViolations.push(result.message);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (allViolations.length > 0) {
|
|
38
|
+
logger.log(`⚠️ ENFORCER: ${allViolations.length} rule violation(s) detected`);
|
|
39
|
+
for (const v of allViolations.slice(0, 5)) {
|
|
40
|
+
logger.log(` - ${v}`);
|
|
41
|
+
}
|
|
42
|
+
if (allViolations.length > 5) {
|
|
43
|
+
logger.log(` ... and ${allViolations.length - 5} more`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const passed = blockingViolations.length === 0;
|
|
47
|
+
violations.push(...blockingViolations);
|
|
48
|
+
if (!passed) {
|
|
49
|
+
logger.error(`🚫 Quality Gate FAILED with ${blockingViolations.length} blocking violation(s)`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
logger.log(`✅ Quality Gate PASSED (${allViolations.length} warning(s))`);
|
|
53
|
+
}
|
|
54
|
+
return { passed, violations };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
logger.log(`Warning: RuleEnforcer unavailable, using fallback checks: ${error instanceof Error ? error.message : String(error)}`);
|
|
58
|
+
if (tool === "write" && args?.filePath) {
|
|
59
|
+
const filePath = args.filePath;
|
|
60
|
+
if (filePath.endsWith(".ts") &&
|
|
61
|
+
!filePath.includes(".test.") &&
|
|
62
|
+
!filePath.includes(".spec.")) {
|
|
63
|
+
const testPath = filePath.replace(".ts", ".test.ts");
|
|
64
|
+
const specPath = filePath.replace(".ts", ".spec.ts");
|
|
65
|
+
if (!fs.existsSync(testPath) && !fs.existsSync(specPath)) {
|
|
66
|
+
violations.push(`tests-required: No test file found for ${filePath}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (args?.content) {
|
|
71
|
+
const errorPatterns = [/console\.log\s*\(/g, /TODO\s*:/gi, /FIXME\s*:/gi];
|
|
72
|
+
for (const pattern of errorPatterns) {
|
|
73
|
+
if (pattern.test(args.content)) {
|
|
74
|
+
violations.push(`resolve-all-errors: Found error pattern in code`);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const passed = violations.length === 0;
|
|
80
|
+
if (!passed) {
|
|
81
|
+
logger.error(`🚫 Fallback Quality Gate FAILED with ${violations.length} violation(s)`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
logger.log(`✅ Fallback Quality Gate PASSED`);
|
|
85
|
+
}
|
|
86
|
+
return { passed, violations };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|