0xray 4.0.11 → 4.0.13

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 (1009) hide show
  1. package/.grok-plugin/plugin.json +1 -1
  2. package/.xray/features.json +1 -1
  3. package/AGENTS-consumer.md +1 -1
  4. package/AGENTS.md +1 -1
  5. package/README.md +2 -2
  6. package/SKILLS.md +1 -1
  7. package/llms.txt +2 -2
  8. package/package.json +1 -1
  9. package/scripts/foundry/CHANGELOG.md +3 -1
  10. package/scripts/foundry/README.md +2 -2
  11. package/scripts/foundry/inspect.mjs +22 -6
  12. package/scripts/foundry/mint-suit.cjs +24 -0
  13. package/scripts/foundry/package.json +1 -1
  14. package/scripts/foundry/plant/agents/inspect.yml +1 -1
  15. package/scripts/foundry/plant/agents/mill.yml +1 -1
  16. package/scripts/foundry/plant/skills/inspect/SKILL.md +1 -1
  17. package/scripts/node/install-bridges.cjs +39 -24
  18. package/src/integrations/openclaw/plugin/xray-pre-tool/package.json +1 -1
  19. package/xray/features.json +1 -1
  20. package/.opencode/agents/api-design.yml +0 -31
  21. package/.opencode/agents/architect.yml +0 -15
  22. package/.opencode/agents/architecture-patterns.yml +0 -14
  23. package/.opencode/agents/auto-format.yml +0 -14
  24. package/.opencode/agents/backend-engineer.yml +0 -12
  25. package/.opencode/agents/boot-orchestrator.yml +0 -14
  26. package/.opencode/agents/bug-triage-specialist.yml +0 -15
  27. package/.opencode/agents/code-analyzer.yml +0 -12
  28. package/.opencode/agents/code-reviewer.yml +0 -14
  29. package/.opencode/agents/content-creator.yml +0 -12
  30. package/.opencode/agents/database-engineer.yml +0 -12
  31. package/.opencode/agents/devops-engineer.yml +0 -12
  32. package/.opencode/agents/framework-compliance-audit.yml +0 -14
  33. package/.opencode/agents/frontend-engineer.yml +0 -12
  34. package/.opencode/agents/frontend-ui-ux-engineer.yml +0 -12
  35. package/.opencode/agents/git-workflow.yml +0 -15
  36. package/.opencode/agents/growth-strategist.yml +0 -12
  37. package/.opencode/agents/hermes-agent.yml +0 -12
  38. package/.opencode/agents/inference-improve.yml +0 -12
  39. package/.opencode/agents/lint.yml +0 -14
  40. package/.opencode/agents/log-monitor.yml +0 -12
  41. package/.opencode/agents/mobile-developer.yml +0 -12
  42. package/.opencode/agents/model-health-check.yml +0 -12
  43. package/.opencode/agents/multimodal-looker.yml +0 -12
  44. package/.opencode/agents/performance-analysis.yml +0 -12
  45. package/.opencode/agents/performance-engineer.yml +0 -12
  46. package/.opencode/agents/performance-optimization.yml +0 -12
  47. package/.opencode/agents/processor-pipeline.yml +0 -14
  48. package/.opencode/agents/project-analysis.yml +0 -12
  49. package/.opencode/agents/refactorer.yml +0 -12
  50. package/.opencode/agents/researcher.yml +0 -12
  51. package/.opencode/agents/security-auditor.yml +0 -12
  52. package/.opencode/agents/security-scan.yml +0 -12
  53. package/.opencode/agents/seo-consultant.yml +0 -12
  54. package/.opencode/agents/session-management.yml +0 -12
  55. package/.opencode/agents/state-manager.yml +0 -12
  56. package/.opencode/agents/storyteller.yml +0 -12
  57. package/.opencode/agents/strategist.yml +0 -12
  58. package/.opencode/agents/tech-writer.yml +0 -12
  59. package/.opencode/agents/testing-best-practices.yml +0 -12
  60. package/.opencode/agents/testing-lead.yml +0 -12
  61. package/.opencode/agents/ui-ux-design.yml +0 -12
  62. package/.opencode/codex.codex +0 -8
  63. package/.opencode/commands/auto-format.md +0 -99
  64. package/.opencode/commands/auto-summary-capture.md +0 -90
  65. package/.opencode/commands/dependency-audit.md +0 -184
  66. package/.opencode/commands/enforcer-daily-scan.md +0 -137
  67. package/.opencode/commands/framework-compliance-audit.md +0 -205
  68. package/.opencode/commands/interactive-validator.md +0 -75
  69. package/.opencode/commands/job-summary-logger.md +0 -68
  70. package/.opencode/commands/lint.md +0 -11
  71. package/.opencode/commands/mode-switch.md +0 -95
  72. package/.opencode/commands/model-health-check.md +0 -186
  73. package/.opencode/commands/performance-analysis.md +0 -144
  74. package/.opencode/commands/pre-commit-introspection.md +0 -185
  75. package/.opencode/commands/pre-commit-introspection.sh +0 -133
  76. package/.opencode/commands/security-scan.md +0 -157
  77. package/.opencode/commands/sisyphus-validation.md +0 -128
  78. package/.opencode/commands/summary-logger.md +0 -83
  79. package/.opencode/enforcer-config.json +0 -282
  80. package/.opencode/skills/api-design/SKILL.md +0 -37
  81. package/.opencode/skills/architect-tools/SKILL.md +0 -37
  82. package/.opencode/skills/architecture-patterns/SKILL.md +0 -37
  83. package/.opencode/skills/auto-format/SKILL.md +0 -37
  84. package/.opencode/skills/backend-engineer/SKILL.md +0 -49
  85. package/.opencode/skills/boot-orchestrator/SKILL.md +0 -33
  86. package/.opencode/skills/bug-triage/SKILL.md +0 -43
  87. package/.opencode/skills/code-analyzer/SKILL.md +0 -45
  88. package/.opencode/skills/code-review/SKILL.md +0 -52
  89. package/.opencode/skills/content-creator/SKILL.md +0 -38
  90. package/.opencode/skills/database-engineer/SKILL.md +0 -46
  91. package/.opencode/skills/devops-engineer/SKILL.md +0 -49
  92. package/.opencode/skills/enforcer/SKILL.md +0 -37
  93. package/.opencode/skills/framework-compliance-audit/SKILL.md +0 -37
  94. package/.opencode/skills/frontend-engineer/SKILL.md +0 -49
  95. package/.opencode/skills/frontend-ui-ux-engineer/SKILL.md +0 -41
  96. package/.opencode/skills/git-workflow/SKILL.md +0 -37
  97. package/.opencode/skills/growth-strategist/SKILL.md +0 -48
  98. package/.opencode/skills/hermes-agent/SKILL.md +0 -212
  99. package/.opencode/skills/inference-improve/SKILL.md +0 -97
  100. package/.opencode/skills/lint/SKILL.md +0 -37
  101. package/.opencode/skills/log-monitor/SKILL.md +0 -44
  102. package/.opencode/skills/mobile-developer/SKILL.md +0 -42
  103. package/.opencode/skills/model-health-check/SKILL.md +0 -37
  104. package/.opencode/skills/multimodal-looker/SKILL.md +0 -45
  105. package/.opencode/skills/orchestrator/SKILL.md +0 -61
  106. package/.opencode/skills/performance-analysis/SKILL.md +0 -37
  107. package/.opencode/skills/performance-engineer/SKILL.md +0 -41
  108. package/.opencode/skills/performance-optimization/SKILL.md +0 -37
  109. package/.opencode/skills/processor-pipeline/SKILL.md +0 -37
  110. package/.opencode/skills/project-analysis/SKILL.md +0 -42
  111. package/.opencode/skills/refactoring-strategies/SKILL.md +0 -37
  112. package/.opencode/skills/registry.json +0 -65
  113. package/.opencode/skills/researcher/SKILL.md +0 -50
  114. package/.opencode/skills/security-audit/SKILL.md +0 -48
  115. package/.opencode/skills/security-scan/SKILL.md +0 -37
  116. package/.opencode/skills/seo-consultant/SKILL.md +0 -43
  117. package/.opencode/skills/session-management/SKILL.md +0 -36
  118. package/.opencode/skills/state-manager/SKILL.md +0 -37
  119. package/.opencode/skills/storyteller/SKILL.md +0 -130
  120. package/.opencode/skills/strategist/SKILL.md +0 -44
  121. package/.opencode/skills/tech-writer/SKILL.md +0 -37
  122. package/.opencode/skills/testing-best-practices/SKILL.md +0 -37
  123. package/.opencode/skills/testing-strategy/SKILL.md +0 -54
  124. package/.opencode/skills/ui-ux-design/SKILL.md +0 -603
  125. package/.opencode/skills/xray-orchestrator/SKILL.md +0 -141
  126. package/.opencode/skills/xray-orchestrator/index.ts +0 -267
  127. package/.opencode/workflows/post-deployment-audit.yml +0 -123
  128. package/dist/.gitignore.default +0 -67
  129. package/dist/AGENTS.md +0 -225
  130. package/dist/CHANGELOG.md +0 -2755
  131. package/dist/LICENSE +0 -21
  132. package/dist/README.md +0 -233
  133. package/dist/SKILLS.md +0 -166
  134. package/dist/agents/architect.d.ts +0 -2
  135. package/dist/agents/architect.js +0 -56
  136. package/dist/agents/backend-engineer.d.ts +0 -8
  137. package/dist/agents/backend-engineer.js +0 -81
  138. package/dist/agents/bug-triage-specialist.d.ts +0 -2
  139. package/dist/agents/bug-triage-specialist.js +0 -74
  140. package/dist/agents/code-analyzer.d.ts +0 -7
  141. package/dist/agents/code-analyzer.js +0 -150
  142. package/dist/agents/code-reviewer.d.ts +0 -2
  143. package/dist/agents/code-reviewer.js +0 -69
  144. package/dist/agents/content-creator.d.ts +0 -9
  145. package/dist/agents/content-creator.js +0 -72
  146. package/dist/agents/database-engineer.d.ts +0 -8
  147. package/dist/agents/database-engineer.js +0 -76
  148. package/dist/agents/devops-engineer.d.ts +0 -8
  149. package/dist/agents/devops-engineer.js +0 -84
  150. package/dist/agents/frontend-engineer.d.ts +0 -8
  151. package/dist/agents/frontend-engineer.js +0 -78
  152. package/dist/agents/frontend-ui-ux-engineer.d.ts +0 -8
  153. package/dist/agents/frontend-ui-ux-engineer.js +0 -64
  154. package/dist/agents/growth-strategist.d.ts +0 -8
  155. package/dist/agents/growth-strategist.js +0 -111
  156. package/dist/agents/index.d.ts +0 -25
  157. package/dist/agents/index.js +0 -47
  158. package/dist/agents/known-names.d.ts +0 -26
  159. package/dist/agents/known-names.js +0 -72
  160. package/dist/agents/librarian-agents-updater.d.ts +0 -30
  161. package/dist/agents/librarian-agents-updater.js +0 -333
  162. package/dist/agents/log-monitor.d.ts +0 -2
  163. package/dist/agents/log-monitor.js +0 -109
  164. package/dist/agents/mobile-developer.d.ts +0 -9
  165. package/dist/agents/mobile-developer.js +0 -102
  166. package/dist/agents/multimodal-looker.d.ts +0 -9
  167. package/dist/agents/multimodal-looker.js +0 -93
  168. package/dist/agents/performance-engineer.d.ts +0 -8
  169. package/dist/agents/performance-engineer.js +0 -86
  170. package/dist/agents/refactorer.d.ts +0 -2
  171. package/dist/agents/refactorer.js +0 -80
  172. package/dist/agents/registry.d.ts +0 -37
  173. package/dist/agents/registry.js +0 -354
  174. package/dist/agents/researcher.d.ts +0 -2
  175. package/dist/agents/researcher.js +0 -83
  176. package/dist/agents/security-auditor.d.ts +0 -2
  177. package/dist/agents/security-auditor.js +0 -158
  178. package/dist/agents/seo-consultant.d.ts +0 -8
  179. package/dist/agents/seo-consultant.js +0 -53
  180. package/dist/agents/strategist.d.ts +0 -7
  181. package/dist/agents/strategist.js +0 -47
  182. package/dist/agents/tech-writer.d.ts +0 -8
  183. package/dist/agents/tech-writer.js +0 -84
  184. package/dist/agents/testing-lead.d.ts +0 -2
  185. package/dist/agents/testing-lead.js +0 -95
  186. package/dist/agents/types.d.ts +0 -45
  187. package/dist/agents/types.js +0 -1
  188. package/dist/analytics/consent-manager.d.ts +0 -92
  189. package/dist/analytics/consent-manager.js +0 -257
  190. package/dist/analytics/emerging-pattern-detector.d.ts +0 -66
  191. package/dist/analytics/emerging-pattern-detector.js +0 -259
  192. package/dist/analytics/pattern-learning-engine.d.ts +0 -79
  193. package/dist/analytics/pattern-learning-engine.js +0 -277
  194. package/dist/analytics/pattern-performance-tracker.d.ts +0 -96
  195. package/dist/analytics/pattern-performance-tracker.js +0 -335
  196. package/dist/analytics/predictive-analytics.d.ts +0 -40
  197. package/dist/analytics/predictive-analytics.js +0 -247
  198. package/dist/analytics/prompt-pattern-analyzer.d.ts +0 -98
  199. package/dist/analytics/prompt-pattern-analyzer.js +0 -370
  200. package/dist/analytics/routing-performance-analyzer.d.ts +0 -100
  201. package/dist/analytics/routing-performance-analyzer.js +0 -355
  202. package/dist/analytics/routing-refiner.d.ts +0 -102
  203. package/dist/analytics/routing-refiner.js +0 -377
  204. package/dist/analytics/simple-pattern-analyzer.d.ts +0 -79
  205. package/dist/analytics/simple-pattern-analyzer.js +0 -296
  206. package/dist/architect/architect-tools.d.ts +0 -70
  207. package/dist/architect/architect-tools.js +0 -437
  208. package/dist/architect/architectural-integrity.d.ts +0 -20
  209. package/dist/architect/architectural-integrity.js +0 -78
  210. package/dist/benchmark/performance-benchmark.d.ts +0 -103
  211. package/dist/benchmark/performance-benchmark.js +0 -373
  212. package/dist/cli/commands/analytics-disable.d.ts +0 -9
  213. package/dist/cli/commands/analytics-disable.js +0 -72
  214. package/dist/cli/commands/analytics-enable-action.d.ts +0 -8
  215. package/dist/cli/commands/analytics-enable-action.js +0 -82
  216. package/dist/cli/commands/analytics-preview.d.ts +0 -9
  217. package/dist/cli/commands/analytics-preview.js +0 -106
  218. package/dist/cli/commands/analytics-status.d.ts +0 -9
  219. package/dist/cli/commands/analytics-status.js +0 -68
  220. package/dist/cli/commands/antigravity-status.d.ts +0 -9
  221. package/dist/cli/commands/antigravity-status.js +0 -106
  222. package/dist/cli/commands/archive-logs.d.ts +0 -23
  223. package/dist/cli/commands/archive-logs.js +0 -160
  224. package/dist/cli/commands/credible-init.d.ts +0 -11
  225. package/dist/cli/commands/credible-init.js +0 -82
  226. package/dist/cli/commands/enforce.d.ts +0 -12
  227. package/dist/cli/commands/enforce.js +0 -78
  228. package/dist/cli/commands/foundry-mint-wear.d.ts +0 -3
  229. package/dist/cli/commands/foundry-mint-wear.js +0 -17
  230. package/dist/cli/commands/govern.d.ts +0 -29
  231. package/dist/cli/commands/govern.js +0 -149
  232. package/dist/cli/commands/grok-install.d.ts +0 -7
  233. package/dist/cli/commands/grok-install.js +0 -16
  234. package/dist/cli/commands/hermes-install.d.ts +0 -2
  235. package/dist/cli/commands/hermes-install.js +0 -90
  236. package/dist/cli/commands/mcp-install.d.ts +0 -4
  237. package/dist/cli/commands/mcp-install.js +0 -253
  238. package/dist/cli/commands/openclaw-install.d.ts +0 -2
  239. package/dist/cli/commands/openclaw-install.js +0 -80
  240. package/dist/cli/commands/opencode-install.d.ts +0 -2
  241. package/dist/cli/commands/opencode-install.js +0 -153
  242. package/dist/cli/commands/plugin-commands.d.ts +0 -18
  243. package/dist/cli/commands/plugin-commands.js +0 -245
  244. package/dist/cli/commands/publish-agent.d.ts +0 -15
  245. package/dist/cli/commands/publish-agent.js +0 -184
  246. package/dist/cli/commands/security-audit.d.ts +0 -23
  247. package/dist/cli/commands/security-audit.js +0 -219
  248. package/dist/cli/commands/skill-install.d.ts +0 -6
  249. package/dist/cli/commands/skill-install.js +0 -522
  250. package/dist/cli/commands/status.d.ts +0 -41
  251. package/dist/cli/commands/status.js +0 -199
  252. package/dist/cli/commands/storyteller.d.ts +0 -19
  253. package/dist/cli/commands/storyteller.js +0 -230
  254. package/dist/cli/index.d.ts +0 -7
  255. package/dist/cli/index.js +0 -996
  256. package/dist/cli/server.d.ts +0 -1
  257. package/dist/cli/server.js +0 -147
  258. package/dist/config/default-agents.d.ts +0 -12
  259. package/dist/config/default-agents.js +0 -16
  260. package/dist/config/routing-mappings.d.ts +0 -26
  261. package/dist/config/routing-mappings.js +0 -151
  262. package/dist/core/activity-logger.d.ts +0 -71
  263. package/dist/core/activity-logger.js +0 -259
  264. package/dist/core/adaptive-kernel.d.ts +0 -108
  265. package/dist/core/adaptive-kernel.js +0 -191
  266. package/dist/core/agent-spawn-gate.d.ts +0 -56
  267. package/dist/core/agent-spawn-gate.js +0 -120
  268. package/dist/core/boot-orchestrator.d.ts +0 -99
  269. package/dist/core/boot-orchestrator.js +0 -809
  270. package/dist/core/bridge.mjs +0 -922
  271. package/dist/core/codex-formatter.d.ts +0 -95
  272. package/dist/core/codex-formatter.js +0 -218
  273. package/dist/core/codex-injector.d.ts +0 -73
  274. package/dist/core/codex-injector.js +0 -423
  275. package/dist/core/config-loader.d.ts +0 -59
  276. package/dist/core/config-loader.js +0 -157
  277. package/dist/core/config-paths.d.ts +0 -66
  278. package/dist/core/config-paths.js +0 -169
  279. package/dist/core/context-loader.d.ts +0 -120
  280. package/dist/core/context-loader.js +0 -268
  281. package/dist/core/context-validator.d.ts +0 -52
  282. package/dist/core/context-validator.js +0 -211
  283. package/dist/core/features-config.d.ts +0 -531
  284. package/dist/core/features-config.js +0 -524
  285. package/dist/core/framework-logger.d.ts +0 -76
  286. package/dist/core/framework-logger.js +0 -275
  287. package/dist/core/index.d.ts +0 -5
  288. package/dist/core/index.js +0 -6
  289. package/dist/core/kernel-patterns.d.ts +0 -129
  290. package/dist/core/kernel-patterns.js +0 -301
  291. package/dist/core/logging-config.d.ts +0 -10
  292. package/dist/core/logging-config.js +0 -43
  293. package/dist/core/model-router.d.ts +0 -56
  294. package/dist/core/model-router.js +0 -134
  295. package/dist/core/orchestrator.d.ts +0 -71
  296. package/dist/core/orchestrator.js +0 -408
  297. package/dist/core/system-prompt-generator.d.ts +0 -34
  298. package/dist/core/system-prompt-generator.js +0 -264
  299. package/dist/core/trace-context.d.ts +0 -12
  300. package/dist/core/trace-context.js +0 -33
  301. package/dist/core/xray-activation.d.ts +0 -14
  302. package/dist/core/xray-activation.js +0 -135
  303. package/dist/delegation/agent-delegator.d.ts +0 -185
  304. package/dist/delegation/agent-delegator.js +0 -768
  305. package/dist/delegation/agent-expertise.d.ts +0 -15
  306. package/dist/delegation/agent-expertise.js +0 -155
  307. package/dist/delegation/analytics/index.d.ts +0 -11
  308. package/dist/delegation/analytics/index.js +0 -11
  309. package/dist/delegation/analytics/learning-engine.d.ts +0 -84
  310. package/dist/delegation/analytics/learning-engine.js +0 -276
  311. package/dist/delegation/analytics/outcome-tracker.d.ts +0 -117
  312. package/dist/delegation/analytics/outcome-tracker.js +0 -278
  313. package/dist/delegation/analytics/routing-analytics.d.ts +0 -60
  314. package/dist/delegation/analytics/routing-analytics.js +0 -192
  315. package/dist/delegation/ast-code-parser.d.ts +0 -173
  316. package/dist/delegation/ast-code-parser.js +0 -877
  317. package/dist/delegation/codebase-context-analyzer.d.ts +0 -164
  318. package/dist/delegation/codebase-context-analyzer.js +0 -1040
  319. package/dist/delegation/complexity-analyzer.d.ts +0 -110
  320. package/dist/delegation/complexity-analyzer.js +0 -281
  321. package/dist/delegation/complexity-core.d.ts +0 -119
  322. package/dist/delegation/complexity-core.js +0 -219
  323. package/dist/delegation/config/types.d.ts +0 -247
  324. package/dist/delegation/config/types.js +0 -6
  325. package/dist/delegation/dependency-graph-builder.d.ts +0 -94
  326. package/dist/delegation/dependency-graph-builder.js +0 -408
  327. package/dist/delegation/index.d.ts +0 -25
  328. package/dist/delegation/index.js +0 -20
  329. package/dist/delegation/metrics-aggregator.d.ts +0 -91
  330. package/dist/delegation/metrics-aggregator.js +0 -334
  331. package/dist/delegation/session-coordinator.d.ts +0 -132
  332. package/dist/delegation/session-coordinator.js +0 -351
  333. package/dist/delegation/strategy-selector.d.ts +0 -27
  334. package/dist/delegation/strategy-selector.js +0 -107
  335. package/dist/delegation/voting-coordinator.d.ts +0 -48
  336. package/dist/delegation/voting-coordinator.js +0 -374
  337. package/dist/delegation/voting-types.d.ts +0 -154
  338. package/dist/delegation/voting-types.js +0 -9
  339. package/dist/delegation/weighted-voting-aggregator.d.ts +0 -36
  340. package/dist/delegation/weighted-voting-aggregator.js +0 -193
  341. package/dist/enforcement/core/index.d.ts +0 -14
  342. package/dist/enforcement/core/index.js +0 -18
  343. package/dist/enforcement/core/rule-executor.d.ts +0 -157
  344. package/dist/enforcement/core/rule-executor.js +0 -364
  345. package/dist/enforcement/core/rule-hierarchy.d.ts +0 -145
  346. package/dist/enforcement/core/rule-hierarchy.js +0 -258
  347. package/dist/enforcement/core/rule-registry.d.ts +0 -196
  348. package/dist/enforcement/core/rule-registry.js +0 -239
  349. package/dist/enforcement/core/violation-fixer.d.ts +0 -105
  350. package/dist/enforcement/core/violation-fixer.js +0 -650
  351. package/dist/enforcement/enforcer-tools.d.ts +0 -85
  352. package/dist/enforcement/enforcer-tools.js +0 -818
  353. package/dist/enforcement/index.d.ts +0 -22
  354. package/dist/enforcement/index.js +0 -40
  355. package/dist/enforcement/loaders/agent-triage-loader.d.ts +0 -98
  356. package/dist/enforcement/loaders/agent-triage-loader.js +0 -221
  357. package/dist/enforcement/loaders/agents-md-validation-loader.d.ts +0 -75
  358. package/dist/enforcement/loaders/agents-md-validation-loader.js +0 -251
  359. package/dist/enforcement/loaders/base-loader.d.ts +0 -82
  360. package/dist/enforcement/loaders/base-loader.js +0 -85
  361. package/dist/enforcement/loaders/codex-loader.d.ts +0 -76
  362. package/dist/enforcement/loaders/codex-loader.js +0 -395
  363. package/dist/enforcement/loaders/index.d.ts +0 -36
  364. package/dist/enforcement/loaders/index.js +0 -39
  365. package/dist/enforcement/loaders/loader-orchestrator.d.ts +0 -96
  366. package/dist/enforcement/loaders/loader-orchestrator.js +0 -167
  367. package/dist/enforcement/loaders/processor-loader.d.ts +0 -59
  368. package/dist/enforcement/loaders/processor-loader.js +0 -112
  369. package/dist/enforcement/rule-enforcer.d.ts +0 -142
  370. package/dist/enforcement/rule-enforcer.js +0 -298
  371. package/dist/enforcement/test-auto-healing.d.ts +0 -83
  372. package/dist/enforcement/test-auto-healing.js +0 -325
  373. package/dist/enforcement/types.d.ts +0 -500
  374. package/dist/enforcement/types.js +0 -29
  375. package/dist/enforcement/validators/architecture-validators.d.ts +0 -154
  376. package/dist/enforcement/validators/architecture-validators.js +0 -599
  377. package/dist/enforcement/validators/base-validator.d.ts +0 -87
  378. package/dist/enforcement/validators/base-validator.js +0 -107
  379. package/dist/enforcement/validators/code-quality-validators.d.ts +0 -88
  380. package/dist/enforcement/validators/code-quality-validators.js +0 -335
  381. package/dist/enforcement/validators/index.d.ts +0 -14
  382. package/dist/enforcement/validators/index.js +0 -20
  383. package/dist/enforcement/validators/security-validators.d.ts +0 -52
  384. package/dist/enforcement/validators/security-validators.js +0 -219
  385. package/dist/enforcement/validators/testing-validators.d.ts +0 -80
  386. package/dist/enforcement/validators/testing-validators.js +0 -252
  387. package/dist/enforcement/validators/validator-registry.d.ts +0 -91
  388. package/dist/enforcement/validators/validator-registry.js +0 -149
  389. package/dist/execution/opencode-cli-invoker.d.ts +0 -8
  390. package/dist/execution/opencode-cli-invoker.js +0 -173
  391. package/dist/execution/proposal-applier.d.ts +0 -24
  392. package/dist/execution/proposal-applier.js +0 -254
  393. package/dist/governance/codex-policy.service.d.ts +0 -56
  394. package/dist/governance/codex-policy.service.js +0 -166
  395. package/dist/governance/governance-core.d.ts +0 -53
  396. package/dist/governance/governance-core.js +0 -168
  397. package/dist/governance/governance-service.d.ts +0 -39
  398. package/dist/governance/governance-service.js +0 -351
  399. package/dist/governance/governance-types.d.ts +0 -90
  400. package/dist/governance/governance-types.js +0 -11
  401. package/dist/governance/llm-governance-provider.d.ts +0 -16
  402. package/dist/governance/llm-governance-provider.js +0 -284
  403. package/dist/governance/local-confer.d.ts +0 -10
  404. package/dist/governance/local-confer.js +0 -27
  405. package/dist/index.d.ts +0 -28
  406. package/dist/index.js +0 -24
  407. package/dist/inference/deploy-verifier.d.ts +0 -26
  408. package/dist/inference/deploy-verifier.js +0 -161
  409. package/dist/inference/index.d.ts +0 -10
  410. package/dist/inference/index.js +0 -5
  411. package/dist/inference/inference-accumulator.d.ts +0 -29
  412. package/dist/inference/inference-accumulator.js +0 -126
  413. package/dist/inference/inference-agent-invoker.d.ts +0 -3
  414. package/dist/inference/inference-agent-invoker.js +0 -67
  415. package/dist/inference/inference-applier.d.ts +0 -4
  416. package/dist/inference/inference-applier.js +0 -178
  417. package/dist/inference/inference-cycle.d.ts +0 -70
  418. package/dist/inference/inference-cycle.js +0 -392
  419. package/dist/inference/inference-proposal-generator.d.ts +0 -3
  420. package/dist/inference/inference-proposal-generator.js +0 -149
  421. package/dist/inference/semantic-patterns.d.ts +0 -7
  422. package/dist/inference/semantic-patterns.js +0 -310
  423. package/dist/inference/session-capture.d.ts +0 -32
  424. package/dist/inference/session-capture.js +0 -308
  425. package/dist/infrastructure/iac-validator.d.ts +0 -150
  426. package/dist/infrastructure/iac-validator.js +0 -465
  427. package/dist/infrastructure/schemas/cloud-schemas.d.ts +0 -482
  428. package/dist/infrastructure/schemas/cloud-schemas.js +0 -488
  429. package/dist/integrations/base/ExampleIntegration.d.ts +0 -46
  430. package/dist/integrations/base/ExampleIntegration.js +0 -180
  431. package/dist/integrations/base/Integration.d.ts +0 -266
  432. package/dist/integrations/base/Integration.js +0 -394
  433. package/dist/integrations/base/README.md +0 -446
  434. package/dist/integrations/base/index.d.ts +0 -11
  435. package/dist/integrations/base/index.js +0 -15
  436. package/dist/integrations/base/registry.d.ts +0 -272
  437. package/dist/integrations/base/registry.js +0 -605
  438. package/dist/integrations/base/types.d.ts +0 -167
  439. package/dist/integrations/base/types.js +0 -117
  440. package/dist/integrations/enforcement-gate.d.ts +0 -44
  441. package/dist/integrations/enforcement-gate.js +0 -348
  442. package/dist/integrations/governance/governance-client.d.ts +0 -75
  443. package/dist/integrations/governance/governance-client.js +0 -315
  444. package/dist/integrations/governance/index.d.ts +0 -98
  445. package/dist/integrations/governance/index.js +0 -365
  446. package/dist/integrations/governance/types.d.ts +0 -238
  447. package/dist/integrations/governance/types.js +0 -96
  448. package/dist/integrations/grok/grok-cli.d.ts +0 -28
  449. package/dist/integrations/grok/grok-cli.js +0 -216
  450. package/dist/integrations/grok/hooks/grok-hook-activity.js +0 -53
  451. package/dist/integrations/grok/hooks/grok-hook-utils.js +0 -372
  452. package/dist/integrations/grok/hooks/post-tool-use.js +0 -118
  453. package/dist/integrations/grok/hooks/pre-tool-use.js +0 -136
  454. package/dist/integrations/grok/hooks/session-start.js +0 -189
  455. package/dist/integrations/grok/plugin/0xray/.mcp.json +0 -35
  456. package/dist/integrations/grok/plugin/0xray/hooks/hooks.json +0 -70
  457. package/dist/integrations/hermes-agent/.mcp.json +0 -32
  458. package/dist/integrations/hermes-agent/__init__.py +0 -790
  459. package/dist/integrations/hermes-agent/__pycache__/__init__.cpython-313.pyc +0 -0
  460. package/dist/integrations/hermes-agent/__pycache__/schemas.cpython-313.pyc +0 -0
  461. package/dist/integrations/hermes-agent/__pycache__/tools.cpython-313.pyc +0 -0
  462. package/dist/integrations/hermes-agent/after-install.md +0 -71
  463. package/dist/integrations/hermes-agent/bridge.mjs +0 -1060
  464. package/dist/integrations/hermes-agent/conftest.py +0 -14
  465. package/dist/integrations/hermes-agent/logs/framework/routing-outcomes.json +0 -1
  466. package/dist/integrations/hermes-agent/plugin.yaml +0 -12
  467. package/dist/integrations/hermes-agent/schemas.py +0 -149
  468. package/dist/integrations/hermes-agent/test_plugin.py +0 -1100
  469. package/dist/integrations/hermes-agent/tools.py +0 -357
  470. package/dist/integrations/hooks/confer-hook-runtime.mjs +0 -49
  471. package/dist/integrations/hooks/delegation-gate-runtime.mjs +0 -110
  472. package/dist/integrations/hooks/pipeline-hook-runtime.mjs +0 -211
  473. package/dist/integrations/hooks/plan-hook-runtime.mjs +0 -68
  474. package/dist/integrations/hooks/station-hook-runtime.cjs +0 -421
  475. package/dist/integrations/hooks/station-hook-runtime.mjs +0 -24
  476. package/dist/integrations/hooks/station-memory-ingest.mjs +0 -45
  477. package/dist/integrations/hooks/station-memory-match.mjs +0 -47
  478. package/dist/integrations/hooks/synthesis-hook-runtime.mjs +0 -50
  479. package/dist/integrations/hooks/user-aside-hook-runtime.mjs +0 -49
  480. package/dist/integrations/openclaw/README.md +0 -134
  481. package/dist/integrations/openclaw/api-server.d.ts +0 -86
  482. package/dist/integrations/openclaw/api-server.js +0 -388
  483. package/dist/integrations/openclaw/client.d.ts +0 -125
  484. package/dist/integrations/openclaw/client.js +0 -499
  485. package/dist/integrations/openclaw/config.d.ts +0 -95
  486. package/dist/integrations/openclaw/config.js +0 -372
  487. package/dist/integrations/openclaw/hooks/pre-tool-gate-runtime.mjs +0 -102
  488. package/dist/integrations/openclaw/hooks/xray-hooks.d.ts +0 -123
  489. package/dist/integrations/openclaw/hooks/xray-hooks.js +0 -279
  490. package/dist/integrations/openclaw/index.d.ts +0 -100
  491. package/dist/integrations/openclaw/index.js +0 -367
  492. package/dist/integrations/openclaw/plugin/xray-pre-tool/index.js +0 -75
  493. package/dist/integrations/openclaw/plugin/xray-pre-tool/openclaw.plugin.json +0 -10
  494. package/dist/integrations/openclaw/plugin/xray-pre-tool/package.json +0 -12
  495. package/dist/integrations/openclaw/pre-tool-gate.d.ts +0 -19
  496. package/dist/integrations/openclaw/pre-tool-gate.js +0 -39
  497. package/dist/integrations/openclaw/types.d.ts +0 -425
  498. package/dist/integrations/openclaw/types.js +0 -152
  499. package/dist/integrations/plugins/index.d.ts +0 -9
  500. package/dist/integrations/plugins/index.js +0 -9
  501. package/dist/integrations/plugins/plugin-integration.d.ts +0 -288
  502. package/dist/integrations/plugins/plugin-integration.js +0 -605
  503. package/dist/integrations/plugins/plugin-registry.d.ts +0 -223
  504. package/dist/integrations/plugins/plugin-registry.js +0 -579
  505. package/dist/mcps/agent-resolver.d.ts +0 -45
  506. package/dist/mcps/agent-resolver.js +0 -105
  507. package/dist/mcps/architect-tools.server.d.ts +0 -16
  508. package/dist/mcps/architect-tools.server.js +0 -217
  509. package/dist/mcps/auto-format.server.d.ts +0 -18
  510. package/dist/mcps/auto-format.server.js +0 -395
  511. package/dist/mcps/boot-orchestrator.server.d.ts +0 -48
  512. package/dist/mcps/boot-orchestrator.server.js +0 -835
  513. package/dist/mcps/config/config-loader.d.ts +0 -56
  514. package/dist/mcps/config/config-loader.js +0 -140
  515. package/dist/mcps/config/config-validator.d.ts +0 -40
  516. package/dist/mcps/config/config-validator.js +0 -101
  517. package/dist/mcps/config/index.d.ts +0 -31
  518. package/dist/mcps/config/index.js +0 -30
  519. package/dist/mcps/config/plugin-server-registry.d.ts +0 -126
  520. package/dist/mcps/config/plugin-server-registry.js +0 -222
  521. package/dist/mcps/config/server-config-registry.d.ts +0 -51
  522. package/dist/mcps/config/server-config-registry.js +0 -349
  523. package/dist/mcps/connection/connection-manager.d.ts +0 -39
  524. package/dist/mcps/connection/connection-manager.js +0 -79
  525. package/dist/mcps/connection/connection-pool.d.ts +0 -64
  526. package/dist/mcps/connection/connection-pool.js +0 -164
  527. package/dist/mcps/connection/mcp-connection.d.ts +0 -66
  528. package/dist/mcps/connection/mcp-connection.js +0 -233
  529. package/dist/mcps/connection/process-spawner.d.ts +0 -24
  530. package/dist/mcps/connection/process-spawner.js +0 -34
  531. package/dist/mcps/enforcer-tools.server.d.ts +0 -26
  532. package/dist/mcps/enforcer-tools.server.js +0 -712
  533. package/dist/mcps/estimation.server.d.ts +0 -19
  534. package/dist/mcps/estimation.server.js +0 -149
  535. package/dist/mcps/framework-compliance-audit.server.d.ts +0 -20
  536. package/dist/mcps/framework-compliance-audit.server.js +0 -471
  537. package/dist/mcps/framework-help.server.d.ts +0 -13
  538. package/dist/mcps/framework-help.server.js +0 -383
  539. package/dist/mcps/governance.server.d.ts +0 -36
  540. package/dist/mcps/governance.server.js +0 -499
  541. package/dist/mcps/in-process-skill-registry.d.ts +0 -20
  542. package/dist/mcps/in-process-skill-registry.js +0 -48
  543. package/dist/mcps/index.d.ts +0 -17
  544. package/dist/mcps/index.js +0 -65
  545. package/dist/mcps/knowledge-skills/api-design.server.d.ts +0 -13
  546. package/dist/mcps/knowledge-skills/api-design.server.js +0 -92
  547. package/dist/mcps/knowledge-skills/architecture-patterns.server.d.ts +0 -13
  548. package/dist/mcps/knowledge-skills/architecture-patterns.server.js +0 -82
  549. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.d.ts +0 -31
  550. package/dist/mcps/knowledge-skills/bug-triage-specialist.server.js +0 -434
  551. package/dist/mcps/knowledge-skills/code-analyzer.server.d.ts +0 -29
  552. package/dist/mcps/knowledge-skills/code-analyzer.server.js +0 -578
  553. package/dist/mcps/knowledge-skills/code-review.server.d.ts +0 -44
  554. package/dist/mcps/knowledge-skills/code-review.server.js +0 -783
  555. package/dist/mcps/knowledge-skills/content-creator.server.d.ts +0 -11
  556. package/dist/mcps/knowledge-skills/content-creator.server.js +0 -234
  557. package/dist/mcps/knowledge-skills/database-design.server.d.ts +0 -41
  558. package/dist/mcps/knowledge-skills/database-design.server.js +0 -788
  559. package/dist/mcps/knowledge-skills/devops-deployment.server.d.ts +0 -41
  560. package/dist/mcps/knowledge-skills/devops-deployment.server.js +0 -1147
  561. package/dist/mcps/knowledge-skills/git-workflow.server.d.ts +0 -13
  562. package/dist/mcps/knowledge-skills/git-workflow.server.js +0 -83
  563. package/dist/mcps/knowledge-skills/growth-strategist.server.d.ts +0 -11
  564. package/dist/mcps/knowledge-skills/growth-strategist.server.js +0 -339
  565. package/dist/mcps/knowledge-skills/log-monitor.server.d.ts +0 -22
  566. package/dist/mcps/knowledge-skills/log-monitor.server.js +0 -431
  567. package/dist/mcps/knowledge-skills/mobile-development.server.d.ts +0 -17
  568. package/dist/mcps/knowledge-skills/mobile-development.server.js +0 -495
  569. package/dist/mcps/knowledge-skills/multimodal-looker.server.d.ts +0 -53
  570. package/dist/mcps/knowledge-skills/multimodal-looker.server.js +0 -1028
  571. package/dist/mcps/knowledge-skills/performance-optimization.server.d.ts +0 -69
  572. package/dist/mcps/knowledge-skills/performance-optimization.server.js +0 -1537
  573. package/dist/mcps/knowledge-skills/project-analysis.server.d.ts +0 -35
  574. package/dist/mcps/knowledge-skills/project-analysis.server.js +0 -724
  575. package/dist/mcps/knowledge-skills/refactoring-strategies.server.d.ts +0 -31
  576. package/dist/mcps/knowledge-skills/refactoring-strategies.server.js +0 -762
  577. package/dist/mcps/knowledge-skills/security-audit.server.d.ts +0 -46
  578. package/dist/mcps/knowledge-skills/security-audit.server.js +0 -684
  579. package/dist/mcps/knowledge-skills/seo-consultant.server.d.ts +0 -24
  580. package/dist/mcps/knowledge-skills/seo-consultant.server.js +0 -745
  581. package/dist/mcps/knowledge-skills/session-management.server.d.ts +0 -22
  582. package/dist/mcps/knowledge-skills/session-management.server.js +0 -394
  583. package/dist/mcps/knowledge-skills/skill-invocation.server.d.ts +0 -32
  584. package/dist/mcps/knowledge-skills/skill-invocation.server.js +0 -454
  585. package/dist/mcps/knowledge-skills/storyteller.server.d.ts +0 -11
  586. package/dist/mcps/knowledge-skills/storyteller.server.js +0 -167
  587. package/dist/mcps/knowledge-skills/strategist.server.d.ts +0 -15
  588. package/dist/mcps/knowledge-skills/strategist.server.js +0 -172
  589. package/dist/mcps/knowledge-skills/tech-writer.server.d.ts +0 -45
  590. package/dist/mcps/knowledge-skills/tech-writer.server.js +0 -1016
  591. package/dist/mcps/knowledge-skills/testing-best-practices.server.d.ts +0 -34
  592. package/dist/mcps/knowledge-skills/testing-best-practices.server.js +0 -694
  593. package/dist/mcps/knowledge-skills/testing-strategy.server.d.ts +0 -45
  594. package/dist/mcps/knowledge-skills/testing-strategy.server.js +0 -689
  595. package/dist/mcps/knowledge-skills/ui-ux-design.server.d.ts +0 -67
  596. package/dist/mcps/knowledge-skills/ui-ux-design.server.js +0 -1265
  597. package/dist/mcps/lint.server.d.ts +0 -15
  598. package/dist/mcps/lint.server.js +0 -340
  599. package/dist/mcps/mcp-client.d.ts +0 -157
  600. package/dist/mcps/mcp-client.js +0 -574
  601. package/dist/mcps/model-health-check.server.d.ts +0 -14
  602. package/dist/mcps/model-health-check.server.js +0 -201
  603. package/dist/mcps/orchestrator/aside-context.d.ts +0 -21
  604. package/dist/mcps/orchestrator/aside-context.js +0 -207
  605. package/dist/mcps/orchestrator/config/agent-capabilities.d.ts +0 -39
  606. package/dist/mcps/orchestrator/config/agent-capabilities.js +0 -128
  607. package/dist/mcps/orchestrator/config/memory-routing-bridge.d.ts +0 -12
  608. package/dist/mcps/orchestrator/config/memory-routing-bridge.js +0 -71
  609. package/dist/mcps/orchestrator/execution/execution-planner.d.ts +0 -64
  610. package/dist/mcps/orchestrator/execution/execution-planner.js +0 -320
  611. package/dist/mcps/orchestrator/handlers/complexity-handler.d.ts +0 -55
  612. package/dist/mcps/orchestrator/handlers/complexity-handler.js +0 -285
  613. package/dist/mcps/orchestrator/handlers/status-handler.d.ts +0 -71
  614. package/dist/mcps/orchestrator/handlers/status-handler.js +0 -239
  615. package/dist/mcps/orchestrator/handlers/task-handler.d.ts +0 -59
  616. package/dist/mcps/orchestrator/handlers/task-handler.js +0 -354
  617. package/dist/mcps/orchestrator/index.d.ts +0 -6
  618. package/dist/mcps/orchestrator/index.js +0 -5
  619. package/dist/mcps/orchestrator/server.d.ts +0 -38
  620. package/dist/mcps/orchestrator/server.js +0 -538
  621. package/dist/mcps/orchestrator/types.d.ts +0 -131
  622. package/dist/mcps/orchestrator/types.js +0 -6
  623. package/dist/mcps/orchestrator.server.d.ts +0 -10
  624. package/dist/mcps/orchestrator.server.js +0 -20
  625. package/dist/mcps/performance-analysis.server.d.ts +0 -25
  626. package/dist/mcps/performance-analysis.server.js +0 -488
  627. package/dist/mcps/processor-pipeline.server.d.ts +0 -29
  628. package/dist/mcps/processor-pipeline.server.js +0 -531
  629. package/dist/mcps/protocol/protocol-constants.d.ts +0 -46
  630. package/dist/mcps/protocol/protocol-constants.js +0 -46
  631. package/dist/mcps/registry.json +0 -109
  632. package/dist/mcps/researcher-confidence.d.ts +0 -21
  633. package/dist/mcps/researcher-confidence.js +0 -92
  634. package/dist/mcps/researcher.server.d.ts +0 -29
  635. package/dist/mcps/researcher.server.js +0 -419
  636. package/dist/mcps/security-scan.server.d.ts +0 -19
  637. package/dist/mcps/security-scan.server.js +0 -517
  638. package/dist/mcps/shared/knowledge-skill-base.d.ts +0 -17
  639. package/dist/mcps/shared/knowledge-skill-base.js +0 -52
  640. package/dist/mcps/shared/prompt-security-validator.d.ts +0 -44
  641. package/dist/mcps/shared/prompt-security-validator.js +0 -148
  642. package/dist/mcps/shared/security-scanner.d.ts +0 -119
  643. package/dist/mcps/shared/security-scanner.js +0 -429
  644. package/dist/mcps/simulation/index.d.ts +0 -12
  645. package/dist/mcps/simulation/index.js +0 -12
  646. package/dist/mcps/simulation/server-simulations.d.ts +0 -39
  647. package/dist/mcps/simulation/server-simulations.js +0 -219
  648. package/dist/mcps/simulation/simulation-engine.d.ts +0 -51
  649. package/dist/mcps/simulation/simulation-engine.js +0 -96
  650. package/dist/mcps/state-manager.server.d.ts +0 -27
  651. package/dist/mcps/state-manager.server.js +0 -609
  652. package/dist/mcps/tools/index.d.ts +0 -14
  653. package/dist/mcps/tools/index.js +0 -14
  654. package/dist/mcps/tools/tool-cache.d.ts +0 -53
  655. package/dist/mcps/tools/tool-cache.js +0 -112
  656. package/dist/mcps/tools/tool-discovery.d.ts +0 -27
  657. package/dist/mcps/tools/tool-discovery.js +0 -65
  658. package/dist/mcps/tools/tool-executor.d.ts +0 -41
  659. package/dist/mcps/tools/tool-executor.js +0 -75
  660. package/dist/mcps/tools/tool-registry.d.ts +0 -42
  661. package/dist/mcps/tools/tool-registry.js +0 -67
  662. package/dist/mcps/types/index.d.ts +0 -13
  663. package/dist/mcps/types/index.js +0 -15
  664. package/dist/mcps/types/json-rpc.types.d.ts +0 -35
  665. package/dist/mcps/types/json-rpc.types.js +0 -7
  666. package/dist/mcps/types/mcp.types.d.ts +0 -105
  667. package/dist/mcps/types/mcp.types.js +0 -7
  668. package/dist/memory-routing/index.d.ts +0 -6
  669. package/dist/memory-routing/index.js +0 -4
  670. package/dist/memory-routing/null-provider.d.ts +0 -14
  671. package/dist/memory-routing/null-provider.js +0 -63
  672. package/dist/memory-routing/provider-loader.d.ts +0 -6
  673. package/dist/memory-routing/provider-loader.js +0 -165
  674. package/dist/memory-routing/provider-registry.d.ts +0 -8
  675. package/dist/memory-routing/provider-registry.js +0 -41
  676. package/dist/memory-routing/types.d.ts +0 -111
  677. package/dist/memory-routing/types.js +0 -7
  678. package/dist/memory-routing/validate-config.d.ts +0 -7
  679. package/dist/memory-routing/validate-config.js +0 -32
  680. package/dist/metrics/agent-metrics.d.ts +0 -169
  681. package/dist/metrics/agent-metrics.js +0 -574
  682. package/dist/metrics/index.d.ts +0 -6
  683. package/dist/metrics/index.js +0 -6
  684. package/dist/monitoring/advanced-profiler.d.ts +0 -51
  685. package/dist/monitoring/advanced-profiler.js +0 -232
  686. package/dist/monitoring/memory-monitor.d.ts +0 -113
  687. package/dist/monitoring/memory-monitor.js +0 -315
  688. package/dist/monitoring/nudge-watchdog.d.ts +0 -87
  689. package/dist/monitoring/nudge-watchdog.js +0 -355
  690. package/dist/monitoring/test-auto-generation-monitor.d.ts +0 -64
  691. package/dist/monitoring/test-auto-generation-monitor.js +0 -157
  692. package/dist/nucleus/aside-worktree.d.ts +0 -41
  693. package/dist/nucleus/aside-worktree.js +0 -164
  694. package/dist/nucleus/autonomy-kernel.d.ts +0 -55
  695. package/dist/nucleus/autonomy-kernel.js +0 -234
  696. package/dist/nucleus/confer.d.ts +0 -57
  697. package/dist/nucleus/confer.js +0 -322
  698. package/dist/nucleus/default-plugins.d.ts +0 -17
  699. package/dist/nucleus/default-plugins.js +0 -173
  700. package/dist/nucleus/delegation-gate.d.ts +0 -105
  701. package/dist/nucleus/delegation-gate.js +0 -582
  702. package/dist/nucleus/govern-http.d.ts +0 -59
  703. package/dist/nucleus/govern-http.js +0 -175
  704. package/dist/nucleus/index.d.ts +0 -17
  705. package/dist/nucleus/index.js +0 -12
  706. package/dist/nucleus/kernel.d.ts +0 -51
  707. package/dist/nucleus/kernel.js +0 -62
  708. package/dist/nucleus/lead-dev-plan-persistence.d.ts +0 -70
  709. package/dist/nucleus/lead-dev-plan-persistence.js +0 -402
  710. package/dist/nucleus/pending-delegations.d.ts +0 -71
  711. package/dist/nucleus/pending-delegations.js +0 -285
  712. package/dist/nucleus/plugin-registry.d.ts +0 -132
  713. package/dist/nucleus/plugin-registry.js +0 -175
  714. package/dist/nucleus/spawn-plan-resolution.d.ts +0 -20
  715. package/dist/nucleus/spawn-plan-resolution.js +0 -42
  716. package/dist/nucleus/suit-temperament.d.ts +0 -40
  717. package/dist/nucleus/suit-temperament.js +0 -157
  718. package/dist/nucleus/synthesis-completion.d.ts +0 -6
  719. package/dist/nucleus/synthesis-completion.js +0 -29
  720. package/dist/nucleus/synthesis-consult-receipt.d.ts +0 -32
  721. package/dist/nucleus/synthesis-consult-receipt.js +0 -171
  722. package/dist/nucleus/synthesis-context.d.ts +0 -31
  723. package/dist/nucleus/synthesis-context.js +0 -86
  724. package/dist/nucleus/synthesis.d.ts +0 -54
  725. package/dist/nucleus/synthesis.js +0 -196
  726. package/dist/nucleus/thin-dispatch.d.ts +0 -33
  727. package/dist/nucleus/thin-dispatch.js +0 -85
  728. package/dist/nucleus/user-aside.d.ts +0 -70
  729. package/dist/nucleus/user-aside.js +0 -393
  730. package/dist/orchestrator/agent-spawn-governor.d.ts +0 -126
  731. package/dist/orchestrator/agent-spawn-governor.js +0 -558
  732. package/dist/orchestrator/enhanced-multi-agent-orchestrator.d.ts +0 -156
  733. package/dist/orchestrator/enhanced-multi-agent-orchestrator.js +0 -399
  734. package/dist/orchestrator/intelligent-commit-batcher.d.ts +0 -114
  735. package/dist/orchestrator/intelligent-commit-batcher.js +0 -344
  736. package/dist/orchestrator/multi-agent-orchestration-coordinator.d.ts +0 -126
  737. package/dist/orchestrator/multi-agent-orchestration-coordinator.js +0 -455
  738. package/dist/orchestrator/orchestrator.d.ts +0 -141
  739. package/dist/orchestrator/orchestrator.js +0 -648
  740. package/dist/orchestrator/self-direction-activation.d.ts +0 -108
  741. package/dist/orchestrator/self-direction-activation.js +0 -244
  742. package/dist/orchestrator/universal-librarian-consultation.d.ts +0 -98
  743. package/dist/orchestrator/universal-librarian-consultation.js +0 -216
  744. package/dist/orchestrator/universal-registry-bridge.d.ts +0 -84
  745. package/dist/orchestrator/universal-registry-bridge.js +0 -246
  746. package/dist/performance/performance-budget-enforcer.d.ts +0 -157
  747. package/dist/performance/performance-budget-enforcer.js +0 -433
  748. package/dist/performance/performance-regression-tester.d.ts +0 -107
  749. package/dist/performance/performance-regression-tester.js +0 -341
  750. package/dist/plugin/plugin-codex-context.d.ts +0 -18
  751. package/dist/plugin/plugin-codex-context.js +0 -87
  752. package/dist/plugin/plugin-helpers.d.ts +0 -23
  753. package/dist/plugin/plugin-helpers.js +0 -155
  754. package/dist/plugin/plugin-logger.d.ts +0 -8
  755. package/dist/plugin/plugin-logger.js +0 -46
  756. package/dist/plugin/plugin-modules.d.ts +0 -11
  757. package/dist/plugin/plugin-modules.js +0 -144
  758. package/dist/plugin/plugin-quality-gate.d.ts +0 -11
  759. package/dist/plugin/plugin-quality-gate.js +0 -88
  760. package/dist/plugin/plugin-types.d.ts +0 -93
  761. package/dist/plugin/plugin-types.js +0 -1
  762. package/dist/plugin/xray-codex-injection.d.ts +0 -39
  763. package/dist/plugin/xray-codex-injection.js +0 -399
  764. package/dist/postprocessor/PostProcessor.d.ts +0 -108
  765. package/dist/postprocessor/PostProcessor.js +0 -1053
  766. package/dist/postprocessor/analysis/CodeChangeAnalyzer.d.ts +0 -11
  767. package/dist/postprocessor/analysis/CodeChangeAnalyzer.js +0 -50
  768. package/dist/postprocessor/analysis/FailureAnalysisEngine.d.ts +0 -39
  769. package/dist/postprocessor/analysis/FailureAnalysisEngine.js +0 -245
  770. package/dist/postprocessor/autofix/AutoFixEngine.d.ts +0 -48
  771. package/dist/postprocessor/autofix/AutoFixEngine.js +0 -254
  772. package/dist/postprocessor/autofix/FixValidator.d.ts +0 -23
  773. package/dist/postprocessor/autofix/FixValidator.js +0 -56
  774. package/dist/postprocessor/config/ProcessorConfigLoader.d.ts +0 -44
  775. package/dist/postprocessor/config/ProcessorConfigLoader.js +0 -16
  776. package/dist/postprocessor/config.d.ts +0 -6
  777. package/dist/postprocessor/config.js +0 -65
  778. package/dist/postprocessor/escalation/EscalationEngine.d.ts +0 -154
  779. package/dist/postprocessor/escalation/EscalationEngine.js +0 -492
  780. package/dist/postprocessor/integration.d.ts +0 -156
  781. package/dist/postprocessor/integration.js +0 -194
  782. package/dist/postprocessor/metamorphosis/SelfProposalEngine.d.ts +0 -87
  783. package/dist/postprocessor/metamorphosis/SelfProposalEngine.js +0 -472
  784. package/dist/postprocessor/metamorphosis/index.d.ts +0 -2
  785. package/dist/postprocessor/metamorphosis/index.js +0 -1
  786. package/dist/postprocessor/monitoring/MonitoringEngine.d.ts +0 -40
  787. package/dist/postprocessor/monitoring/MonitoringEngine.js +0 -125
  788. package/dist/postprocessor/redeploy/RedeployCoordinator.d.ts +0 -91
  789. package/dist/postprocessor/redeploy/RedeployCoordinator.js +0 -342
  790. package/dist/postprocessor/redeploy/RetryHandler.d.ts +0 -49
  791. package/dist/postprocessor/redeploy/RetryHandler.js +0 -118
  792. package/dist/postprocessor/services/RegressionAnalysisService.d.ts +0 -39
  793. package/dist/postprocessor/services/RegressionAnalysisService.js +0 -130
  794. package/dist/postprocessor/success/SuccessHandler.d.ts +0 -57
  795. package/dist/postprocessor/success/SuccessHandler.js +0 -134
  796. package/dist/postprocessor/triggers/APITrigger.d.ts +0 -34
  797. package/dist/postprocessor/triggers/APITrigger.js +0 -114
  798. package/dist/postprocessor/triggers/GitHookTrigger.d.ts +0 -38
  799. package/dist/postprocessor/triggers/GitHookTrigger.js +0 -557
  800. package/dist/postprocessor/triggers/WebhookTrigger.d.ts +0 -46
  801. package/dist/postprocessor/triggers/WebhookTrigger.js +0 -210
  802. package/dist/postprocessor/types.d.ts +0 -227
  803. package/dist/postprocessor/types.js +0 -4
  804. package/dist/processors/doc-write-guard.d.ts +0 -6
  805. package/dist/processors/doc-write-guard.js +0 -46
  806. package/dist/processors/implementations/agents-md-validation-processor.d.ts +0 -62
  807. package/dist/processors/implementations/agents-md-validation-processor.js +0 -285
  808. package/dist/processors/implementations/async-pattern-processor.d.ts +0 -47
  809. package/dist/processors/implementations/async-pattern-processor.js +0 -157
  810. package/dist/processors/implementations/codex-compliance-processor.d.ts +0 -7
  811. package/dist/processors/implementations/codex-compliance-processor.js +0 -57
  812. package/dist/processors/implementations/commit-batcher-processor.d.ts +0 -13
  813. package/dist/processors/implementations/commit-batcher-processor.js +0 -71
  814. package/dist/processors/implementations/console-log-guard-processor.d.ts +0 -32
  815. package/dist/processors/implementations/console-log-guard-processor.js +0 -162
  816. package/dist/processors/implementations/coverage-analysis-processor.d.ts +0 -19
  817. package/dist/processors/implementations/coverage-analysis-processor.js +0 -137
  818. package/dist/processors/implementations/error-boundary-processor.d.ts +0 -7
  819. package/dist/processors/implementations/error-boundary-processor.js +0 -44
  820. package/dist/processors/implementations/inference-improvement-processor.d.ts +0 -36
  821. package/dist/processors/implementations/inference-improvement-processor.js +0 -262
  822. package/dist/processors/implementations/log-protection-processor.d.ts +0 -29
  823. package/dist/processors/implementations/log-protection-processor.js +0 -117
  824. package/dist/processors/implementations/nudge-processor.d.ts +0 -21
  825. package/dist/processors/implementations/nudge-processor.js +0 -129
  826. package/dist/processors/implementations/performance-budget-processor.d.ts +0 -49
  827. package/dist/processors/implementations/performance-budget-processor.js +0 -216
  828. package/dist/processors/implementations/postprocessor-chain-validator.d.ts +0 -45
  829. package/dist/processors/implementations/postprocessor-chain-validator.js +0 -148
  830. package/dist/processors/implementations/pre-validate-processor.d.ts +0 -7
  831. package/dist/processors/implementations/pre-validate-processor.js +0 -18
  832. package/dist/processors/implementations/publish-preflight-processor.d.ts +0 -37
  833. package/dist/processors/implementations/publish-preflight-processor.js +0 -240
  834. package/dist/processors/implementations/refactoring-logging-processor-wrapper.d.ts +0 -7
  835. package/dist/processors/implementations/refactoring-logging-processor-wrapper.js +0 -33
  836. package/dist/processors/implementations/refactoring-logging-processor.d.ts +0 -31
  837. package/dist/processors/implementations/refactoring-logging-processor.js +0 -96
  838. package/dist/processors/implementations/regression-testing-processor.d.ts +0 -20
  839. package/dist/processors/implementations/regression-testing-processor.js +0 -59
  840. package/dist/processors/implementations/session-capture-processor.d.ts +0 -14
  841. package/dist/processors/implementations/session-capture-processor.js +0 -37
  842. package/dist/processors/implementations/session-summary-processor.d.ts +0 -26
  843. package/dist/processors/implementations/session-summary-processor.js +0 -125
  844. package/dist/processors/implementations/spawn-governance-processor.d.ts +0 -57
  845. package/dist/processors/implementations/spawn-governance-processor.js +0 -218
  846. package/dist/processors/implementations/state-validation-processor.d.ts +0 -11
  847. package/dist/processors/implementations/state-validation-processor.js +0 -15
  848. package/dist/processors/implementations/storytelling-trigger-processor.d.ts +0 -40
  849. package/dist/processors/implementations/storytelling-trigger-processor.js +0 -563
  850. package/dist/processors/implementations/test-auto-creation-processor.d.ts +0 -16
  851. package/dist/processors/implementations/test-auto-creation-processor.js +0 -483
  852. package/dist/processors/implementations/test-execution-processor.d.ts +0 -11
  853. package/dist/processors/implementations/test-execution-processor.js +0 -132
  854. package/dist/processors/implementations/typescript-compilation-processor.d.ts +0 -37
  855. package/dist/processors/implementations/typescript-compilation-processor.js +0 -86
  856. package/dist/processors/implementations/version-compliance-processor.d.ts +0 -80
  857. package/dist/processors/implementations/version-compliance-processor.js +0 -222
  858. package/dist/processors/processor-interfaces.d.ts +0 -126
  859. package/dist/processors/processor-interfaces.js +0 -125
  860. package/dist/processors/processor-manager.d.ts +0 -80
  861. package/dist/processors/processor-manager.js +0 -826
  862. package/dist/processors/processor-types.d.ts +0 -189
  863. package/dist/processors/processor-types.js +0 -11
  864. package/dist/public/XrayService.d.ts +0 -17
  865. package/dist/public/XrayService.js +0 -40
  866. package/dist/public/about.html +0 -228
  867. package/dist/public/enterprise.html +0 -27
  868. package/dist/public/features.html +0 -102
  869. package/dist/public/index.d.ts +0 -4
  870. package/dist/public/index.html +0 -145
  871. package/dist/public/index.js +0 -2
  872. package/dist/reporting/framework-reporting-system.d.ts +0 -19
  873. package/dist/reporting/framework-reporting-system.js +0 -187
  874. package/dist/reporting/log-parser.d.ts +0 -10
  875. package/dist/reporting/log-parser.js +0 -281
  876. package/dist/reporting/metrics.d.ts +0 -15
  877. package/dist/reporting/metrics.js +0 -202
  878. package/dist/reporting/report-formatter.d.ts +0 -5
  879. package/dist/reporting/report-formatter.js +0 -146
  880. package/dist/reporting/types.d.ts +0 -102
  881. package/dist/reporting/types.js +0 -1
  882. package/dist/scripts/activate-kernel-pipeline.d.ts +0 -7
  883. package/dist/scripts/activate-kernel-pipeline.js +0 -101
  884. package/dist/scripts/integration.d.ts +0 -36
  885. package/dist/scripts/integration.js +0 -233
  886. package/dist/scripts/pre-command +0 -26
  887. package/dist/scripts/pre-command.mjs +0 -358
  888. package/dist/security/comprehensive-security-audit.d.ts +0 -157
  889. package/dist/security/comprehensive-security-audit.js +0 -1004
  890. package/dist/security/index.d.ts +0 -13
  891. package/dist/security/index.js +0 -13
  892. package/dist/security/prompt-security-validator.d.ts +0 -44
  893. package/dist/security/prompt-security-validator.js +0 -148
  894. package/dist/security/security-agent-coordinator.d.ts +0 -71
  895. package/dist/security/security-agent-coordinator.js +0 -203
  896. package/dist/security/security-auditor.d.ts +0 -55
  897. package/dist/security/security-auditor.js +0 -583
  898. package/dist/security/security-hardener.d.ts +0 -61
  899. package/dist/security/security-hardener.js +0 -169
  900. package/dist/security/security-hardening-system.d.ts +0 -238
  901. package/dist/security/security-hardening-system.js +0 -726
  902. package/dist/security/security-headers.d.ts +0 -63
  903. package/dist/security/security-headers.js +0 -117
  904. package/dist/security/security-orchestration-layer.d.ts +0 -118
  905. package/dist/security/security-orchestration-layer.js +0 -495
  906. package/dist/security/security-scanner.d.ts +0 -119
  907. package/dist/security/security-scanner.js +0 -429
  908. package/dist/services/inference-tuner.d.ts +0 -76
  909. package/dist/services/inference-tuner.js +0 -300
  910. package/dist/session/index.d.ts +0 -3
  911. package/dist/session/index.js +0 -3
  912. package/dist/session/session-cleanup-manager.d.ts +0 -117
  913. package/dist/session/session-cleanup-manager.js +0 -365
  914. package/dist/session/session-monitor.d.ts +0 -132
  915. package/dist/session/session-monitor.js +0 -502
  916. package/dist/session/session-state-manager.d.ts +0 -144
  917. package/dist/session/session-state-manager.js +0 -521
  918. package/dist/skills/api-design/SKILL.md +0 -37
  919. package/dist/skills/architect-tools/SKILL.md +0 -37
  920. package/dist/skills/architecture-patterns/SKILL.md +0 -37
  921. package/dist/skills/auto-format/SKILL.md +0 -37
  922. package/dist/skills/backend-engineer/SKILL.md +0 -49
  923. package/dist/skills/boot-orchestrator/SKILL.md +0 -33
  924. package/dist/skills/bug-triage/SKILL.md +0 -43
  925. package/dist/skills/code-analyzer/SKILL.md +0 -45
  926. package/dist/skills/code-review/SKILL.md +0 -52
  927. package/dist/skills/content-creator/SKILL.md +0 -38
  928. package/dist/skills/database-engineer/SKILL.md +0 -46
  929. package/dist/skills/devops-engineer/SKILL.md +0 -49
  930. package/dist/skills/enforcer/SKILL.md +0 -37
  931. package/dist/skills/framework-compliance-audit/SKILL.md +0 -37
  932. package/dist/skills/frontend-engineer/SKILL.md +0 -49
  933. package/dist/skills/frontend-ui-ux-engineer/SKILL.md +0 -41
  934. package/dist/skills/git-workflow/SKILL.md +0 -37
  935. package/dist/skills/growth-strategist/SKILL.md +0 -48
  936. package/dist/skills/hermes-agent/SKILL.md +0 -212
  937. package/dist/skills/inference-improve/SKILL.md +0 -97
  938. package/dist/skills/lint/SKILL.md +0 -37
  939. package/dist/skills/log-monitor/SKILL.md +0 -44
  940. package/dist/skills/mobile-developer/SKILL.md +0 -42
  941. package/dist/skills/model-health-check/SKILL.md +0 -37
  942. package/dist/skills/multimodal-looker/SKILL.md +0 -45
  943. package/dist/skills/orchestrator/SKILL.md +0 -61
  944. package/dist/skills/performance-analysis/SKILL.md +0 -37
  945. package/dist/skills/performance-engineer/SKILL.md +0 -41
  946. package/dist/skills/performance-optimization/SKILL.md +0 -37
  947. package/dist/skills/processor-pipeline/SKILL.md +0 -37
  948. package/dist/skills/project-analysis/SKILL.md +0 -42
  949. package/dist/skills/refactoring-strategies/SKILL.md +0 -37
  950. package/dist/skills/registry.json +0 -65
  951. package/dist/skills/researcher/SKILL.md +0 -50
  952. package/dist/skills/security-audit/SKILL.md +0 -48
  953. package/dist/skills/security-scan/SKILL.md +0 -37
  954. package/dist/skills/seo-consultant/SKILL.md +0 -43
  955. package/dist/skills/session-management/SKILL.md +0 -36
  956. package/dist/skills/state-manager/SKILL.md +0 -37
  957. package/dist/skills/storyteller/SKILL.md +0 -130
  958. package/dist/skills/strategist/SKILL.md +0 -44
  959. package/dist/skills/tech-writer/SKILL.md +0 -37
  960. package/dist/skills/testing-best-practices/SKILL.md +0 -37
  961. package/dist/skills/testing-strategy/SKILL.md +0 -54
  962. package/dist/skills/ui-ux-design/SKILL.md +0 -603
  963. package/dist/skills/xray-orchestrator/SKILL.md +0 -141
  964. package/dist/skills/xray-orchestrator/index.d.ts +0 -12
  965. package/dist/skills/xray-orchestrator/index.js +0 -223
  966. package/dist/state/context-providers.d.ts +0 -4
  967. package/dist/state/context-providers.js +0 -1
  968. package/dist/state/index.d.ts +0 -4
  969. package/dist/state/index.js +0 -7
  970. package/dist/state/state-manager.d.ts +0 -41
  971. package/dist/state/state-manager.js +0 -207
  972. package/dist/state/state-types.d.ts +0 -5
  973. package/dist/state/state-types.js +0 -1
  974. package/dist/testing/memory-regression-suite.d.ts +0 -105
  975. package/dist/testing/memory-regression-suite.js +0 -258
  976. package/dist/tools/assess-complexity-tool.d.ts +0 -28
  977. package/dist/tools/assess-complexity-tool.js +0 -44
  978. package/dist/tools/query-routing-tool.d.ts +0 -17
  979. package/dist/tools/query-routing-tool.js +0 -59
  980. package/dist/types/metamorphosis.d.ts +0 -21
  981. package/dist/types/metamorphosis.js +0 -6
  982. package/dist/utils/batch-operations.d.ts +0 -25
  983. package/dist/utils/batch-operations.js +0 -292
  984. package/dist/utils/codex-parser.d.ts +0 -60
  985. package/dist/utils/codex-parser.js +0 -444
  986. package/dist/utils/command-runner.d.ts +0 -32
  987. package/dist/utils/command-runner.js +0 -96
  988. package/dist/utils/import-resolver.d.ts +0 -54
  989. package/dist/utils/import-resolver.js +0 -189
  990. package/dist/utils/language-detector.d.ts +0 -43
  991. package/dist/utils/language-detector.js +0 -382
  992. package/dist/utils/path-resolver.d.ts +0 -48
  993. package/dist/utils/path-resolver.js +0 -112
  994. package/dist/utils/shutdown-handler.d.ts +0 -26
  995. package/dist/utils/shutdown-handler.js +0 -74
  996. package/dist/utils/task-graph.d.ts +0 -29
  997. package/dist/utils/task-graph.js +0 -106
  998. package/dist/utils/test-template-generator.d.ts +0 -25
  999. package/dist/utils/test-template-generator.js +0 -178
  1000. package/dist/utils/token-manager.d.ts +0 -48
  1001. package/dist/utils/token-manager.js +0 -163
  1002. package/dist/validation/agent-config-validator.d.ts +0 -110
  1003. package/dist/validation/agent-config-validator.js +0 -280
  1004. package/dist/validation/estimation-validator.d.ts +0 -61
  1005. package/dist/validation/estimation-validator.js +0 -241
  1006. package/dist/validation/orchestration-flow-validator.d.ts +0 -87
  1007. package/dist/validation/orchestration-flow-validator.js +0 -606
  1008. package/dist/validation/report-content-validator.d.ts +0 -42
  1009. package/dist/validation/report-content-validator.js +0 -218
