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