0xray 3.1.1 → 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.
Files changed (296) hide show
  1. package/.opencode/codex.codex +1 -1
  2. package/.opencode/commands/auto-format.md +3 -3
  3. package/.opencode/commands/auto-summary-capture.md +2 -2
  4. package/.opencode/commands/enforcer-daily-scan.md +3 -3
  5. package/.opencode/commands/framework-compliance-audit.md +4 -4
  6. package/.opencode/commands/interactive-validator.md +2 -2
  7. package/.opencode/commands/job-summary-logger.md +2 -2
  8. package/.opencode/commands/mode-switch.md +1 -1
  9. package/.opencode/commands/model-health-check.md +2 -2
  10. package/.opencode/commands/performance-analysis.md +2 -2
  11. package/.opencode/commands/pre-commit-introspection.md +3 -3
  12. package/.opencode/commands/security-scan.md +3 -3
  13. package/.opencode/commands/sisyphus-validation.md +3 -3
  14. package/.opencode/commands/summary-logger.md +2 -2
  15. package/AGENTS.md +3 -13
  16. package/README.md +3 -3
  17. package/dist/AGENTS.md +3 -13
  18. package/dist/CHANGELOG.md +29 -0
  19. package/dist/README.md +3 -3
  20. package/dist/analytics/consent-manager.js +0 -1
  21. package/dist/analytics/emerging-pattern-detector.js +0 -1
  22. package/dist/analytics/pattern-learning-engine.js +0 -1
  23. package/dist/analytics/pattern-performance-tracker.js +0 -1
  24. package/dist/analytics/predictive-analytics.js +0 -1
  25. package/dist/analytics/prompt-pattern-analyzer.js +0 -1
  26. package/dist/analytics/routing-performance-analyzer.js +0 -1
  27. package/dist/analytics/routing-refiner.js +0 -1
  28. package/dist/analytics/simple-pattern-analyzer.js +0 -1
  29. package/dist/cli/commands/archive-logs.js +0 -1
  30. package/dist/cli/commands/opencode-install.js +13 -0
  31. package/dist/cli/commands/plugin-commands.js +0 -1
  32. package/dist/cli/commands/status.js +11 -13
  33. package/dist/cli/index.js +2 -7
  34. package/dist/core/activity-logger.js +0 -1
  35. package/dist/core/adaptive-kernel.js +0 -1
  36. package/dist/core/boot-orchestrator.js +2 -12
  37. package/dist/core/bridge.mjs +0 -1
  38. package/dist/core/codex-formatter.js +0 -1
  39. package/dist/core/codex-injector.js +0 -1
  40. package/dist/core/config-loader.js +36 -28
  41. package/dist/core/context-loader.js +0 -1
  42. package/dist/core/context-validator.js +0 -1
  43. package/dist/core/features-config.js +37 -1
  44. package/dist/core/kernel-patterns.js +0 -1
  45. package/dist/core/model-router.js +23 -64
  46. package/dist/core/system-prompt-generator.js +0 -1
  47. package/dist/delegation/agent-delegator.js +0 -1
  48. package/dist/delegation/agent-expertise.js +0 -1
  49. package/dist/delegation/analytics/index.js +0 -1
  50. package/dist/delegation/analytics/learning-engine.js +0 -1
  51. package/dist/delegation/analytics/outcome-tracker.js +0 -1
  52. package/dist/delegation/analytics/routing-analytics.js +0 -1
  53. package/dist/delegation/ast-code-parser.js +0 -1
  54. package/dist/delegation/complexity-analyzer.js +0 -1
  55. package/dist/delegation/dependency-graph-builder.js +0 -1
  56. package/dist/delegation/index.js +0 -1
  57. package/dist/delegation/metrics-aggregator.js +0 -1
  58. package/dist/delegation/session-coordinator.js +0 -1
  59. package/dist/delegation/strategy-selector.js +0 -1
  60. package/dist/delegation/voting-coordinator.js +0 -1
  61. package/dist/delegation/voting-types.js +0 -1
  62. package/dist/delegation/weighted-voting-aggregator.js +0 -1
  63. package/dist/enforcement/core/index.js +0 -1
  64. package/dist/enforcement/core/rule-executor.js +0 -1
  65. package/dist/enforcement/core/rule-hierarchy.js +0 -1
  66. package/dist/enforcement/core/rule-registry.js +0 -1
  67. package/dist/enforcement/core/violation-fixer.js +0 -1
  68. package/dist/enforcement/index.js +0 -1
  69. package/dist/enforcement/loaders/agent-triage-loader.js +0 -1
  70. package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -1
  71. package/dist/enforcement/loaders/base-loader.js +0 -1
  72. package/dist/enforcement/loaders/codex-loader.js +0 -1
  73. package/dist/enforcement/loaders/index.js +0 -1
  74. package/dist/enforcement/loaders/loader-orchestrator.js +0 -1
  75. package/dist/enforcement/loaders/processor-loader.js +0 -1
  76. package/dist/enforcement/types.js +0 -1
  77. package/dist/enforcement/validators/architecture-validators.js +0 -1
  78. package/dist/enforcement/validators/base-validator.js +0 -1
  79. package/dist/enforcement/validators/code-quality-validators.js +0 -1
  80. package/dist/enforcement/validators/index.js +0 -1
  81. package/dist/enforcement/validators/security-validators.js +0 -1
  82. package/dist/enforcement/validators/testing-validators.js +0 -1
  83. package/dist/enforcement/validators/validator-registry.js +0 -1
  84. package/dist/governance/codex-policy.service.js +0 -1
  85. package/dist/inference/inference-agent-invoker.js +67 -0
  86. package/dist/inference/inference-applier.js +178 -0
  87. package/dist/inference/inference-cycle.js +51 -827
  88. package/dist/inference/inference-proposal-generator.js +149 -0
  89. package/dist/infrastructure/iac-validator.js +465 -0
  90. package/dist/infrastructure/schemas/cloud-schemas.js +488 -0
  91. package/dist/integrations/base/ExampleIntegration.js +0 -1
  92. package/dist/integrations/base/Integration.js +0 -1
  93. package/dist/integrations/base/index.js +0 -1
  94. package/dist/integrations/base/registry.js +0 -1
  95. package/dist/integrations/base/types.js +0 -1
  96. package/dist/integrations/enforcement-gate.js +3 -3
  97. package/dist/integrations/governance/governance-client.js +0 -1
  98. package/dist/integrations/governance/index.js +11 -19
  99. package/dist/integrations/governance/types.js +0 -1
  100. package/dist/integrations/hermes-agent/__init__.py +4 -0
  101. package/dist/integrations/hermes-agent/bridge.mjs +37 -0
  102. package/dist/integrations/openclaw/api-server.js +0 -1
  103. package/dist/integrations/openclaw/client.js +0 -1
  104. package/dist/integrations/openclaw/config.js +0 -1
  105. package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -1
  106. package/dist/integrations/openclaw/index.js +0 -1
  107. package/dist/integrations/openclaw/types.js +0 -1
  108. package/dist/integrations/plugins/index.js +0 -1
  109. package/dist/integrations/plugins/plugin-integration.js +0 -1
  110. package/dist/integrations/plugins/plugin-registry.js +0 -1
  111. package/dist/mcps/agent-resolver.js +0 -1
  112. package/dist/mcps/architect-tools.server.js +119 -185
  113. package/dist/mcps/auto-format.server.js +56 -74
  114. package/dist/mcps/boot-orchestrator.server.js +67 -85
  115. package/dist/mcps/config/config-loader.js +6 -0
  116. package/dist/mcps/config/plugin-server-registry.js +0 -1
  117. package/dist/mcps/enforcer-tools.server.js +207 -273
  118. package/dist/mcps/estimation.server.js +63 -107
  119. package/dist/mcps/framework-compliance-audit.server.js +52 -81
  120. package/dist/mcps/framework-help.server.js +71 -89
  121. package/dist/mcps/governance.server.js +97 -149
  122. package/dist/mcps/knowledge-skills/api-design.server.js +33 -65
  123. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +33 -65
  124. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +123 -163
  125. package/dist/mcps/knowledge-skills/code-analyzer.server.js +210 -237
  126. package/dist/mcps/knowledge-skills/code-review.server.js +108 -142
  127. package/dist/mcps/knowledge-skills/content-creator.server.js +203 -225
  128. package/dist/mcps/knowledge-skills/database-design.server.js +116 -150
  129. package/dist/mcps/knowledge-skills/devops-deployment.server.js +123 -157
  130. package/dist/mcps/knowledge-skills/git-workflow.server.js +34 -67
  131. package/dist/mcps/knowledge-skills/growth-strategist.server.js +301 -323
  132. package/dist/mcps/knowledge-skills/log-monitor.server.js +139 -159
  133. package/dist/mcps/knowledge-skills/mobile-development.server.js +170 -200
  134. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +122 -158
  135. package/dist/mcps/knowledge-skills/performance-optimization.server.js +88 -138
  136. package/dist/mcps/knowledge-skills/project-analysis.server.js +131 -218
  137. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +115 -150
  138. package/dist/mcps/knowledge-skills/security-audit.server.js +16 -143
  139. package/dist/mcps/knowledge-skills/seo-consultant.server.js +20 -213
  140. package/dist/mcps/knowledge-skills/session-management.server.js +13 -90
  141. package/dist/mcps/knowledge-skills/skill-invocation.server.js +43 -421
  142. package/dist/mcps/knowledge-skills/strategist.server.js +10 -55
  143. package/dist/mcps/knowledge-skills/tech-writer.server.js +16 -191
  144. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +18 -191
  145. package/dist/mcps/knowledge-skills/testing-strategy.server.js +18 -156
  146. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +22 -296
  147. package/dist/mcps/lint.server.js +50 -91
  148. package/dist/mcps/model-health-check.server.js +32 -60
  149. package/dist/mcps/orchestrator/aside-context.js +207 -0
  150. package/dist/mcps/orchestrator/handlers/complexity-handler.js +5 -1
  151. package/dist/mcps/orchestrator/handlers/status-handler.js +8 -1
  152. package/dist/mcps/orchestrator/handlers/task-handler.js +5 -0
  153. package/dist/mcps/orchestrator/index.js +5 -0
  154. package/dist/mcps/orchestrator/server.js +63 -8
  155. package/dist/mcps/performance-analysis.server.js +56 -87
  156. package/dist/mcps/processor-pipeline.server.js +68 -99
  157. package/dist/mcps/researcher.server.js +80 -153
  158. package/dist/mcps/security-scan.server.js +56 -70
  159. package/dist/mcps/shared/knowledge-skill-base.js +11 -4
  160. package/dist/mcps/state-manager.server.js +124 -152
  161. package/dist/monitoring/nudge-watchdog.js +0 -1
  162. package/dist/nucleus/default-plugins.js +13 -19
  163. package/dist/nucleus/index.js +0 -1
  164. package/dist/orchestrator/agent-spawn-governor.js +0 -1
  165. package/dist/orchestrator/intelligent-commit-batcher.js +2 -10
  166. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -1
  167. package/dist/orchestrator/orchestrator.js +8 -18
  168. package/dist/orchestrator/self-direction-activation.js +0 -1
  169. package/dist/orchestrator/universal-registry-bridge.js +0 -1
  170. package/dist/performance/performance-budget-enforcer.js +0 -1
  171. package/dist/performance/performance-regression-tester.js +0 -1
  172. package/dist/plugin/plugin-codex-context.js +87 -0
  173. package/dist/plugin/plugin-helpers.js +155 -0
  174. package/dist/plugin/plugin-logger.js +46 -0
  175. package/dist/plugin/plugin-modules.js +144 -0
  176. package/dist/plugin/plugin-quality-gate.js +88 -0
  177. package/dist/plugin/plugin-types.js +1 -0
  178. package/dist/plugin/xray-codex-injection.js +338 -0
  179. package/dist/postprocessor/PostProcessor.js +3 -9
  180. package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +50 -0
  181. package/dist/postprocessor/config/ProcessorConfigLoader.js +16 -0
  182. package/dist/postprocessor/integration.js +194 -0
  183. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +472 -0
  184. package/dist/postprocessor/metamorphosis/index.js +1 -0
  185. package/dist/postprocessor/redeploy/RetryHandler.js +118 -0
  186. package/dist/postprocessor/services/RegressionAnalysisService.js +0 -1
  187. package/dist/postprocessor/triggers/APITrigger.js +0 -1
  188. package/dist/postprocessor/triggers/WebhookTrigger.js +0 -1
  189. package/dist/processors/implementations/agents-md-validation-processor.js +0 -1
  190. package/dist/processors/implementations/async-pattern-processor.js +0 -1
  191. package/dist/processors/implementations/console-log-guard-processor.js +0 -1
  192. package/dist/processors/implementations/coverage-analysis-processor.js +0 -1
  193. package/dist/processors/implementations/inference-improvement-processor.js +2 -9
  194. package/dist/processors/implementations/log-protection-processor.js +0 -1
  195. package/dist/processors/implementations/nudge-processor.js +0 -1
  196. package/dist/processors/implementations/performance-budget-processor.js +0 -1
  197. package/dist/processors/implementations/postprocessor-chain-validator.js +0 -1
  198. package/dist/processors/implementations/publish-preflight-processor.js +4 -12
  199. package/dist/processors/implementations/session-summary-processor.js +8 -16
  200. package/dist/processors/implementations/spawn-governance-processor.js +0 -1
  201. package/dist/processors/implementations/storytelling-trigger-processor.js +3 -28
  202. package/dist/processors/implementations/test-auto-creation-processor.js +0 -1
  203. package/dist/processors/implementations/typescript-compilation-processor.js +0 -1
  204. package/dist/processors/implementations/version-compliance-processor.js +0 -1
  205. package/dist/processors/processor-interfaces.js +0 -1
  206. package/dist/processors/processor-types.js +0 -1
  207. package/dist/scripts/integration.js +0 -1
  208. package/dist/security/comprehensive-security-audit.js +0 -1
  209. package/dist/security/security-agent-coordinator.js +0 -1
  210. package/dist/security/security-auditor.js +0 -1
  211. package/dist/security/security-hardener.js +0 -1
  212. package/dist/security/security-hardening-system.js +0 -1
  213. package/dist/security/security-headers.js +0 -1
  214. package/dist/security/security-orchestration-layer.js +0 -1
  215. package/dist/services/inference-tuner.js +0 -1
  216. package/dist/session/session-cleanup-manager.js +0 -1
  217. package/dist/session/session-monitor.js +0 -1
  218. package/dist/session/session-state-manager.js +0 -1
  219. package/dist/skills/xray-orchestrator/index.js +0 -1
  220. package/dist/utils/codex-parser.js +0 -1
  221. package/dist/utils/language-detector.js +0 -1
  222. package/dist/utils/shutdown-handler.js +0 -1
  223. package/dist/validation/agent-config-validator.js +280 -0
  224. package/dist/validation/orchestration-flow-validator.js +606 -0
  225. package/package.json +1 -1
  226. package/scripts/node/release.mjs +2 -2
  227. package/scripts/node/setup.cjs +28 -0
  228. package/scripts/node/universal-version-manager.js +1 -1
  229. package/src/mcps/agent-resolver.ts +0 -1
  230. package/src/mcps/architect-tools.server.ts +129 -211
  231. package/src/mcps/auto-format.server.ts +74 -103
  232. package/src/mcps/boot-orchestrator.server.ts +71 -96
  233. package/src/mcps/config/__tests__/config-loader.test.ts +6 -6
  234. package/src/mcps/config/config-loader.ts +7 -0
  235. package/src/mcps/config/plugin-server-registry.ts +0 -1
  236. package/src/mcps/enforcer-tools.server.ts +217 -294
  237. package/src/mcps/estimation.server.ts +62 -122
  238. package/src/mcps/framework-compliance-audit.server.ts +53 -95
  239. package/src/mcps/framework-help.server.ts +74 -96
  240. package/src/mcps/governance.server.ts +97 -162
  241. package/src/mcps/knowledge-skills/api-design.server.ts +33 -72
  242. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +33 -72
  243. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +148 -193
  244. package/src/mcps/knowledge-skills/code-analyzer.server.ts +222 -254
  245. package/src/mcps/knowledge-skills/code-review.server.ts +115 -157
  246. package/src/mcps/knowledge-skills/content-creator.server.ts +219 -246
  247. package/src/mcps/knowledge-skills/database-design.server.ts +119 -160
  248. package/src/mcps/knowledge-skills/devops-deployment.server.ts +126 -167
  249. package/src/mcps/knowledge-skills/git-workflow.server.ts +32 -77
  250. package/src/mcps/knowledge-skills/growth-strategist.server.ts +322 -360
  251. package/src/mcps/knowledge-skills/log-monitor.server.ts +68 -95
  252. package/src/mcps/knowledge-skills/mobile-development.server.ts +16 -56
  253. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +13 -59
  254. package/src/mcps/knowledge-skills/performance-optimization.server.ts +13 -74
  255. package/src/mcps/knowledge-skills/project-analysis.server.ts +13 -120
  256. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +13 -60
  257. package/src/mcps/knowledge-skills/security-audit.server.ts +19 -157
  258. package/src/mcps/knowledge-skills/seo-consultant.server.ts +23 -227
  259. package/src/mcps/knowledge-skills/session-management.server.ts +17 -106
  260. package/src/mcps/knowledge-skills/skill-invocation.server.ts +45 -446
  261. package/src/mcps/knowledge-skills/strategist.server.ts +13 -63
  262. package/src/mcps/knowledge-skills/tech-writer.server.ts +19 -204
  263. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +21 -204
  264. package/src/mcps/knowledge-skills/testing-strategy.server.ts +21 -165
  265. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +25 -342
  266. package/src/mcps/lint.server.ts +52 -105
  267. package/src/mcps/model-health-check.server.ts +34 -70
  268. package/src/mcps/orchestrator/aside-context.ts +245 -0
  269. package/src/mcps/orchestrator/handlers/complexity-handler.ts +9 -3
  270. package/src/mcps/orchestrator/handlers/status-handler.ts +11 -1
  271. package/src/mcps/orchestrator/handlers/task-handler.ts +8 -1
  272. package/src/mcps/orchestrator/index.ts +29 -0
  273. package/src/mcps/orchestrator/server.ts +79 -24
  274. package/src/mcps/orchestrator/types.ts +37 -0
  275. package/src/mcps/performance-analysis.server.ts +59 -102
  276. package/src/mcps/processor-pipeline.server.ts +70 -108
  277. package/src/mcps/researcher.server.ts +87 -175
  278. package/src/mcps/security-scan.server.ts +57 -76
  279. package/src/mcps/shared/knowledge-skill-base.ts +12 -4
  280. package/src/mcps/state-manager.server.ts +129 -169
  281. package/src/opencode/codex.codex +1 -1
  282. package/src/opencode/commands/auto-format.md +3 -3
  283. package/src/opencode/commands/auto-summary-capture.md +2 -2
  284. package/src/opencode/commands/enforcer-daily-scan.md +3 -3
  285. package/src/opencode/commands/framework-compliance-audit.md +4 -4
  286. package/src/opencode/commands/interactive-validator.md +2 -2
  287. package/src/opencode/commands/job-summary-logger.md +2 -2
  288. package/src/opencode/commands/mode-switch.md +1 -1
  289. package/src/opencode/commands/model-health-check.md +2 -2
  290. package/src/opencode/commands/performance-analysis.md +2 -2
  291. package/src/opencode/commands/pre-commit-introspection.md +3 -3
  292. package/src/opencode/commands/security-scan.md +3 -3
  293. package/src/opencode/commands/sisyphus-validation.md +3 -3
  294. package/src/opencode/commands/summary-logger.md +2 -2
  295. package/src/skills/xray-orchestrator/index.ts +0 -1
  296. package/dist/nucleus/orchestrator.js +0 -479
@@ -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 {};