@@ -1,1100 +0,0 @@
1
- """Comprehensive tests for the Xray Hermes Plugin v2.
2
-
3
- Tests all 3 tools, both hooks, the slash command, bridge integration,
4
- logging to disk, and the full register() wiring.
5
-
6
- v2 changes from v1:
7
- - Hooks now pipe through Node.js bridge for real framework integration
8
- - Tool events logged to disk (activity.log, plugin-tool-events.log)
9
- - Tools use bridge first, fall back to CLI
10
- - Session stats track quality gate runs, processor runs, bridge calls
11
- - No more in-memory _TOOL_LOG — everything persists to disk
12
- """
13
-
14
- import json
15
- import subprocess
16
- import os
17
- import sys
18
- import tempfile
19
- import unittest
20
- from pathlib import Path
21
- from unittest.mock import patch, MagicMock, call
22
- import logging
23
- import importlib
24
- import types
25
-
26
- # ── Path setup ────────────────────────────────────────────────
27
-
28
- PLUGIN_DIR = str(Path(__file__).resolve().parent)
29
- sys.path.insert(0, PLUGIN_DIR)
30
-
31
- # Force reimport
32
- for mod in list(sys.modules):
33
- if "xray" in mod and ("schemas" in mod or "tools" in mod or "plugin" in mod):
34
- del sys.modules[mod]
35
-
36
- schemas = importlib.import_module("schemas")
37
- tools_mod = importlib.import_module("tools")
38
-
39
- # Create a fake package for __init__.py execution
40
- pkg = types.ModuleType("xray_hermes_pkg")
41
- pkg.__path__ = [PLUGIN_DIR]
42
- pkg.__dict__["schemas"] = schemas
43
- pkg.__dict__["tools"] = tools_mod
44
- sys.modules["xray_hermes_pkg"] = pkg
45
-
46
- init_path = os.path.join(PLUGIN_DIR, "__init__.py")
47
- with open(init_path) as f:
48
- init_code = f.read()
49
- init_code = init_code.replace("from . import schemas, tools", "import schemas, tools")
50
- # Provide __file__ since exec() loses it
51
- pkg.__dict__["__file__"] = init_path
52
- exec(compile(init_code, init_path, "exec"), pkg.__dict__)
53
-
54
- pi = pkg # plugin init module
55
-
56
-
57
- class TestSchemas(unittest.TestCase):
58
- def test_validate_schema_has_required_fields(self):
59
- s = schemas.XRAY_VALIDATE
60
- self.assertEqual(s["name"], "xray_validate")
61
- params = s["parameters"]
62
- self.assertEqual(params["type"], "object")
63
- self.assertIn("files", params["properties"])
64
- self.assertIn("operation", params["properties"])
65
- self.assertIn("files", params["required"])
66
- self.assertEqual(params["properties"]["files"]["type"], "array")
67
-
68
- def test_codex_check_schema(self):
69
- s = schemas.XRAY_CODEX_CHECK
70
- self.assertEqual(s["name"], "xray_codex_check")
71
- fa = s["parameters"]["properties"]["focus_areas"]
72
- self.assertIn("enum", fa["items"])
73
- self.assertIn("error-handling", fa["items"]["enum"])
74
-
75
- def test_health_schema_no_required(self):
76
- s = schemas.XRAY_HEALTH
77
- self.assertEqual(len(s["parameters"].get("required", [])), 0)
78
-
79
- def test_descriptions_non_empty(self):
80
- for name, schema in [("v", schemas.XRAY_VALIDATE), ("c", schemas.XRAY_CODEX_CHECK), ("h", schemas.XRAY_HEALTH)]:
81
- self.assertTrue(len(schema["description"]) > 20, f"{name}")
82
-
83
-
84
- class TestRunXrayHelper(unittest.TestCase):
85
- """Test the CLI fallback helper (still exists for bridge-less environments)."""
86
-
87
- def test_successful_command(self):
88
- with patch("subprocess.run") as m:
89
- m.return_value = MagicMock(returncode=0, stdout="all good", stderr="")
90
- r = json.loads(tools_mod._run_xray(["health"]))
91
- self.assertEqual(r["status"], "ok")
92
- self.assertEqual(m.call_args[0][0], ["npx", "0xray", "health"])
93
-
94
- def test_command_failure(self):
95
- with patch("subprocess.run") as m:
96
- m.return_value = MagicMock(returncode=1, stdout="", stderr="broke")
97
- r = json.loads(tools_mod._run_xray(["validate"]))
98
- self.assertEqual(r["status"], "error")
99
-
100
- def test_file_not_found(self):
101
- with patch("subprocess.run", side_effect=FileNotFoundError):
102
- r = json.loads(tools_mod._run_xray(["health"]))
103
- self.assertIn("not found", r["error"])
104
-
105
- def test_timeout(self):
106
- with patch("subprocess.run", side_effect=subprocess.TimeoutExpired("c", 30)):
107
- r = json.loads(tools_mod._run_xray(["health"], timeout=15))
108
- self.assertIn("15s", r["error"])
109
-
110
- def test_custom_timeout(self):
111
- with patch("subprocess.run") as m:
112
- m.return_value = MagicMock(returncode=0, stdout="", stderr="")
113
- tools_mod._run_xray(["health"], timeout=60)
114
- self.assertEqual(m.call_args[1]["timeout"], 60)
115
-
116
-
117
- class TestBridgeHelper(unittest.TestCase):
118
- """Test the bridge.mjs calling helper."""
119
-
120
- def test_successful_bridge_call(self):
121
- with patch("subprocess.run") as m:
122
- m.return_value = MagicMock(returncode=0, stdout='{"status":"ok"}', stderr="")
123
- r = tools_mod._bridge_call({"command": "health"})
124
- self.assertEqual(r["status"], "ok")
125
- # Should call node with bridge path
126
- self.assertIn("node", m.call_args[0][0])
127
- self.assertIn("bridge.mjs", m.call_args[0][0][1])
128
-
129
- def test_bridge_returns_error(self):
130
- with patch("subprocess.run") as m:
131
- m.return_value = MagicMock(returncode=1, stdout="", stderr="module not found")
132
- r = tools_mod._bridge_call({"command": "health"})
133
- self.assertIn("error", r)
134
-
135
- def test_bridge_node_not_found(self):
136
- with patch("subprocess.run", side_effect=FileNotFoundError):
137
- r = tools_mod._bridge_call({"command": "health"})
138
- self.assertEqual(r["error"], "node not found")
139
-
140
- def test_bridge_timeout(self):
141
- with patch("subprocess.run", side_effect=subprocess.TimeoutExpired("c", 10)):
142
- r = tools_mod._bridge_call({"command": "health"}, timeout=10)
143
- self.assertIn("timed out", r["error"])
144
-
145
-
146
- class TestXrayHealth(unittest.TestCase):
147
- def test_health_via_bridge(self):
148
- """v2: health uses bridge first."""
149
- with patch.object(tools_mod, "_bridge_call", return_value={"status": "ok", "framework": "loaded", "version": "1.15.0", "components": {}}) as m:
150
- r = json.loads(tools_mod.xray_health({}))
151
- self.assertEqual(r["status"], "ok")
152
- self.assertEqual(r["via"], "bridge")
153
- m.assert_called_once_with({"command": "health"}, timeout=10)
154
-
155
- def test_health_fallback_to_cli(self):
156
- """v2: falls back to CLI when bridge fails."""
157
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "node not found"}):
158
- with patch.object(tools_mod, "_run_xray", return_value='{"status":"ok","output":"healthy"}') as cli:
159
- r = json.loads(tools_mod.xray_health({}))
160
- cli.assert_called_once()
161
-
162
- def test_health_ignores_extra_args(self):
163
- with patch.object(tools_mod, "_bridge_call", return_value={"status": "ok", "framework": "loaded", "version": "1.0", "components": {}}):
164
- r = json.loads(tools_mod.xray_health({"x": 1}))
165
- self.assertEqual(r["status"], "ok")
166
-
167
-
168
- class TestXrayValidate(unittest.TestCase):
169
- def test_with_files_via_bridge(self):
170
- """v2: validate uses bridge first."""
171
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "fileResults": []}) as m:
172
- r = json.loads(tools_mod.xray_validate({"files": ["a.ts", "b.ts"], "operation": "commit"}))
173
- self.assertEqual(r["status"], "passed")
174
- self.assertEqual(r["files_checked"], 2)
175
- self.assertEqual(r["via"], "bridge")
176
- m.assert_called_once()
177
-
178
- def test_bridge_violations(self):
179
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": False, "fileResults": [{"file": "a.ts", "passed": False, "violations": ["tests-required"]}]}) as m:
180
- r = json.loads(tools_mod.xray_validate({"files": ["a.ts"]}))
181
- self.assertEqual(r["status"], "violations")
182
- self.assertEqual(r["file_results"][0]["violations"], ["tests-required"])
183
-
184
- def test_bridge_error_fallback_to_cli(self):
185
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "node not found"}):
186
- with patch.object(tools_mod, "_run_xray", return_value='{"status":"ok","output":"valid"}') as cli:
187
- r = json.loads(tools_mod.xray_validate({"files": ["a.ts"]}))
188
- self.assertEqual(r["via"], "cli")
189
- cli.assert_called_once()
190
-
191
- def test_no_files_error(self):
192
- r = json.loads(tools_mod.xray_validate({"files": []}))
193
- self.assertIn("No files", r["error"])
194
-
195
- def test_no_files_key_error(self):
196
- r = json.loads(tools_mod.xray_validate({}))
197
- self.assertIn("error", r)
198
-
199
- def test_default_operation(self):
200
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "fileResults": []}):
201
- r = json.loads(tools_mod.xray_validate({"files": ["a.ts"]}))
202
- self.assertEqual(r["operation"], "commit")
203
-
204
- def test_100_files(self):
205
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "fileResults": []}) as m:
206
- fs = [f"f{i}.ts" for i in range(100)]
207
- r = json.loads(tools_mod.xray_validate({"files": fs}))
208
- self.assertEqual(r["files_checked"], 100)
209
-
210
-
211
- class TestXrayCodexCheck(unittest.TestCase):
212
- def test_with_code_via_bridge(self):
213
- """v2: codex check uses bridge for real quality gate analysis."""
214
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "violations": [], "checks": []}) as m:
215
- r = json.loads(tools_mod.xray_codex_check({"code": "const x = null;", "operation": "create"}))
216
- self.assertEqual(r["status"], "passed")
217
- self.assertEqual(r["via"], "bridge")
218
- m.assert_called_once()
219
-
220
- def test_with_code_bridge_violations(self):
221
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": False, "violations": ["console.log found"], "checks": []}):
222
- r = json.loads(tools_mod.xray_codex_check({"code": "console.log(x)", "operation": "create"}))
223
- self.assertEqual(r["status"], "violations")
224
- self.assertEqual(r["violations"], ["console.log found"])
225
-
226
- def test_with_focus_areas(self):
227
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "violations": [], "checks": []}) as m:
228
- tools_mod.xray_codex_check({"code": "eval()", "operation": "modify", "focus_areas": ["security"]})
229
- self.assertEqual(m.call_args[0][0]["focusAreas"], ["security"])
230
-
231
- def test_empty_string_code_treated_as_code(self):
232
- """BUG FIX: empty string '' should still be treated as code (is not None)."""
233
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "violations": [], "checks": []}) as m:
234
- r = json.loads(tools_mod.xray_codex_check({"code": "", "operation": "create"}))
235
- self.assertEqual(r["status"], "passed")
236
- self.assertEqual(r["code_length"], 0)
237
-
238
- def test_no_code_bridge_health(self):
239
- """No code provided — bridge health check."""
240
- with patch.object(tools_mod, "_bridge_call", return_value={"framework": "loaded", "version": "1.15.0", "components": {}}) as m:
241
- r = json.loads(tools_mod.xray_codex_check({"operation": "refactor"}))
242
- self.assertEqual(r["status"], "ok")
243
- self.assertIn("Pass", r["note"])
244
-
245
- def test_no_code_bridge_error_fallback(self):
246
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "node not found"}):
247
- with patch.object(tools_mod, "_run_xray", return_value='{"status":"ok","output":"healthy"}') as cli:
248
- r = json.loads(tools_mod.xray_codex_check({"operation": "create"}))
249
- cli.assert_called_once()
250
-
251
- def test_default_operation(self):
252
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "violations": [], "checks": []}):
253
- r = json.loads(tools_mod.xray_codex_check({"code": "x"}))
254
- self.assertEqual(r["operation"], "create")
255
-
256
- def test_multiline_code(self):
257
- code = "function foo() {\n return null;\n}\n"
258
- with patch.object(tools_mod, "_bridge_call", return_value={"passed": True, "violations": [], "checks": []}):
259
- r = json.loads(tools_mod.xray_codex_check({"code": code, "operation": "create"}))
260
- self.assertEqual(r["code_length"], len(code))
261
-
262
-
263
- class TestPreToolCallHook(unittest.TestCase):
264
- """v2: pre_tool_call now runs bridge for code tools and logs to disk."""
265
-
266
- def setUp(self):
267
- # Reset session stats
268
- pi._session_stats = dict.fromkeys(pi._session_stats, 0)
269
- pi._session_stats["started_at"] = None
270
- pi._session_stats["session_id"] = None
271
-
272
- @patch.object(pi, "_call_bridge")
273
- def test_xray_mcp_no_bridge(self, mock_bridge):
274
- """Xray MCP tools skip bridge entirely."""
275
- pi._on_pre_tool_call("mcp_xray_lint_lint", {}, "t1")
276
- self.assertEqual(pi._session_stats["xray_mcp_calls"], 1)
277
- self.assertEqual(pi._session_stats["native_tool_calls"], 0)
278
- mock_bridge.assert_not_called()
279
-
280
- @patch.object(pi, "_call_bridge")
281
- def test_native_tool_no_bridge(self, mock_bridge):
282
- """Non-code native tools don't call bridge."""
283
- pi._on_pre_tool_call("read_file", {"path": "a.md"}, "t1")
284
- mock_bridge.assert_not_called()
285
-
286
- @patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True, "violations": []}, "processors": {"ran": False}})
287
- def test_code_tool_calls_bridge(self, mock_bridge):
288
- """Code-producing tools trigger bridge pre-process."""
289
- pi._on_pre_tool_call("write_file", {"path": "a.ts"}, "t1")
290
- mock_bridge.assert_called_once()
291
- call_cmd = mock_bridge.call_args[0][0]
292
- self.assertEqual(call_cmd["command"], "pre-process")
293
- self.assertEqual(call_cmd["tool"], "write_file")
294
-
295
- @patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True, "violations": []}, "processors": {"ran": False}})
296
- def test_code_tool_increments_stats(self, mock_bridge):
297
- for t in ["write_file", "patch", "execute_code"]:
298
- pi._session_stats["code_operations"] = 0
299
- pi._session_stats["quality_gate_runs"] = 0
300
- pi._on_pre_tool_call(t, {}, "t1")
301
- self.assertEqual(pi._session_stats["code_operations"], 1, f"{t}")
302
- self.assertEqual(pi._session_stats["quality_gate_runs"], 1, f"{t}")
303
-
304
- @patch.object(pi, "_call_bridge", return_value={"passed": False, "qualityGate": {"passed": False, "violations": ["tests-required: no test"]}, "processors": {"ran": False}})
305
- def test_quality_gate_block(self, mock_bridge):
306
- """Quality gate failures increment block counter."""
307
- pi._on_pre_tool_call("write_file", {"path": "a.ts"}, "t1")
308
- self.assertEqual(pi._session_stats["quality_gate_blocks"], 1)
309
-
310
- @patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True}, "processors": {"ran": True, "success": True, "processorCount": 2, "details": [{"name": "preValidate", "success": True}]}})
311
- def test_pre_processor_stats(self, mock_bridge):
312
- pi._on_pre_tool_call("write_file", {"path": "a.ts"}, "t1")
313
- self.assertEqual(pi._session_stats["pre_processor_runs"], 1)
314
-
315
- def test_nudge_terminal(self):
316
- """Terminal nudge only fires when command matches a known pattern."""
317
- # No command arg — no nudge
318
- with self.assertRaises(AssertionError):
319
- with self.assertLogs("xray-hermes", level="INFO"):
320
- pi._on_pre_tool_call("terminal", {}, "t1")
321
-
322
- # Generic command (git, ls) — no nudge
323
- with self.assertRaises(AssertionError):
324
- with self.assertLogs("xray-hermes", level="INFO"):
325
- pi._on_pre_tool_call("terminal", {"command": "git status"}, "t1")
326
-
327
- # Grep command — should nudge
328
- with self.assertLogs("xray-hermes", level="INFO") as cm:
329
- pi._on_pre_tool_call("terminal", {"command": "grep -r 'pattern' src/"}, "t1")
330
- self.assertTrue(any("grep" in m for m in cm.output))
331
-
332
- # npm audit — should nudge
333
- with self.assertLogs("xray-hermes", level="INFO") as cm:
334
- pi._on_pre_tool_call("terminal", {"command": "npm audit"}, "t1")
335
- self.assertTrue(any("audit" in m for m in cm.output))
336
-
337
- def test_nudge_search_files(self):
338
- with self.assertLogs("xray-hermes", level="INFO") as cm:
339
- pi._on_pre_tool_call("search_files", {}, "t1")
340
- self.assertTrue(any("Tip" in m for m in cm.output))
341
-
342
- def test_no_nudge_write_file(self):
343
- """write_file is a code tool — no nudge, gets bridge instead."""
344
- with patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True}, "processors": {"ran": False}}):
345
- with self.assertRaises(AssertionError):
346
- with self.assertLogs("xray-hermes", level="INFO"):
347
- pi._on_pre_tool_call("write_file", {}, "t1")
348
-
349
- def test_accumulates(self):
350
- with patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True}, "processors": {"ran": False}}):
351
- for _ in range(5):
352
- pi._on_pre_tool_call("terminal", {}, "t1")
353
- self.assertEqual(pi._session_stats["total_tool_calls"], 5)
354
-
355
- def test_is_xray_mcp(self):
356
- self.assertTrue(pi._is_xray_mcp("mcp_xray_lint_lint"))
357
- self.assertTrue(pi._is_xray_mcp("mcp_xray_enforcer_codex_enforcement"))
358
- self.assertFalse(pi._is_xray_mcp("terminal"))
359
- self.assertFalse(pi._is_xray_mcp("xray_validate"))
360
- self.assertFalse(pi._is_xray_mcp("mcp_other_tool"))
361
-
362
-
363
- class TestPostToolCallHook(unittest.TestCase):
364
- """v2: post_tool_call logs to disk and calls bridge for code tools."""
365
-
366
- def setUp(self):
367
- # Reset post_processor_runs since it accumulates across tests
368
- pi._session_stats["post_processor_runs"] = 0
369
-
370
- @patch.object(pi, "_call_bridge")
371
- def test_non_code_no_bridge(self, mock_bridge):
372
- """Non-code tools don't trigger bridge post-process."""
373
- pi._on_post_tool_call("terminal", {"command": "ls"}, None, "t1")
374
- mock_bridge.assert_not_called()
375
-
376
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": True, "success": True, "processorCount": 2, "details": []}})
377
- def test_code_tool_calls_bridge(self, mock_bridge):
378
- """Code-producing tools trigger bridge post-process."""
379
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, None, "t1")
380
- mock_bridge.assert_called_once()
381
- call_cmd = mock_bridge.call_args[0][0]
382
- self.assertEqual(call_cmd["command"], "post-process")
383
- self.assertEqual(call_cmd["tool"], "write_file")
384
-
385
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": True, "success": True, "processorCount": 1, "details": []}})
386
- def test_post_processor_stats(self, mock_bridge):
387
- pi._on_post_tool_call("patch", {"path": "a.ts"}, None, "t1")
388
- self.assertEqual(pi._session_stats["post_processor_runs"], 1)
389
-
390
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": True, "success": True, "processorCount": 2, "details": []}})
391
- def test_post_captures_result(self, mock_bridge):
392
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, {"error": "disk full"}, "t1")
393
- call_cmd = mock_bridge.call_args[0][0]
394
- self.assertEqual(call_cmd["error"], "disk full")
395
-
396
- def test_args_not_dict_no_crash(self):
397
- pi._on_post_tool_call("write_file", "not a dict", None, "t1")
398
-
399
- def test_args_none_no_crash(self):
400
- pi._on_post_tool_call("write_file", None, None, "t1")
401
-
402
- def test_missing_path_key_no_file_tracking(self):
403
- """BUG FIX: missing path key should not crash."""
404
- pi._on_post_tool_call("write_file", {"content": "hello"}, None, "t1")
405
-
406
- def test_empty_path_no_file_tracking(self):
407
- """Empty string path should not crash."""
408
- pi._on_post_tool_call("write_file", {"path": ""}, None, "t1")
409
-
410
-
411
- class TestSlashCommand(unittest.TestCase):
412
- def setUp(self):
413
- pi._session_stats = {
414
- "started_at": "2026-03-27T15:00:00Z",
415
- "session_id": "test-session",
416
- "code_operations": 5,
417
- "total_tool_calls": 20,
418
- "xray_mcp_calls": 12,
419
- "native_tool_calls": 8,
420
- "quality_gate_runs": 10,
421
- "quality_gate_blocks": 2,
422
- "pre_processor_runs": 8,
423
- "post_processor_runs": 6,
424
- "bridge_calls": 15,
425
- "bridge_errors": 0,
426
- "subagent_dispatches": 3,
427
- "subagent_validations": 1,
428
- "subagent_blocks": 0,
429
- }
430
-
431
- def test_stats(self):
432
- o = pi._xray_command("stats")
433
- self.assertIn("20", o)
434
- self.assertIn("12", o)
435
- self.assertIn("8", o)
436
- self.assertIn("5", o)
437
- # v2 new stats
438
- self.assertIn("10", o) # quality_gate_runs
439
- self.assertIn("2", o) # quality_gate_blocks
440
- self.assertIn("15", o) # bridge_calls
441
-
442
- def test_help(self):
443
- o = pi._xray_command("help")
444
- self.assertIn("status", o)
445
- self.assertIn("help", o)
446
-
447
- def test_status_via_bridge(self):
448
- """v2: status uses bridge, not tools.xray_health."""
449
- with patch.object(pi, "_call_bridge", return_value={"framework": "loaded", "version": "1.15.0", "components": {"qualityGate": True, "processorManager": True}}) as m:
450
- o = pi._xray_command("status")
451
- self.assertIn("loaded", o)
452
- self.assertIn("1.15.0", o)
453
- m.assert_called_once_with({"command": "health"}, timeout=10)
454
-
455
- def test_status_bridge_error(self):
456
- with patch.object(pi, "_call_bridge", return_value={"error": "node not found"}):
457
- o = pi._xray_command("status")
458
- self.assertIn("node not found", o)
459
-
460
- def test_default_status(self):
461
- with patch.object(pi, "_call_bridge", return_value={"framework": "loaded", "version": "1.0", "components": {}}):
462
- o = pi._xray_command("")
463
- self.assertIn("loaded", o)
464
-
465
- def test_stats_null_started_at(self):
466
- pi._session_stats["started_at"] = None
467
- pi._session_stats["session_id"] = None
468
- o = pi._xray_command("stats")
469
- self.assertIn("N/A", o)
470
-
471
-
472
- class TestSessionStartHook(unittest.TestCase):
473
- def test_resets_stats(self):
474
- pi._session_stats["total_tool_calls"] = 99
475
- pi._session_stats["code_operations"] = 50
476
- pi._session_stats["bridge_calls"] = 20
477
- pi._session_stats["quality_gate_blocks"] = 5
478
- pi._on_session_start("s1", "cli")
479
- self.assertEqual(pi._session_stats["total_tool_calls"], 0)
480
- self.assertEqual(pi._session_stats["code_operations"], 0)
481
- self.assertEqual(pi._session_stats["bridge_calls"], 0)
482
- self.assertEqual(pi._session_stats["quality_gate_blocks"], 0)
483
- self.assertIsNotNone(pi._session_stats["started_at"])
484
- self.assertEqual(pi._session_stats["session_id"], "s1")
485
-
486
- def test_logs(self):
487
- with self.assertLogs("xray-hermes", level="INFO") as cm:
488
- pi._on_session_start("s1", "telegram")
489
- self.assertTrue(any("s1" in m for m in cm.output))
490
- self.assertTrue(any("telegram" in m for m in cm.output))
491
-
492
-
493
- class TestRegisterIntegration(unittest.TestCase):
494
- def test_wires_three_tools(self):
495
- ctx = MagicMock()
496
- pi.register(ctx)
497
- names = [c[1]["name"] for c in ctx.register_tool.call_args_list]
498
- self.assertEqual(set(names), {"xray_validate", "xray_codex_check", "xray_health", "xray_hooks"})
499
-
500
- def test_toolset_name(self):
501
- ctx = MagicMock()
502
- pi.register(ctx)
503
- for c in ctx.register_tool.call_args_list:
504
- self.assertEqual(c[1]["toolset"], "xray-hermes")
505
-
506
- def test_schemas_wired(self):
507
- ctx = MagicMock()
508
- pi.register(ctx)
509
- sm = {c[1]["name"]: c[1]["schema"] for c in ctx.register_tool.call_args_list}
510
- self.assertIs(sm["xray_validate"], schemas.XRAY_VALIDATE)
511
- self.assertIs(sm["xray_codex_check"], schemas.XRAY_CODEX_CHECK)
512
- self.assertIs(sm["xray_health"], schemas.XRAY_HEALTH)
513
-
514
- def test_handlers_wired(self):
515
- ctx = MagicMock()
516
- pi.register(ctx)
517
- hm = {c[1]["name"]: c[1]["handler"] for c in ctx.register_tool.call_args_list}
518
- self.assertIs(hm["xray_validate"], tools_mod.xray_validate)
519
- self.assertIs(hm["xray_codex_check"], tools_mod.xray_codex_check)
520
- self.assertIs(hm["xray_health"], tools_mod.xray_health)
521
-
522
- def test_hooks_registered(self):
523
- ctx = MagicMock()
524
- pi.register(ctx)
525
- names = [c[0][0] for c in ctx.register_hook.call_args_list]
526
- self.assertIn("pre_tool_call", names)
527
- self.assertIn("post_tool_call", names)
528
-
529
- def test_hooks_are_callable(self):
530
- ctx = MagicMock()
531
- pi.register(ctx)
532
- for c in ctx.register_hook.call_args_list:
533
- self.assertTrue(callable(c[0][1]))
534
-
535
- def test_slash_command_attempted(self):
536
- ctx = MagicMock()
537
- pi.register(ctx)
538
- cmds = [c for c in ctx.method_calls if "register_command" in str(c)]
539
- self.assertTrue(len(cmds) >= 1)
540
-
541
- def test_survives_missing_session_hook(self):
542
- ctx = MagicMock()
543
- # pre_tool_call, post_tool_call succeed; on_session_start fails; 3 lifecycle hooks fail
544
- ctx.register_hook.side_effect = [None, None, AttributeError("nope"), AttributeError("nope"), AttributeError("nope"), AttributeError("nope")]
545
- pi.register(ctx) # should not raise
546
-
547
- def test_survives_missing_command_reg(self):
548
- ctx = MagicMock()
549
- ctx.register_command.side_effect = TypeError("nope")
550
- pi.register(ctx)
551
-
552
- def test_logs_on_load(self):
553
- ctx = MagicMock()
554
- with self.assertLogs("xray-hermes", level="INFO") as cm:
555
- pi.register(ctx)
556
- self.assertTrue(any("Plugin" in m and "loaded" in m for m in cm.output))
557
-
558
-
559
- class TestFileLogging(unittest.TestCase):
560
- """Test that tool events are written to log files."""
561
-
562
- def test_log_tool_event_creates_file(self):
563
- with tempfile.TemporaryDirectory() as td:
564
- log_dir = Path(td)
565
- # Temporarily override LOG_DIR
566
- original = pi.LOG_DIR
567
- pi.LOG_DIR = log_dir
568
-
569
- pi._log_tool_event("start", "terminal", {"command": "ls"})
570
- pi._log_tool_event("complete", "terminal", {"command": "ls"}, duration=100)
571
-
572
- activity_file = log_dir / "plugin-tool-events.log"
573
- self.assertTrue(activity_file.exists())
574
-
575
- content = activity_file.read_text()
576
- self.assertIn("tool-started", content)
577
- self.assertIn("tool-complete", content)
578
- self.assertIn("SUCCESS", content)
579
-
580
- pi.LOG_DIR = original
581
-
582
- def test_log_to_file_creates_file(self):
583
- with tempfile.TemporaryDirectory() as td:
584
- log_dir = Path(td)
585
- original = pi.LOG_DIR
586
- pi.LOG_DIR = log_dir
587
-
588
- pi._log_to_file("activity.log", "[test] hello world")
589
-
590
- activity_file = log_dir / "activity.log"
591
- self.assertTrue(activity_file.exists())
592
- content = activity_file.read_text()
593
- self.assertIn("[test] hello world", content)
594
-
595
- pi.LOG_DIR = original
596
-
597
- def test_log_to_file_survives_permission_error(self):
598
- """Should never crash the agent over logging."""
599
- original = pi.LOG_DIR
600
- pi.LOG_DIR = Path("/nonexistent/path/that/does/not/exist/and/cannot/be/created")
601
- pi._log_to_file("activity.log", "should not crash") # noqa: B023
602
- pi.LOG_DIR = original
603
-
604
-
605
- class TestLiveBridge(unittest.TestCase):
606
- """Live test: actually call bridge.mjs if it exists."""
607
-
608
- def test_bridge_health(self):
609
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
610
- if not bridge_path.exists():
611
- self.skipTest("bridge.mjs not built yet")
612
-
613
- r = tools_mod._bridge_call({"command": "health"}, timeout=10)
614
- self.assertNotIn("error", r)
615
- self.assertIn("status", r)
616
-
617
- def test_bridge_stats(self):
618
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
619
- if not bridge_path.exists():
620
- self.skipTest("bridge.mjs not built yet")
621
-
622
- r = tools_mod._bridge_call({"command": "stats"}, timeout=5)
623
- self.assertIn("frameworkReady", r)
624
-
625
- def test_bridge_quality_gate(self):
626
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
627
- if not bridge_path.exists():
628
- self.skipTest("bridge.mjs not built yet")
629
-
630
- # Clean code should pass
631
- r = tools_mod._bridge_call({
632
- "command": "codex-check",
633
- "code": "const x: number = 42;",
634
- }, timeout=10)
635
- self.assertNotIn("error", r)
636
- self.assertIn("passed", r)
637
-
638
- def test_bridge_quality_gate_violation(self):
639
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
640
- if not bridge_path.exists():
641
- self.skipTest("bridge.mjs not built yet")
642
-
643
- # Code with console.log should fail
644
- r = tools_mod._bridge_call({
645
- "command": "codex-check",
646
- "code": "console.log('hello');",
647
- }, timeout=10)
648
- self.assertNotIn("error", r)
649
- # console.log is a violation
650
- if r.get("passed") is False:
651
- self.assertTrue(any("console.log" in v for v in r.get("violations", [])))
652
-
653
- def test_bridge_positional_health(self):
654
- """Positional arg mode: node bridge.mjs health --cwd /path (no stdin pipe)."""
655
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
656
- if not bridge_path.exists():
657
- self.skipTest("bridge.mjs not built yet")
658
-
659
- # Use xray dev repo as project root (has package.json)
660
- xray_root = str(Path(PLUGIN_DIR).parent.parent.parent / "dev" / "xray")
661
- cwd = xray_root if Path(xray_root).exists() else PLUGIN_DIR
662
-
663
- r = subprocess.run(
664
- ["node", str(bridge_path), "health", "--cwd", cwd],
665
- capture_output=True, text=True, timeout=10,
666
- )
667
- self.assertEqual(r.returncode, 0, f"stderr: {r.stderr}")
668
- data = json.loads(r.stdout)
669
- self.assertEqual(data["status"], "ok")
670
- self.assertIn("framework", data)
671
-
672
- def test_bridge_positional_stats(self):
673
- """Positional stats: no stdin needed."""
674
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
675
- if not bridge_path.exists():
676
- self.skipTest("bridge.mjs not built yet")
677
-
678
- xray_root = str(Path(PLUGIN_DIR).parent.parent.parent / "dev" / "xray")
679
- cwd = xray_root if Path(xray_root).exists() else PLUGIN_DIR
680
-
681
- r = subprocess.run(
682
- ["node", str(bridge_path), "stats", "--cwd", cwd],
683
- capture_output=True, text=True, timeout=10,
684
- )
685
- self.assertEqual(r.returncode, 0, f"stderr: {r.stderr}")
686
- data = json.loads(r.stdout)
687
- self.assertIn("frameworkReady", data)
688
-
689
- def test_bridge_positional_with_json_payload(self):
690
- """Positional mode with --json payload for commands needing args."""
691
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
692
- if not bridge_path.exists():
693
- self.skipTest("bridge.mjs not built yet")
694
-
695
- xray_root = str(Path(PLUGIN_DIR).parent.parent.parent / "dev" / "xray")
696
- cwd = xray_root if Path(xray_root).exists() else PLUGIN_DIR
697
-
698
- r = subprocess.run(
699
- ["node", str(bridge_path), "validate", "--cwd", cwd,
700
- "--json", json.dumps({"files": ["src/index.ts"], "operation": "commit"})],
701
- capture_output=True, text=True, timeout=15,
702
- )
703
- self.assertEqual(r.returncode, 0, f"stderr: {r.stderr}")
704
- data = json.loads(r.stdout)
705
- self.assertIn("passed", data)
706
-
707
- def test_bridge_positional_invalid_json(self):
708
- """Positional mode with invalid --json returns error."""
709
- bridge_path = Path(PLUGIN_DIR) / "bridge.mjs"
710
- if not bridge_path.exists():
711
- self.skipTest("bridge.mjs not built yet")
712
-
713
- xray_root = str(Path(PLUGIN_DIR).parent.parent.parent / "dev" / "xray")
714
- cwd = xray_root if Path(xray_root).exists() else PLUGIN_DIR
715
-
716
- r = subprocess.run(
717
- ["node", str(bridge_path), "validate", "--cwd", cwd,
718
- "--json", "not-json"],
719
- capture_output=True, text=True, timeout=10,
720
- )
721
- # Should fail with error about invalid payload
722
- data = json.loads(r.stdout)
723
- self.assertIn("error", data)
724
-
725
-
726
- class TestBridgeErrorPaths(unittest.TestCase):
727
- """Cover remaining bridge error branches in tools.py."""
728
-
729
- def test_bridge_json_decode_error(self):
730
- """_bridge_call with non-JSON stdout returns error."""
731
- with patch("subprocess.run") as m:
732
- m.return_value = MagicMock(returncode=0, stdout="not json", stderr="")
733
- r = tools_mod._bridge_call({"command": "health"})
734
- self.assertIn("error", r)
735
-
736
- def test_bridge_os_error(self):
737
- """_bridge_call with OSError during subprocess returns error."""
738
- with patch("subprocess.run", side_effect=OSError("broken pipe")):
739
- r = tools_mod._bridge_call({"command": "health"})
740
- self.assertIn("error", r)
741
-
742
- def test_bridge_generic_exception_in_run_xray(self):
743
- """_run_xray catches non-standard exceptions."""
744
- with patch("subprocess.run", side_effect=RuntimeError("unexpected")):
745
- r = json.loads(tools_mod._run_xray(["health"]))
746
- self.assertIn("unexpected", r["error"])
747
-
748
- def test_validate_cli_fallback_error(self):
749
- """xray_validate CLI fallback when CLI returns an error JSON."""
750
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "bridge down"}):
751
- with patch.object(tools_mod, "_run_xray", return_value='{"error": "validation failed"}'):
752
- r = json.loads(tools_mod.xray_validate({"files": ["a.ts"]}))
753
- # CLI error path returns raw result without "via" key
754
- self.assertIn("error", r)
755
-
756
- def test_codex_check_static_fallback(self):
757
- """xray_codex_check with code but bridge down falls back to static analysis."""
758
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "bridge down"}):
759
- r = json.loads(tools_mod.xray_codex_check({"code": "console.log(1)", "operation": "create"}))
760
- self.assertEqual(r["via"], "static")
761
- self.assertIn("basic analysis", r["note"])
762
-
763
- def test_codex_check_cli_health_error(self):
764
- """xray_codex_check no-code path: bridge error + CLI also errors."""
765
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "no node"}):
766
- with patch.object(tools_mod, "_run_xray", return_value='{"error": "0xray not found"}'):
767
- r = json.loads(tools_mod.xray_codex_check({"operation": "create"}))
768
- self.assertIn("error", r)
769
-
770
-
771
- class TestGetProjectRoot(unittest.TestCase):
772
- """Test the _get_project_root helper in tools.py."""
773
-
774
- def test_returns_cwd_when_no_package_json(self):
775
- """With no package.json in any ancestor, falls back to cwd."""
776
- # _get_project_root delegates to __init__.py's PROJECT_ROOT.
777
- # We verify the function exists and is callable.
778
- self.assertTrue(callable(tools_mod._get_project_root))
779
- # Verify it returns a Path-like value
780
- result = tools_mod._get_project_root()
781
- self.assertIsNotNone(result)
782
-
783
-
784
- class TestPreToolCallBridgeErrors(unittest.TestCase):
785
- """Test pre_tool_call hook when bridge returns errors."""
786
-
787
- def setUp(self):
788
- pi._session_stats = dict.fromkeys(pi._session_stats, 0)
789
- pi._session_stats["started_at"] = None
790
- pi._session_stats["session_id"] = None
791
-
792
- @patch.object(pi, "_call_bridge", return_value={"error": "bridge crashed"})
793
- def test_code_tool_bridge_error_does_not_crash(self, mock_bridge):
794
- """Bridge error during pre-process should not crash the hook."""
795
- pi._on_pre_tool_call("write_file", {"path": "a.ts"}, "t1")
796
- self.assertEqual(pi._session_stats["code_operations"], 1)
797
- # Note: bridge_calls stat is inside the real _bridge_call,
798
- # so mocking it doesn't increment the counter. Verify hook doesn't crash.
799
- mock_bridge.assert_called_once()
800
-
801
- @patch.object(pi, "_call_bridge", return_value={"error": "timeout"})
802
- def test_multiple_code_tools_with_bridge_errors(self, mock_bridge):
803
- """Multiple bridge errors accumulate properly."""
804
- for i in range(3):
805
- pi._on_pre_tool_call("write_file", {"path": f"f{i}.ts"}, "t1")
806
- self.assertEqual(pi._session_stats["code_operations"], 3)
807
- self.assertEqual(pi._session_stats["total_tool_calls"], 3)
808
-
809
-
810
- class TestPostToolCallBridgeErrors(unittest.TestCase):
811
- """Test post_tool_call hook when bridge returns errors."""
812
-
813
- def setUp(self):
814
- pi._session_stats["post_processor_runs"] = 0
815
-
816
- @patch.object(pi, "_call_bridge", return_value={"error": "bridge down"})
817
- def test_code_tool_post_bridge_error(self, mock_bridge):
818
- """Bridge error during post-process should not crash."""
819
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, None, "t1")
820
- mock_bridge.assert_called_once()
821
-
822
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": False}})
823
- def test_code_tool_processors_not_ran(self, mock_bridge):
824
- """Processors not running is handled gracefully."""
825
- pi._on_post_tool_call("execute_code", {"command": "echo hi"}, {"duration": 42}, "t1")
826
- self.assertEqual(pi._session_stats["post_processor_runs"], 0)
827
-
828
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": True, "success": False, "processorCount": 1, "details": [{"name": "testAutoCreation", "success": False, "error": "no test file"}]}})
829
- def test_post_processor_failure_logging(self, mock_bridge):
830
- """Failed post-processors are tracked but don't crash."""
831
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, None, "t1")
832
- self.assertEqual(pi._session_stats["post_processor_runs"], 1)
833
-
834
-
835
- class TestPreToolCallEdgeCases(unittest.TestCase):
836
- """Edge cases for pre_tool_call."""
837
-
838
- def setUp(self):
839
- pi._session_stats = dict.fromkeys(pi._session_stats, 0)
840
- pi._session_stats["started_at"] = None
841
- pi._session_stats["session_id"] = None
842
-
843
- @patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True}, "processors": {"ran": False}})
844
- def test_all_code_tools_trigger_bridge(self, mock_bridge):
845
- """Every tool in _CODE_TOOLS calls the bridge."""
846
- code_tools = ["write_file", "patch", "execute_code", "write", "edit"]
847
- for tool in code_tools:
848
- pi._session_stats["code_operations"] = 0
849
- pi._on_pre_tool_call(tool, {}, "t1")
850
- self.assertEqual(pi._session_stats["code_operations"], 1, f"{tool} should be a code tool")
851
-
852
- @patch.object(pi, "_call_bridge")
853
- def test_unknown_tool_not_xray_mcp(self, mock_bridge):
854
- """Unknown tools should be treated as native tools."""
855
- pi._on_pre_tool_call("some_random_tool", {}, "t1")
856
- self.assertEqual(pi._session_stats["native_tool_calls"], 1)
857
- mock_bridge.assert_not_called()
858
-
859
- def test_xray_validate_tool_not_treated_as_mcp(self):
860
- """xray_validate is a native tool, not an MCP tool."""
861
- pi._on_pre_tool_call("xray_validate", {}, "t1")
862
- self.assertEqual(pi._session_stats["native_tool_calls"], 1)
863
- self.assertEqual(pi._session_stats["xray_mcp_calls"], 0)
864
-
865
- @patch.object(pi, "_call_bridge", return_value={"passed": True, "qualityGate": {"passed": True, "violations": []}, "processors": {"ran": True, "success": True, "processorCount": 3, "details": [{"name": "p1", "success": True}, {"name": "p2", "success": True}, {"name": "p3", "success": False, "error": "failed"}]}})
866
- def test_pre_processor_partial_failure(self, mock_bridge):
867
- """Pre-processors with partial failure still count as ran."""
868
- pi._on_pre_tool_call("write_file", {"path": "a.ts"}, "t1")
869
- self.assertEqual(pi._session_stats["pre_processor_runs"], 1)
870
-
871
-
872
- class TestSlashCommandEdgeCases(unittest.TestCase):
873
- """Edge cases for the slash command handler."""
874
-
875
- def test_unknown_command_defaults_to_status(self):
876
- """Unknown args default to status."""
877
- with patch.object(pi, "_call_bridge", return_value={"framework": "loaded", "version": "1.0", "components": {}}) as m:
878
- pi._xray_command("something-random")
879
- m.assert_called_once_with({"command": "health"}, timeout=10)
880
-
881
- def test_case_insensitive(self):
882
- """Command arg is lowercased."""
883
- o = pi._xray_command(" STATS ")
884
- self.assertIn("Session", o)
885
-
886
-
887
- class TestLogToFileTimestamps(unittest.TestCase):
888
- """Verify log file formatting."""
889
-
890
- def test_log_entry_has_iso_timestamp(self):
891
- """Every log entry should start with an ISO timestamp."""
892
- import re
893
- with tempfile.TemporaryDirectory() as td:
894
- log_dir = Path(td)
895
- original = pi.LOG_DIR
896
- pi.LOG_DIR = log_dir
897
-
898
- pi._log_to_file("test.log", "[test] message")
899
- content = (log_dir / "test.log").read_text()
900
- # ISO timestamp: 2026-03-27T17:00:00Z or similar
901
- self.assertTrue(re.match(r"\d{4}-\d{2}-\d{2}T", content.split(" ")[0]))
902
-
903
- pi.LOG_DIR = original
904
-
905
-
906
- class TestPostToolCallDuration(unittest.TestCase):
907
- """Test that duration is correctly extracted from results."""
908
-
909
- def setUp(self):
910
- pi._session_stats["post_processor_runs"] = 0
911
-
912
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": False}})
913
- def test_duration_extracted_from_result_dict(self, mock_bridge):
914
- """Duration from result dict is logged correctly."""
915
- # We verify the post hook doesn't crash with duration in result
916
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, {"duration": 1234, "success": True}, "t1")
917
- # No crash = pass
918
-
919
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": False}})
920
- def test_non_dict_result_no_crash(self, mock_bridge):
921
- """Non-dict result doesn't crash the hook."""
922
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, "string result", "t1")
923
-
924
- @patch.object(pi, "_call_bridge", return_value={"processors": {"ran": False}})
925
- def test_none_result_no_crash(self, mock_bridge):
926
- """None result doesn't crash the hook."""
927
- pi._on_post_tool_call("write_file", {"path": "a.ts"}, None, "t1")
928
-
929
-
930
- class TestBridgeHelperTimeoutDefault(unittest.TestCase):
931
- """Verify bridge timeout defaults."""
932
-
933
- def test_default_timeout(self):
934
- """_bridge_call defaults to 30s timeout."""
935
- with patch("subprocess.run") as m:
936
- m.return_value = MagicMock(returncode=0, stdout='{"ok":true}', stderr="")
937
- tools_mod._bridge_call({"command": "health"})
938
- self.assertEqual(m.call_args[1]["timeout"], 30)
939
-
940
- def test_custom_timeout(self):
941
- """_bridge_call respects custom timeout."""
942
- with patch("subprocess.run") as m:
943
- m.return_value = MagicMock(returncode=0, stdout='{\"ok\":true}', stderr="")
944
- tools_mod._bridge_call({"command": "health"}, timeout=5)
945
- self.assertEqual(m.call_args[1]["timeout"], 5)
946
-
947
-
948
- class TestXrayHooksTool(unittest.TestCase):
949
- """Tests for the xray_hooks tool."""
950
-
951
- def test_list_via_bridge(self):
952
- """list action uses bridge when available."""
953
- with patch.object(tools_mod, "_bridge_call", return_value={
954
- "status": "ok", "action": "list",
955
- "hooks": {"managed": ["pre-commit"], "missing": [], "external": [], "stale": []},
956
- }) as m:
957
- r = json.loads(tools_mod.xray_hooks({"action": "list"}))
958
- self.assertEqual(r["status"], "ok")
959
- self.assertEqual(r["via"], "bridge")
960
- m.assert_called_once()
961
- call_cmd = m.call_args[0][0]
962
- self.assertEqual(call_cmd["command"], "hooks")
963
- self.assertEqual(call_cmd["action"], "list")
964
-
965
- def test_install_via_bridge(self):
966
- """install action uses bridge."""
967
- with patch.object(tools_mod, "_bridge_call", return_value={
968
- "status": "ok", "action": "install", "installed": ["pre-commit", "post-commit"],
969
- "skipped": [], "errors": [],
970
- }) as m:
971
- r = json.loads(tools_mod.xray_hooks({"action": "install"}))
972
- self.assertEqual(r["via"], "bridge")
973
- self.assertEqual(len(r["result"]["installed"]), 2)
974
-
975
- def test_uninstall_via_bridge(self):
976
- """uninstall action uses bridge."""
977
- with patch.object(tools_mod, "_bridge_call", return_value={
978
- "status": "ok", "action": "uninstall", "removed": ["pre-commit"], "restored": [],
979
- }) as m:
980
- r = json.loads(tools_mod.xray_hooks({"action": "uninstall"}))
981
- self.assertEqual(r["via"], "bridge")
982
-
983
- def test_bridge_error_fallback(self):
984
- """Falls back to file-based when bridge errors."""
985
- with patch.object(tools_mod, "_bridge_call", return_value={"error": "node not found"}):
986
- # Without a real git repo, should return error
987
- r = json.loads(tools_mod.xray_hooks({"action": "list"}))
988
- self.assertIn("via", r)
989
-
990
- def test_specific_hooks(self):
991
- """Can request specific hooks."""
992
- with patch.object(tools_mod, "_bridge_call", return_value={
993
- "status": "ok", "action": "list",
994
- "hooks": {"managed": [], "missing": ["pre-commit"], "external": [], "stale": []},
995
- }) as m:
996
- tools_mod.xray_hooks({"action": "list", "hooks": ["pre-commit"]})
997
- call_cmd = m.call_args[0][0]
998
- self.assertEqual(call_cmd["hooks"], ["pre-commit"])
999
-
1000
- def test_status_defaults_to_list(self):
1001
- """status action works like list."""
1002
- with patch.object(tools_mod, "_bridge_call", return_value={
1003
- "status": "ok", "action": "status",
1004
- "hooks": {"managed": [], "missing": [], "external": [], "stale": []},
1005
- }) as m:
1006
- r = json.loads(tools_mod.xray_hooks({"action": "status"}))
1007
- self.assertEqual(r["status"], "ok")
1008
- m.assert_called_once()
1009
-
1010
- def test_default_action_is_list(self):
1011
- """Missing action defaults to list."""
1012
- with patch.object(tools_mod, "_bridge_call", return_value={
1013
- "status": "ok", "action": "list",
1014
- "hooks": {"managed": [], "missing": [], "external": [], "stale": []},
1015
- }) as m:
1016
- tools_mod.xray_hooks({})
1017
- call_cmd = m.call_args[0][0]
1018
- self.assertEqual(call_cmd["action"], "list")
1019
-
1020
-
1021
- class TestXrayHooksSchema(unittest.TestCase):
1022
- """Tests for the XRAY_HOOKS schema."""
1023
-
1024
- def test_schema_has_required_fields(self):
1025
- s = schemas.XRAY_HOOKS
1026
- self.assertEqual(s["name"], "xray_hooks")
1027
- self.assertIn("action", s["parameters"]["properties"])
1028
- self.assertIn("hooks", s["parameters"]["properties"])
1029
- self.assertIn("action", s["parameters"]["required"])
1030
-
1031
- def test_action_enum(self):
1032
- s = schemas.XRAY_HOOKS
1033
- action = s["parameters"]["properties"]["action"]
1034
- self.assertIn("install", action["enum"])
1035
- self.assertIn("uninstall", action["enum"])
1036
- self.assertIn("list", action["enum"])
1037
- self.assertIn("status", action["enum"])
1038
-
1039
- def test_hooks_enum(self):
1040
- s = schemas.XRAY_HOOKS
1041
- hooks = s["parameters"]["properties"]["hooks"]
1042
- self.assertIn("pre-commit", hooks["items"]["enum"])
1043
- self.assertIn("post-commit", hooks["items"]["enum"])
1044
- self.assertIn("pre-push", hooks["items"]["enum"])
1045
- self.assertIn("post-push", hooks["items"]["enum"])
1046
-
1047
- def test_description_mentions_hooks(self):
1048
- s = schemas.XRAY_HOOKS
1049
- self.assertIn("git hooks", s["description"])
1050
-
1051
-
1052
- class TestRegisterIntegrationV2_1(unittest.TestCase):
1053
- """Test that register() wires all 4 tools and 2 hooks in v2.2."""
1054
-
1055
- def test_wires_four_tools(self):
1056
- ctx = MagicMock()
1057
- pi.register(ctx)
1058
- names = [c[1]["name"] for c in ctx.register_tool.call_args_list]
1059
- self.assertEqual(set(names), {
1060
- "xray_validate", "xray_codex_check",
1061
- "xray_health", "xray_hooks",
1062
- })
1063
-
1064
- def test_xray_hooks_schema_wired(self):
1065
- ctx = MagicMock()
1066
- pi.register(ctx)
1067
- sm = {c[1]["name"]: c[1]["schema"] for c in ctx.register_tool.call_args_list}
1068
- self.assertIs(sm["xray_hooks"], schemas.XRAY_HOOKS)
1069
-
1070
- def test_xray_hooks_handler_wired(self):
1071
- ctx = MagicMock()
1072
- pi.register(ctx)
1073
- hm = {c[1]["name"]: c[1]["handler"] for c in ctx.register_tool.call_args_list}
1074
- self.assertIs(hm["xray_hooks"], tools_mod.xray_hooks)
1075
-
1076
- def test_registers_two_hooks(self):
1077
- ctx = MagicMock()
1078
- pi.register(ctx)
1079
- hook_names = [c[0][0] for c in ctx.register_hook.call_args_list]
1080
- self.assertIn("pre_tool_call", hook_names)
1081
- self.assertIn("post_tool_call", hook_names)
1082
-
1083
- def test_survives_missing_session_hook(self):
1084
- """Session hook should fail gracefully if not supported."""
1085
- ctx = MagicMock()
1086
- def side_effect(*args):
1087
- raise AttributeError("not available")
1088
- ctx.register_hook.side_effect = [None, None, side_effect]
1089
- pi.register(ctx) # should not raise
1090
-
1091
- def test_v2_2_log_message(self):
1092
- ctx = MagicMock()
1093
- with self.assertLogs("xray-hermes", level="INFO") as cm:
1094
- pi.register(ctx)
1095
- self.assertTrue(any("v2.2" in m for m in cm.output))
1096
- self.assertTrue(any("4 tools" in m for m in cm.output))
1097
-
1098
-
1099
- if __name__ == "__main__":
1100
- unittest.main(verbosity=2)