0xray 2.0.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 (739) hide show
  1. package/.opencode/agents/api-design.yml +31 -0
  2. package/.opencode/agents/architect.yml +15 -0
  3. package/.opencode/agents/architecture-patterns.yml +14 -0
  4. package/.opencode/agents/auto-format.yml +14 -0
  5. package/.opencode/agents/backend-engineer.yml +12 -0
  6. package/.opencode/agents/boot-orchestrator.yml +14 -0
  7. package/.opencode/agents/bug-triage-specialist.yml +15 -0
  8. package/.opencode/agents/code-analyzer.yml +12 -0
  9. package/.opencode/agents/code-reviewer.yml +14 -0
  10. package/.opencode/agents/content-creator.yml +12 -0
  11. package/.opencode/agents/database-engineer.yml +12 -0
  12. package/.opencode/agents/devops-engineer.yml +12 -0
  13. package/.opencode/agents/framework-compliance-audit.yml +14 -0
  14. package/.opencode/agents/frontend-engineer.yml +12 -0
  15. package/.opencode/agents/frontend-ui-ux-engineer.yml +12 -0
  16. package/.opencode/agents/git-workflow.yml +15 -0
  17. package/.opencode/agents/growth-strategist.yml +12 -0
  18. package/.opencode/agents/hermes-agent.yml +12 -0
  19. package/.opencode/agents/inference-improve.yml +12 -0
  20. package/.opencode/agents/lint.yml +14 -0
  21. package/.opencode/agents/log-monitor.yml +12 -0
  22. package/.opencode/agents/mobile-developer.yml +12 -0
  23. package/.opencode/agents/model-health-check.yml +12 -0
  24. package/.opencode/agents/multimodal-looker.yml +12 -0
  25. package/.opencode/agents/performance-analysis.yml +12 -0
  26. package/.opencode/agents/performance-engineer.yml +12 -0
  27. package/.opencode/agents/performance-optimization.yml +12 -0
  28. package/.opencode/agents/processor-pipeline.yml +14 -0
  29. package/.opencode/agents/project-analysis.yml +12 -0
  30. package/.opencode/agents/refactorer.yml +12 -0
  31. package/.opencode/agents/researcher.yml +12 -0
  32. package/.opencode/agents/security-auditor.yml +12 -0
  33. package/.opencode/agents/security-scan.yml +12 -0
  34. package/.opencode/agents/seo-consultant.yml +12 -0
  35. package/.opencode/agents/session-management.yml +12 -0
  36. package/.opencode/agents/state-manager.yml +12 -0
  37. package/.opencode/agents/storyteller.yml +12 -0
  38. package/.opencode/agents/strategist.yml +12 -0
  39. package/.opencode/agents/tech-writer.yml +12 -0
  40. package/.opencode/agents/testing-best-practices.yml +12 -0
  41. package/.opencode/agents/testing-lead.yml +12 -0
  42. package/.opencode/agents/ui-ux-design.yml +12 -0
  43. package/.opencode/codex.codex +8 -0
  44. package/.opencode/commands/auto-format.md +99 -0
  45. package/.opencode/commands/auto-summary-capture.md +90 -0
  46. package/.opencode/commands/dependency-audit.md +184 -0
  47. package/.opencode/commands/enforcer-daily-scan.md +137 -0
  48. package/.opencode/commands/framework-compliance-audit.md +205 -0
  49. package/.opencode/commands/interactive-validator.md +75 -0
  50. package/.opencode/commands/job-summary-logger.md +68 -0
  51. package/.opencode/commands/lint.md +11 -0
  52. package/.opencode/commands/mode-switch.md +95 -0
  53. package/.opencode/commands/model-health-check.md +186 -0
  54. package/.opencode/commands/performance-analysis.md +144 -0
  55. package/.opencode/commands/pre-commit-introspection.md +185 -0
  56. package/.opencode/commands/pre-commit-introspection.sh +133 -0
  57. package/.opencode/commands/security-scan.md +157 -0
  58. package/.opencode/commands/sisyphus-validation.md +128 -0
  59. package/.opencode/commands/summary-logger.md +83 -0
  60. package/.opencode/enforcer-config.json +285 -0
  61. package/.opencode/hooks/hook-metrics.json +380 -0
  62. package/.opencode/hooks/post-commit +114 -0
  63. package/.opencode/hooks/post-push +34 -0
  64. package/.opencode/init.sh +151 -0
  65. package/.opencode/skills/api-design/SKILL.md +37 -0
  66. package/.opencode/skills/architect-tools/SKILL.md +37 -0
  67. package/.opencode/skills/architecture-patterns/SKILL.md +37 -0
  68. package/.opencode/skills/auto-format/SKILL.md +37 -0
  69. package/.opencode/skills/backend-engineer/SKILL.md +49 -0
  70. package/.opencode/skills/boot-orchestrator/SKILL.md +37 -0
  71. package/.opencode/skills/bug-triage/SKILL.md +43 -0
  72. package/.opencode/skills/code-analyzer/SKILL.md +45 -0
  73. package/.opencode/skills/code-review/SKILL.md +52 -0
  74. package/.opencode/skills/content-creator/SKILL.md +38 -0
  75. package/.opencode/skills/database-engineer/SKILL.md +46 -0
  76. package/.opencode/skills/devops-engineer/SKILL.md +49 -0
  77. package/.opencode/skills/enforcer/SKILL.md +37 -0
  78. package/.opencode/skills/framework-compliance-audit/SKILL.md +37 -0
  79. package/.opencode/skills/frontend-engineer/SKILL.md +49 -0
  80. package/.opencode/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  81. package/.opencode/skills/git-workflow/SKILL.md +37 -0
  82. package/.opencode/skills/growth-strategist/SKILL.md +48 -0
  83. package/.opencode/skills/hermes-agent/SKILL.md +212 -0
  84. package/.opencode/skills/inference-improve/SKILL.md +97 -0
  85. package/.opencode/skills/lint/SKILL.md +37 -0
  86. package/.opencode/skills/log-monitor/SKILL.md +44 -0
  87. package/.opencode/skills/mobile-developer/SKILL.md +42 -0
  88. package/.opencode/skills/model-health-check/SKILL.md +37 -0
  89. package/.opencode/skills/multimodal-looker/SKILL.md +45 -0
  90. package/.opencode/skills/orchestrator/SKILL.md +37 -0
  91. package/.opencode/skills/performance-analysis/SKILL.md +37 -0
  92. package/.opencode/skills/performance-engineer/SKILL.md +41 -0
  93. package/.opencode/skills/performance-optimization/SKILL.md +37 -0
  94. package/.opencode/skills/processor-pipeline/SKILL.md +37 -0
  95. package/.opencode/skills/project-analysis/SKILL.md +42 -0
  96. package/.opencode/skills/refactoring-strategies/SKILL.md +37 -0
  97. package/.opencode/skills/registry.json +66 -0
  98. package/.opencode/skills/researcher/SKILL.md +37 -0
  99. package/.opencode/skills/security-audit/SKILL.md +47 -0
  100. package/.opencode/skills/security-scan/SKILL.md +37 -0
  101. package/.opencode/skills/seo-consultant/SKILL.md +43 -0
  102. package/.opencode/skills/session-management/SKILL.md +36 -0
  103. package/.opencode/skills/state-manager/SKILL.md +37 -0
  104. package/.opencode/skills/storyteller/SKILL.md +130 -0
  105. package/.opencode/skills/strategist/SKILL.md +32 -0
  106. package/.opencode/skills/tech-writer/SKILL.md +37 -0
  107. package/.opencode/skills/testing-best-practices/SKILL.md +37 -0
  108. package/.opencode/skills/testing-strategy/SKILL.md +43 -0
  109. package/.opencode/skills/ui-ux-design/SKILL.md +603 -0
  110. package/.opencode/workflows/post-deployment-audit.yml +123 -0
  111. package/AGENTS.md +110 -0
  112. package/LICENSE +21 -0
  113. package/README.md +131 -0
  114. package/dist/AGENTS.md +110 -0
  115. package/dist/CHANGELOG.md +2182 -0
  116. package/dist/LICENSE +21 -0
  117. package/dist/README.md +131 -0
  118. package/dist/agents/architect.js +56 -0
  119. package/dist/agents/backend-engineer.js +81 -0
  120. package/dist/agents/bug-triage-specialist.js +74 -0
  121. package/dist/agents/code-analyzer.js +150 -0
  122. package/dist/agents/code-reviewer.js +69 -0
  123. package/dist/agents/content-creator.js +72 -0
  124. package/dist/agents/database-engineer.js +76 -0
  125. package/dist/agents/devops-engineer.js +84 -0
  126. package/dist/agents/frontend-engineer.js +78 -0
  127. package/dist/agents/frontend-ui-ux-engineer.js +64 -0
  128. package/dist/agents/growth-strategist.js +111 -0
  129. package/dist/agents/index.js +45 -0
  130. package/dist/agents/librarian-agents-updater.js +333 -0
  131. package/dist/agents/log-monitor.js +109 -0
  132. package/dist/agents/mobile-developer.js +102 -0
  133. package/dist/agents/multimodal-looker.js +93 -0
  134. package/dist/agents/performance-engineer.js +86 -0
  135. package/dist/agents/refactorer.js +80 -0
  136. package/dist/agents/registry.js +340 -0
  137. package/dist/agents/researcher.js +83 -0
  138. package/dist/agents/security-auditor.js +158 -0
  139. package/dist/agents/seo-consultant.js +53 -0
  140. package/dist/agents/strategist.js +47 -0
  141. package/dist/agents/tech-writer.js +84 -0
  142. package/dist/agents/testing-lead.js +95 -0
  143. package/dist/agents/types.js +1 -0
  144. package/dist/analytics/consent-manager.js +258 -0
  145. package/dist/analytics/emerging-pattern-detector.js +260 -0
  146. package/dist/analytics/pattern-learning-engine.js +278 -0
  147. package/dist/analytics/pattern-performance-tracker.js +336 -0
  148. package/dist/analytics/predictive-analytics.js +248 -0
  149. package/dist/analytics/prompt-pattern-analyzer.js +371 -0
  150. package/dist/analytics/routing-performance-analyzer.js +356 -0
  151. package/dist/analytics/routing-refiner.js +380 -0
  152. package/dist/analytics/simple-pattern-analyzer.js +297 -0
  153. package/dist/architect/architect-tools.js +437 -0
  154. package/dist/architect/architectural-integrity.js +78 -0
  155. package/dist/benchmark/performance-benchmark.js +372 -0
  156. package/dist/cli/commands/analytics-disable.js +72 -0
  157. package/dist/cli/commands/analytics-enable-action.js +82 -0
  158. package/dist/cli/commands/analytics-preview.js +106 -0
  159. package/dist/cli/commands/analytics-status.js +68 -0
  160. package/dist/cli/commands/antigravity-status.js +106 -0
  161. package/dist/cli/commands/archive-logs.js +161 -0
  162. package/dist/cli/commands/credible-init.js +82 -0
  163. package/dist/cli/commands/grok-install.js +16 -0
  164. package/dist/cli/commands/hermes-install.js +66 -0
  165. package/dist/cli/commands/mcp-install.js +253 -0
  166. package/dist/cli/commands/openclaw-install.js +44 -0
  167. package/dist/cli/commands/opencode-install.js +99 -0
  168. package/dist/cli/commands/plugin-commands.js +246 -0
  169. package/dist/cli/commands/publish-agent.js +184 -0
  170. package/dist/cli/commands/security-audit.js +219 -0
  171. package/dist/cli/commands/skill-install.js +481 -0
  172. package/dist/cli/commands/status.js +196 -0
  173. package/dist/cli/commands/storyteller.js +230 -0
  174. package/dist/cli/index.js +986 -0
  175. package/dist/cli/server.js +147 -0
  176. package/dist/config/default-agents.js +16 -0
  177. package/dist/core/activity-logger.js +260 -0
  178. package/dist/core/adaptive-kernel.js +192 -0
  179. package/dist/core/agent-spawn-gate.js +120 -0
  180. package/dist/core/boot-orchestrator.js +812 -0
  181. package/dist/core/bridge.mjs +945 -0
  182. package/dist/core/codex-formatter.js +220 -0
  183. package/dist/core/codex-injector.js +424 -0
  184. package/dist/core/config-loader.js +148 -0
  185. package/dist/core/config-paths.js +162 -0
  186. package/dist/core/context-loader.js +269 -0
  187. package/dist/core/context-validator.js +212 -0
  188. package/dist/core/features-config.js +457 -0
  189. package/dist/core/framework-logger.js +275 -0
  190. package/dist/core/index.js +6 -0
  191. package/dist/core/kernel-patterns.js +302 -0
  192. package/dist/core/logging-config.js +43 -0
  193. package/dist/core/model-router.js +175 -0
  194. package/dist/core/orchestrator.js +408 -0
  195. package/dist/core/system-prompt-generator.js +265 -0
  196. package/dist/core/trace-context.js +33 -0
  197. package/dist/core/xray-activation.js +134 -0
  198. package/dist/delegation/agent-delegator.js +769 -0
  199. package/dist/delegation/agent-expertise.js +156 -0
  200. package/dist/delegation/analytics/index.js +12 -0
  201. package/dist/delegation/analytics/learning-engine.js +277 -0
  202. package/dist/delegation/analytics/outcome-tracker.js +279 -0
  203. package/dist/delegation/analytics/routing-analytics.js +193 -0
  204. package/dist/delegation/ast-code-parser.js +878 -0
  205. package/dist/delegation/codebase-context-analyzer.js +1040 -0
  206. package/dist/delegation/complexity-analyzer.js +282 -0
  207. package/dist/delegation/complexity-core.js +219 -0
  208. package/dist/delegation/config/types.js +6 -0
  209. package/dist/delegation/dependency-graph-builder.js +409 -0
  210. package/dist/delegation/index.js +20 -0
  211. package/dist/delegation/metrics-aggregator.js +335 -0
  212. package/dist/delegation/session-coordinator.js +352 -0
  213. package/dist/delegation/strategy-selector.js +108 -0
  214. package/dist/delegation/voting-coordinator.js +375 -0
  215. package/dist/delegation/voting-types.js +10 -0
  216. package/dist/delegation/weighted-voting-aggregator.js +194 -0
  217. package/dist/enforcement/core/index.js +19 -0
  218. package/dist/enforcement/core/rule-executor.js +365 -0
  219. package/dist/enforcement/core/rule-hierarchy.js +259 -0
  220. package/dist/enforcement/core/rule-registry.js +240 -0
  221. package/dist/enforcement/core/violation-fixer.js +651 -0
  222. package/dist/enforcement/enforcer-tools.js +909 -0
  223. package/dist/enforcement/index.js +41 -0
  224. package/dist/enforcement/loaders/agent-triage-loader.js +222 -0
  225. package/dist/enforcement/loaders/agents-md-validation-loader.js +252 -0
  226. package/dist/enforcement/loaders/base-loader.js +86 -0
  227. package/dist/enforcement/loaders/codex-loader.js +396 -0
  228. package/dist/enforcement/loaders/index.js +40 -0
  229. package/dist/enforcement/loaders/loader-orchestrator.js +168 -0
  230. package/dist/enforcement/loaders/processor-loader.js +113 -0
  231. package/dist/enforcement/rule-enforcer.js +298 -0
  232. package/dist/enforcement/test-auto-healing.js +325 -0
  233. package/dist/enforcement/types.js +30 -0
  234. package/dist/enforcement/validators/architecture-validators.js +600 -0
  235. package/dist/enforcement/validators/base-validator.js +108 -0
  236. package/dist/enforcement/validators/code-quality-validators.js +336 -0
  237. package/dist/enforcement/validators/index.js +21 -0
  238. package/dist/enforcement/validators/security-validators.js +220 -0
  239. package/dist/enforcement/validators/testing-validators.js +253 -0
  240. package/dist/enforcement/validators/validator-registry.js +150 -0
  241. package/dist/execution/opencode-cli-invoker.js +173 -0
  242. package/dist/execution/proposal-applier.js +254 -0
  243. package/dist/governance/codex-policy.service.js +167 -0
  244. package/dist/governance/governance-core.js +152 -0
  245. package/dist/governance/governance-service.js +274 -0
  246. package/dist/governance/governance-types.js +6 -0
  247. package/dist/index.js +24 -0
  248. package/dist/inference/deploy-verifier.js +161 -0
  249. package/dist/inference/index.js +5 -0
  250. package/dist/inference/inference-accumulator.js +126 -0
  251. package/dist/inference/inference-cycle.js +1168 -0
  252. package/dist/inference/semantic-patterns.js +310 -0
  253. package/dist/inference/session-capture.js +308 -0
  254. package/dist/integrations/base/ExampleIntegration.js +181 -0
  255. package/dist/integrations/base/Integration.js +395 -0
  256. package/dist/integrations/base/README.md +446 -0
  257. package/dist/integrations/base/index.js +16 -0
  258. package/dist/integrations/base/registry.js +606 -0
  259. package/dist/integrations/base/types.js +118 -0
  260. package/dist/integrations/governance/governance-client.js +316 -0
  261. package/dist/integrations/governance/index.js +373 -0
  262. package/dist/integrations/governance/types.js +97 -0
  263. package/dist/integrations/grok/grok-cli.js +83 -0
  264. package/dist/integrations/grok/hooks/pre-tool-use.js +134 -0
  265. package/dist/integrations/grok/plugin/0xray/.mcp.json +15 -0
  266. package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
  267. package/dist/integrations/hermes-agent/__init__.py +718 -0
  268. package/dist/integrations/hermes-agent/after-install.md +71 -0
  269. package/dist/integrations/hermes-agent/bridge.mjs +861 -0
  270. package/dist/integrations/hermes-agent/conftest.py +14 -0
  271. package/dist/integrations/hermes-agent/plugin.yaml +12 -0
  272. package/dist/integrations/hermes-agent/schemas.py +100 -0
  273. package/dist/integrations/hermes-agent/test_plugin.py +1100 -0
  274. package/dist/integrations/hermes-agent/tools.py +253 -0
  275. package/dist/integrations/openclaw/README.md +134 -0
  276. package/dist/integrations/openclaw/api-server.js +389 -0
  277. package/dist/integrations/openclaw/client.js +492 -0
  278. package/dist/integrations/openclaw/config.js +374 -0
  279. package/dist/integrations/openclaw/hooks/strray-hooks.js +280 -0
  280. package/dist/integrations/openclaw/index.js +351 -0
  281. package/dist/integrations/openclaw/types.js +153 -0
  282. package/dist/integrations/plugins/index.js +10 -0
  283. package/dist/integrations/plugins/plugin-integration.js +606 -0
  284. package/dist/integrations/plugins/plugin-registry.js +580 -0
  285. package/dist/mcps/agent-resolver.js +106 -0
  286. package/dist/mcps/architect-tools.server.js +277 -0
  287. package/dist/mcps/auto-format.server.js +413 -0
  288. package/dist/mcps/boot-orchestrator.server.js +853 -0
  289. package/dist/mcps/config/config-loader.js +103 -0
  290. package/dist/mcps/config/config-validator.js +101 -0
  291. package/dist/mcps/config/index.js +30 -0
  292. package/dist/mcps/config/plugin-server-registry.js +223 -0
  293. package/dist/mcps/config/server-config-registry.js +348 -0
  294. package/dist/mcps/connection/connection-manager.js +79 -0
  295. package/dist/mcps/connection/connection-pool.js +164 -0
  296. package/dist/mcps/connection/mcp-connection.js +233 -0
  297. package/dist/mcps/connection/process-spawner.js +34 -0
  298. package/dist/mcps/enforcer-tools.server.js +778 -0
  299. package/dist/mcps/estimation.server.js +192 -0
  300. package/dist/mcps/framework-compliance-audit.server.js +500 -0
  301. package/dist/mcps/framework-help.server.js +400 -0
  302. package/dist/mcps/governance.server.js +464 -0
  303. package/dist/mcps/in-process-skill-registry.js +48 -0
  304. package/dist/mcps/knowledge-skills/api-design.server.js +123 -0
  305. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +113 -0
  306. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +474 -0
  307. package/dist/mcps/knowledge-skills/code-analyzer.server.js +605 -0
  308. package/dist/mcps/knowledge-skills/code-review.server.js +847 -0
  309. package/dist/mcps/knowledge-skills/content-creator.server.js +256 -0
  310. package/dist/mcps/knowledge-skills/database-design.server.js +822 -0
  311. package/dist/mcps/knowledge-skills/devops-deployment.server.js +1180 -0
  312. package/dist/mcps/knowledge-skills/git-workflow.server.js +115 -0
  313. package/dist/mcps/knowledge-skills/growth-strategist.server.js +361 -0
  314. package/dist/mcps/knowledge-skills/log-monitor.server.js +451 -0
  315. package/dist/mcps/knowledge-skills/mobile-development.server.js +525 -0
  316. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +1063 -0
  317. package/dist/mcps/knowledge-skills/performance-optimization.server.js +1587 -0
  318. package/dist/mcps/knowledge-skills/project-analysis.server.js +811 -0
  319. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +796 -0
  320. package/dist/mcps/knowledge-skills/security-audit.server.js +846 -0
  321. package/dist/mcps/knowledge-skills/seo-consultant.server.js +937 -0
  322. package/dist/mcps/knowledge-skills/session-management.server.js +470 -0
  323. package/dist/mcps/knowledge-skills/skill-invocation.server.js +729 -0
  324. package/dist/mcps/knowledge-skills/strategist.server.js +217 -0
  325. package/dist/mcps/knowledge-skills/tech-writer.server.js +1191 -0
  326. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +866 -0
  327. package/dist/mcps/knowledge-skills/testing-strategy.server.js +827 -0
  328. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +1538 -0
  329. package/dist/mcps/lint.server.js +381 -0
  330. package/dist/mcps/mcp-client.js +574 -0
  331. package/dist/mcps/model-health-check.server.js +228 -0
  332. package/dist/mcps/orchestrator/config/agent-capabilities.js +87 -0
  333. package/dist/mcps/orchestrator/execution/execution-planner.js +279 -0
  334. package/dist/mcps/orchestrator/handlers/complexity-handler.js +94 -0
  335. package/dist/mcps/orchestrator/handlers/status-handler.js +232 -0
  336. package/dist/mcps/orchestrator/handlers/task-handler.js +197 -0
  337. package/dist/mcps/orchestrator/server.js +305 -0
  338. package/dist/mcps/orchestrator/types.js +6 -0
  339. package/dist/mcps/orchestrator.server.js +19 -0
  340. package/dist/mcps/performance-analysis.server.js +519 -0
  341. package/dist/mcps/processor-pipeline.server.js +561 -0
  342. package/dist/mcps/protocol/protocol-constants.js +46 -0
  343. package/dist/mcps/registry.json +110 -0
  344. package/dist/mcps/researcher.server.js +504 -0
  345. package/dist/mcps/security-scan.server.js +531 -0
  346. package/dist/mcps/simulation/index.js +12 -0
  347. package/dist/mcps/simulation/server-simulations.js +219 -0
  348. package/dist/mcps/simulation/simulation-engine.js +96 -0
  349. package/dist/mcps/state-manager.server.js +637 -0
  350. package/dist/mcps/tools/index.js +14 -0
  351. package/dist/mcps/tools/tool-cache.js +112 -0
  352. package/dist/mcps/tools/tool-discovery.js +65 -0
  353. package/dist/mcps/tools/tool-executor.js +75 -0
  354. package/dist/mcps/tools/tool-registry.js +67 -0
  355. package/dist/mcps/types/index.js +15 -0
  356. package/dist/mcps/types/json-rpc.types.js +7 -0
  357. package/dist/mcps/types/mcp.types.js +7 -0
  358. package/dist/metrics/agent-metrics.js +574 -0
  359. package/dist/metrics/index.js +6 -0
  360. package/dist/monitoring/advanced-profiler.js +232 -0
  361. package/dist/monitoring/memory-monitor.js +315 -0
  362. package/dist/monitoring/nudge-watchdog.js +356 -0
  363. package/dist/monitoring/test-auto-generation-monitor.js +157 -0
  364. package/dist/orchestrator/agent-spawn-governor.js +559 -0
  365. package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +399 -0
  366. package/dist/orchestrator/intelligent-commit-batcher.js +353 -0
  367. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +456 -0
  368. package/dist/orchestrator/orchestrator.js +657 -0
  369. package/dist/orchestrator/self-direction-activation.js +245 -0
  370. package/dist/orchestrator/universal-librarian-consultation.js +216 -0
  371. package/dist/orchestrator/universal-registry-bridge.js +247 -0
  372. package/dist/performance/performance-budget-enforcer.js +434 -0
  373. package/dist/performance/performance-regression-tester.js +342 -0
  374. package/dist/plugin/xray-codex-injection.js +857 -0
  375. package/dist/postprocessor/PostProcessor.js +1048 -0
  376. package/dist/postprocessor/analysis/FailureAnalysisEngine.js +245 -0
  377. package/dist/postprocessor/autofix/AutoFixEngine.js +254 -0
  378. package/dist/postprocessor/autofix/FixValidator.js +56 -0
  379. package/dist/postprocessor/config.js +65 -0
  380. package/dist/postprocessor/escalation/EscalationEngine.js +492 -0
  381. package/dist/postprocessor/monitoring/MonitoringEngine.js +125 -0
  382. package/dist/postprocessor/redeploy/RedeployCoordinator.js +342 -0
  383. package/dist/postprocessor/services/RegressionAnalysisService.js +131 -0
  384. package/dist/postprocessor/success/SuccessHandler.js +134 -0
  385. package/dist/postprocessor/triggers/APITrigger.js +115 -0
  386. package/dist/postprocessor/triggers/GitHookTrigger.js +551 -0
  387. package/dist/postprocessor/triggers/WebhookTrigger.js +211 -0
  388. package/dist/postprocessor/types.js +4 -0
  389. package/dist/processors/doc-write-guard.js +46 -0
  390. package/dist/processors/implementations/agents-md-validation-processor.js +286 -0
  391. package/dist/processors/implementations/async-pattern-processor.js +158 -0
  392. package/dist/processors/implementations/codex-compliance-processor.js +57 -0
  393. package/dist/processors/implementations/commit-batcher-processor.js +71 -0
  394. package/dist/processors/implementations/console-log-guard-processor.js +163 -0
  395. package/dist/processors/implementations/coverage-analysis-processor.js +138 -0
  396. package/dist/processors/implementations/error-boundary-processor.js +44 -0
  397. package/dist/processors/implementations/inference-improvement-processor.js +270 -0
  398. package/dist/processors/implementations/log-protection-processor.js +118 -0
  399. package/dist/processors/implementations/nudge-processor.js +130 -0
  400. package/dist/processors/implementations/performance-budget-processor.js +217 -0
  401. package/dist/processors/implementations/postprocessor-chain-validator.js +149 -0
  402. package/dist/processors/implementations/pre-validate-processor.js +18 -0
  403. package/dist/processors/implementations/publish-preflight-processor.js +249 -0
  404. package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +33 -0
  405. package/dist/processors/implementations/refactoring-logging-processor.js +96 -0
  406. package/dist/processors/implementations/regression-testing-processor.js +59 -0
  407. package/dist/processors/implementations/session-capture-processor.js +37 -0
  408. package/dist/processors/implementations/session-summary-processor.js +130 -0
  409. package/dist/processors/implementations/spawn-governance-processor.js +219 -0
  410. package/dist/processors/implementations/state-validation-processor.js +15 -0
  411. package/dist/processors/implementations/storytelling-trigger-processor.js +589 -0
  412. package/dist/processors/implementations/test-auto-creation-processor.js +484 -0
  413. package/dist/processors/implementations/test-execution-processor.js +132 -0
  414. package/dist/processors/implementations/typescript-compilation-processor.js +87 -0
  415. package/dist/processors/implementations/version-compliance-processor.js +350 -0
  416. package/dist/processors/processor-interfaces.js +126 -0
  417. package/dist/processors/processor-manager.js +826 -0
  418. package/dist/processors/processor-types.js +12 -0
  419. package/dist/public/about.html +228 -0
  420. package/dist/public/enterprise.html +27 -0
  421. package/dist/public/features.html +102 -0
  422. package/dist/public/index.html +145 -0
  423. package/dist/reporting/framework-reporting-system.js +187 -0
  424. package/dist/reporting/log-parser.js +281 -0
  425. package/dist/reporting/metrics.js +202 -0
  426. package/dist/reporting/report-formatter.js +146 -0
  427. package/dist/reporting/types.js +1 -0
  428. package/dist/scripts/activate-kernel-pipeline.js +101 -0
  429. package/dist/scripts/integration.js +234 -0
  430. package/dist/scripts/pre-command +26 -0
  431. package/dist/scripts/pre-command.mjs +358 -0
  432. package/dist/security/comprehensive-security-audit.js +1005 -0
  433. package/dist/security/index.js +13 -0
  434. package/dist/security/prompt-security-validator.js +148 -0
  435. package/dist/security/security-agent-coordinator.js +204 -0
  436. package/dist/security/security-auditor.js +584 -0
  437. package/dist/security/security-hardener.js +170 -0
  438. package/dist/security/security-hardening-system.js +727 -0
  439. package/dist/security/security-headers.js +118 -0
  440. package/dist/security/security-orchestration-layer.js +496 -0
  441. package/dist/security/security-scanner.js +429 -0
  442. package/dist/services/inference-tuner.js +301 -0
  443. package/dist/session/index.js +3 -0
  444. package/dist/session/session-cleanup-manager.js +366 -0
  445. package/dist/session/session-monitor.js +503 -0
  446. package/dist/session/session-state-manager.js +522 -0
  447. package/dist/skills/api-design/SKILL.md +37 -0
  448. package/dist/skills/architect-tools/SKILL.md +37 -0
  449. package/dist/skills/architecture-patterns/SKILL.md +37 -0
  450. package/dist/skills/auto-format/SKILL.md +37 -0
  451. package/dist/skills/backend-engineer/SKILL.md +49 -0
  452. package/dist/skills/boot-orchestrator/SKILL.md +37 -0
  453. package/dist/skills/bug-triage/SKILL.md +43 -0
  454. package/dist/skills/code-analyzer/SKILL.md +45 -0
  455. package/dist/skills/code-review/SKILL.md +52 -0
  456. package/dist/skills/content-creator/SKILL.md +38 -0
  457. package/dist/skills/database-engineer/SKILL.md +46 -0
  458. package/dist/skills/devops-engineer/SKILL.md +49 -0
  459. package/dist/skills/enforcer/SKILL.md +37 -0
  460. package/dist/skills/framework-compliance-audit/SKILL.md +37 -0
  461. package/dist/skills/frontend-engineer/SKILL.md +49 -0
  462. package/dist/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  463. package/dist/skills/git-workflow/SKILL.md +37 -0
  464. package/dist/skills/growth-strategist/SKILL.md +48 -0
  465. package/dist/skills/hermes-agent/SKILL.md +212 -0
  466. package/dist/skills/inference-improve/SKILL.md +97 -0
  467. package/dist/skills/lint/SKILL.md +37 -0
  468. package/dist/skills/log-monitor/SKILL.md +44 -0
  469. package/dist/skills/mobile-developer/SKILL.md +42 -0
  470. package/dist/skills/model-health-check/SKILL.md +37 -0
  471. package/dist/skills/multimodal-looker/SKILL.md +45 -0
  472. package/dist/skills/orchestrator/SKILL.md +37 -0
  473. package/dist/skills/performance-analysis/SKILL.md +37 -0
  474. package/dist/skills/performance-engineer/SKILL.md +41 -0
  475. package/dist/skills/performance-optimization/SKILL.md +37 -0
  476. package/dist/skills/processor-pipeline/SKILL.md +37 -0
  477. package/dist/skills/project-analysis/SKILL.md +42 -0
  478. package/dist/skills/refactoring-strategies/SKILL.md +37 -0
  479. package/dist/skills/registry.json +66 -0
  480. package/dist/skills/researcher/SKILL.md +37 -0
  481. package/dist/skills/security-audit/SKILL.md +48 -0
  482. package/dist/skills/security-scan/SKILL.md +37 -0
  483. package/dist/skills/seo-consultant/SKILL.md +43 -0
  484. package/dist/skills/session-management/SKILL.md +36 -0
  485. package/dist/skills/state-manager/SKILL.md +37 -0
  486. package/dist/skills/storyteller/SKILL.md +130 -0
  487. package/dist/skills/strategist/SKILL.md +32 -0
  488. package/dist/skills/tech-writer/SKILL.md +37 -0
  489. package/dist/skills/testing-best-practices/SKILL.md +37 -0
  490. package/dist/skills/testing-strategy/SKILL.md +43 -0
  491. package/dist/skills/ui-ux-design/SKILL.md +603 -0
  492. package/dist/state/context-providers.js +1 -0
  493. package/dist/state/index.js +7 -0
  494. package/dist/state/state-manager.js +208 -0
  495. package/dist/state/state-types.js +1 -0
  496. package/dist/testing/memory-regression-suite.js +258 -0
  497. package/dist/utils/batch-operations.js +292 -0
  498. package/dist/utils/codex-parser.js +445 -0
  499. package/dist/utils/command-runner.js +96 -0
  500. package/dist/utils/import-resolver.js +189 -0
  501. package/dist/utils/language-detector.js +383 -0
  502. package/dist/utils/path-resolver.js +112 -0
  503. package/dist/utils/shutdown-handler.js +75 -0
  504. package/dist/utils/test-template-generator.js +178 -0
  505. package/dist/utils/token-manager.js +163 -0
  506. package/dist/validation/estimation-validator.js +241 -0
  507. package/dist/validation/report-content-validator.js +218 -0
  508. package/opencode.json +153 -0
  509. package/package.json +170 -0
  510. package/scripts/helpers/resolve-config-path.cjs +57 -0
  511. package/scripts/helpers/resolve-config-path.mjs +73 -0
  512. package/scripts/hooks/pre-command +26 -0
  513. package/scripts/hooks/pre-command.mjs +358 -0
  514. package/scripts/hooks/run-hook.js +570 -0
  515. package/scripts/mjs/test-consumer-readiness.mjs +273 -0
  516. package/scripts/mjs/test-mcp-functionality.mjs +507 -0
  517. package/scripts/mjs/validate-mcp-connectivity.cjs +75 -0
  518. package/scripts/mjs/validate-postinstall-config.mjs +308 -0
  519. package/scripts/node/auto-reflection-generator.mjs +496 -0
  520. package/scripts/node/basic-security-audit.cjs +338 -0
  521. package/scripts/node/ci-cd-auto-fix.cjs +263 -0
  522. package/scripts/node/ci-report-generator.mjs +227 -0
  523. package/scripts/node/enforce-agents-md.mjs +420 -0
  524. package/scripts/node/enforce-version-compliance.sh +22 -0
  525. package/scripts/node/enforce-version-compliance.ts +126 -0
  526. package/scripts/node/github-actions-monitor.cjs +23 -0
  527. package/scripts/node/govern-reflection.mjs +160 -0
  528. package/scripts/node/postinstall.cjs +78 -0
  529. package/scripts/node/pre-publish-guard.js +267 -0
  530. package/scripts/node/prepare-consumer.cjs +143 -0
  531. package/scripts/node/reflection-processor.cjs +213 -0
  532. package/scripts/node/reflection-validate.sh +194 -0
  533. package/scripts/node/release-tweet.mjs +39 -0
  534. package/scripts/node/release.js +159 -0
  535. package/scripts/node/release.mjs +213 -0
  536. package/scripts/node/setup-dev.cjs +83 -0
  537. package/scripts/node/setup.cjs +214 -0
  538. package/scripts/node/sync-versions.mjs +140 -0
  539. package/scripts/node/universal-version-manager.js +1025 -0
  540. package/scripts/node/validate-external-processes.js +265 -0
  541. package/scripts/node/validate-mcp-connectivity.js +258 -0
  542. package/scripts/node/version-manager.mjs +524 -0
  543. package/scripts/validate-stringray-comprehensive.js +636 -0
  544. package/src/integrations/grok/plugin/0xray/.mcp.json +15 -0
  545. package/src/integrations/grok/plugin/0xray/hooks/hooks.json +30 -0
  546. package/src/mcps/agent-resolver.ts +168 -0
  547. package/src/mcps/architect-tools.server.ts +343 -0
  548. package/src/mcps/auto-format.server.ts +529 -0
  549. package/src/mcps/boot-orchestrator.server.ts +1082 -0
  550. package/src/mcps/config/__tests__/config-loader.test.ts +338 -0
  551. package/src/mcps/config/__tests__/config-validator.test.ts +646 -0
  552. package/src/mcps/config/__tests__/server-config-registry.test.ts +257 -0
  553. package/src/mcps/config/config-loader.ts +127 -0
  554. package/src/mcps/config/config-validator.ts +127 -0
  555. package/src/mcps/config/index.ts +32 -0
  556. package/src/mcps/config/plugin-server-registry.ts +335 -0
  557. package/src/mcps/config/server-config-registry.ts +395 -0
  558. package/src/mcps/connection/connection-manager.ts +91 -0
  559. package/src/mcps/connection/connection-pool.ts +216 -0
  560. package/src/mcps/connection/mcp-connection.ts +327 -0
  561. package/src/mcps/connection/process-spawner.ts +47 -0
  562. package/src/mcps/enforcer-tools.server.ts +1106 -0
  563. package/src/mcps/estimation.server.ts +229 -0
  564. package/src/mcps/framework-compliance-audit.server.ts +635 -0
  565. package/src/mcps/framework-help.server.ts +467 -0
  566. package/src/mcps/governance.server.ts +551 -0
  567. package/src/mcps/in-process-skill-registry.ts +79 -0
  568. package/src/mcps/knowledge-skills/api-design.server.test.ts +41 -0
  569. package/src/mcps/knowledge-skills/api-design.server.ts +160 -0
  570. package/src/mcps/knowledge-skills/architecture-patterns.server.ts +152 -0
  571. package/src/mcps/knowledge-skills/bug-triage-specialist.server.ts +624 -0
  572. package/src/mcps/knowledge-skills/code-analyzer.server.test.ts +129 -0
  573. package/src/mcps/knowledge-skills/code-analyzer.server.ts +591 -0
  574. package/src/mcps/knowledge-skills/code-review.server.ts +1132 -0
  575. package/src/mcps/knowledge-skills/content-creator.server.ts +300 -0
  576. package/src/mcps/knowledge-skills/database-design.server.ts +1200 -0
  577. package/src/mcps/knowledge-skills/devops-deployment.server.ts +1622 -0
  578. package/src/mcps/knowledge-skills/git-workflow.server.ts +152 -0
  579. package/src/mcps/knowledge-skills/growth-strategist.server.ts +413 -0
  580. package/src/mcps/knowledge-skills/log-monitor.server.ts +619 -0
  581. package/src/mcps/knowledge-skills/mobile-development.server.ts +672 -0
  582. package/src/mcps/knowledge-skills/multimodal-looker.server.ts +1500 -0
  583. package/src/mcps/knowledge-skills/performance-optimization.server.ts +2065 -0
  584. package/src/mcps/knowledge-skills/project-analysis.server.ts +1111 -0
  585. package/src/mcps/knowledge-skills/refactoring-strategies.server.ts +1092 -0
  586. package/src/mcps/knowledge-skills/security-audit.server.test.ts +112 -0
  587. package/src/mcps/knowledge-skills/security-audit.server.ts +1193 -0
  588. package/src/mcps/knowledge-skills/seo-consultant.server.ts +1160 -0
  589. package/src/mcps/knowledge-skills/session-management.server.ts +576 -0
  590. package/src/mcps/knowledge-skills/skill-invocation.server.ts +941 -0
  591. package/src/mcps/knowledge-skills/strategist.server.ts +267 -0
  592. package/src/mcps/knowledge-skills/tech-writer.server.ts +1638 -0
  593. package/src/mcps/knowledge-skills/testing-best-practices.server.test.ts +136 -0
  594. package/src/mcps/knowledge-skills/testing-best-practices.server.ts +1232 -0
  595. package/src/mcps/knowledge-skills/testing-strategy.server.test.ts +100 -0
  596. package/src/mcps/knowledge-skills/testing-strategy.server.ts +1172 -0
  597. package/src/mcps/knowledge-skills/ui-ux-design.server.ts +2076 -0
  598. package/src/mcps/lint.server.ts +483 -0
  599. package/src/mcps/mcp-client.ts +706 -0
  600. package/src/mcps/model-health-check.server.ts +292 -0
  601. package/src/mcps/orchestrator/config/agent-capabilities.ts +108 -0
  602. package/src/mcps/orchestrator/execution/execution-planner.ts +353 -0
  603. package/src/mcps/orchestrator/handlers/complexity-handler.ts +125 -0
  604. package/src/mcps/orchestrator/handlers/status-handler.ts +295 -0
  605. package/src/mcps/orchestrator/handlers/task-handler.ts +268 -0
  606. package/src/mcps/orchestrator/server.ts +388 -0
  607. package/src/mcps/orchestrator/types.ts +81 -0
  608. package/src/mcps/orchestrator.server.ts +34 -0
  609. package/src/mcps/performance-analysis.server.ts +715 -0
  610. package/src/mcps/processor-pipeline.server.ts +778 -0
  611. package/src/mcps/protocol/protocol-constants.ts +51 -0
  612. package/src/mcps/registry.json +110 -0
  613. package/src/mcps/researcher.server.ts +595 -0
  614. package/src/mcps/security-scan.server.ts +651 -0
  615. package/src/mcps/simulation/__tests__/simulation-engine.test.ts +275 -0
  616. package/src/mcps/simulation/index.ts +23 -0
  617. package/src/mcps/simulation/server-simulations.ts +241 -0
  618. package/src/mcps/simulation/simulation-engine.ts +126 -0
  619. package/src/mcps/state-manager.server.ts +777 -0
  620. package/src/mcps/tools/__tests__/tool-cache.test.ts +205 -0
  621. package/src/mcps/tools/__tests__/tool-discovery.test.ts +189 -0
  622. package/src/mcps/tools/__tests__/tool-executor.test.ts +215 -0
  623. package/src/mcps/tools/__tests__/tool-registry.test.ts +230 -0
  624. package/src/mcps/tools/index.ts +15 -0
  625. package/src/mcps/tools/tool-cache.ts +145 -0
  626. package/src/mcps/tools/tool-discovery.ts +83 -0
  627. package/src/mcps/tools/tool-executor.ts +106 -0
  628. package/src/mcps/tools/tool-registry.ts +78 -0
  629. package/src/mcps/types/__tests__/types.test.ts +341 -0
  630. package/src/mcps/types/index.ts +17 -0
  631. package/src/mcps/types/json-rpc.types.ts +38 -0
  632. package/src/mcps/types/mcp.types.ts +115 -0
  633. package/src/opencode/agents/api-design.yml +31 -0
  634. package/src/opencode/agents/architect.yml +15 -0
  635. package/src/opencode/agents/architecture-patterns.yml +14 -0
  636. package/src/opencode/agents/auto-format.yml +14 -0
  637. package/src/opencode/agents/backend-engineer.yml +12 -0
  638. package/src/opencode/agents/boot-orchestrator.yml +14 -0
  639. package/src/opencode/agents/bug-triage-specialist.yml +15 -0
  640. package/src/opencode/agents/code-analyzer.yml +12 -0
  641. package/src/opencode/agents/code-reviewer.yml +14 -0
  642. package/src/opencode/agents/content-creator.yml +12 -0
  643. package/src/opencode/agents/database-engineer.yml +12 -0
  644. package/src/opencode/agents/devops-engineer.yml +12 -0
  645. package/src/opencode/agents/framework-compliance-audit.yml +14 -0
  646. package/src/opencode/agents/frontend-engineer.yml +12 -0
  647. package/src/opencode/agents/frontend-ui-ux-engineer.yml +12 -0
  648. package/src/opencode/agents/git-workflow.yml +15 -0
  649. package/src/opencode/agents/growth-strategist.yml +12 -0
  650. package/src/opencode/agents/hermes-agent.yml +12 -0
  651. package/src/opencode/agents/inference-improve.yml +12 -0
  652. package/src/opencode/agents/lint.yml +14 -0
  653. package/src/opencode/agents/log-monitor.yml +12 -0
  654. package/src/opencode/agents/mobile-developer.yml +12 -0
  655. package/src/opencode/agents/model-health-check.yml +12 -0
  656. package/src/opencode/agents/multimodal-looker.yml +12 -0
  657. package/src/opencode/agents/performance-analysis.yml +12 -0
  658. package/src/opencode/agents/performance-engineer.yml +12 -0
  659. package/src/opencode/agents/performance-optimization.yml +12 -0
  660. package/src/opencode/agents/processor-pipeline.yml +14 -0
  661. package/src/opencode/agents/project-analysis.yml +12 -0
  662. package/src/opencode/agents/refactorer.yml +12 -0
  663. package/src/opencode/agents/researcher.yml +12 -0
  664. package/src/opencode/agents/security-auditor.yml +12 -0
  665. package/src/opencode/agents/security-scan.yml +12 -0
  666. package/src/opencode/agents/seo-consultant.yml +12 -0
  667. package/src/opencode/agents/session-management.yml +12 -0
  668. package/src/opencode/agents/state-manager.yml +12 -0
  669. package/src/opencode/agents/storyteller.yml +12 -0
  670. package/src/opencode/agents/strategist.yml +12 -0
  671. package/src/opencode/agents/tech-writer.yml +12 -0
  672. package/src/opencode/agents/testing-best-practices.yml +12 -0
  673. package/src/opencode/agents/testing-lead.yml +12 -0
  674. package/src/opencode/agents/ui-ux-design.yml +12 -0
  675. package/src/opencode/codex.codex +8 -0
  676. package/src/opencode/commands/auto-format.md +99 -0
  677. package/src/opencode/commands/auto-summary-capture.md +90 -0
  678. package/src/opencode/commands/dependency-audit.md +184 -0
  679. package/src/opencode/commands/enforcer-daily-scan.md +137 -0
  680. package/src/opencode/commands/framework-compliance-audit.md +205 -0
  681. package/src/opencode/commands/interactive-validator.md +75 -0
  682. package/src/opencode/commands/job-summary-logger.md +68 -0
  683. package/src/opencode/commands/lint.md +11 -0
  684. package/src/opencode/commands/mode-switch.md +95 -0
  685. package/src/opencode/commands/model-health-check.md +186 -0
  686. package/src/opencode/commands/performance-analysis.md +144 -0
  687. package/src/opencode/commands/pre-commit-introspection.md +185 -0
  688. package/src/opencode/commands/pre-commit-introspection.sh +133 -0
  689. package/src/opencode/commands/security-scan.md +157 -0
  690. package/src/opencode/commands/sisyphus-validation.md +128 -0
  691. package/src/opencode/commands/summary-logger.md +83 -0
  692. package/src/opencode/enforcer-config.json +285 -0
  693. package/src/opencode/openclaw/config.json +25 -0
  694. package/src/opencode/workflows/post-deployment-audit.yml +123 -0
  695. package/src/skills/api-design/SKILL.md +37 -0
  696. package/src/skills/architect-tools/SKILL.md +37 -0
  697. package/src/skills/architecture-patterns/SKILL.md +37 -0
  698. package/src/skills/auto-format/SKILL.md +37 -0
  699. package/src/skills/backend-engineer/SKILL.md +49 -0
  700. package/src/skills/boot-orchestrator/SKILL.md +37 -0
  701. package/src/skills/bug-triage/SKILL.md +43 -0
  702. package/src/skills/code-analyzer/SKILL.md +45 -0
  703. package/src/skills/code-review/SKILL.md +52 -0
  704. package/src/skills/content-creator/SKILL.md +38 -0
  705. package/src/skills/database-engineer/SKILL.md +46 -0
  706. package/src/skills/devops-engineer/SKILL.md +49 -0
  707. package/src/skills/enforcer/SKILL.md +37 -0
  708. package/src/skills/framework-compliance-audit/SKILL.md +37 -0
  709. package/src/skills/frontend-engineer/SKILL.md +49 -0
  710. package/src/skills/frontend-ui-ux-engineer/SKILL.md +41 -0
  711. package/src/skills/git-workflow/SKILL.md +37 -0
  712. package/src/skills/growth-strategist/SKILL.md +48 -0
  713. package/src/skills/hermes-agent/SKILL.md +212 -0
  714. package/src/skills/inference-improve/SKILL.md +97 -0
  715. package/src/skills/lint/SKILL.md +37 -0
  716. package/src/skills/log-monitor/SKILL.md +44 -0
  717. package/src/skills/mobile-developer/SKILL.md +42 -0
  718. package/src/skills/model-health-check/SKILL.md +37 -0
  719. package/src/skills/multimodal-looker/SKILL.md +45 -0
  720. package/src/skills/orchestrator/SKILL.md +37 -0
  721. package/src/skills/performance-analysis/SKILL.md +37 -0
  722. package/src/skills/performance-engineer/SKILL.md +41 -0
  723. package/src/skills/performance-optimization/SKILL.md +37 -0
  724. package/src/skills/processor-pipeline/SKILL.md +37 -0
  725. package/src/skills/project-analysis/SKILL.md +42 -0
  726. package/src/skills/refactoring-strategies/SKILL.md +37 -0
  727. package/src/skills/registry.json +66 -0
  728. package/src/skills/researcher/SKILL.md +37 -0
  729. package/src/skills/security-audit/SKILL.md +48 -0
  730. package/src/skills/security-scan/SKILL.md +37 -0
  731. package/src/skills/seo-consultant/SKILL.md +43 -0
  732. package/src/skills/session-management/SKILL.md +36 -0
  733. package/src/skills/state-manager/SKILL.md +37 -0
  734. package/src/skills/storyteller/SKILL.md +130 -0
  735. package/src/skills/strategist/SKILL.md +32 -0
  736. package/src/skills/tech-writer/SKILL.md +37 -0
  737. package/src/skills/testing-best-practices/SKILL.md +37 -0
  738. package/src/skills/testing-strategy/SKILL.md +43 -0
  739. package/src/skills/ui-ux-design/SKILL.md +603 -0
