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,1168 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { shouldTriggerCycle, accumulateCorpus } from "./inference-accumulator.js";
4
+ import { DeployVerifier } from "./deploy-verifier.js";
5
+ import { VotingCoordinator } from "../delegation/voting-coordinator.js";
6
+ import { StringRayStateManager } from "../state/state-manager.js";
7
+ import { frameworkLogger } from "../core/framework-logger.js";
8
+ import { getGovernanceIntegration } from "../integrations/governance/index.js";
9
+ import { featuresConfigLoader } from "../core/features-config.js";
10
+ import { mcpClientManager } from "../mcps/mcp-client.js";
11
+ import { getConfigDir } from "../core/config-paths.js";
12
+ import { invokeViaOpencode as invokeOpencodeFromEngine } from "../execution/opencode-cli-invoker.js";
13
+ import { ProposalApplier } from "../execution/proposal-applier.js";
14
+ const CYCLE_STATE_FILE = "inference-cycle-state.json";
15
+ const CYCLE_HISTORY_FILE = "inference-cycle-history.json";
16
+ const GOVERNANCE_AGENTS = {
17
+ // Real individual knowledge-skill MCP servers (have analyze_proposal handlers)
18
+ fix: ["code-review", "security-audit", "researcher"],
19
+ refactor: ["code-review", "security-audit", "researcher"],
20
+ guard: ["code-review", "security-audit", "researcher"],
21
+ automate: ["code-review", "security-audit", "researcher"],
22
+ codify: ["code-review", "security-audit", "researcher"],
23
+ };
24
+ export class InferenceCycle {
25
+ // Singleton registry + state management to prevent recursive agent spawning
26
+ static instances = new Map();
27
+ static reEntryLock = false;
28
+ static governedProposalIds = new Set();
29
+ static votingCoordinator = null;
30
+ static getInstance(projectRoot, options) {
31
+ const root = path.resolve(projectRoot || process.cwd());
32
+ if (!InferenceCycle.instances.has(root)) {
33
+ InferenceCycle.instances.set(root, new InferenceCycle(root, undefined, options));
34
+ }
35
+ return InferenceCycle.instances.get(root);
36
+ }
37
+ static resetInstance() {
38
+ InferenceCycle.instances.clear();
39
+ InferenceCycle.reEntryLock = false;
40
+ InferenceCycle.governedProposalIds.clear();
41
+ InferenceCycle.votingCoordinator = null;
42
+ }
43
+ inferenceDir;
44
+ stateDir;
45
+ projectRoot;
46
+ phase = "idle";
47
+ opencodeAvailable = null;
48
+ agentInvoker;
49
+ options;
50
+ constructor(projectRoot, agentInvoker, options) {
51
+ this.projectRoot = projectRoot || process.cwd();
52
+ this.inferenceDir = path.join(this.projectRoot, "docs", "inference");
53
+ this.stateDir = path.join(this.projectRoot, ".strray", "inference");
54
+ this.agentInvoker = agentInvoker ?? null;
55
+ this.options = options ?? {};
56
+ }
57
+ async governExternalProposals(proposals) {
58
+ // GATE: prevent re-entry — same as maybeRunCycle
59
+ if (InferenceCycle.reEntryLock) {
60
+ const blockedId = `blocked-${Date.now()}`;
61
+ frameworkLogger.log("inference-cycle", "external-re-entry-blocked", "warning", {});
62
+ return this.buildBlockedResult(blockedId, "Cycle in progress — external governance blocked");
63
+ }
64
+ InferenceCycle.reEntryLock = true;
65
+ const startTime = Date.now();
66
+ const cycleId = `external-${Date.now()}`;
67
+ try {
68
+ frameworkLogger.log("inference-cycle", "external-governance-start", "info", {
69
+ cycleId,
70
+ proposalCount: proposals.length,
71
+ });
72
+ this.setPhase("governing");
73
+ let votes = [];
74
+ try {
75
+ votes = await this.governProposals(proposals);
76
+ }
77
+ catch (e) {
78
+ frameworkLogger.log("inference-cycle", "govern-proposals-error", "error", {
79
+ error: e.message,
80
+ stack: e.stack?.substring(0, 500),
81
+ });
82
+ for (const proposal of proposals) {
83
+ votes.push({
84
+ proposalId: proposal.id,
85
+ decision: "reject",
86
+ confidence: 0,
87
+ details: [`rejected: external governance error: ${e.message}`],
88
+ });
89
+ }
90
+ }
91
+ const approved = proposals.filter((p) => votes.find((v) => v.proposalId === p.id && v.decision === "approve"));
92
+ for (const p of approved)
93
+ p.status = "approved";
94
+ for (const p of proposals.filter((p) => p.status !== "approved"))
95
+ p.status = "rejected";
96
+ // Track governed proposals for dedup across cycles
97
+ for (const p of proposals)
98
+ InferenceCycle.governedProposalIds.add(p.id);
99
+ this.setPhase("complete");
100
+ this.saveCycleState(cycleId);
101
+ this.saveGovernanceState(this.getCoordinator());
102
+ const result = this.buildResult(cycleId, true, "external proposals", startTime, undefined, proposals, votes);
103
+ this.appendHistory(result);
104
+ frameworkLogger.log("inference-cycle", "external-governance-complete", "info", {
105
+ cycleId,
106
+ approved: approved.length,
107
+ rejected: proposals.length - approved.length,
108
+ });
109
+ return result;
110
+ }
111
+ finally {
112
+ InferenceCycle.reEntryLock = false;
113
+ }
114
+ }
115
+ async maybeRunCycle() {
116
+ // GATE: prevent recursive re-entry while a cycle is in progress
117
+ if (InferenceCycle.reEntryLock) {
118
+ const blockedId = `blocked-${Date.now()}`;
119
+ frameworkLogger.log("inference-cycle", "re-entry-blocked", "warning", {});
120
+ return this.buildBlockedResult(blockedId, "Cycle already in progress — re-entry blocked");
121
+ }
122
+ InferenceCycle.reEntryLock = true;
123
+ const startTime = Date.now();
124
+ const cycleId = `cycle-${Date.now()}`;
125
+ try {
126
+ this.setPhase("collecting");
127
+ const lastCycleFile = path.join(this.stateDir, CYCLE_STATE_FILE);
128
+ const threshold = this.options.force ? { trigger: true, reason: "force flag set" } : shouldTriggerCycle(this.inferenceDir, lastCycleFile);
129
+ if (!threshold.trigger) {
130
+ this.setPhase("idle");
131
+ return this.buildResult(cycleId, false, threshold.reason, startTime);
132
+ }
133
+ frameworkLogger.log("inference-cycle", "cycle-triggered", "info", {
134
+ cycleId,
135
+ reason: threshold.reason,
136
+ });
137
+ const corpus = accumulateCorpus(this.inferenceDir);
138
+ this.setPhase("proposing");
139
+ const proposals = this.generateProposals(corpus);
140
+ this.adjustFromHistory(proposals);
141
+ if (proposals.length === 0) {
142
+ this.setPhase("complete");
143
+ return this.buildResult(cycleId, true, threshold.reason, startTime, corpus, proposals);
144
+ }
145
+ this.setPhase("governing");
146
+ const votes = await this.governProposals(proposals);
147
+ // Track governed proposals for dedup across cycles
148
+ for (const p of proposals)
149
+ InferenceCycle.governedProposalIds.add(p.id);
150
+ const approved = proposals.filter((p) => votes.find((v) => v.proposalId === p.id && v.decision === "approve"));
151
+ for (const p of approved) {
152
+ p.status = "approved";
153
+ }
154
+ for (const p of proposals.filter((p) => p.status !== "approved")) {
155
+ p.status = "rejected";
156
+ }
157
+ if (approved.length > 0) {
158
+ if (!this.options.skipApply) {
159
+ this.setPhase("applying");
160
+ await this.applyProposals(approved);
161
+ }
162
+ let deployResult;
163
+ if (!this.options.skipDeployVerify) {
164
+ this.setPhase("deploying");
165
+ const verifier = new DeployVerifier(this.projectRoot);
166
+ deployResult = verifier.quickVerify();
167
+ this.setPhase("verifying");
168
+ if (deployResult.success) {
169
+ for (const p of approved) {
170
+ p.status = "applied";
171
+ }
172
+ }
173
+ else {
174
+ const failureReasons = deployResult.checks
175
+ .filter((c) => !c.passed)
176
+ .map((c) => c.output)
177
+ .join("; ");
178
+ frameworkLogger.log("inference-cycle", "deploy-failed", "warning", {
179
+ checks: deployResult.checks.map((c) => ({ name: c.name, passed: c.passed })),
180
+ failureReasons,
181
+ });
182
+ }
183
+ }
184
+ else {
185
+ for (const p of approved) {
186
+ p.status = "approved";
187
+ }
188
+ }
189
+ this.setPhase("complete");
190
+ this.saveCycleState(cycleId);
191
+ this.saveGovernanceState(this.getCoordinator());
192
+ this.appendHistory(this.buildResult(cycleId, true, threshold.reason, startTime, corpus, proposals, votes, deployResult));
193
+ return this.buildResult(cycleId, true, threshold.reason, startTime, corpus, proposals, votes, deployResult);
194
+ }
195
+ this.setPhase("complete");
196
+ this.saveCycleState(cycleId);
197
+ this.appendHistory(this.buildResult(cycleId, true, threshold.reason, startTime, corpus, proposals, votes));
198
+ return this.buildResult(cycleId, true, threshold.reason, startTime, corpus, proposals, votes);
199
+ }
200
+ finally {
201
+ InferenceCycle.reEntryLock = false;
202
+ }
203
+ }
204
+ generateProposals(corpus) {
205
+ const proposals = [];
206
+ for (const problem of corpus.recurringProblems) {
207
+ proposals.push({
208
+ id: `prop-${Date.now()}-${proposals.length}`,
209
+ type: this.classifyProposalType(problem.pattern),
210
+ title: this.generateTitle(problem),
211
+ description: `Recurring across ${problem.occurrences} sessions: ${problem.pattern}`,
212
+ evidence: problem.sessions.map((s) => `Seen in session ${s}`),
213
+ confidence: Math.min(0.95, 0.5 + problem.occurrences * 0.15),
214
+ source: "recurring_problem",
215
+ status: "pending",
216
+ });
217
+ }
218
+ const seenPatterns = new Set(corpus.recurringProblems.map((p) => p.pattern));
219
+ const allProblems = corpus.sessions.flatMap((s) => s.problems.map((p) => ({ problem: p, session: s.sessionId })));
220
+ for (const { problem, session } of allProblems) {
221
+ const normalized = problem.replace(/\([a-f0-9]{7}\)/g, "").trim();
222
+ if (seenPatterns.has(normalized))
223
+ continue;
224
+ if (proposals.length >= 5)
225
+ break;
226
+ proposals.push({
227
+ id: `prop-${Date.now()}-${proposals.length}`,
228
+ type: this.classifyProposalType(problem),
229
+ title: `Investigate: ${problem.substring(0, 80)}`,
230
+ description: `Observed in session ${session}: ${problem}`,
231
+ evidence: [problem],
232
+ confidence: 0.4,
233
+ source: "recurring_problem",
234
+ status: "pending",
235
+ });
236
+ seenPatterns.add(normalized);
237
+ }
238
+ for (const pattern of corpus.recurringPatterns) {
239
+ if (pattern.occurrences < 2)
240
+ continue;
241
+ const type = this.patternToProposalType(pattern);
242
+ proposals.push({
243
+ id: `prop-${Date.now()}-${proposals.length}`,
244
+ type,
245
+ title: `Codify ${pattern.name} pattern`,
246
+ description: `${pattern.name} detected across ${pattern.occurrences} sessions (avg confidence: ${Math.round(pattern.avgConfidence * 100)}%). ${pattern.description}`,
247
+ evidence: pattern.evidence,
248
+ confidence: pattern.avgConfidence,
249
+ source: "recurring_pattern",
250
+ status: "pending",
251
+ });
252
+ }
253
+ const wrongTurns = corpus.allWrongTurns.slice(0, 2);
254
+ for (const wt of wrongTurns) {
255
+ const summary = wt.length > 50 ? `${wt.substring(0, 47)}...` : wt;
256
+ proposals.push({
257
+ id: `prop-${Date.now()}-${proposals.length}`,
258
+ type: "guard",
259
+ title: `Guard against: ${summary}`,
260
+ description: `Recurring wrong turn detected: ${wt}. Add a guard or validation to prevent this pattern.`,
261
+ evidence: [wt],
262
+ confidence: 0.7,
263
+ source: "wrong_turn",
264
+ status: "pending",
265
+ });
266
+ }
267
+ return proposals.sort((a, b) => b.confidence - a.confidence).slice(0, 3);
268
+ }
269
+ adjustFromHistory(proposals) {
270
+ this.adjustConfidenceFromHistory(proposals);
271
+ proposals.sort((a, b) => b.confidence - a.confidence);
272
+ }
273
+ getCoordinator() {
274
+ if (!InferenceCycle.votingCoordinator) {
275
+ const stateManager = this.getGovernanceStateManager();
276
+ InferenceCycle.votingCoordinator = new VotingCoordinator(stateManager);
277
+ }
278
+ return InferenceCycle.votingCoordinator;
279
+ }
280
+ async applyProposals(proposals) {
281
+ const applier = new ProposalApplier(this.projectRoot, async (p) => this.applyProposalWork(p), async (p, prUrl) => {
282
+ if (this.options.skipResearcherReview)
283
+ return "go";
284
+ return this.researcherReview(p, prUrl);
285
+ });
286
+ const results = await applier.applyProposals(proposals);
287
+ for (const r of results) {
288
+ const p = proposals.find(pr => pr.id === r.proposalId);
289
+ if (p)
290
+ p.status = r.success ? "applied" : "failed";
291
+ }
292
+ }
293
+ async applyProposalWork(p) {
294
+ let filesChanged = false;
295
+ if (p.type === "fix" || p.type === "refactor") {
296
+ filesChanged = await this.applyCodeChange(p);
297
+ }
298
+ else if (p.type === "guard") {
299
+ filesChanged = await this.applyGuard(p);
300
+ }
301
+ else if (p.type === "automate") {
302
+ filesChanged = await this.applyAutomation(p);
303
+ }
304
+ return filesChanged;
305
+ }
306
+ async applyCodeChange(p) {
307
+ const targetFiles = this.extractTargetFiles(p.evidence);
308
+ const prompt = [
309
+ `Apply approved inference proposal`,
310
+ ``,
311
+ `Type: ${p.type}`,
312
+ `Title: ${p.title}`,
313
+ `Description: ${p.description}`,
314
+ targetFiles.length > 0 ? `Target files: ${targetFiles.join(", ")}` : "No specific target files identified",
315
+ `Evidence: ${p.evidence.slice(0, 5).join("; ")}`,
316
+ `Confidence: ${(p.confidence * 100).toFixed(0)}%`,
317
+ ``,
318
+ `1. Read the relevant source files`,
319
+ `2. Apply the ${p.type} described above`,
320
+ `3. Make minimal, surgical changes`,
321
+ `4. If the change is unsafe or unclear, skip and explain`,
322
+ ].join("\n");
323
+ frameworkLogger.log("inference-cycle", "apply-invoking-agent", "info", {
324
+ proposalId: p.id,
325
+ proposalType: p.type,
326
+ targetFiles,
327
+ });
328
+ try {
329
+ let agentName = p.type === "refactor" ? "refactorer" : "code-reviewer";
330
+ // In pure MCP mode, use real skill server names so the orchestrator dispatches to actual MCP tools
331
+ if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
332
+ agentName = p.type === "refactor" ? "refactoring-strategies" : "code-review";
333
+ }
334
+ await this.invokeAgentInternal(agentName, prompt);
335
+ return true;
336
+ }
337
+ catch (err) {
338
+ frameworkLogger.log("inference-cycle", "apply-agent-failed", "warning", {
339
+ proposalId: p.id,
340
+ error: String(err),
341
+ });
342
+ return false;
343
+ }
344
+ }
345
+ async applyGuard(p) {
346
+ const prompt = [
347
+ `Add guard/validation for the following issue:`,
348
+ ``,
349
+ `Title: ${p.title}`,
350
+ `Description: ${p.description}`,
351
+ `Evidence: ${p.evidence.join("; ")}`,
352
+ `Confidence: ${(p.confidence * 100).toFixed(0)}%`,
353
+ ``,
354
+ `1. Read the relevant source files`,
355
+ `2. Add the missing guard, validation, or edge case handling`,
356
+ `3. If this is a codex rule, add the term to .opencode/strray/codex.json`,
357
+ `4. Make minimal, surgical changes`,
358
+ ].join("\n");
359
+ try {
360
+ const agentName = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true'
361
+ ? "code-review"
362
+ : "code-reviewer";
363
+ await this.invokeAgentInternal(agentName, prompt);
364
+ return true;
365
+ }
366
+ catch (err) {
367
+ frameworkLogger.log("inference-cycle", "apply-guard-failed", "warning", {
368
+ proposalId: p.id,
369
+ error: String(err),
370
+ });
371
+ const guardPath = path.join(this.projectRoot, "docs", "guards", `${p.title.replace(/[^a-z0-9]/gi, "-")}.md`);
372
+ fs.mkdirSync(path.dirname(guardPath), { recursive: true });
373
+ fs.writeFileSync(guardPath, `# Guard: ${p.title}\n\n${p.description}\n\n## Evidence\n${p.evidence.join("\n")}`);
374
+ return true;
375
+ }
376
+ }
377
+ async applyAutomation(p) {
378
+ const prompt = [
379
+ `Design automation for the following manual process:`,
380
+ ``,
381
+ `Title: ${p.title}`,
382
+ `Description: ${p.description}`,
383
+ `Evidence: ${p.evidence.join("; ")}`,
384
+ `Confidence: ${(p.confidence * 100).toFixed(0)}%`,
385
+ ``,
386
+ `1. Read the relevant source files`,
387
+ `2. Design the automation (script, processor, or config change)`,
388
+ `3. Implement it if straightforward, otherwise describe the design`,
389
+ ].join("\n");
390
+ try {
391
+ const agentName = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true'
392
+ ? "architecture-patterns"
393
+ : "architect";
394
+ await this.invokeAgentInternal(agentName, prompt);
395
+ return true;
396
+ }
397
+ catch (err) {
398
+ frameworkLogger.log("inference-cycle", "apply-automation-failed", "warning", {
399
+ proposalId: p.id,
400
+ error: String(err),
401
+ });
402
+ const automationPath = path.join(this.projectRoot, "docs", "automation-proposals.md");
403
+ const entry = `\n## ${p.title}\n\n${p.description}\n\n**Evidence:** ${p.evidence.join(", ")}\n`;
404
+ fs.mkdirSync(path.dirname(automationPath), { recursive: true });
405
+ fs.appendFileSync(automationPath, entry);
406
+ return true;
407
+ }
408
+ }
409
+ extractTargetFiles(evidence) {
410
+ const filePattern = /[a-zA-Z0-9/_-]+\.(ts|js|mjs|json|yml|yaml)/g;
411
+ const files = new Set();
412
+ for (const item of evidence) {
413
+ const matches = item.matchAll(filePattern);
414
+ for (const match of matches) {
415
+ const f = match[0];
416
+ if (f.startsWith("src/") || f.startsWith("dist/") || f.startsWith(".opencode/")) {
417
+ files.add(f);
418
+ }
419
+ }
420
+ }
421
+ return [...files];
422
+ }
423
+ async researcherReview(p, prUrl) {
424
+ const prompt = `You are a researcher agent reviewing a PR for proposal: "${p.title}".
425
+
426
+ PR URL: ${prUrl}
427
+
428
+ Proposal Type: ${p.type}
429
+ Description: ${p.description}
430
+ Evidence: ${p.evidence.slice(0, 5).join("; ")}
431
+
432
+ Your job: Review the actual codebase to verify this proposal makes sense. Search the code to confirm:
433
+ 1. Does the problem described actually exist in the codebase?
434
+ 2. Is the proposed solution appropriate?
435
+ 3. Are there any missed edge cases?
436
+
437
+ Respond with EXACTLY one of:
438
+ - GO (proposal is valid, approve)
439
+ - NO-GO (proposal is invalid, reject)
440
+ - MODIFY: <specific changes needed>`;
441
+ try {
442
+ const result = await this.invokeAgentInternal("researcher", prompt);
443
+ const output = result.toLowerCase();
444
+ if (output.includes("no-go"))
445
+ return "no-go";
446
+ if (output.includes("modify"))
447
+ return "modify";
448
+ return "go";
449
+ }
450
+ catch (err) {
451
+ frameworkLogger.log("inference-cycle", "researcher-review-failed", "warning", { error: String(err) });
452
+ return "go";
453
+ }
454
+ }
455
+ async governProposals(proposals) {
456
+ // Primary path: Use the first-class Governance MCP (real skill servers + required Dynamo)
457
+ // This is the clean, centralized path (governance.server.ts + GovernanceService)
458
+ const useGovernanceMcp = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true' ||
459
+ this.isGovernanceMcpPreferred();
460
+ if (useGovernanceMcp) {
461
+ try {
462
+ const result = await Promise.race([
463
+ mcpClientManager.callServerTool("governance", "govern_proposals", {
464
+ proposals: proposals.map(p => ({
465
+ id: p.id,
466
+ type: p.type,
467
+ title: p.title,
468
+ description: p.description,
469
+ evidence: p.evidence || [],
470
+ source: p.source || "inference",
471
+ confidence: p.confidence || 0.8,
472
+ })),
473
+ context: { source: "inference-cycle" },
474
+ options: { require_external: true },
475
+ }),
476
+ new Promise((_, reject) => setTimeout(() => reject(new Error("Governance MCP timed out after 8s")), 8000)),
477
+ ]);
478
+ const text = result?.content?.[0]?.text || "";
479
+ const parsed = this.parseGovernanceMcpResponse(text, proposals);
480
+ frameworkLogger.log("inference-cycle", "governance-mcp-primary-path", "info", {
481
+ proposalCount: proposals.length,
482
+ overall: parsed.overallDecision,
483
+ });
484
+ return parsed.votes;
485
+ }
486
+ catch (err) {
487
+ frameworkLogger.log("inference-cycle", "governance-mcp-failed", "error", {
488
+ error: err instanceof Error ? err.message : String(err),
489
+ });
490
+ // In forced pure MCP mode we must not silently fall back
491
+ if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
492
+ throw err;
493
+ }
494
+ // In normal mode, fall back to legacy path with deprecation warning.
495
+ // The legacy path will be removed once all consumers have migrated to the Governance MCP + Dynamo Solar SSOT model.
496
+ frameworkLogger.log("inference-cycle", "governance-legacy-fallback", "warning", {
497
+ message: "Falling back to legacy governance path. This path is deprecated and will be removed in a future version.",
498
+ });
499
+ }
500
+ }
501
+ // Legacy internal path (deprecated)
502
+ const internalVotes = await this.governProposalsInternal(proposals);
503
+ const governanceIntegration = getGovernanceIntegration();
504
+ if (governanceIntegration?.isAvailable()) {
505
+ const externalVotes = await this.governProposalsExternal(proposals);
506
+ return this.mergeGovernanceVotes(internalVotes, externalVotes, proposals);
507
+ }
508
+ return internalVotes;
509
+ }
510
+ isGovernanceMcpPreferred() {
511
+ try {
512
+ const config = featuresConfigLoader.loadConfig();
513
+ const inferenceGov = config.inference_governance;
514
+ return inferenceGov?.enabled ?? true;
515
+ }
516
+ catch {
517
+ return true;
518
+ }
519
+ }
520
+ parseGovernanceMcpResponse(text, proposals) {
521
+ // The governance MCP returns a GovernanceResponse JSON
522
+ try {
523
+ const data = JSON.parse(text);
524
+ const results = data.results || [];
525
+ const votes = proposals.map((p, i) => {
526
+ const r = results[i] || {};
527
+ return {
528
+ proposalId: p.id,
529
+ decision: (r.finalDecision === 'approve' ? 'approve' : r.finalDecision === 'reject' ? 'reject' : 'needs_revision'),
530
+ confidence: r.averageConfidence || 0.75,
531
+ details: (r.votes || []).map((v) => `${v.server}: ${v.decision} (${v.confidence})`),
532
+ };
533
+ });
534
+ return { votes, overallDecision: data.overallDecision || "needs_revision" };
535
+ }
536
+ catch {
537
+ frameworkLogger.log('inference-cycle', 'governance-mcp-parse-failed', 'warning', {
538
+ textPreview: text.substring(0, 200),
539
+ proposalCount: proposals.length,
540
+ });
541
+ const votes = proposals.map(p => ({
542
+ proposalId: p.id,
543
+ decision: "abstain",
544
+ confidence: 0.5,
545
+ details: ["governance-mcp: parse-failed"],
546
+ }));
547
+ return { votes, overallDecision: "needs_revision" };
548
+ }
549
+ }
550
+ /**
551
+ * Oscillator 1: Internal VotingCoordinator-based governance
552
+ */
553
+ async governProposalsInternal(proposals) {
554
+ // Defensive: if pure MCP mode is forced, use individual skill servers only
555
+ if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
556
+ return this.governProposalsWithIndividualSkills(proposals);
557
+ }
558
+ const coordinator = this.getCoordinator();
559
+ const sessionId = `inference-governance-${Date.now()}`;
560
+ const results = [];
561
+ const todoPrompt = [
562
+ `Vote on ${proposals.length} inference proposals. Output EXACTLY one PROPOSAL block per proposal.`,
563
+ ``,
564
+ `FORMAT (exact, no extra text, no markdown):`,
565
+ `PROPOSAL: <number>`,
566
+ ` AGENT: architect`,
567
+ ` DECISION: approve|reject|abstain`,
568
+ ` CONFIDENCE: 0.XX`,
569
+ ` REASONING: <brief reason>`,
570
+ ``,
571
+ `Example:`,
572
+ `PROPOSAL: 1`,
573
+ ` AGENT: architect`,
574
+ ` DECISION: approve`,
575
+ ` CONFIDENCE: 0.85`,
576
+ ` REASONING: Cleanup reduces maintenance burden`,
577
+ ``,
578
+ `PROPOSALS:`,
579
+ ];
580
+ for (let i = 0; i < proposals.length; i++) {
581
+ const p = proposals[i];
582
+ todoPrompt.push(`${i + 1}. [${p.type}] "${p.title}"`);
583
+ }
584
+ try {
585
+ const jsonOutput = await this.invokeAgentInternal("architect", todoPrompt.join("\n"));
586
+ const allVotes = this.parseSubagentVotes(jsonOutput, proposals);
587
+ for (const proposal of proposals) {
588
+ const agents = GOVERNANCE_AGENTS[proposal.type] ?? ["code-reviewer"];
589
+ const participants = ["architect", ...agents];
590
+ const voteId = await coordinator.initiateVoting(sessionId, proposal.title, proposal.description, participants, {
591
+ complexity: Math.min(50, 10 + proposal.evidence.length * 5 + (proposal.confidence > 0.8 ? 10 : 0)),
592
+ riskLevel: proposal.type === "fix" ? "low" : proposal.type === "guard" ? "high" : "medium",
593
+ hasSecurityConcerns: proposal.type === "guard" || proposal.type === "fix",
594
+ hasArchitecturalImpact: proposal.type === "codify" || proposal.type === "automate",
595
+ participantCount: participants.length,
596
+ });
597
+ const proposalVotes = allVotes.filter((v) => v.proposalId === proposal.id);
598
+ for (const v of proposalVotes) {
599
+ coordinator.submitVote(voteId, v.agentName, v.decision, v.confidence, v.reasoning);
600
+ }
601
+ const resolved = coordinator.resolveVoting(voteId);
602
+ if (resolved) {
603
+ results.push({
604
+ proposalId: proposal.id,
605
+ decision: resolved.decision === "approve" ? "approve" : "reject",
606
+ confidence: resolved.confidence,
607
+ details: resolved.details?.map((d) => `${d.agentName}: vote=${d.vote}, weight=${d.weight.toFixed(2)}`) || [],
608
+ });
609
+ if (resolved.details) {
610
+ for (const detail of resolved.details) {
611
+ this.getCoordinator().getAggregator().updateAgentPerformance(detail.agentName, resolved.decision, detail.vote, detail.vote === resolved.decision, proposal.confidence);
612
+ }
613
+ }
614
+ }
615
+ else {
616
+ results.push(this.rejectNoQuorum(proposal, "agents did not vote (no quorum)"));
617
+ }
618
+ }
619
+ }
620
+ catch (error) {
621
+ frameworkLogger.log("inference-cycle", "architect-governance-failed", "error", { error: String(error) });
622
+ for (const proposal of proposals) {
623
+ results.push(this.rejectNoQuorum(proposal, `agent invocation failed: ${error instanceof Error ? error.message : String(error)}`));
624
+ }
625
+ }
626
+ const metrics = coordinator.getMetrics();
627
+ frameworkLogger.log("inference-cycle", "governance-metrics", "info", {
628
+ totalVotes: metrics.totalVotes,
629
+ avgConfidence: metrics.averageConfidence.toFixed(2),
630
+ strategyUsage: metrics.strategyUsage,
631
+ });
632
+ return results;
633
+ }
634
+ /**
635
+ * Pure individual knowledge-skill MCP path for governance.
636
+ * Used when STRRAY_FORCE_MCP_GOVERNANCE=true.
637
+ * Each proposal is evaluated directly by the relevant skill servers using analyze_proposal.
638
+ */
639
+ async governProposalsWithIndividualSkills(proposals) {
640
+ const results = [];
641
+ const GOVERNANCE_AGENTS = {
642
+ fix: ["code-review", "security-audit", "researcher"],
643
+ refactor: ["code-review", "security-audit", "researcher"],
644
+ guard: ["code-review", "security-audit", "researcher"],
645
+ automate: ["code-review", "security-audit", "researcher"],
646
+ codify: ["code-review", "security-audit", "researcher"],
647
+ };
648
+ for (const proposal of proposals) {
649
+ const agents = GOVERNANCE_AGENTS[proposal.type] ?? ["code-review", "security-audit"];
650
+ const skillVotes = [];
651
+ for (const agent of agents) {
652
+ try {
653
+ const skillResult = await mcpClientManager.callServerTool(agent, "analyze_proposal", {
654
+ proposalTitle: proposal.title,
655
+ proposalDescription: proposal.description,
656
+ evidence: proposal.evidence,
657
+ proposalType: proposal.type,
658
+ });
659
+ let structured = "";
660
+ const contents = skillResult?.content || [];
661
+ for (const c of contents) {
662
+ if (c?.text && c.text.includes("DECISION:")) {
663
+ structured = c.text.trim();
664
+ break;
665
+ }
666
+ }
667
+ if (!structured) {
668
+ const full = JSON.stringify(skillResult);
669
+ const m = full.match(/DECISION:\s*(approve|reject|abstain)[\s\S]{0,300}?REASONING:[^\n"]*/i);
670
+ if (m)
671
+ structured = m[0].trim();
672
+ }
673
+ skillVotes.push({
674
+ agent,
675
+ toolUsed: "analyze_proposal",
676
+ rawResponse: structured || JSON.stringify(skillResult),
677
+ structuredVote: structured || null,
678
+ });
679
+ }
680
+ catch (err) {
681
+ skillVotes.push({
682
+ agent,
683
+ toolUsed: "analyze_proposal",
684
+ rawResponse: `error: ${err}`,
685
+ structuredVote: null,
686
+ });
687
+ }
688
+ }
689
+ const approves = skillVotes.filter((v) => v.structuredVote && v.structuredVote.includes("DECISION: approve")).length;
690
+ const rejects = skillVotes.filter((v) => v.structuredVote && v.structuredVote.includes("DECISION: reject")).length;
691
+ const decision = approves > rejects ? "approve" : (rejects > approves ? "reject" : "abstain");
692
+ let avgConf = 0.75;
693
+ const confMatches = skillVotes.map((v) => {
694
+ if (!v.structuredVote)
695
+ return 0.75;
696
+ const m = v.structuredVote.match(/CONFIDENCE:\s*([0-9.]+)/);
697
+ return m ? parseFloat(m[1]) : 0.75;
698
+ });
699
+ if (confMatches.length > 0)
700
+ avgConf = confMatches.reduce((a, b) => a + b, 0) / confMatches.length;
701
+ results.push({
702
+ proposalId: proposal.id,
703
+ decision: decision,
704
+ confidence: Math.round(avgConf * 100) / 100,
705
+ details: skillVotes.map((v) => `${v.agent}: ${v.structuredVote?.split('\n')[0] || 'no structured vote'}`),
706
+ });
707
+ }
708
+ return results;
709
+ }
710
+ /**
711
+ * Merge internal and external governance votes.
712
+ * A proposal passes both oscillators — must be approved by internal AND external.
713
+ */
714
+ mergeGovernanceVotes(internalVotes, externalVotes, proposals) {
715
+ const merged = [];
716
+ for (const proposal of proposals) {
717
+ const internal = internalVotes.find((v) => v.proposalId === proposal.id);
718
+ const external = externalVotes.find((v) => v.proposalId === proposal.id);
719
+ if (!internal) {
720
+ merged.push(this.rejectNoQuorum(proposal, "internal governance vote missing"));
721
+ continue;
722
+ }
723
+ const internalApproved = internal.decision === "approve";
724
+ const externalApproved = external?.decision === "approve";
725
+ const bothApproved = internalApproved && (!external || externalApproved);
726
+ merged.push({
727
+ proposalId: proposal.id,
728
+ decision: bothApproved ? "approve" : "reject",
729
+ confidence: internal.confidence * (external ? external.confidence : 1.0),
730
+ details: [
731
+ ...internal.details,
732
+ ...(external ? [`External governance: ${external.decision} (conf: ${external.confidence.toFixed(2)})`, ...external.details] : []),
733
+ ],
734
+ });
735
+ }
736
+ return merged;
737
+ }
738
+ // Removed: buildOrchestratorGovernancePrompt (replaced by inline TODO prompt in governProposals)
739
+ /**
740
+ * Govern proposals using external chrono-warp-drive Dynamo endpoint
741
+ */
742
+ async governProposalsExternal(proposals) {
743
+ const governanceIntegration = getGovernanceIntegration();
744
+ if (!governanceIntegration) {
745
+ throw new Error("Governance integration not available");
746
+ }
747
+ // Build agent reviews from proposal evidence
748
+ const agentReviews = proposals.flatMap((p) => p.evidence.slice(0, 2).map((e) => `[${p.type}] ${e}`));
749
+ try {
750
+ const batchResult = await governanceIntegration.checkProposals(proposals, agentReviews, []);
751
+ const votes = batchResult.results.map((result) => ({
752
+ proposalId: result.governanceResponse.proposalId,
753
+ decision: result.vote.toLowerCase() === "yes" ? "approve" : "reject",
754
+ confidence: result.governanceResponse.confidence,
755
+ details: [
756
+ `Governance: ${result.governanceResponse.recommendation}`,
757
+ `Isotope: ${result.governanceResponse.governanceIsotopeId}`,
758
+ ...result.governanceResponse.reasons.slice(0, 2),
759
+ ],
760
+ }));
761
+ frameworkLogger.log("inference-cycle", "external-governance-complete", "info", {
762
+ proposalCount: proposals.length,
763
+ passedCount: batchResult.results.filter((r) => r.passed).length,
764
+ });
765
+ return votes;
766
+ }
767
+ catch (error) {
768
+ frameworkLogger.log("inference-cycle", "external-governance-failed", "error", {
769
+ error: error instanceof Error ? error.message : String(error),
770
+ });
771
+ return proposals.map((p) => this.rejectNoQuorum(p, "external governance endpoint failed"));
772
+ }
773
+ }
774
+ async invokeAgentInternal(agentName, prompt) {
775
+ frameworkLogger.log("inference-cycle", "invoke-agent-internal", "info", {
776
+ agentName,
777
+ promptLength: prompt.length,
778
+ });
779
+ try {
780
+ const { mcpClientManager } = await import("../mcps/mcp-client.js");
781
+ const MCP_TIMEOUT_MS = 8000;
782
+ const result = await Promise.race([
783
+ mcpClientManager.callServerTool("orchestrator", "orchestrate-task", {
784
+ description: prompt,
785
+ tasks: [{
786
+ id: `task-${Date.now()}`,
787
+ description: prompt,
788
+ type: agentName,
789
+ priority: "high",
790
+ }],
791
+ executionMode: "sequential",
792
+ }),
793
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`Orchestrator MCP timed out after ${MCP_TIMEOUT_MS}ms`)), MCP_TIMEOUT_MS)),
794
+ ]);
795
+ const content = result.content;
796
+ let responseText = "";
797
+ if (content && Array.isArray(content)) {
798
+ responseText = content.map((c) => c.text ?? "").join("");
799
+ }
800
+ else {
801
+ responseText = JSON.stringify(result);
802
+ }
803
+ // In pure MCP governance mode, trust the orchestrator response (it now does real work)
804
+ const isPureMcp = process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true';
805
+ const hasRealContent = /PROPOSAL:\s*\d+/i.test(responseText) ||
806
+ /DECISION:\s*(approve|reject|abstain)/i.test(responseText) ||
807
+ /Agent Outputs \(real MCP responses\):/i.test(responseText);
808
+ if (hasRealContent || isPureMcp) {
809
+ if (isPureMcp && !hasRealContent) {
810
+ frameworkLogger.log("inference-cycle", "pure-mcp-orchestrator-response", "info", {
811
+ agentName,
812
+ responsePreview: responseText.substring(0, 300),
813
+ });
814
+ }
815
+ return responseText;
816
+ }
817
+ frameworkLogger.log("inference-cycle", "mcp-no-useful-content", "info", {
818
+ agentName,
819
+ responsePreview: responseText.substring(0, 200),
820
+ });
821
+ }
822
+ catch (mcpError) {
823
+ frameworkLogger.log("inference-cycle", "mcp-invocation-failed", "info", {
824
+ agentName,
825
+ error: String(mcpError),
826
+ });
827
+ }
828
+ if (this.agentInvoker) {
829
+ frameworkLogger.log("inference-cycle", "invoke-via-callback", "info", { agentName });
830
+ return this.agentInvoker(agentName, prompt);
831
+ }
832
+ // Only fall back to OpenCode if not in forced pure MCP mode
833
+ if (process.env.STRRAY_FORCE_MCP_GOVERNANCE === 'true') {
834
+ throw new Error(`[PURE MCP] Orchestrator returned no usable response for agent "${agentName}" and OpenCode fallback is disabled`);
835
+ }
836
+ return this.invokeViaOpencode(agentName, prompt);
837
+ }
838
+ async invokeViaOpencode(agentName, prompt) {
839
+ return invokeOpencodeFromEngine(agentName, prompt, this.projectRoot);
840
+ }
841
+ parseSubagentVotes(jsonOutput, proposals) {
842
+ const votes = [];
843
+ const lines = jsonOutput.split("\n").filter((l) => l.trim());
844
+ for (const line of lines) {
845
+ try {
846
+ const obj = JSON.parse(line);
847
+ if (obj.type === "tool_use" && obj.part?.type === "tool" && obj.part.tool === "task") {
848
+ const agentName = obj.part.state?.input?.subagent_type || "";
849
+ const output = obj.part.state?.output || "";
850
+ // Each task output may contain multiple PROPOSAL blocks
851
+ const blocks = output.split(/PROPOSAL:\s*/).filter((b) => b.trim().length > 0);
852
+ for (const block of blocks) {
853
+ const numMatch = block.match(/^(\d+)/);
854
+ if (!numMatch)
855
+ continue;
856
+ const proposalIdx = parseInt(numMatch[1], 10) - 1;
857
+ if (proposalIdx < 0 || proposalIdx >= proposals.length)
858
+ continue;
859
+ const decisionMatch = block.match(/DECISION:\s*(\w+)/i);
860
+ const confMatch = block.match(/CONFIDENCE:\s*(0?\.\d+|1\.0|1|0)/i);
861
+ const reasonMatch = block.match(/REASONING:\s*(.+)/i);
862
+ if (decisionMatch) {
863
+ const proposal = proposals[proposalIdx];
864
+ if (proposal) {
865
+ votes.push({
866
+ proposalId: proposal.id,
867
+ agentName,
868
+ decision: decisionMatch[1].toLowerCase(),
869
+ confidence: confMatch ? Math.min(1, Math.max(0, parseFloat(confMatch[1]))) : 0.5,
870
+ reasoning: reasonMatch ? reasonMatch[1].trim() : "",
871
+ });
872
+ }
873
+ }
874
+ }
875
+ }
876
+ }
877
+ catch {
878
+ // Not JSON, skip
879
+ }
880
+ }
881
+ // Fallback: if no votes found from JSON format, try parsing plain-text
882
+ // PROPOSAL/DECISION blocks directly (e.g. from opencode CLI fallback path)
883
+ if (votes.length === 0 && /PROPOSAL:\s*\d+/i.test(jsonOutput)) {
884
+ const blocks = jsonOutput.split(/PROPOSAL:\s*/).filter((b) => b.trim().length > 0);
885
+ for (const block of blocks) {
886
+ const numMatch = block.match(/^(\d+)/);
887
+ if (!numMatch)
888
+ continue;
889
+ const numStr = numMatch[1];
890
+ if (!numStr)
891
+ continue;
892
+ const proposalIdx = parseInt(numStr, 10) - 1;
893
+ if (proposalIdx < 0 || proposalIdx >= proposals.length)
894
+ continue;
895
+ const agentMatch = block.match(/AGENT:\s*(\w[\w-]*)/i);
896
+ const decisionMatch = block.match(/DECISION:\s*(\w+)/i);
897
+ const confMatch = block.match(/CONFIDENCE:\s*(0?\.\d+|1\.0|1|0)/i);
898
+ const reasonMatch = block.match(/REASONING:\s*(.+)/i);
899
+ if (decisionMatch) {
900
+ const proposal = proposals[proposalIdx];
901
+ if (proposal) {
902
+ let decision = decisionMatch[1].toLowerCase();
903
+ if (decision === "yes")
904
+ decision = "approve";
905
+ if (decision === "no")
906
+ decision = "reject";
907
+ votes.push({
908
+ proposalId: proposal.id,
909
+ agentName: agentMatch?.[1] ?? "architect",
910
+ decision,
911
+ confidence: confMatch ? Math.min(1, Math.max(0, parseFloat(confMatch[1]))) : 0.5,
912
+ reasoning: reasonMatch ? reasonMatch[1].trim() : "",
913
+ });
914
+ }
915
+ }
916
+ }
917
+ }
918
+ return votes;
919
+ }
920
+ getGovernanceStateManager() {
921
+ if (!fs.existsSync(this.stateDir)) {
922
+ fs.mkdirSync(this.stateDir, { recursive: true });
923
+ }
924
+ const stateFile = path.join(this.stateDir, "governance-state.json");
925
+ const stateManager = new StringRayStateManager();
926
+ if (fs.existsSync(stateFile)) {
927
+ try {
928
+ const data = JSON.parse(fs.readFileSync(stateFile, "utf-8"));
929
+ for (const [key, value] of Object.entries(data)) {
930
+ stateManager.set(key, value);
931
+ }
932
+ }
933
+ catch {
934
+ frameworkLogger.log("inference-cycle", "governance-state-load-failed", "warning", {});
935
+ }
936
+ }
937
+ return stateManager;
938
+ }
939
+ saveGovernanceState(coordinator) {
940
+ const stateFile = path.join(this.stateDir, "governance-state.json");
941
+ try {
942
+ // Export the coordinator's internal state (voting history, metrics, etc.)
943
+ const history = coordinator.getVotingHistory();
944
+ const metrics = coordinator.getMetrics();
945
+ const exportData = {
946
+ votingHistory: history,
947
+ metrics,
948
+ exportedAt: new Date().toISOString(),
949
+ };
950
+ if (!fs.existsSync(this.stateDir)) {
951
+ fs.mkdirSync(this.stateDir, { recursive: true });
952
+ }
953
+ fs.writeFileSync(stateFile, JSON.stringify(exportData, null, 2));
954
+ }
955
+ catch (error) {
956
+ frameworkLogger.log("inference-cycle", "governance-state-save-failed", "warning", { error: String(error) });
957
+ }
958
+ }
959
+ extractTextFromNdjson(output) {
960
+ const texts = [];
961
+ for (const line of output.split("\n")) {
962
+ const trimmed = line.trim();
963
+ if (!trimmed)
964
+ continue;
965
+ try {
966
+ const obj = JSON.parse(trimmed);
967
+ if (obj.type === "text" && obj.part?.text) {
968
+ texts.push(obj.part.text);
969
+ }
970
+ }
971
+ catch {
972
+ // skip non-JSON lines
973
+ }
974
+ }
975
+ return texts.join("\n").trim();
976
+ }
977
+ resolveOpencodeRoot() {
978
+ // Use the provider-agnostic config path resolver (prefers .strray/, falls back to .opencode/strray/)
979
+ const configDir = getConfigDir(this.projectRoot);
980
+ // If we resolved to a .strray or custom dir, use its parent as the "root"
981
+ if (configDir.includes(".strray") || configDir.includes("strray")) {
982
+ return path.dirname(configDir);
983
+ }
984
+ // Legacy fallback
985
+ let dir = this.projectRoot;
986
+ for (let i = 0; i < 10; i++) {
987
+ if (fs.existsSync(path.join(dir, ".opencode")))
988
+ return dir;
989
+ const parent = path.dirname(dir);
990
+ if (parent === dir)
991
+ break;
992
+ dir = parent;
993
+ }
994
+ const cwd = process.cwd();
995
+ if (fs.existsSync(path.join(cwd, ".opencode")))
996
+ return cwd;
997
+ return this.projectRoot;
998
+ }
999
+ rejectNoQuorum(proposal, reason) {
1000
+ return {
1001
+ proposalId: proposal.id,
1002
+ decision: "reject",
1003
+ confidence: 0,
1004
+ details: [`rejected: ${reason}`],
1005
+ };
1006
+ }
1007
+ classifyProposalType(problemPattern) {
1008
+ const lower = problemPattern.toLowerCase();
1009
+ if (lower.includes("bug") || lower.includes("fix") || lower.includes("stability"))
1010
+ return "fix";
1011
+ if (lower.includes("dead code") || lower.includes("remove") || lower.includes("health"))
1012
+ return "refactor";
1013
+ if (lower.includes("manual") || lower.includes("automate"))
1014
+ return "automate";
1015
+ if (lower.includes("guard") || lower.includes("path") || lower.includes("timing") || lower.includes("edge case"))
1016
+ return "guard";
1017
+ return "codify";
1018
+ }
1019
+ patternToProposalType(pattern) {
1020
+ const name = pattern.name.toLowerCase();
1021
+ if (name.includes("dead code"))
1022
+ return "refactor";
1023
+ if (name.includes("extract"))
1024
+ return "refactor";
1025
+ if (name.includes("registry") || name.includes("facade"))
1026
+ return "codify";
1027
+ if (name.includes("test"))
1028
+ return "guard";
1029
+ if (name.includes("stability"))
1030
+ return "fix";
1031
+ return "codify";
1032
+ }
1033
+ generateTitle(problem) {
1034
+ const pattern = problem.pattern;
1035
+ const ACTION_MAP = [
1036
+ [/^Bug fix$/i, "Fix recurring bug pattern"],
1037
+ [/^Code health cleanup$/i, "Clean up code health issues"],
1038
+ [/^Accumulated dead code$/i, "Remove accumulated dead code"],
1039
+ [/^Incomplete implementation$/i, "Complete partial implementation"],
1040
+ [/^Technical debt/i, "Address technical debt"],
1041
+ [/^Missing guard/i, "Add missing guard"],
1042
+ [/^Manual step/i, "Automate manual step"],
1043
+ ];
1044
+ for (const [re, title] of ACTION_MAP) {
1045
+ if (re.test(pattern)) {
1046
+ return `${title} (${problem.occurrences}x across ${problem.sessions.length} sessions)`;
1047
+ }
1048
+ }
1049
+ if (pattern.length > 80) {
1050
+ return `Address: ${pattern.substring(0, 77)}... (${problem.occurrences}x)`;
1051
+ }
1052
+ return `Address: ${pattern} (${problem.occurrences}x)`;
1053
+ }
1054
+ setPhase(phase) {
1055
+ this.phase = phase;
1056
+ frameworkLogger.log("inference-cycle", "phase-change", "info", { phase });
1057
+ }
1058
+ getPhase() {
1059
+ return this.phase;
1060
+ }
1061
+ saveCycleState(cycleId) {
1062
+ if (!fs.existsSync(this.stateDir)) {
1063
+ fs.mkdirSync(this.stateDir, { recursive: true });
1064
+ }
1065
+ fs.writeFileSync(path.join(this.stateDir, CYCLE_STATE_FILE), JSON.stringify({
1066
+ cycleId,
1067
+ completedAt: new Date().toISOString(),
1068
+ phase: this.phase,
1069
+ }));
1070
+ }
1071
+ appendHistory(result) {
1072
+ if (!fs.existsSync(this.stateDir)) {
1073
+ fs.mkdirSync(this.stateDir, { recursive: true });
1074
+ }
1075
+ const historyPath = path.join(this.stateDir, CYCLE_HISTORY_FILE);
1076
+ let history = [];
1077
+ if (fs.existsSync(historyPath)) {
1078
+ try {
1079
+ history = JSON.parse(fs.readFileSync(historyPath, "utf-8"));
1080
+ }
1081
+ catch {
1082
+ history = [];
1083
+ }
1084
+ }
1085
+ history.push(result);
1086
+ if (history.length > 50)
1087
+ history = history.slice(-50);
1088
+ fs.writeFileSync(historyPath, JSON.stringify(history, null, 2));
1089
+ }
1090
+ loadHistory() {
1091
+ const historyPath = path.join(this.stateDir, CYCLE_HISTORY_FILE);
1092
+ if (!fs.existsSync(historyPath))
1093
+ return [];
1094
+ try {
1095
+ return JSON.parse(fs.readFileSync(historyPath, "utf-8"));
1096
+ }
1097
+ catch {
1098
+ return [];
1099
+ }
1100
+ }
1101
+ adjustConfidenceFromHistory(proposals) {
1102
+ const history = this.loadHistory();
1103
+ if (history.length === 0)
1104
+ return;
1105
+ const recentVotes = history.slice(-10).flatMap((h) => h.votes);
1106
+ const approvedIds = new Set(recentVotes.filter((v) => v.decision === "approve").map((v) => v.proposalId));
1107
+ const approvedTypes = new Map();
1108
+ const rejectedTypes = new Map();
1109
+ for (const h of history.slice(-10)) {
1110
+ for (const p of h.proposals) {
1111
+ if (p.status === "approved" || p.status === "applied") {
1112
+ approvedTypes.set(p.type, (approvedTypes.get(p.type) ?? 0) + 1);
1113
+ }
1114
+ else if (p.status === "rejected" || p.status === "failed") {
1115
+ rejectedTypes.set(p.type, (rejectedTypes.get(p.type) ?? 0) + 1);
1116
+ }
1117
+ }
1118
+ }
1119
+ for (const proposal of proposals) {
1120
+ const approved = approvedTypes.get(proposal.type) ?? 0;
1121
+ const rejected = rejectedTypes.get(proposal.type) ?? 0;
1122
+ const total = approved + rejected;
1123
+ if (total >= 3) {
1124
+ const successRate = approved / total;
1125
+ if (successRate < 0.3) {
1126
+ proposal.confidence *= 0.8;
1127
+ }
1128
+ else if (successRate > 0.7) {
1129
+ proposal.confidence = Math.min(0.95, proposal.confidence * 1.05);
1130
+ }
1131
+ }
1132
+ }
1133
+ }
1134
+ buildBlockedResult(cycleId, reason) {
1135
+ return {
1136
+ cycleId,
1137
+ triggered: false,
1138
+ triggerReason: reason,
1139
+ corpusSummary: { sessions: 0, totalCommits: 0, recurringPatterns: 0, recurringProblems: 0 },
1140
+ proposals: [],
1141
+ votes: [],
1142
+ phase: "idle",
1143
+ completedAt: new Date().toISOString(),
1144
+ duration: 0,
1145
+ };
1146
+ }
1147
+ buildResult(cycleId, triggered, reason, startTime, corpus, proposals, votes, deployVerification) {
1148
+ return {
1149
+ cycleId,
1150
+ triggered,
1151
+ triggerReason: reason,
1152
+ corpusSummary: corpus
1153
+ ? {
1154
+ sessions: corpus.sessions.length,
1155
+ totalCommits: corpus.totalCommits,
1156
+ recurringPatterns: corpus.recurringPatterns.length,
1157
+ recurringProblems: corpus.recurringProblems.length,
1158
+ }
1159
+ : { sessions: 0, totalCommits: 0, recurringPatterns: 0, recurringProblems: 0 },
1160
+ proposals: proposals || [],
1161
+ votes: votes || [],
1162
+ deployVerification,
1163
+ phase: this.phase,
1164
+ completedAt: new Date().toISOString(),
1165
+ duration: Date.now() - startTime,
1166
+ };
1167
+ }
1168
+ }