0xray 3.1.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/codex.codex +1 -1
- package/.opencode/commands/auto-format.md +3 -3
- package/.opencode/commands/auto-summary-capture.md +2 -2
- 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 +2 -2
- package/AGENTS.md +3 -13
- package/README.md +3 -3
- package/dist/AGENTS.md +3 -13
- package/dist/CHANGELOG.md +55 -0
- package/dist/README.md +3 -3
- 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 +0 -1
- package/dist/analytics/simple-pattern-analyzer.js +0 -1
- package/dist/cli/commands/archive-logs.js +0 -1
- package/dist/cli/commands/opencode-install.js +13 -0
- package/dist/cli/commands/plugin-commands.js +0 -1
- package/dist/cli/commands/status.js +11 -13
- package/dist/cli/index.js +2 -7
- package/dist/core/activity-logger.js +0 -1
- package/dist/core/adaptive-kernel.js +0 -1
- package/dist/core/boot-orchestrator.js +2 -12
- package/dist/core/bridge.mjs +0 -1
- package/dist/core/codex-formatter.js +0 -1
- package/dist/core/codex-injector.js +0 -1
- package/dist/core/config-loader.js +36 -28
- package/dist/core/context-loader.js +0 -1
- package/dist/core/context-validator.js +0 -1
- package/dist/core/features-config.js +40 -1
- package/dist/core/kernel-patterns.js +0 -1
- package/dist/core/model-router.js +23 -64
- package/dist/core/system-prompt-generator.js +0 -1
- package/dist/delegation/agent-delegator.js +0 -1
- 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/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 +0 -1
- 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/governance/codex-policy.service.js +0 -1
- package/dist/inference/inference-agent-invoker.js +67 -0
- package/dist/inference/inference-applier.js +178 -0
- package/dist/inference/inference-cycle.js +51 -827
- 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/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 +3 -3
- 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/hermes-agent/__init__.py +4 -0
- package/dist/integrations/hermes-agent/bridge.mjs +37 -0
- package/dist/integrations/openclaw/api-server.js +0 -1
- package/dist/integrations/openclaw/client.js +0 -1
- package/dist/integrations/openclaw/config.js +0 -1
- package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -1
- package/dist/integrations/openclaw/index.js +0 -1
- package/dist/integrations/openclaw/types.js +0 -1
- package/dist/integrations/plugins/index.js +0 -1
- package/dist/integrations/plugins/plugin-integration.js +0 -1
- package/dist/integrations/plugins/plugin-registry.js +0 -1
- package/dist/mcps/agent-resolver.js +0 -1
- package/dist/mcps/architect-tools.server.js +119 -185
- package/dist/mcps/auto-format.server.js +56 -74
- package/dist/mcps/boot-orchestrator.server.js +67 -85
- package/dist/mcps/config/config-loader.js +6 -0
- package/dist/mcps/config/plugin-server-registry.js +0 -1
- package/dist/mcps/enforcer-tools.server.js +207 -273
- package/dist/mcps/estimation.server.js +63 -107
- package/dist/mcps/framework-compliance-audit.server.js +52 -81
- package/dist/mcps/framework-help.server.js +71 -89
- package/dist/mcps/governance.server.js +97 -149
- package/dist/mcps/knowledge-skills/api-design.server.js +33 -65
- package/dist/mcps/knowledge-skills/architecture-patterns.server.js +33 -65
- package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +123 -163
- package/dist/mcps/knowledge-skills/code-analyzer.server.js +210 -237
- package/dist/mcps/knowledge-skills/code-review.server.js +108 -142
- package/dist/mcps/knowledge-skills/content-creator.server.js +203 -225
- package/dist/mcps/knowledge-skills/database-design.server.js +116 -150
- package/dist/mcps/knowledge-skills/devops-deployment.server.js +123 -157
- package/dist/mcps/knowledge-skills/git-workflow.server.js +34 -67
- package/dist/mcps/knowledge-skills/growth-strategist.server.js +301 -323
- package/dist/mcps/knowledge-skills/log-monitor.server.js +139 -159
- package/dist/mcps/knowledge-skills/mobile-development.server.js +170 -200
- package/dist/mcps/knowledge-skills/multimodal-looker.server.js +122 -158
- package/dist/mcps/knowledge-skills/performance-optimization.server.js +88 -138
- package/dist/mcps/knowledge-skills/project-analysis.server.js +131 -218
- package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +115 -150
- package/dist/mcps/knowledge-skills/security-audit.server.js +16 -143
- package/dist/mcps/knowledge-skills/seo-consultant.server.js +20 -213
- package/dist/mcps/knowledge-skills/session-management.server.js +13 -90
- package/dist/mcps/knowledge-skills/skill-invocation.server.js +43 -421
- package/dist/mcps/knowledge-skills/strategist.server.js +10 -55
- package/dist/mcps/knowledge-skills/tech-writer.server.js +16 -191
- package/dist/mcps/knowledge-skills/testing-best-practices.server.js +18 -191
- package/dist/mcps/knowledge-skills/testing-strategy.server.js +18 -156
- package/dist/mcps/knowledge-skills/ui-ux-design.server.js +22 -296
- package/dist/mcps/lint.server.js +50 -91
- package/dist/mcps/model-health-check.server.js +32 -60
- package/dist/mcps/orchestrator/aside-context.js +207 -0
- package/dist/mcps/orchestrator/config/agent-capabilities.js +30 -11
- package/dist/mcps/orchestrator/config/memory-routing-bridge.js +70 -0
- package/dist/mcps/orchestrator/execution/execution-planner.js +25 -7
- 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 +59 -1
- package/dist/mcps/orchestrator/index.js +5 -0
- package/dist/mcps/orchestrator/server.js +63 -8
- package/dist/mcps/performance-analysis.server.js +56 -87
- package/dist/mcps/processor-pipeline.server.js +68 -99
- package/dist/mcps/researcher.server.js +80 -153
- package/dist/mcps/security-scan.server.js +56 -70
- package/dist/mcps/shared/knowledge-skill-base.js +11 -4
- package/dist/mcps/state-manager.server.js +124 -152
- package/dist/memory-routing/index.js +4 -0
- package/dist/memory-routing/null-provider.js +51 -0
- package/dist/memory-routing/provider-loader.js +91 -0
- package/dist/memory-routing/provider-registry.js +40 -0
- package/dist/memory-routing/types.js +7 -0
- package/dist/memory-routing/validate-config.js +32 -0
- 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/nucleus/thin-dispatch.js +29 -1
- package/dist/orchestrator/agent-spawn-governor.js +0 -1
- package/dist/orchestrator/intelligent-commit-batcher.js +2 -10
- package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -1
- package/dist/orchestrator/orchestrator.js +8 -18
- package/dist/orchestrator/self-direction-activation.js +0 -1
- package/dist/orchestrator/universal-registry-bridge.js +0 -1
- 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 +338 -0
- package/dist/postprocessor/PostProcessor.js +3 -9
- 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 +0 -1
- package/dist/postprocessor/triggers/APITrigger.js +0 -1
- 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 -9
- 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 -12
- 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 -28
- 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/scripts/integration.js +0 -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 +0 -1
- 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/xray-orchestrator/index.js +0 -1
- package/dist/utils/codex-parser.js +0 -1
- package/dist/utils/language-detector.js +0 -1
- 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 +1 -1
- package/scripts/node/release.mjs +2 -2
- package/scripts/node/setup.cjs +28 -0
- package/scripts/node/universal-version-manager.js +1 -1
- package/src/mcps/agent-resolver.ts +0 -1
- package/src/mcps/architect-tools.server.ts +129 -211
- package/src/mcps/auto-format.server.ts +74 -103
- package/src/mcps/boot-orchestrator.server.ts +71 -96
- package/src/mcps/config/__tests__/config-loader.test.ts +6 -6
- package/src/mcps/config/config-loader.ts +7 -0
- package/src/mcps/config/plugin-server-registry.ts +0 -1
- package/src/mcps/enforcer-tools.server.ts +217 -294
- package/src/mcps/estimation.server.ts +62 -122
- package/src/mcps/framework-compliance-audit.server.ts +53 -95
- package/src/mcps/framework-help.server.ts +74 -96
- package/src/mcps/governance.server.ts +97 -162
- package/src/mcps/knowledge-skills/api-design.server.ts +33 -72
- package/src/mcps/knowledge-skills/architecture-patterns.server.ts +33 -72
- package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +148 -193
- package/src/mcps/knowledge-skills/code-analyzer.server.ts +222 -254
- package/src/mcps/knowledge-skills/code-review.server.ts +115 -157
- package/src/mcps/knowledge-skills/content-creator.server.ts +219 -246
- package/src/mcps/knowledge-skills/database-design.server.ts +119 -160
- package/src/mcps/knowledge-skills/devops-deployment.server.ts +126 -167
- package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
- package/src/mcps/knowledge-skills/growth-strategist.server.ts +322 -360
- package/src/mcps/knowledge-skills/log-monitor.server.ts +68 -95
- package/src/mcps/knowledge-skills/mobile-development.server.ts +16 -56
- package/src/mcps/knowledge-skills/multimodal-looker.server.ts +13 -59
- package/src/mcps/knowledge-skills/performance-optimization.server.ts +13 -74
- package/src/mcps/knowledge-skills/project-analysis.server.ts +13 -120
- package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +13 -60
- package/src/mcps/knowledge-skills/security-audit.server.ts +19 -157
- package/src/mcps/knowledge-skills/seo-consultant.server.ts +23 -227
- package/src/mcps/knowledge-skills/session-management.server.ts +17 -106
- package/src/mcps/knowledge-skills/skill-invocation.server.ts +45 -446
- package/src/mcps/knowledge-skills/strategist.server.ts +13 -63
- package/src/mcps/knowledge-skills/tech-writer.server.ts +19 -204
- package/src/mcps/knowledge-skills/testing-best-practices.server.ts +21 -204
- package/src/mcps/knowledge-skills/testing-strategy.server.ts +21 -165
- package/src/mcps/knowledge-skills/ui-ux-design.server.ts +25 -342
- package/src/mcps/lint.server.ts +52 -105
- package/src/mcps/model-health-check.server.ts +34 -70
- package/src/mcps/orchestrator/aside-context.ts +245 -0
- package/src/mcps/orchestrator/config/agent-capabilities.ts +49 -14
- package/src/mcps/orchestrator/config/memory-routing-bridge.ts +80 -0
- package/src/mcps/orchestrator/execution/execution-planner.ts +36 -9
- 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 +78 -2
- package/src/mcps/orchestrator/index.ts +29 -0
- package/src/mcps/orchestrator/server.ts +79 -24
- package/src/mcps/orchestrator/types.ts +50 -0
- package/src/mcps/performance-analysis.server.ts +59 -102
- package/src/mcps/processor-pipeline.server.ts +70 -108
- package/src/mcps/researcher.server.ts +87 -175
- package/src/mcps/security-scan.server.ts +57 -76
- package/src/mcps/shared/knowledge-skill-base.ts +12 -4
- package/src/mcps/state-manager.server.ts +129 -169
- 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/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 +2 -2
- package/src/skills/xray-orchestrator/index.ts +0 -1
- package/dist/nucleus/orchestrator.js +0 -479
|
@@ -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 {};
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consumer runtime compat shim from prior 0xRay releases (1-line min per Scope Rule; xray codex injection + .xray fallbacks).
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from "fs";
|
|
5
|
+
import * as path from "path";
|
|
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";
|
|
17
|
+
const INFERENCE_TUNE_INTERVAL = 100;
|
|
18
|
+
let _openCodeToolCallCount = 0;
|
|
19
|
+
let _lastTuneToolCallCount = 0;
|
|
20
|
+
export default async function xrayCodexPlugin(input) {
|
|
21
|
+
const { directory: inputDirectory } = input;
|
|
22
|
+
const directory = inputDirectory || process.cwd();
|
|
23
|
+
return {
|
|
24
|
+
"experimental.chat.system.transform": async (_input, output) => {
|
|
25
|
+
try {
|
|
26
|
+
await importSystemPromptGenerator();
|
|
27
|
+
let leanPrompt = getFrameworkIdentity();
|
|
28
|
+
const _systemPromptGenerator = getSystemPromptGenerator();
|
|
29
|
+
if (_systemPromptGenerator) {
|
|
30
|
+
leanPrompt = await _systemPromptGenerator({
|
|
31
|
+
showWelcomeBanner: true,
|
|
32
|
+
showCodexContext: false,
|
|
33
|
+
enableTokenOptimization: true,
|
|
34
|
+
maxTokenBudget: 8192,
|
|
35
|
+
showCriticalTermsOnly: true,
|
|
36
|
+
showEssentialLinks: true,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (output.system && Array.isArray(output.system)) {
|
|
40
|
+
output.system = [leanPrompt];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const logger = await getOrCreateLogger(directory);
|
|
45
|
+
logger.error("System prompt injection failed:", error);
|
|
46
|
+
const fallback = getFrameworkIdentity();
|
|
47
|
+
if (output.system && Array.isArray(output.system)) {
|
|
48
|
+
output.system = [fallback];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"tool.execute.before": async (input, output) => {
|
|
53
|
+
const logger = await getOrCreateLogger(directory);
|
|
54
|
+
logger.log(`🚀 TOOL EXECUTE BEFORE HOOK FIRED: ${input.tool}`);
|
|
55
|
+
logger.log(`📥 Full input: ${JSON.stringify(input)}`);
|
|
56
|
+
await loadXrayComponents();
|
|
57
|
+
const _featuresConfigLoader = getFeaturesConfigLoader();
|
|
58
|
+
const _detectTaskType = getDetectTaskType();
|
|
59
|
+
if (_featuresConfigLoader && _detectTaskType) {
|
|
60
|
+
try {
|
|
61
|
+
const config = _featuresConfigLoader.loadConfig();
|
|
62
|
+
if (config.model_routing?.enabled) {
|
|
63
|
+
const taskType = _detectTaskType(input.tool);
|
|
64
|
+
const routing = taskType !== "unknown"
|
|
65
|
+
? config.model_routing.task_routing?.[taskType]
|
|
66
|
+
: undefined;
|
|
67
|
+
if (routing?.model) {
|
|
68
|
+
output.model = routing.model;
|
|
69
|
+
logger.log(`Model routed: ${input.tool} → ${taskType} → ${routing.model}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
logger.error("Model routing error", e);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const { tool, args } = input;
|
|
78
|
+
const qualityGateResult = await runEnforcerQualityGate(input, logger);
|
|
79
|
+
if (!qualityGateResult.passed) {
|
|
80
|
+
logger.error(`🚫 Quality gate failed: ${qualityGateResult.violations.join(", ")}`);
|
|
81
|
+
throw new Error(`ENFORCER BLOCKED: ${qualityGateResult.violations.join("; ")}`);
|
|
82
|
+
}
|
|
83
|
+
logger.log(`✅ Quality gate passed for ${tool}`);
|
|
84
|
+
if (isWriteEditOperation(tool)) {
|
|
85
|
+
const _ProcessorManager = getProcessorManager();
|
|
86
|
+
const _XrayStateManager = getXrayStateManager();
|
|
87
|
+
if (!_ProcessorManager || !_XrayStateManager) {
|
|
88
|
+
logger.error("ProcessorManager or XrayStateManager not loaded");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
let stateManager;
|
|
92
|
+
let processorManager;
|
|
93
|
+
const globalState = globalThis.xrayStateManager;
|
|
94
|
+
if (globalState) {
|
|
95
|
+
logger.log("🔗 Connecting to booted 0xRay framework");
|
|
96
|
+
stateManager = globalState;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
logger.log("🚀 0xRay framework not booted, initializing...");
|
|
100
|
+
stateManager = new _XrayStateManager(await resolveStateDir(directory));
|
|
101
|
+
globalThis.xrayStateManager = stateManager;
|
|
102
|
+
}
|
|
103
|
+
processorManager = stateManager.get("processor:manager") ?? null;
|
|
104
|
+
if (!processorManager) {
|
|
105
|
+
logger.log("⚙️ Creating and registering processors...");
|
|
106
|
+
processorManager = new _ProcessorManager(stateManager);
|
|
107
|
+
registerAllProcessors(processorManager);
|
|
108
|
+
stateManager.set("processor:manager", processorManager);
|
|
109
|
+
logger.log("✅ Processors registered successfully");
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
logger.log("✅ Using existing processor manager");
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
logger.log(`▶️ Executing pre-processors for ${tool}...`);
|
|
116
|
+
const preProcessorInput = {
|
|
117
|
+
tool,
|
|
118
|
+
args: args,
|
|
119
|
+
context: {
|
|
120
|
+
directory,
|
|
121
|
+
operation: "tool_execution",
|
|
122
|
+
filePath: args?.filePath,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
const result = await processorManager.executePreProcessors(preProcessorInput);
|
|
126
|
+
logPreProcessorResults(result, logger);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.error(`💥 Pre-processor execution error`, error);
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
logger.log(`▶️ Executing post-processors for ${tool}...`);
|
|
133
|
+
logger.log(`📝 Post-processor args: ${JSON.stringify(args)}`);
|
|
134
|
+
const agentName = resolveAgentName(input);
|
|
135
|
+
const postProcessorContext = {
|
|
136
|
+
directory,
|
|
137
|
+
operation: tool,
|
|
138
|
+
filePath: args?.filePath,
|
|
139
|
+
success: true,
|
|
140
|
+
agentName,
|
|
141
|
+
metadata: {
|
|
142
|
+
isPublishing: isPublishOperation(tool),
|
|
143
|
+
hook: "tool_execution",
|
|
144
|
+
toolName: tool,
|
|
145
|
+
timestamp: Date.now(),
|
|
146
|
+
agentType: agentName,
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
const postResults = await processorManager.executePostProcessors(tool, postProcessorContext, []);
|
|
150
|
+
logPostProcessorResults(postResults, logger);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
logger.error(`💥 Post-processor execution error`, error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"tool.execute.after": async (input, _output) => {
|
|
158
|
+
const logger = await getOrCreateLogger(directory);
|
|
159
|
+
await loadXrayComponents();
|
|
160
|
+
const { tool, args, result } = input;
|
|
161
|
+
try {
|
|
162
|
+
const { routingOutcomeTracker } = await import("../delegation/analytics/outcome-tracker.js");
|
|
163
|
+
const { TOOL_AGENT_MAP } = await import("./plugin-helpers.js");
|
|
164
|
+
const mapping = TOOL_AGENT_MAP[tool];
|
|
165
|
+
const taskType = classifyTaskType(tool, args);
|
|
166
|
+
const rawDesc = args?.content
|
|
167
|
+
? String(args.content).slice(0, 150)
|
|
168
|
+
: args?.filePath
|
|
169
|
+
? String(args.filePath)
|
|
170
|
+
: args?.command
|
|
171
|
+
? String(args.command).slice(0, 150)
|
|
172
|
+
: tool;
|
|
173
|
+
const description = `[${taskType}] ${rawDesc}`;
|
|
174
|
+
const outcomeFields = {
|
|
175
|
+
taskId: `opencode-${_openCodeToolCallCount}`,
|
|
176
|
+
taskDescription: description,
|
|
177
|
+
routedAgent: mapping?.agent ?? "direct",
|
|
178
|
+
routedSkill: mapping?.skill ?? tool,
|
|
179
|
+
confidence: mapping ? 0.8 : 0.5,
|
|
180
|
+
success: result?.error == null,
|
|
181
|
+
routingMethod: mapping ? "keyword" : "default",
|
|
182
|
+
};
|
|
183
|
+
if (taskType !== "unknown")
|
|
184
|
+
outcomeFields.taskType = taskType;
|
|
185
|
+
routingOutcomeTracker.recordOutcome(outcomeFields);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Outcome tracker not available — skip silently
|
|
189
|
+
}
|
|
190
|
+
logger.log(`📥 After hook input: ${JSON.stringify({ tool, hasArgs: !!args, args, hasResult: !!result }).slice(0, 200)}`);
|
|
191
|
+
if (isWriteEditOperation(tool)) {
|
|
192
|
+
const _ProcessorManager = getProcessorManager();
|
|
193
|
+
const _XrayStateManager = getXrayStateManager();
|
|
194
|
+
if (!_ProcessorManager || !_XrayStateManager)
|
|
195
|
+
return;
|
|
196
|
+
const stateManager = new _XrayStateManager(await resolveStateDir(directory));
|
|
197
|
+
const processorManager = new _ProcessorManager(stateManager);
|
|
198
|
+
registerAfterPostProcessors(processorManager);
|
|
199
|
+
try {
|
|
200
|
+
logger.log(`📝 Post-processor tool: ${tool}`);
|
|
201
|
+
logger.log(`📝 Post-processor args: ${JSON.stringify(args)}`);
|
|
202
|
+
logger.log(`📝 Post-processor directory: ${directory}`);
|
|
203
|
+
const postProcessorContext = {
|
|
204
|
+
directory,
|
|
205
|
+
operation: tool,
|
|
206
|
+
filePath: args?.filePath,
|
|
207
|
+
success: result?.success !== false,
|
|
208
|
+
metadata: {
|
|
209
|
+
isPublishing: isPublishOperation(tool),
|
|
210
|
+
hook: "tool_execution",
|
|
211
|
+
toolName: tool,
|
|
212
|
+
timestamp: Date.now(),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
const postResults = await processorManager.executePostProcessors(tool, postProcessorContext, []);
|
|
216
|
+
logPostProcessorResults(postResults, logger);
|
|
217
|
+
logTestAutoCreationResult(postResults, logger);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
logger.error(`💥 Post-processor error`, error);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
_openCodeToolCallCount++;
|
|
224
|
+
if (_openCodeToolCallCount - _lastTuneToolCallCount >= INFERENCE_TUNE_INTERVAL) {
|
|
225
|
+
_lastTuneToolCallCount = _openCodeToolCallCount;
|
|
226
|
+
try {
|
|
227
|
+
const { inferenceTuner } = await import("../services/inference-tuner.js");
|
|
228
|
+
inferenceTuner
|
|
229
|
+
.runTuningCycle()
|
|
230
|
+
.then(() => {
|
|
231
|
+
logger.log(`🔄 Inference tuning cycle completed (call #${_openCodeToolCallCount})`);
|
|
232
|
+
})
|
|
233
|
+
.catch((err) => {
|
|
234
|
+
logger.log(`⚠️ Inference tuning cycle skipped: ${err instanceof Error ? err.message : String(err)}`);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
catch {
|
|
238
|
+
// Tuner not available in this environment — skip silently
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
},
|
|
242
|
+
"chat.message": async (input, output) => {
|
|
243
|
+
const logger = await getOrCreateLogger(directory);
|
|
244
|
+
if (!output.parts) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const textContent = input.parts?.find(p => p.type === "text")?.text ?? "";
|
|
248
|
+
if (!textContent) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const agentMentionRegex = /@([\w-]+)(?:\s+(.+?))?(?=$|\n\n|\r\r)/g;
|
|
252
|
+
let match;
|
|
253
|
+
let hasAgentMention = false;
|
|
254
|
+
let transformedText = textContent;
|
|
255
|
+
const knownAgents = {
|
|
256
|
+
"architect": "architect",
|
|
257
|
+
"strategist": "strategist",
|
|
258
|
+
"testinglead": "testing-lead",
|
|
259
|
+
"bugtriagespecialist": "bug-triage-specialist",
|
|
260
|
+
"codereviewer": "code-reviewer",
|
|
261
|
+
"securityauditor": "security-auditor",
|
|
262
|
+
"refactorer": "refactorer",
|
|
263
|
+
"researcher": "researcher",
|
|
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",
|
|
278
|
+
};
|
|
279
|
+
while ((match = agentMentionRegex.exec(textContent)) !== null) {
|
|
280
|
+
const agentName = match[1].toLowerCase().replace(/-/g, "");
|
|
281
|
+
const taskPart = match[2]?.trim() ?? "";
|
|
282
|
+
if (knownAgents[agentName]) {
|
|
283
|
+
hasAgentMention = true;
|
|
284
|
+
const canonicalAgent = knownAgents[agentName];
|
|
285
|
+
logger.log(`🎯 Agent mention detected: @${canonicalAgent}`);
|
|
286
|
+
const prefix = `\n[DELEGATE TO AGENT: ${canonicalAgent}]\n`;
|
|
287
|
+
transformedText = prefix + (taskPart || textContent.replace(`@${match[1]}`, "").trim());
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (hasAgentMention) {
|
|
292
|
+
const textPart = output.parts.find(p => p.type === "text");
|
|
293
|
+
if (textPart) {
|
|
294
|
+
textPart.text = transformedText;
|
|
295
|
+
logger.log(`✅ Transformed prompt for agent routing`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
},
|
|
299
|
+
config: async (_config) => {
|
|
300
|
+
const lockFile = path.join(directory, ".opencode", "logs", ".xray-init.lock");
|
|
301
|
+
const now = Date.now();
|
|
302
|
+
try {
|
|
303
|
+
if (fs.existsSync(lockFile)) {
|
|
304
|
+
const stat = fs.statSync(lockFile);
|
|
305
|
+
if (now - stat.mtimeMs < 15000) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
fs.writeFileSync(lockFile, String(now));
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// lock check failed — proceed anyway
|
|
313
|
+
}
|
|
314
|
+
const logger = await getOrCreateLogger(directory);
|
|
315
|
+
logger.log("🔧 Plugin config hook triggered - initializing 0xRay integration");
|
|
316
|
+
let initScriptPath = path.join(directory, ".opencode", "init.sh");
|
|
317
|
+
const pkgInitPath = path.join(directory, "node_modules", "0xray", ".opencode", "init.sh");
|
|
318
|
+
if (!fs.existsSync(initScriptPath) && fs.existsSync(pkgInitPath)) {
|
|
319
|
+
initScriptPath = pkgInitPath;
|
|
320
|
+
}
|
|
321
|
+
if (fs.existsSync(initScriptPath)) {
|
|
322
|
+
try {
|
|
323
|
+
const { stderr } = await spawnPromise("bash", [initScriptPath], directory);
|
|
324
|
+
if (stderr) {
|
|
325
|
+
logger.error(`Framework init error: ${stderr}`);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
logger.log("✅ 0xRay Framework initialized successfully");
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
logger.error("Framework initialization failed", error);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
logger.log("✅ Plugin config hook completed");
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* Automated CI/CD loop orchestration: commit → push → monitor → fix → redeploy → monitor
|
|
5
5
|
* Provides systematic error prevention and deployment automation.
|
|
6
6
|
*
|
|
7
|
-
* @version 1.0.0
|
|
8
7
|
* @since 2026-01-13
|
|
9
8
|
*/
|
|
10
9
|
import * as path from "path";
|
|
11
10
|
import { frameworkLogger } from "../core/framework-logger.js";
|
|
12
|
-
import {
|
|
11
|
+
import { featuresConfigLoader } from "../core/features-config.js";
|
|
13
12
|
import { GitHookTrigger } from "./triggers/GitHookTrigger.js";
|
|
14
13
|
import { WebhookTrigger } from "./triggers/WebhookTrigger.js";
|
|
15
14
|
import { APITrigger } from "./triggers/APITrigger.js";
|
|
@@ -205,14 +204,9 @@ export class PostProcessor {
|
|
|
205
204
|
* FIX: Issue #2 - Make processor registration configurable
|
|
206
205
|
*/
|
|
207
206
|
async loadProcessorConfig() {
|
|
208
|
-
const fs = await import("fs");
|
|
209
|
-
const path = await import("path");
|
|
210
207
|
try {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
214
|
-
return config.processors || {};
|
|
215
|
-
}
|
|
208
|
+
const config = featuresConfigLoader.loadConfig();
|
|
209
|
+
return config.processors ?? {};
|
|
216
210
|
}
|
|
217
211
|
catch (error) {
|
|
218
212
|
frameworkLogger.log("postprocessor", "processor-config-load-failed", "info", {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { frameworkLogger } from "../../core/framework-logger.js";
|
|
2
|
+
export class CodeChangeAnalyzer {
|
|
3
|
+
async analyzeCodeChanges(context) {
|
|
4
|
+
const fs = await import("fs");
|
|
5
|
+
const path = await import("path");
|
|
6
|
+
const newCode = new Map();
|
|
7
|
+
const existingCode = new Map();
|
|
8
|
+
const tests = [];
|
|
9
|
+
const dependencies = [];
|
|
10
|
+
try {
|
|
11
|
+
// Read new/changed files
|
|
12
|
+
for (const file of context.files || []) {
|
|
13
|
+
try {
|
|
14
|
+
const fullPath = path.join(process.cwd(), file);
|
|
15
|
+
if (fs.existsSync(fullPath)) {
|
|
16
|
+
// Read new code
|
|
17
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
18
|
+
newCode.set(file, content);
|
|
19
|
+
// Check for test files
|
|
20
|
+
if (file.includes(".test.") || file.includes(".spec.")) {
|
|
21
|
+
tests.push(file);
|
|
22
|
+
}
|
|
23
|
+
// Check for package.json or dependency files
|
|
24
|
+
if (file.includes("package.json") || file.includes("requirements.txt") || file.includes("Cargo.toml")) {
|
|
25
|
+
dependencies.push(file);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// Skip files that can't be read
|
|
31
|
+
await frameworkLogger.log("-post-processor", "-code-analysis-file-error", "info", { message: `Could not analyze ${file}: ${error}` });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
await frameworkLogger.log("-post-processor", "-code-analysis-complete", "info", {
|
|
35
|
+
message: `Analyzed ${newCode.size} files, ${tests.length} tests, ${dependencies.length} dependencies`,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
await frameworkLogger.log("-post-processor", "-code-analysis-failed", "error", { message: `Code analysis failed: ${error}` });
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
operation: "commit",
|
|
43
|
+
files: context.files || [],
|
|
44
|
+
newCode,
|
|
45
|
+
existingCode,
|
|
46
|
+
tests,
|
|
47
|
+
dependencies,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { featuresConfigLoader } from "../../core/features-config.js";
|
|
2
|
+
import { frameworkLogger } from "../../core/framework-logger.js";
|
|
3
|
+
export class ProcessorConfigLoader {
|
|
4
|
+
async loadProcessorConfig() {
|
|
5
|
+
try {
|
|
6
|
+
const config = featuresConfigLoader.loadConfig();
|
|
7
|
+
return config.processors ?? {};
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
frameworkLogger.log("postprocessor", "processor-config-load-failed", "info", {
|
|
11
|
+
error: error instanceof Error ? error.message : String(error),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
}
|