@@ -0,0 +1,718 @@
1
+ """StringRay Hermes Plugin — full framework pipeline integration.
2
+
3
+ Mirrors the OpenCode xray-codex-injection.ts behavior:
4
+ 1. Captures ALL tool calls and logs to disk
5
+ 2. Runs quality gates on code-producing tools
6
+ 3. Runs pre/post processors via Node.js bridge
7
+ 4. Persists activity to activity.log + plugin-tool-events.log
8
+ 5. Tracks session statistics
9
+
10
+ Bridge protocol: JSON over stdin/stdout to bridge.mjs (Node.js).
11
+ """
12
+
13
+ import json
14
+ import logging
15
+ import os
16
+ import subprocess
17
+ import sys
18
+ from datetime import datetime, timezone
19
+ from pathlib import Path
20
+
21
+ try:
22
+ from . import schemas, tools
23
+ except ImportError:
24
+ # Standalone import (e.g., pytest discovery) — modules loaded separately
25
+ import importlib
26
+ import types
27
+ _pkg_dir = Path(__file__).resolve().parent
28
+ sys.path.insert(0, str(_pkg_dir))
29
+ schemas = importlib.import_module("schemas")
30
+ tools = importlib.import_module("tools")
31
+
32
+ logger = logging.getLogger("strray-hermes")
33
+
34
+ # ── Paths ─────────────────────────────────────────────────────
35
+
36
+ PLUGIN_DIR = Path(__file__).resolve().parent
37
+ BRIDGE_PATH = PLUGIN_DIR / "bridge.mjs"
38
+
39
+ # Project root: find the StringRay project directory
40
+ # The plugin lives at ~/.hermes/plugins/ which is NOT inside any project tree,
41
+ # so walking up from PLUGIN_DIR will never find the project. Instead:
42
+ # 1. Check STRRAY_PROJECT_ROOT env var (explicit override)
43
+ # 2. Walk up from cwd looking for node_modules/0xray or strray-ai (consumer install)
44
+ ...
45
+ # node_modules/0xray — consumer install marker
46
+ if (d / "node_modules" / "0xray" / "package.json").exists() or (d / "node_modules" / "strray-ai" / "package.json").exists():
47
+ return d
48
+ # .opencode/strray — dev repo marker
49
+ if (d / ".opencode" / "strray" / "features.json").exists():
50
+ return d
51
+ # package.json but not home dir
52
+ if d != home and (d / "package.json").exists():
53
+ return d
54
+ d = d.parent
55
+ if d == d.parent:
56
+ break
57
+
58
+ return cwd
59
+
60
+ PROJECT_ROOT = _find_project_root()
61
+ LOG_DIR = PROJECT_ROOT / "logs" / "framework"
62
+
63
+ # ── Constants ─────────────────────────────────────────────────
64
+
65
+ # Tools that produce/modify code — these get the full pipeline
66
+ _CODE_TOOLS = {"write_file", "patch", "execute_code", "write", "edit"}
67
+
68
+ # Map tool names to agent/skill for outcome tracking
69
+ _TOOL_AGENT_MAP = {
70
+ "write_file": ("code-reviewer", "write"),
71
+ "patch": ("code-reviewer", "patch"),
72
+ "execute_code": ("testing-lead", "execution"),
73
+ "write": ("code-reviewer", "write"),
74
+ "edit": ("code-reviewer", "edit"),
75
+ "terminal": ("testing-lead", "execution"),
76
+ "search_files": ("researcher", "search"),
77
+ "read_file": ("researcher", "read"),
78
+ "browser_*": ("researcher", "browser"),
79
+ "delegate_task": ("orchestrator", "delegation"),
80
+ }
81
+
82
+ # Tools where StringRay has a better alternative
83
+ # terminal: only nudge when the command looks lint/security/search related
84
+ _BETTER_WITH_STRRAY = {
85
+ "search_files": "Use mcp_strray_researcher_search_codebase for code pattern searches",
86
+ }
87
+
88
+ # Patterns that suggest the terminal command should use an MCP tool instead
89
+ _TERMINAL_NUDGE_PATTERNS = {
90
+ "grep": "Use mcp_strray_researcher_search_codebase instead of grep",
91
+ "rg ": "Use mcp_strray_researcher_search_codebase instead of ripgrep",
92
+ "eslint": "Use mcp_strray_lint_lint instead of raw eslint",
93
+ "npx eslint": "Use mcp_strray_lint_lint instead of raw eslint",
94
+ "npm audit": "Use mcp_strray_security_scan_security_scan instead of npm audit",
95
+ "yarn audit": "Use mcp_strray_security_scan_security_scan instead of yarn audit",
96
+ "find ": "Use search_files(target='files') instead of find",
97
+ "sed ": "Use patch tool instead of sed",
98
+ "awk ": "Use patch tool instead of awk",
99
+ }
100
+
101
+ # ── Session stats ─────────────────────────────────────────────
102
+
103
+ _INFERENCE_TUNE_INTERVAL = 100
104
+ _last_tune_tool_call_count = 0
105
+
106
+ _session_stats = {
107
+ "started_at": None,
108
+ "session_id": None,
109
+ "code_operations": 0,
110
+ "total_tool_calls": 0,
111
+ "strray_mcp_calls": 0,
112
+ "native_tool_calls": 0,
113
+ "quality_gate_runs": 0,
114
+ "quality_gate_blocks": 0,
115
+ "pre_processor_runs": 0,
116
+ "post_processor_runs": 0,
117
+ "bridge_calls": 0,
118
+ "bridge_errors": 0,
119
+ "subagent_dispatches": 0,
120
+ "subagent_validations": 0,
121
+ "subagent_blocks": 0,
122
+ }
123
+
124
+ # ── File logging ──────────────────────────────────────────────
125
+
126
+ def _ensure_log_dir():
127
+ LOG_DIR.mkdir(parents=True, exist_ok=True)
128
+
129
+
130
+ def _log_to_file(filename, message):
131
+ """Append a timestamped line to a log file in logs/framework/."""
132
+ try:
133
+ _ensure_log_dir()
134
+ log_path = LOG_DIR / filename
135
+ timestamp = datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
136
+ entry = f"{timestamp} {message}\n"
137
+ with open(log_path, "a", encoding="utf-8") as f:
138
+ f.write(entry)
139
+ except OSError:
140
+ pass # never break the agent over logging
141
+
142
+
143
+ def _log_tool_event(event_type, tool, args=None, duration=0, error=None):
144
+ """Log tool events in the same format as the OpenCode plugin."""
145
+ import random
146
+ job_id = f"plugin-{int(datetime.now(timezone.utc).timestamp() * 1000)}-{random.randint(100000, 999999)}"
147
+ if event_type == "start":
148
+ args_keys = list((args or {}).keys())
149
+ msg = f"[{job_id}] [agent] tool-started - INFO | {{\"tool\":\"{tool}\",\"args\":{json.dumps(args_keys)}}}"
150
+ else:
151
+ level = "ERROR" if error else "SUCCESS"
152
+ err_part = f",\"error\":\"{error}\"" if error else ""
153
+ msg = f"[{job_id}] [agent] tool-complete - {level} | {{\"tool\":\"{tool}\",\"duration\":{duration}{err_part}}}"
154
+ _log_to_file("plugin-tool-events.log", msg)
155
+
156
+
157
+ # ── Bridge calls ──────────────────────────────────────────────
158
+
159
+ def _call_bridge(command: dict, timeout: int = 10) -> dict:
160
+ """Call bridge.mjs with a JSON command, return parsed response."""
161
+ _session_stats["bridge_calls"] += 1
162
+ try:
163
+ result = subprocess.run(
164
+ ["node", str(BRIDGE_PATH), "--cwd", str(PROJECT_ROOT)],
165
+ input=json.dumps(command),
166
+ capture_output=True,
167
+ text=True,
168
+ timeout=timeout,
169
+ )
170
+ if result.returncode != 0:
171
+ _session_stats["bridge_errors"] += 1
172
+ return {"error": result.stderr[:300] if result.stderr else "bridge failed"}
173
+ return json.loads(result.stdout)
174
+ except FileNotFoundError:
175
+ _session_stats["bridge_errors"] += 1
176
+ return {"error": "node not found"}
177
+ except subprocess.TimeoutExpired:
178
+ _session_stats["bridge_errors"] += 1
179
+ return {"error": f"bridge timed out after {timeout}s"}
180
+ except (json.JSONDecodeError, OSError) as e:
181
+ _session_stats["bridge_errors"] += 1
182
+ return {"error": str(e)}
183
+
184
+
185
+ # ── Hook: pre_tool_call ───────────────────────────────────────
186
+
187
+ def _is_strray_mcp(tool_name: str) -> bool:
188
+ return tool_name.startswith("mcp_strray_")
189
+
190
+
191
+ def _on_pre_tool_call(tool_name: str, args: dict, task_id: str, **kwargs):
192
+ """Fires before ANY tool executes.
193
+
194
+ Pipeline:
195
+ 1. Track stats
196
+ 2. Log tool-start event to disk
197
+ 3. For code-producing tools: run quality gate + pre-processors via bridge
198
+ 4. For non-code tools: nudge if StringRay alternative exists
199
+ """
200
+ _session_stats["total_tool_calls"] += 1
201
+
202
+ # Log start event
203
+ _log_tool_event("start", tool_name, args)
204
+
205
+ # StringRay MCP tools — track but don't interfere
206
+ if _is_strray_mcp(tool_name):
207
+ _session_stats["strray_mcp_calls"] += 1
208
+ _log_to_file("activity.log", f"[quality-gate] SKIP (strray-mcp): {tool_name}")
209
+ return
210
+
211
+ # delegate_task: snapshot working tree so post_hook can validate changes
212
+ if tool_name == "delegate_task":
213
+ tid = kwargs.get("task_id", "") or args.get("task_id", "") or task_id
214
+ if tid:
215
+ _delegate_snapshots[tid] = _snapshot_working_tree()
216
+ _session_stats["subagent_dispatches"] += 1
217
+ _log_to_file("activity.log",
218
+ f"[pre-tool] SUBAGENT DISPATCH: task_id={tid}")
219
+ return
220
+
221
+ _session_stats["native_tool_calls"] += 1
222
+
223
+ # Code-producing tools get the full pipeline
224
+ if tool_name in _CODE_TOOLS:
225
+ _session_stats["code_operations"] += 1
226
+
227
+ # Extract file path for logging
228
+ file_path = None
229
+ if isinstance(args, dict):
230
+ file_path = args.get("path") or args.get("filePath")
231
+
232
+ _log_to_file("activity.log",
233
+ f"[pre-tool] CODE OPERATION: tool={tool_name} file={file_path}")
234
+
235
+ # Run quality gate via bridge
236
+ _session_stats["quality_gate_runs"] += 1
237
+ bridge_result = _call_bridge({
238
+ "command": "pre-process",
239
+ "tool": tool_name,
240
+ "args": args or {},
241
+ }, timeout=15)
242
+
243
+ if "error" not in bridge_result:
244
+ quality = bridge_result.get("qualityGate", {})
245
+ processors = bridge_result.get("processors", {})
246
+
247
+ # Log quality gate results
248
+ if quality.get("passed") is False:
249
+ violations = quality.get("violations", [])
250
+ _session_stats["quality_gate_blocks"] += 1
251
+ violation_msg = "; ".join(violations)
252
+ _log_to_file("activity.log",
253
+ f"[quality-gate] BLOCKED: tool={tool_name} violations={violation_msg}")
254
+ logger.warning(
255
+ "[strray] Quality gate BLOCKED %s: %s",
256
+ tool_name, violation_msg,
257
+ )
258
+ else:
259
+ _log_to_file("activity.log",
260
+ f"[quality-gate] PASSED: tool={tool_name}")
261
+
262
+ # Log processor results
263
+ if processors.get("ran"):
264
+ _session_stats["pre_processor_runs"] += 1
265
+ success = processors.get("success", True)
266
+ count = processors.get("processorCount", 0)
267
+ _log_to_file("activity.log",
268
+ f"[pre-processors] {'SUCCESS' if success else 'FAILED'}: "
269
+ f"{count} processors for {tool_name}")
270
+ if processors.get("details"):
271
+ for detail in processors["details"]:
272
+ status = "OK" if detail.get("success") else f"FAILED: {detail.get('error')}"
273
+ _log_to_file("activity.log",
274
+ f"[pre-processor] {detail.get('name', 'unknown')}: {status}")
275
+ else:
276
+ _log_to_file("activity.log",
277
+ f"[bridge] ERROR in pre-process: {bridge_result.get('error', 'unknown')}")
278
+ return
279
+
280
+ # Non-code tools: nudge for StringRay alternatives
281
+ if tool_name in _BETTER_WITH_STRRAY:
282
+ tip = _BETTER_WITH_STRRAY[tool_name]
283
+ logger.info("[strray] Tip: %s — %s", tool_name, tip)
284
+ _log_to_file("activity.log",
285
+ f"[nudge] {tool_name}: {tip}")
286
+
287
+ # Terminal: smart nudge based on command content
288
+ if tool_name == "terminal" and isinstance(args, dict):
289
+ cmd = args.get("command", "")
290
+ if isinstance(cmd, str):
291
+ for pattern, tip in _TERMINAL_NUDGE_PATTERNS.items():
292
+ if pattern in cmd:
293
+ logger.info("[strray] Tip: %s — %s", tool_name, tip)
294
+ _log_to_file("activity.log",
295
+ f"[nudge] {tool_name}: {tip}")
296
+ break
297
+
298
+
299
+ # ── Hook: post_tool_call ──────────────────────────────────────
300
+
301
+ def _on_post_tool_call(tool_name: str, args: dict, result, task_id: str, **kwargs):
302
+ """Fires after ANY tool returns.
303
+
304
+ Pipeline:
305
+ 1. Log tool-complete event to disk
306
+ 2. Extract file info from write/patch operations
307
+ 3. For code-producing tools: run post-processors via bridge
308
+ 4. Track file modifications for session context
309
+ """
310
+ duration = 0
311
+
312
+ # Extract file path — BUG FIX: only when path key exists with truthy value
313
+ file_path = None
314
+ if isinstance(args, dict) and tool_name in ("write_file", "patch"):
315
+ file_path = args.get("path")
316
+ if not file_path:
317
+ # No path key or empty string — skip file logging
318
+ pass
319
+
320
+ # Extract duration from result if available
321
+ if isinstance(result, dict):
322
+ duration = result.get("duration", 0)
323
+
324
+ # Log completion event
325
+ error = None
326
+ if isinstance(result, dict) and result.get("error"):
327
+ error = result["error"]
328
+ _log_tool_event("complete", tool_name, args, duration, error)
329
+
330
+ # Record outcome for the inference feedback loop
331
+ _record_tool_outcome(tool_name, args or {}, error is None)
332
+
333
+ # delegate_task: validate all files the subagent changed
334
+ if tool_name == "delegate_task":
335
+ tid = kwargs.get("task_id", "") or args.get("task_id", "") or task_id
336
+ if tid:
337
+ _validate_subagent_changes(tid)
338
+ return
339
+
340
+ # Track file modifications
341
+ if file_path:
342
+ _log_to_file("activity.log",
343
+ f"[post-tool] file-written: tool={tool_name} path={file_path}")
344
+
345
+ # Code-producing tools get post-processors
346
+ if tool_name in _CODE_TOOLS:
347
+ # Run post-processors via bridge
348
+ bridge_result = _call_bridge({
349
+ "command": "post-process",
350
+ "tool": tool_name,
351
+ "args": args or {},
352
+ "result": result,
353
+ "error": error,
354
+ }, timeout=15)
355
+
356
+ if "error" not in bridge_result:
357
+ processors = bridge_result.get("processors", {})
358
+ if processors.get("ran"):
359
+ _session_stats["post_processor_runs"] += 1
360
+ success = processors.get("success", True)
361
+ count = processors.get("processorCount", 0)
362
+ _log_to_file("activity.log",
363
+ f"[post-processors] {'SUCCESS' if success else 'FAILED'}: "
364
+ f"{count} processors for {tool_name}")
365
+ if processors.get("details"):
366
+ for detail in processors["details"]:
367
+ status = "OK" if detail.get("success") else f"FAILED: {detail.get('error')}"
368
+ _log_to_file("activity.log",
369
+ f"[post-processor] {detail.get('name', 'unknown')}: {status}")
370
+ else:
371
+ _log_to_file("activity.log",
372
+ f"[bridge] ERROR in post-process: {bridge_result.get('error', 'unknown')}")
373
+
374
+ # Auto inference tuning: every _INFERENCE_TUNE_INTERVAL tool calls,
375
+ # shell out to the inference tuner to close the feedback loop.
376
+ global _last_tune_tool_call_count
377
+ calls = _session_stats["total_tool_calls"]
378
+ if calls - _last_tune_tool_call_count >= _INFERENCE_TUNE_INTERVAL:
379
+ _last_tune_tool_call_count = calls
380
+ logger.info(
381
+ "[strray] Triggering inference tuning cycle (tool call #%d)", calls
382
+ )
383
+ _log_to_file("activity.log",
384
+ f"[inference-tune] auto-cycle at tool call #{calls}")
385
+ try:
386
+ _run_inference_tune()
387
+ except Exception as e:
388
+ logger.warning("[strray] Inference tuning failed: %s", e)
389
+
390
+
391
+ # ── Hook: session_start ───────────────────────────────────────
392
+
393
+ def _on_session_start(session_id: str, platform: str, **kwargs):
394
+ """Fires when a new session starts. Resets stats, logs to disk."""
395
+ _session_stats["started_at"] = datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
396
+ _session_stats["session_id"] = session_id
397
+ for key in ("code_operations", "total_tool_calls", "strray_mcp_calls",
398
+ "native_tool_calls", "quality_gate_runs", "quality_gate_blocks",
399
+ "pre_processor_runs", "post_processor_runs",
400
+ "bridge_calls", "bridge_errors",
401
+ "subagent_dispatches", "subagent_validations", "subagent_blocks"):
402
+ _session_stats[key] = 0
403
+ global _last_tune_tool_call_count
404
+ _last_tune_tool_call_count = 0
405
+
406
+ _ensure_log_dir()
407
+ _log_to_file("activity.log",
408
+ f"[session-start] session={session_id} platform={platform}")
409
+ logger.info("[strray] Session %s started on %s", session_id, platform)
410
+
411
+
412
+ # ── Slash command ─────────────────────────────────────────────
413
+
414
+ def _strray_command(args: str) -> str:
415
+ """Slash command handler: /strray [status|stats|help]"""
416
+ cmd = (args or "status").strip().lower()
417
+
418
+ if cmd == "stats":
419
+ return (
420
+ f"StringRay Session Stats\n"
421
+ f" Session: {_session_stats['session_id'] or 'N/A'}\n"
422
+ f" Started: {_session_stats['started_at'] or 'N/A'}\n"
423
+ f" Tool calls: {_session_stats['total_tool_calls']}\n"
424
+ f" Code operations: {_session_stats['code_operations']}\n"
425
+ f" StringRay MCP: {_session_stats['strray_mcp_calls']}\n"
426
+ f" Native tools: {_session_stats['native_tool_calls']}\n"
427
+ f" Quality gate runs: {_session_stats['quality_gate_runs']}\n"
428
+ f" Quality gate blocks: {_session_stats['quality_gate_blocks']}\n"
429
+ f" Pre-processor runs: {_session_stats['pre_processor_runs']}\n"
430
+ f" Post-processor runs: {_session_stats['post_processor_runs']}\n"
431
+ f" Bridge calls: {_session_stats['bridge_calls']}\n"
432
+ f" Bridge errors: {_session_stats['bridge_errors']}\n"
433
+ f" Subagent dispatches: {_session_stats['subagent_dispatches']}\n"
434
+ f" Subagent validations: {_session_stats['subagent_validations']}\n"
435
+ f" Subagent blocks: {_session_stats['subagent_blocks']}"
436
+ )
437
+
438
+ if cmd == "help":
439
+ return (
440
+ "StringRay Commands:\n"
441
+ " /strray status — Plugin and framework health\n"
442
+ " /strray stats — Session pipeline statistics\n"
443
+ " /strray help — This message"
444
+ )
445
+
446
+ # Default: status (calls bridge health)
447
+ bridge_result = _call_bridge({"command": "health"}, timeout=10)
448
+ if "error" in bridge_result:
449
+ return f"StringRay plugin loaded. Bridge: {bridge_result['error']}"
450
+
451
+ return (
452
+ f"StringRay Hermes Plugin Status\n"
453
+ f" Framework: {bridge_result.get('framework', 'unknown')}\n"
454
+ f" Version: {bridge_result.get('version', 'unknown')}\n"
455
+ f" Quality Gate: {'ready' if bridge_result.get('components', {}).get('qualityGate') else 'not loaded'}\n"
456
+ f" Processors: {'ready' if bridge_result.get('components', {}).get('processorManager') else 'not loaded'}\n"
457
+ f" Project: {bridge_result.get('projectRoot', 'unknown')}\n"
458
+ f" Bridge calls: {_session_stats['bridge_calls']} (errors: {_session_stats['bridge_errors']})"
459
+ )
460
+
461
+
462
+ # ── Outcome tracking (feeds inference tuner) ──────────────────
463
+
464
+ _OUTCOMES_PATH = PROJECT_ROOT / "logs" / "framework" / "routing-outcomes.json"
465
+ _MAX_OUTCOMES = 1000
466
+
467
+
468
+ def _record_tool_outcome(tool_name: str, args: dict, success: bool):
469
+ """Append a routing outcome to routing-outcomes.json.
470
+
471
+ Writes directly to the JSON file (same format the TS outcome tracker uses)
472
+ so both OpenCode and Hermes plugin outcomes are visible to the tuner.
473
+ """
474
+ call_num = _session_stats.get("total_tool_calls", 0)
475
+
476
+ # Look up agent/skill mapping
477
+ agent, skill = "direct", tool_name
478
+ for pattern, mapped in _TOOL_AGENT_MAP.items():
479
+ if pattern.endswith("*"):
480
+ if tool_name.startswith(pattern[:-1]):
481
+ agent, skill = mapped
482
+ break
483
+ elif tool_name == pattern:
484
+ agent, skill = mapped
485
+ break
486
+
487
+ # Build description from args
488
+ if isinstance(args, dict):
489
+ content = args.get("content") or args.get("path") or args.get("filePath") or ""
490
+ description = str(content)[:200] if content else f"tool call: {tool_name}"
491
+ else:
492
+ description = f"tool call: {tool_name}"
493
+
494
+ outcome = {
495
+ "taskId": f"hermes-{call_num}",
496
+ "taskDescription": description,
497
+ "routedAgent": agent,
498
+ "routedSkill": skill,
499
+ "confidence": 0.8 if agent != "direct" else 0.5,
500
+ "success": success,
501
+ "timestamp": datetime.now(timezone.utc).isoformat(),
502
+ "routingMethod": "keyword" if agent != "direct" else "default",
503
+ }
504
+
505
+ try:
506
+ _OUTCOMES_PATH.parent.mkdir(parents=True, exist_ok=True)
507
+ if _OUTCOMES_PATH.exists():
508
+ with open(_OUTCOMES_PATH, "r") as f:
509
+ outcomes = json.load(f)
510
+ else:
511
+ outcomes = []
512
+
513
+ outcomes.append(outcome)
514
+ # Circular buffer — keep last N outcomes
515
+ if len(outcomes) > _MAX_OUTCOMES:
516
+ outcomes = outcomes[-_MAX_OUTCOMES:]
517
+
518
+ with open(_OUTCOMES_PATH, "w") as f:
519
+ json.dump(outcomes, f, indent=2)
520
+ except Exception as e:
521
+ logger.debug("[strray] outcome recording failed: %s", e)
522
+
523
+
524
+ # ── Inference tuning (auto-calibration) ────────────────────────
525
+
526
+ def _run_inference_tune():
527
+ """Shell out to strray-ai inference:tuner --run-once.
528
+
529
+ Runs in a background thread so it doesn't block the tool call pipeline.
530
+ The tuner reads routing outcomes, runs the analytics pipeline, and
531
+ writes back refined keyword mappings to routing-mappings.json.
532
+ """
533
+ import threading
534
+
535
+ def _tune():
536
+ try:
537
+ result = subprocess.run(
538
+ ["npx", "0xray", "inference:tuner", "--run-once"],
539
+ capture_output=True, text=True, timeout=30,
540
+ cwd=os.getcwd(),
541
+ )
542
+ if result.returncode == 0:
543
+ logger.info("[0xray] Inference tuning cycle completed")
544
+ _log_to_file("activity.log",
545
+ "[inference-tune] cycle completed successfully")
546
+ else:
547
+ _log_to_file("activity.log",
548
+ f"[inference-tune] cycle failed (rc={result.returncode}): "
549
+ f"{result.stderr.strip()[:200]}")
550
+ except subprocess.TimeoutExpired:
551
+ _log_to_file("activity.log",
552
+ "[inference-tune] cycle timed out after 30s")
553
+ except Exception as e:
554
+ _log_to_file("activity.log",
555
+ f"[inference-tune] cycle error: {e}")
556
+
557
+ threading.Thread(target=_tune, daemon=True).start()
558
+
559
+
560
+ # ── Registration ──────────────────────────────────────────────
561
+
562
+ # ── Subagent (delegate_task) enforcement ────────────────────
563
+ # Subagents bypass all StringRay hooks because they run in isolated
564
+ # contexts. We enforce by snapshotting the working tree before dispatch
565
+ # and validating all changed files after return.
566
+
567
+ _delegate_snapshots: dict = {} # task_id → set of (path, mtime)
568
+
569
+
570
+ def _snapshot_working_tree() -> dict:
571
+ """Snapshot file mtimes under project root for subagent change detection."""
572
+ try:
573
+ result = subprocess.run(
574
+ ["git", "-C", str(PROJECT_ROOT), "diff", "--name-only", "HEAD"],
575
+ capture_output=True, text=True, timeout=5,
576
+ )
577
+ if result.returncode == 0:
578
+ changed = set(result.stdout.strip().split("\n")) if result.stdout.strip() else set()
579
+ else:
580
+ changed = set()
581
+ except (FileNotFoundError, subprocess.TimeoutExpired):
582
+ changed = set()
583
+ return {"changed_before": changed}
584
+
585
+
586
+ def _validate_subagent_changes(task_id: str, **kwargs):
587
+ """After delegate_task returns, find what the subagent changed and validate."""
588
+ snapshot = _delegate_snapshots.pop(task_id, None)
589
+ if not snapshot:
590
+ return
591
+
592
+ before = snapshot.get("changed_before", set())
593
+
594
+ try:
595
+ result = subprocess.run(
596
+ ["git", "-C", str(PROJECT_ROOT), "diff", "--name-only", "HEAD"],
597
+ capture_output=True, text=True, timeout=5,
598
+ )
599
+ if result.returncode != 0:
600
+ return
601
+ after = set(result.stdout.strip().split("\n")) if result.stdout.strip() else set()
602
+ except (FileNotFoundError, subprocess.TimeoutExpired):
603
+ return
604
+
605
+ new_changes = after - before
606
+ if not new_changes:
607
+ return
608
+
609
+ # Filter to source files only (skip dist, node_modules, logs, etc.)
610
+ source_files = sorted(f for f in new_changes if any(
611
+ f.startswith(prefix) for prefix in ("src/", "dist/", "scripts/", ".opencode/plugins/")
612
+ ) and not any(
613
+ skip in f for skip in ("node_modules/", ".log", "__pycache__", ".map")
614
+ ))
615
+
616
+ if not source_files:
617
+ return
618
+
619
+ _session_stats["code_operations"] += len(source_files)
620
+ _session_stats["subagent_validations"] += 1
621
+
622
+ # Resolve to absolute paths for validation
623
+ abs_files = [str(PROJECT_ROOT / f) for f in source_files]
624
+
625
+ # Run validation on all changed files via bridge
626
+ bridge_result = _call_bridge({
627
+ "command": "validate",
628
+ "files": abs_files,
629
+ "operation": "modify",
630
+ }, timeout=30)
631
+
632
+ if "error" in bridge_result:
633
+ _log_to_file("activity.log",
634
+ f"[subagent-validate] BRIDGE ERROR: {bridge_result['error']}")
635
+ return
636
+
637
+ results = bridge_result.get("fileResults", bridge_result.get("results", {}))
638
+ for rel_path in source_files:
639
+ file_result = results.get(rel_path, results.get(str(PROJECT_ROOT / rel_path), {}))
640
+ passed = file_result.get("passed", True)
641
+ violations = file_result.get("violations", [])
642
+
643
+ if not passed:
644
+ _session_stats["quality_gate_blocks"] += 1
645
+ _session_stats["subagent_blocks"] += 1
646
+ _log_to_file("activity.log",
647
+ f"[subagent-validate] BLOCKED: {rel_path} "
648
+ f"violations={'; '.join(str(v) for v in violations[:3])}")
649
+ logger.warning(
650
+ "[strray] Subagent BLOCKED %s: %s",
651
+ rel_path, violations[:3],
652
+ )
653
+ else:
654
+ _log_to_file("activity.log",
655
+ f"[subagent-validate] PASSED: {rel_path}")
656
+
657
+
658
+ def register(ctx):
659
+ """Wire schemas to handlers and register lifecycle hooks."""
660
+ # ── Register tools ────────────────────────────────────────
661
+ ctx.register_tool(
662
+ name="strray_validate",
663
+ toolset="strray-hermes",
664
+ schema=schemas.STRRAY_VALIDATE,
665
+ handler=tools.strray_validate,
666
+ )
667
+ ctx.register_tool(
668
+ name="strray_codex_check",
669
+ toolset="strray-hermes",
670
+ schema=schemas.STRRAY_CODEX_CHECK,
671
+ handler=tools.strray_codex_check,
672
+ )
673
+ ctx.register_tool(
674
+ name="strray_health",
675
+ toolset="strray-hermes",
676
+ schema=schemas.STRRAY_HEALTH,
677
+ handler=tools.strray_health,
678
+ )
679
+ ctx.register_tool(
680
+ name="strray_hooks",
681
+ toolset="strray-hermes",
682
+ schema=schemas.STRRAY_HOOKS,
683
+ handler=tools.strray_hooks,
684
+ )
685
+
686
+ # ── Register hooks ────────────────────────────────────────
687
+ ctx.register_hook("pre_tool_call", _on_pre_tool_call)
688
+ ctx.register_hook("post_tool_call", _on_post_tool_call)
689
+
690
+ # Try to register session hooks
691
+ try:
692
+ ctx.register_hook("on_session_start", _on_session_start)
693
+ except (AttributeError, TypeError):
694
+ logger.debug("[strray] on_session_start hook not yet available")
695
+
696
+ # ── Register slash command ────────────────────────────────
697
+ try:
698
+ ctx.register_command(
699
+ name="strray",
700
+ handler=_strray_command,
701
+ description="StringRay status, stats, hooks, and enforcement info",
702
+ args_hint="[status|stats|help]",
703
+ aliases=("sr",),
704
+ )
705
+ except (AttributeError, TypeError):
706
+ logger.debug("[strray] Slash command registration not yet available")
707
+
708
+ # ── Bootstrap ─────────────────────────────────────────────
709
+ _ensure_log_dir()
710
+ _log_to_file("activity.log",
711
+ f"[plugin-loaded] StringRay Hermes Plugin v2.2 — "
712
+ f"4 tools, 2 hooks, subagent enforcement, bridge={BRIDGE_PATH.exists()}")
713
+
714
+ logger.info(
715
+ "[strray] Plugin v2.2 loaded: 4 tools, 2 hooks, "
716
+ "subagent enforcement active, bridge=%s",
717
+ BRIDGE_PATH.exists(),
718
+ )