@trac3r/oh-my-god 2.2.11

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 (638) hide show
  1. package/CHANGELOG.md +188 -0
  2. package/INSTALL-VERIFICATION-INDEX.md +51 -0
  3. package/LICENSE +21 -0
  4. package/OMG-setup.sh +2549 -0
  5. package/QUICK-REFERENCE.md +58 -0
  6. package/README.md +207 -0
  7. package/agents/__init__.py +1 -0
  8. package/agents/__pycache__/model_roles.cpython-313.pyc +0 -0
  9. package/agents/_model_roles.yaml +26 -0
  10. package/agents/designer.md +67 -0
  11. package/agents/explore.md +60 -0
  12. package/agents/model_roles.py +196 -0
  13. package/agents/omg-api-builder.md +23 -0
  14. package/agents/omg-architect-mode.md +41 -0
  15. package/agents/omg-architect.md +13 -0
  16. package/agents/omg-backend-engineer.md +41 -0
  17. package/agents/omg-critic.md +16 -0
  18. package/agents/omg-database-engineer.md +41 -0
  19. package/agents/omg-escalation-router.md +17 -0
  20. package/agents/omg-executor.md +12 -0
  21. package/agents/omg-frontend-designer.md +41 -0
  22. package/agents/omg-implement-mode.md +49 -0
  23. package/agents/omg-infra-engineer.md +41 -0
  24. package/agents/omg-qa-tester.md +16 -0
  25. package/agents/omg-research-mode.md +41 -0
  26. package/agents/omg-security-auditor.md +41 -0
  27. package/agents/omg-testing-engineer.md +41 -0
  28. package/agents/plan.md +80 -0
  29. package/agents/quick_task.md +64 -0
  30. package/agents/reviewer.md +83 -0
  31. package/agents/task.md +71 -0
  32. package/bin/omg +41 -0
  33. package/commands/OMG:ai-commit.md +113 -0
  34. package/commands/OMG:api-twin.md +22 -0
  35. package/commands/OMG:arch.md +313 -0
  36. package/commands/OMG:browser.md +29 -0
  37. package/commands/OMG:ccg.md +22 -0
  38. package/commands/OMG:compat.md +57 -0
  39. package/commands/OMG:cost.md +181 -0
  40. package/commands/OMG:crazy.md +125 -0
  41. package/commands/OMG:create-agent.md +183 -0
  42. package/commands/OMG:deep-plan.md +18 -0
  43. package/commands/OMG:deps.md +248 -0
  44. package/commands/OMG:diagnose-plugins.md +33 -0
  45. package/commands/OMG:doctor.md +37 -0
  46. package/commands/OMG:domain-init.md +11 -0
  47. package/commands/OMG:escalate.md +52 -0
  48. package/commands/OMG:forge.md +103 -0
  49. package/commands/OMG:health-check.md +48 -0
  50. package/commands/OMG:init.md +134 -0
  51. package/commands/OMG:issue.md +56 -0
  52. package/commands/OMG:mode.md +44 -0
  53. package/commands/OMG:playwright.md +17 -0
  54. package/commands/OMG:preflight.md +26 -0
  55. package/commands/OMG:preset.md +49 -0
  56. package/commands/OMG:profile-review.md +58 -0
  57. package/commands/OMG:project-init.md +11 -0
  58. package/commands/OMG:ralph-start.md +43 -0
  59. package/commands/OMG:ralph-stop.md +23 -0
  60. package/commands/OMG:security-check.md +28 -0
  61. package/commands/OMG:session-branch.md +101 -0
  62. package/commands/OMG:session-fork.md +57 -0
  63. package/commands/OMG:session-merge.md +138 -0
  64. package/commands/OMG:setup.md +82 -0
  65. package/commands/OMG:ship.md +18 -0
  66. package/commands/OMG:stats.md +225 -0
  67. package/commands/OMG:teams.md +54 -0
  68. package/commands/OMG:theme.md +44 -0
  69. package/commands/OMG:validate.md +59 -0
  70. package/commands/__init__.py +1 -0
  71. package/docs/command-surface.md +55 -0
  72. package/docs/install/claude-code.md +53 -0
  73. package/docs/install/codex.md +45 -0
  74. package/docs/install/gemini.md +43 -0
  75. package/docs/install/github-action.md +81 -0
  76. package/docs/install/github-app-required-checks.md +107 -0
  77. package/docs/install/github-app.md +161 -0
  78. package/docs/install/kimi.md +43 -0
  79. package/docs/install/opencode.md +38 -0
  80. package/docs/proof.md +182 -0
  81. package/hooks/__init__.py +0 -0
  82. package/hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  83. package/hooks/__pycache__/_agent_registry.cpython-313.pyc +0 -0
  84. package/hooks/__pycache__/_analytics.cpython-313.pyc +0 -0
  85. package/hooks/__pycache__/_budget.cpython-313.pyc +0 -0
  86. package/hooks/__pycache__/_common.cpython-313.pyc +0 -0
  87. package/hooks/__pycache__/_compression_optimizer.cpython-313.pyc +0 -0
  88. package/hooks/__pycache__/_cost_ledger.cpython-313.pyc +0 -0
  89. package/hooks/__pycache__/_learnings.cpython-313.pyc +0 -0
  90. package/hooks/__pycache__/_memory.cpython-313.pyc +0 -0
  91. package/hooks/__pycache__/_post_write.cpython-313.pyc +0 -0
  92. package/hooks/__pycache__/_protected_context.cpython-313.pyc +0 -0
  93. package/hooks/__pycache__/_token_counter.cpython-313.pyc +0 -0
  94. package/hooks/__pycache__/branch_manager.cpython-313.pyc +0 -0
  95. package/hooks/__pycache__/budget_governor.cpython-313.pyc +0 -0
  96. package/hooks/__pycache__/circuit-breaker.cpython-313.pyc +0 -0
  97. package/hooks/__pycache__/compression_feedback.cpython-313.pyc +0 -0
  98. package/hooks/__pycache__/config-guard.cpython-313.pyc +0 -0
  99. package/hooks/__pycache__/context_pressure.cpython-313.pyc +0 -0
  100. package/hooks/__pycache__/credential_store.cpython-313.pyc +0 -0
  101. package/hooks/__pycache__/fetch-rate-limits.cpython-313.pyc +0 -0
  102. package/hooks/__pycache__/firewall.cpython-313.pyc +0 -0
  103. package/hooks/__pycache__/hashline-formatter-bridge.cpython-313.pyc +0 -0
  104. package/hooks/__pycache__/hashline-injector.cpython-313.pyc +0 -0
  105. package/hooks/__pycache__/hashline-validator.cpython-313.pyc +0 -0
  106. package/hooks/__pycache__/idle-detector.cpython-313.pyc +0 -0
  107. package/hooks/__pycache__/instructions-loaded.cpython-313.pyc +0 -0
  108. package/hooks/__pycache__/intentgate-keyword-detector.cpython-313.pyc +0 -0
  109. package/hooks/__pycache__/magic-keyword-router.cpython-313.pyc +0 -0
  110. package/hooks/__pycache__/policy_engine.cpython-313.pyc +0 -0
  111. package/hooks/__pycache__/post-tool-failure.cpython-313.pyc +0 -0
  112. package/hooks/__pycache__/post-write.cpython-313.pyc +0 -0
  113. package/hooks/__pycache__/post_write.cpython-313.pyc +0 -0
  114. package/hooks/__pycache__/pre-compact.cpython-313.pyc +0 -0
  115. package/hooks/__pycache__/pre-tool-inject.cpython-313.pyc +0 -0
  116. package/hooks/__pycache__/prompt-enhancer.cpython-313.pyc +0 -0
  117. package/hooks/__pycache__/quality-runner.cpython-313.pyc +0 -0
  118. package/hooks/__pycache__/query.cpython-313.pyc +0 -0
  119. package/hooks/__pycache__/secret-guard.cpython-313.pyc +0 -0
  120. package/hooks/__pycache__/secret_audit.cpython-313.pyc +0 -0
  121. package/hooks/__pycache__/security_validators.cpython-313.pyc +0 -0
  122. package/hooks/__pycache__/session-end-capture.cpython-313.pyc +0 -0
  123. package/hooks/__pycache__/session-start.cpython-313.pyc +0 -0
  124. package/hooks/__pycache__/setup_wizard.cpython-313.pyc +0 -0
  125. package/hooks/__pycache__/shadow_manager.cpython-313.pyc +0 -0
  126. package/hooks/__pycache__/state_migration.cpython-313.pyc +0 -0
  127. package/hooks/__pycache__/stop-gate.cpython-313.pyc +0 -0
  128. package/hooks/__pycache__/stop_dispatcher.cpython-313.pyc +0 -0
  129. package/hooks/__pycache__/tdd-gate.cpython-313.pyc +0 -0
  130. package/hooks/__pycache__/terms-guard.cpython-313.pyc +0 -0
  131. package/hooks/__pycache__/test-validator.cpython-313.pyc +0 -0
  132. package/hooks/__pycache__/test_generator_hook.cpython-313.pyc +0 -0
  133. package/hooks/__pycache__/todo-state-tracker.cpython-313.pyc +0 -0
  134. package/hooks/__pycache__/tool-ledger.cpython-313.pyc +0 -0
  135. package/hooks/__pycache__/trust_review.cpython-313.pyc +0 -0
  136. package/hooks/__pycache__/user-prompt-submit.cpython-313.pyc +0 -0
  137. package/hooks/_agent_registry.py +481 -0
  138. package/hooks/_analytics.py +291 -0
  139. package/hooks/_budget.py +31 -0
  140. package/hooks/_common.py +761 -0
  141. package/hooks/_compression_optimizer.py +119 -0
  142. package/hooks/_cost_ledger.py +176 -0
  143. package/hooks/_learnings.py +126 -0
  144. package/hooks/_memory.py +103 -0
  145. package/hooks/_post_write.py +46 -0
  146. package/hooks/_protected_context.py +150 -0
  147. package/hooks/_token_counter.py +221 -0
  148. package/hooks/branch_manager.py +255 -0
  149. package/hooks/budget_governor.py +326 -0
  150. package/hooks/circuit-breaker.py +270 -0
  151. package/hooks/compression_feedback.py +254 -0
  152. package/hooks/config-guard.py +193 -0
  153. package/hooks/context_pressure.py +119 -0
  154. package/hooks/credential_store.py +970 -0
  155. package/hooks/fetch-rate-limits.py +212 -0
  156. package/hooks/firewall.py +323 -0
  157. package/hooks/hashline-formatter-bridge.py +224 -0
  158. package/hooks/hashline-injector.py +273 -0
  159. package/hooks/hashline-validator.py +216 -0
  160. package/hooks/idle-detector.py +97 -0
  161. package/hooks/instructions-loaded.py +26 -0
  162. package/hooks/intentgate-keyword-detector.py +200 -0
  163. package/hooks/magic-keyword-router.py +195 -0
  164. package/hooks/policy_engine.py +767 -0
  165. package/hooks/post-tool-failure.py +19 -0
  166. package/hooks/post-write.py +233 -0
  167. package/hooks/pre-compact.py +470 -0
  168. package/hooks/pre-tool-inject.py +98 -0
  169. package/hooks/prompt-enhancer.py +879 -0
  170. package/hooks/quality-runner.py +191 -0
  171. package/hooks/query.py +512 -0
  172. package/hooks/secret-guard.py +120 -0
  173. package/hooks/secret_audit.py +144 -0
  174. package/hooks/security_validators.py +93 -0
  175. package/hooks/session-end-capture.py +505 -0
  176. package/hooks/session-start.py +261 -0
  177. package/hooks/setup_wizard.py +1101 -0
  178. package/hooks/shadow_manager.py +476 -0
  179. package/hooks/state_migration.py +228 -0
  180. package/hooks/stop-gate.py +7 -0
  181. package/hooks/stop_dispatcher.py +1259 -0
  182. package/hooks/tdd-gate.py +10 -0
  183. package/hooks/terms-guard.py +98 -0
  184. package/hooks/test-validator.py +462 -0
  185. package/hooks/test_generator_hook.py +123 -0
  186. package/hooks/todo-state-tracker.py +114 -0
  187. package/hooks/tool-ledger.py +165 -0
  188. package/hooks/trust_review.py +662 -0
  189. package/hooks/user-prompt-submit.py +12 -0
  190. package/hud/omg-hud.mjs +1571 -0
  191. package/lab/__init__.py +1 -0
  192. package/lab/__pycache__/__init__.cpython-313.pyc +0 -0
  193. package/lab/__pycache__/axolotl_adapter.cpython-313.pyc +0 -0
  194. package/lab/__pycache__/forge_runner.cpython-313.pyc +0 -0
  195. package/lab/__pycache__/gazebo_adapter.cpython-313.pyc +0 -0
  196. package/lab/__pycache__/isaac_gym_adapter.cpython-313.pyc +0 -0
  197. package/lab/__pycache__/mock_isaac_env.cpython-313.pyc +0 -0
  198. package/lab/__pycache__/pipeline.cpython-313.pyc +0 -0
  199. package/lab/__pycache__/policies.cpython-313.pyc +0 -0
  200. package/lab/__pycache__/pybullet_adapter.cpython-313.pyc +0 -0
  201. package/lab/axolotl_adapter.py +531 -0
  202. package/lab/forge_runner.py +103 -0
  203. package/lab/gazebo_adapter.py +168 -0
  204. package/lab/isaac_gym_adapter.py +190 -0
  205. package/lab/mock_isaac_env.py +47 -0
  206. package/lab/pipeline.py +712 -0
  207. package/lab/policies.py +52 -0
  208. package/lab/pybullet_adapter.py +192 -0
  209. package/package.json +61 -0
  210. package/plugins/README.md +78 -0
  211. package/plugins/__init__.py +1 -0
  212. package/plugins/__pycache__/__init__.cpython-313.pyc +0 -0
  213. package/plugins/advanced/commands/OMG-code-review.md +114 -0
  214. package/plugins/advanced/commands/OMG-deep-plan.md +266 -0
  215. package/plugins/advanced/commands/OMG-handoff.md +115 -0
  216. package/plugins/advanced/commands/OMG-learn.md +110 -0
  217. package/plugins/advanced/commands/OMG-maintainer.md +31 -0
  218. package/plugins/advanced/commands/OMG-ralph-start.md +43 -0
  219. package/plugins/advanced/commands/OMG-ralph-stop.md +23 -0
  220. package/plugins/advanced/commands/OMG-security-review.md +16 -0
  221. package/plugins/advanced/commands/OMG-sequential-thinking.md +20 -0
  222. package/plugins/advanced/commands/OMG-ship.md +46 -0
  223. package/plugins/advanced/commands/OMG:code-review.md +114 -0
  224. package/plugins/advanced/commands/OMG:deep-plan.md +266 -0
  225. package/plugins/advanced/commands/OMG:handoff.md +115 -0
  226. package/plugins/advanced/commands/OMG:learn.md +110 -0
  227. package/plugins/advanced/commands/OMG:maintainer.md +31 -0
  228. package/plugins/advanced/commands/OMG:ralph-start.md +43 -0
  229. package/plugins/advanced/commands/OMG:ralph-stop.md +23 -0
  230. package/plugins/advanced/commands/OMG:security-review.md +16 -0
  231. package/plugins/advanced/commands/OMG:sequential-thinking.md +20 -0
  232. package/plugins/advanced/commands/OMG:ship.md +46 -0
  233. package/plugins/advanced/plugin.json +104 -0
  234. package/plugins/core/plugin.json +204 -0
  235. package/plugins/dephealth/__init__.py +0 -0
  236. package/plugins/dephealth/__pycache__/__init__.cpython-313.pyc +0 -0
  237. package/plugins/dephealth/__pycache__/cve_scanner.cpython-313.pyc +0 -0
  238. package/plugins/dephealth/__pycache__/license_checker.cpython-313.pyc +0 -0
  239. package/plugins/dephealth/__pycache__/manifest_detector.cpython-313.pyc +0 -0
  240. package/plugins/dephealth/__pycache__/vuln_analyzer.cpython-313.pyc +0 -0
  241. package/plugins/dephealth/cve_scanner.py +279 -0
  242. package/plugins/dephealth/license_checker.py +135 -0
  243. package/plugins/dephealth/manifest_detector.py +423 -0
  244. package/plugins/dephealth/vuln_analyzer.py +176 -0
  245. package/plugins/testgen/__init__.py +0 -0
  246. package/plugins/testgen/__pycache__/__init__.cpython-313.pyc +0 -0
  247. package/plugins/testgen/__pycache__/codamosa_engine.cpython-313.pyc +0 -0
  248. package/plugins/testgen/__pycache__/edge_case_synthesizer.cpython-313.pyc +0 -0
  249. package/plugins/testgen/__pycache__/framework_detector.cpython-313.pyc +0 -0
  250. package/plugins/testgen/__pycache__/skeleton_generator.cpython-313.pyc +0 -0
  251. package/plugins/testgen/codamosa_engine.py +402 -0
  252. package/plugins/testgen/edge_case_synthesizer.py +184 -0
  253. package/plugins/testgen/framework_detector.py +271 -0
  254. package/plugins/testgen/skeleton_generator.py +219 -0
  255. package/plugins/viz/__init__.py +0 -0
  256. package/plugins/viz/__pycache__/__init__.cpython-313.pyc +0 -0
  257. package/plugins/viz/__pycache__/ast_parser.cpython-313.pyc +0 -0
  258. package/plugins/viz/__pycache__/diagram_generator.cpython-313.pyc +0 -0
  259. package/plugins/viz/__pycache__/graph_builder.cpython-313.pyc +0 -0
  260. package/plugins/viz/__pycache__/native_parsers.cpython-313.pyc +0 -0
  261. package/plugins/viz/__pycache__/regex_parser.cpython-313.pyc +0 -0
  262. package/plugins/viz/ast_parser.py +139 -0
  263. package/plugins/viz/diagram_generator.py +192 -0
  264. package/plugins/viz/graph_builder.py +444 -0
  265. package/plugins/viz/native_parsers.py +259 -0
  266. package/plugins/viz/regex_parser.py +112 -0
  267. package/pyproject.toml +143 -0
  268. package/registry/__init__.py +1 -0
  269. package/registry/__pycache__/__init__.cpython-313.pyc +0 -0
  270. package/registry/__pycache__/approval_artifact.cpython-313.pyc +0 -0
  271. package/registry/__pycache__/verify_artifact.cpython-313.pyc +0 -0
  272. package/registry/approval_artifact.py +236 -0
  273. package/registry/bundles/algorithms.yaml +45 -0
  274. package/registry/bundles/api-twin.yaml +48 -0
  275. package/registry/bundles/ast-pack.yaml +80 -0
  276. package/registry/bundles/claim-judge.yaml +49 -0
  277. package/registry/bundles/control-plane.yaml +192 -0
  278. package/registry/bundles/data-lineage.yaml +47 -0
  279. package/registry/bundles/delta-classifier.yaml +47 -0
  280. package/registry/bundles/eval-gate.yaml +47 -0
  281. package/registry/bundles/hash-edit.yaml +73 -0
  282. package/registry/bundles/health.yaml +45 -0
  283. package/registry/bundles/hook-governor.yaml +101 -0
  284. package/registry/bundles/incident-replay.yaml +47 -0
  285. package/registry/bundles/lsp-pack.yaml +80 -0
  286. package/registry/bundles/mcp-fabric.yaml +53 -0
  287. package/registry/bundles/plan-council.yaml +56 -0
  288. package/registry/bundles/preflight.yaml +48 -0
  289. package/registry/bundles/proof-gate.yaml +49 -0
  290. package/registry/bundles/remote-supervisor.yaml +49 -0
  291. package/registry/bundles/robotics.yaml +45 -0
  292. package/registry/bundles/secure-worktree-pipeline.yaml +69 -0
  293. package/registry/bundles/security-check.yaml +50 -0
  294. package/registry/bundles/terminal-lane.yaml +61 -0
  295. package/registry/bundles/test-intent-lock.yaml +49 -0
  296. package/registry/bundles/tracebank.yaml +47 -0
  297. package/registry/bundles/vision.yaml +45 -0
  298. package/registry/omg-capability.schema.json +378 -0
  299. package/registry/policy-packs/airgapped.lock.json +11 -0
  300. package/registry/policy-packs/airgapped.signature.json +10 -0
  301. package/registry/policy-packs/airgapped.yaml +16 -0
  302. package/registry/policy-packs/fintech.lock.json +11 -0
  303. package/registry/policy-packs/fintech.signature.json +10 -0
  304. package/registry/policy-packs/fintech.yaml +15 -0
  305. package/registry/policy-packs/locked-prod.lock.json +11 -0
  306. package/registry/policy-packs/locked-prod.signature.json +10 -0
  307. package/registry/policy-packs/locked-prod.yaml +18 -0
  308. package/registry/trusted_signers.json +44 -0
  309. package/registry/verify_artifact.py +493 -0
  310. package/runtime/__init__.py +36 -0
  311. package/runtime/__pycache__/__init__.cpython-313.pyc +0 -0
  312. package/runtime/__pycache__/adoption.cpython-313.pyc +0 -0
  313. package/runtime/__pycache__/agent_selector.cpython-313.pyc +0 -0
  314. package/runtime/__pycache__/api_twin.cpython-313.pyc +0 -0
  315. package/runtime/__pycache__/architecture_signal.cpython-313.pyc +0 -0
  316. package/runtime/__pycache__/artifact_parsers.cpython-313.pyc +0 -0
  317. package/runtime/__pycache__/asset_loader.cpython-313.pyc +0 -0
  318. package/runtime/__pycache__/background_verification.cpython-313.pyc +0 -0
  319. package/runtime/__pycache__/budget_envelopes.cpython-313.pyc +0 -0
  320. package/runtime/__pycache__/business_workflow.cpython-313.pyc +0 -0
  321. package/runtime/__pycache__/canonical_surface.cpython-313.pyc +0 -0
  322. package/runtime/__pycache__/canonical_taxonomy.cpython-313.pyc +0 -0
  323. package/runtime/__pycache__/claim_judge.cpython-313.pyc +0 -0
  324. package/runtime/__pycache__/cli_provider.cpython-313.pyc +0 -0
  325. package/runtime/__pycache__/compat.cpython-313.pyc +0 -0
  326. package/runtime/__pycache__/complexity_scorer.cpython-313.pyc +0 -0
  327. package/runtime/__pycache__/compliance_governor.cpython-313.pyc +0 -0
  328. package/runtime/__pycache__/config_transaction.cpython-313.pyc +0 -0
  329. package/runtime/__pycache__/context_compiler.cpython-313.pyc +0 -0
  330. package/runtime/__pycache__/context_engine.cpython-313.pyc +0 -0
  331. package/runtime/__pycache__/context_limits.cpython-313.pyc +0 -0
  332. package/runtime/__pycache__/contract_compiler.cpython-313.pyc +0 -0
  333. package/runtime/__pycache__/custom_agent_loader.cpython-313.pyc +0 -0
  334. package/runtime/__pycache__/data_lineage.cpython-313.pyc +0 -0
  335. package/runtime/__pycache__/defense_state.cpython-313.pyc +0 -0
  336. package/runtime/__pycache__/delta_classifier.cpython-313.pyc +0 -0
  337. package/runtime/__pycache__/dispatcher.cpython-313.pyc +0 -0
  338. package/runtime/__pycache__/doc_generator.cpython-313.pyc +0 -0
  339. package/runtime/__pycache__/domain_packs.cpython-313.pyc +0 -0
  340. package/runtime/__pycache__/ecosystem.cpython-313.pyc +0 -0
  341. package/runtime/__pycache__/equalizer.cpython-313.pyc +0 -0
  342. package/runtime/__pycache__/eval_gate.cpython-313.pyc +0 -0
  343. package/runtime/__pycache__/evidence_narrator.cpython-313.pyc +0 -0
  344. package/runtime/__pycache__/evidence_query.cpython-313.pyc +0 -0
  345. package/runtime/__pycache__/evidence_registry.cpython-313.pyc +0 -0
  346. package/runtime/__pycache__/evidence_requirements.cpython-313.pyc +0 -0
  347. package/runtime/__pycache__/exec_kernel.cpython-313.pyc +0 -0
  348. package/runtime/__pycache__/explainer_formatter.cpython-313.pyc +0 -0
  349. package/runtime/__pycache__/feature_registry.cpython-313.pyc +0 -0
  350. package/runtime/__pycache__/forge_agents.cpython-313.pyc +0 -0
  351. package/runtime/__pycache__/forge_contracts.cpython-313.pyc +0 -0
  352. package/runtime/__pycache__/forge_domains.cpython-313.pyc +0 -0
  353. package/runtime/__pycache__/forge_run_id.cpython-313.pyc +0 -0
  354. package/runtime/__pycache__/github_integration.cpython-313.pyc +0 -0
  355. package/runtime/__pycache__/github_review_bot.cpython-313.pyc +0 -0
  356. package/runtime/__pycache__/github_review_contract.cpython-313.pyc +0 -0
  357. package/runtime/__pycache__/github_review_formatter.cpython-313.pyc +0 -0
  358. package/runtime/__pycache__/guide_assert.cpython-313.pyc +0 -0
  359. package/runtime/__pycache__/hook_governor.cpython-313.pyc +0 -0
  360. package/runtime/__pycache__/host_parity.cpython-313.pyc +0 -0
  361. package/runtime/__pycache__/incident_replay.cpython-313.pyc +0 -0
  362. package/runtime/__pycache__/install_planner.cpython-313.pyc +0 -0
  363. package/runtime/__pycache__/interaction_journal.cpython-313.pyc +0 -0
  364. package/runtime/__pycache__/issue_surface.cpython-313.pyc +0 -0
  365. package/runtime/__pycache__/legacy_compat.cpython-313.pyc +0 -0
  366. package/runtime/__pycache__/mcp_config_writers.cpython-313.pyc +0 -0
  367. package/runtime/__pycache__/mcp_lifecycle.cpython-313.pyc +0 -0
  368. package/runtime/__pycache__/mcp_memory_server.cpython-313.pyc +0 -0
  369. package/runtime/__pycache__/memory_store.cpython-313.pyc +0 -0
  370. package/runtime/__pycache__/merge_writer.cpython-313.pyc +0 -0
  371. package/runtime/__pycache__/music_omr_testbed.cpython-313.pyc +0 -0
  372. package/runtime/__pycache__/mutation_gate.cpython-313.pyc +0 -0
  373. package/runtime/__pycache__/omc_compat.cpython-313.pyc +0 -0
  374. package/runtime/__pycache__/omg_browser_cli.cpython-313.pyc +0 -0
  375. package/runtime/__pycache__/omg_mcp_server.cpython-313.pyc +0 -0
  376. package/runtime/__pycache__/opus_plan.cpython-313.pyc +0 -0
  377. package/runtime/__pycache__/playwright_adapter.cpython-313.pyc +0 -0
  378. package/runtime/__pycache__/playwright_pack.cpython-313.pyc +0 -0
  379. package/runtime/__pycache__/plugin_diagnostics.cpython-313.pyc +0 -0
  380. package/runtime/__pycache__/plugin_interop.cpython-313.pyc +0 -0
  381. package/runtime/__pycache__/policy_pack_loader.cpython-313.pyc +0 -0
  382. package/runtime/__pycache__/preflight.cpython-313.pyc +0 -0
  383. package/runtime/__pycache__/profile_io.cpython-313.pyc +0 -0
  384. package/runtime/__pycache__/prompt_compiler.cpython-313.pyc +0 -0
  385. package/runtime/__pycache__/proof_chain.cpython-313.pyc +0 -0
  386. package/runtime/__pycache__/proof_gate.cpython-313.pyc +0 -0
  387. package/runtime/__pycache__/provider_parity_eval.cpython-313.pyc +0 -0
  388. package/runtime/__pycache__/release_artifact_audit.cpython-313.pyc +0 -0
  389. package/runtime/__pycache__/release_run_coordinator.cpython-313.pyc +0 -0
  390. package/runtime/__pycache__/release_surface_compiler.cpython-313.pyc +0 -0
  391. package/runtime/__pycache__/release_surface_registry.cpython-313.pyc +0 -0
  392. package/runtime/__pycache__/release_surfaces.cpython-313.pyc +0 -0
  393. package/runtime/__pycache__/remote_supervisor.cpython-313.pyc +0 -0
  394. package/runtime/__pycache__/repro_pack.cpython-313.pyc +0 -0
  395. package/runtime/__pycache__/rollback_manifest.cpython-313.pyc +0 -0
  396. package/runtime/__pycache__/router_critics.cpython-313.pyc +0 -0
  397. package/runtime/__pycache__/router_executor.cpython-313.pyc +0 -0
  398. package/runtime/__pycache__/router_selector.cpython-313.pyc +0 -0
  399. package/runtime/__pycache__/runtime_contracts.cpython-313.pyc +0 -0
  400. package/runtime/__pycache__/runtime_profile.cpython-313.pyc +0 -0
  401. package/runtime/__pycache__/security_check.cpython-313.pyc +0 -0
  402. package/runtime/__pycache__/session_health.cpython-313.pyc +0 -0
  403. package/runtime/__pycache__/skill_evolution.cpython-313.pyc +0 -0
  404. package/runtime/__pycache__/skill_registry.cpython-313.pyc +0 -0
  405. package/runtime/__pycache__/subagent_dispatcher.cpython-313.pyc +0 -0
  406. package/runtime/__pycache__/subscription_tiers.cpython-313.pyc +0 -0
  407. package/runtime/__pycache__/team_router.cpython-313.pyc +0 -0
  408. package/runtime/__pycache__/test_intent_lock.cpython-313-pytest-9.0.2.pyc +0 -0
  409. package/runtime/__pycache__/test_intent_lock.cpython-313.pyc +0 -0
  410. package/runtime/__pycache__/tmux_session_manager.cpython-313.pyc +0 -0
  411. package/runtime/__pycache__/tool_fabric.cpython-313.pyc +0 -0
  412. package/runtime/__pycache__/tool_plan_gate.cpython-313.pyc +0 -0
  413. package/runtime/__pycache__/tool_relevance.cpython-313.pyc +0 -0
  414. package/runtime/__pycache__/tracebank.cpython-313.pyc +0 -0
  415. package/runtime/__pycache__/untrusted_content.cpython-313.pyc +0 -0
  416. package/runtime/__pycache__/validate.cpython-313.pyc +0 -0
  417. package/runtime/__pycache__/verdict_schema.cpython-313.pyc +0 -0
  418. package/runtime/__pycache__/verification_controller.cpython-313.pyc +0 -0
  419. package/runtime/__pycache__/verification_loop.cpython-313.pyc +0 -0
  420. package/runtime/__pycache__/vision_artifacts.cpython-313.pyc +0 -0
  421. package/runtime/__pycache__/vision_cache.cpython-313.pyc +0 -0
  422. package/runtime/__pycache__/vision_jobs.cpython-313.pyc +0 -0
  423. package/runtime/__pycache__/worker_watchdog.cpython-313.pyc +0 -0
  424. package/runtime/adapters/__init__.py +13 -0
  425. package/runtime/adapters/__pycache__/__init__.cpython-313.pyc +0 -0
  426. package/runtime/adapters/__pycache__/claude.cpython-313.pyc +0 -0
  427. package/runtime/adapters/__pycache__/gpt.cpython-313.pyc +0 -0
  428. package/runtime/adapters/__pycache__/local.cpython-313.pyc +0 -0
  429. package/runtime/adapters/claude.py +63 -0
  430. package/runtime/adapters/gpt.py +56 -0
  431. package/runtime/adapters/local.py +56 -0
  432. package/runtime/adoption.py +280 -0
  433. package/runtime/api_twin.py +450 -0
  434. package/runtime/architecture_signal.py +226 -0
  435. package/runtime/artifact_parsers.py +161 -0
  436. package/runtime/asset_loader.py +62 -0
  437. package/runtime/background_verification.py +178 -0
  438. package/runtime/budget_envelopes.py +398 -0
  439. package/runtime/business_workflow.py +234 -0
  440. package/runtime/canonical_surface.py +53 -0
  441. package/runtime/canonical_taxonomy.py +27 -0
  442. package/runtime/claim_judge.py +648 -0
  443. package/runtime/cli_provider.py +105 -0
  444. package/runtime/compat.py +2222 -0
  445. package/runtime/complexity_scorer.py +148 -0
  446. package/runtime/compliance_governor.py +505 -0
  447. package/runtime/config_transaction.py +304 -0
  448. package/runtime/context_compiler.py +131 -0
  449. package/runtime/context_engine.py +708 -0
  450. package/runtime/context_limits.py +363 -0
  451. package/runtime/contract_compiler.py +3664 -0
  452. package/runtime/custom_agent_loader.py +366 -0
  453. package/runtime/data_lineage.py +244 -0
  454. package/runtime/defense_state.py +261 -0
  455. package/runtime/delta_classifier.py +231 -0
  456. package/runtime/dispatcher.py +47 -0
  457. package/runtime/doc_generator.py +319 -0
  458. package/runtime/domain_packs.py +75 -0
  459. package/runtime/ecosystem.py +371 -0
  460. package/runtime/equalizer.py +268 -0
  461. package/runtime/eval_gate.py +96 -0
  462. package/runtime/evidence_narrator.py +147 -0
  463. package/runtime/evidence_query.py +303 -0
  464. package/runtime/evidence_registry.py +16 -0
  465. package/runtime/evidence_requirements.py +157 -0
  466. package/runtime/exec_kernel.py +267 -0
  467. package/runtime/explainer_formatter.py +82 -0
  468. package/runtime/feature_registry.py +109 -0
  469. package/runtime/forge_agents.py +915 -0
  470. package/runtime/forge_contracts.py +519 -0
  471. package/runtime/forge_domains.py +68 -0
  472. package/runtime/forge_run_id.py +86 -0
  473. package/runtime/guide_assert.py +135 -0
  474. package/runtime/hook_governor.py +156 -0
  475. package/runtime/host_parity.py +373 -0
  476. package/runtime/incident_replay.py +310 -0
  477. package/runtime/install_planner.py +617 -0
  478. package/runtime/interaction_journal.py +566 -0
  479. package/runtime/issue_surface.py +472 -0
  480. package/runtime/legacy_compat.py +7 -0
  481. package/runtime/mcp_config_writers.py +360 -0
  482. package/runtime/mcp_lifecycle.py +175 -0
  483. package/runtime/mcp_memory_server.py +220 -0
  484. package/runtime/memory_parsers/__init__.py +0 -0
  485. package/runtime/memory_parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  486. package/runtime/memory_parsers/__pycache__/chatgpt_parser.cpython-313.pyc +0 -0
  487. package/runtime/memory_parsers/__pycache__/claude_import.cpython-313.pyc +0 -0
  488. package/runtime/memory_parsers/__pycache__/export.cpython-313.pyc +0 -0
  489. package/runtime/memory_parsers/__pycache__/gemini_import.cpython-313.pyc +0 -0
  490. package/runtime/memory_parsers/__pycache__/kimi_import.cpython-313.pyc +0 -0
  491. package/runtime/memory_parsers/chatgpt_parser.py +257 -0
  492. package/runtime/memory_parsers/claude_import.py +107 -0
  493. package/runtime/memory_parsers/export.py +97 -0
  494. package/runtime/memory_parsers/gemini_import.py +91 -0
  495. package/runtime/memory_parsers/kimi_import.py +91 -0
  496. package/runtime/memory_store.py +1182 -0
  497. package/runtime/merge_writer.py +445 -0
  498. package/runtime/music_omr_testbed.py +336 -0
  499. package/runtime/mutation_gate.py +320 -0
  500. package/runtime/omc_compat.py +7 -0
  501. package/runtime/omg_browser_cli.py +95 -0
  502. package/runtime/omg_compat_contract_snapshot.json +936 -0
  503. package/runtime/omg_contract_snapshot.json +936 -0
  504. package/runtime/omg_mcp_server.py +306 -0
  505. package/runtime/playwright_adapter.py +39 -0
  506. package/runtime/playwright_pack.py +253 -0
  507. package/runtime/plugin_diagnostics.py +308 -0
  508. package/runtime/plugin_interop.py +1060 -0
  509. package/runtime/policy_pack_loader.py +147 -0
  510. package/runtime/preflight.py +135 -0
  511. package/runtime/profile_io.py +328 -0
  512. package/runtime/proof_chain.py +472 -0
  513. package/runtime/proof_gate.py +442 -0
  514. package/runtime/provider_parity_eval.py +109 -0
  515. package/runtime/providers/__init__.py +0 -0
  516. package/runtime/providers/__pycache__/__init__.cpython-313.pyc +0 -0
  517. package/runtime/providers/__pycache__/codex_provider.cpython-313.pyc +0 -0
  518. package/runtime/providers/__pycache__/gemini_provider.cpython-313.pyc +0 -0
  519. package/runtime/providers/__pycache__/kimi_provider.cpython-313.pyc +0 -0
  520. package/runtime/providers/__pycache__/opencode_provider.cpython-313.pyc +0 -0
  521. package/runtime/providers/codex_provider.py +129 -0
  522. package/runtime/providers/gemini_provider.py +143 -0
  523. package/runtime/providers/kimi_provider.py +167 -0
  524. package/runtime/providers/opencode_provider.py +99 -0
  525. package/runtime/release_artifact_audit.py +556 -0
  526. package/runtime/release_run_coordinator.py +574 -0
  527. package/runtime/release_surface_compiler.py +643 -0
  528. package/runtime/release_surface_registry.py +283 -0
  529. package/runtime/release_surfaces.py +320 -0
  530. package/runtime/remote_supervisor.py +79 -0
  531. package/runtime/repro_pack.py +398 -0
  532. package/runtime/rollback_manifest.py +143 -0
  533. package/runtime/router_critics.py +229 -0
  534. package/runtime/router_executor.py +142 -0
  535. package/runtime/router_selector.py +99 -0
  536. package/runtime/runtime_contracts.py +292 -0
  537. package/runtime/runtime_profile.py +133 -0
  538. package/runtime/security_check.py +1094 -0
  539. package/runtime/session_health.py +546 -0
  540. package/runtime/skill_evolution.py +221 -0
  541. package/runtime/skill_registry.py +53 -0
  542. package/runtime/subagent_dispatcher.py +604 -0
  543. package/runtime/subscription_tiers.py +258 -0
  544. package/runtime/team_router.py +1399 -0
  545. package/runtime/test_intent_lock.py +543 -0
  546. package/runtime/tmux_session_manager.py +172 -0
  547. package/runtime/tool_fabric.py +570 -0
  548. package/runtime/tool_plan_gate.py +460 -0
  549. package/runtime/tracebank.py +125 -0
  550. package/runtime/untrusted_content.py +360 -0
  551. package/runtime/validate.py +293 -0
  552. package/runtime/verdict_schema.py +198 -0
  553. package/runtime/verification_controller.py +235 -0
  554. package/runtime/verification_loop.py +73 -0
  555. package/runtime/vision_artifacts.py +31 -0
  556. package/runtime/vision_cache.py +38 -0
  557. package/runtime/vision_jobs.py +92 -0
  558. package/runtime/worker_watchdog.py +526 -0
  559. package/scripts/__pycache__/audit-published-artifact.cpython-313.pyc +0 -0
  560. package/scripts/__pycache__/check-doc-parity.cpython-313.pyc +0 -0
  561. package/scripts/__pycache__/check-omg-standalone-clean.cpython-313.pyc +0 -0
  562. package/scripts/__pycache__/github_review_helpers.cpython-313.pyc +0 -0
  563. package/scripts/__pycache__/omg.cpython-313.pyc +0 -0
  564. package/scripts/__pycache__/prepare-release-proof-fixtures.cpython-313.pyc +0 -0
  565. package/scripts/__pycache__/sync-release-identity.cpython-313.pyc +0 -0
  566. package/scripts/__pycache__/validate-release-identity.cpython-313.pyc +0 -0
  567. package/scripts/audit-published-artifact.py +59 -0
  568. package/scripts/check-omg-compat-contract-snapshot.py +137 -0
  569. package/scripts/check-omg-contract-snapshot.py +12 -0
  570. package/scripts/check-omg-public-ready.py +273 -0
  571. package/scripts/check-omg-standalone-clean.py +133 -0
  572. package/scripts/emit_host_parity.py +72 -0
  573. package/scripts/legacy_to_omg_migrate.py +29 -0
  574. package/scripts/migrate-legacy.py +464 -0
  575. package/scripts/omc_to_omg_migrate.py +12 -0
  576. package/scripts/omg.py +2962 -0
  577. package/scripts/pre-release-check.sh +38 -0
  578. package/scripts/prepare-release-proof-fixtures.py +602 -0
  579. package/scripts/print-canonical-version.py +80 -0
  580. package/scripts/settings-merge.py +289 -0
  581. package/scripts/sync-release-identity.py +481 -0
  582. package/scripts/validate-release-identity.py +632 -0
  583. package/scripts/verify-no-omc.sh +5 -0
  584. package/scripts/verify-standalone.sh +35 -0
  585. package/settings.json +751 -0
  586. package/tools/__init__.py +2 -0
  587. package/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  588. package/tools/__pycache__/browser_consent.cpython-313.pyc +0 -0
  589. package/tools/__pycache__/browser_stealth.cpython-313.pyc +0 -0
  590. package/tools/__pycache__/browser_tool.cpython-313.pyc +0 -0
  591. package/tools/__pycache__/changelog_generator.cpython-313.pyc +0 -0
  592. package/tools/__pycache__/commit_splitter.cpython-313.pyc +0 -0
  593. package/tools/__pycache__/config_discovery.cpython-313.pyc +0 -0
  594. package/tools/__pycache__/config_merger.cpython-313.pyc +0 -0
  595. package/tools/__pycache__/dashboard_generator.cpython-313.pyc +0 -0
  596. package/tools/__pycache__/git_inspector.cpython-313.pyc +0 -0
  597. package/tools/__pycache__/lsp_client.cpython-313.pyc +0 -0
  598. package/tools/__pycache__/lsp_operations.cpython-313.pyc +0 -0
  599. package/tools/__pycache__/pr_generator.cpython-313.pyc +0 -0
  600. package/tools/__pycache__/python_repl.cpython-313.pyc +0 -0
  601. package/tools/__pycache__/python_sandbox.cpython-313.pyc +0 -0
  602. package/tools/__pycache__/session_snapshot.cpython-313.pyc +0 -0
  603. package/tools/__pycache__/ssh_manager.cpython-313.pyc +0 -0
  604. package/tools/__pycache__/theme_engine.cpython-313.pyc +0 -0
  605. package/tools/__pycache__/theme_selector.cpython-313.pyc +0 -0
  606. package/tools/__pycache__/web_search.cpython-313.pyc +0 -0
  607. package/tools/browser_consent.py +289 -0
  608. package/tools/browser_stealth.py +481 -0
  609. package/tools/browser_tool.py +448 -0
  610. package/tools/changelog_generator.py +347 -0
  611. package/tools/commit_splitter.py +749 -0
  612. package/tools/config_discovery.py +151 -0
  613. package/tools/config_merger.py +449 -0
  614. package/tools/dashboard_generator.py +300 -0
  615. package/tools/git_inspector.py +298 -0
  616. package/tools/lsp_client.py +275 -0
  617. package/tools/lsp_discovery.py +231 -0
  618. package/tools/lsp_operations.py +392 -0
  619. package/tools/pr_generator.py +404 -0
  620. package/tools/python_repl.py +712 -0
  621. package/tools/python_sandbox.py +768 -0
  622. package/tools/search_providers/__init__.py +77 -0
  623. package/tools/search_providers/__pycache__/__init__.cpython-313.pyc +0 -0
  624. package/tools/search_providers/__pycache__/brave.cpython-313.pyc +0 -0
  625. package/tools/search_providers/__pycache__/exa.cpython-313.pyc +0 -0
  626. package/tools/search_providers/__pycache__/jina.cpython-313.pyc +0 -0
  627. package/tools/search_providers/__pycache__/perplexity.cpython-313.pyc +0 -0
  628. package/tools/search_providers/__pycache__/synthetic.cpython-313.pyc +0 -0
  629. package/tools/search_providers/brave.py +115 -0
  630. package/tools/search_providers/exa.py +116 -0
  631. package/tools/search_providers/jina.py +104 -0
  632. package/tools/search_providers/perplexity.py +139 -0
  633. package/tools/search_providers/synthetic.py +74 -0
  634. package/tools/session_snapshot.py +851 -0
  635. package/tools/ssh_manager.py +912 -0
  636. package/tools/theme_engine.py +296 -0
  637. package/tools/theme_selector.py +137 -0
  638. package/tools/web_search.py +675 -0
@@ -0,0 +1,129 @@
1
+ """Codex CLI provider — implements CLIProvider for the ``codex`` binary."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ import uuid
11
+ from typing import Any
12
+
13
+ from runtime.cli_provider import CLIProvider, register_provider
14
+ from runtime.host_parity import normalize_output
15
+ from runtime.mcp_config_writers import write_codex_mcp_config
16
+ from runtime.release_run_coordinator import build_release_env_prefix
17
+ from runtime.tmux_session_manager import TmuxSessionManager
18
+
19
+ _logger = logging.getLogger(__name__)
20
+ _AUTH_CHECK_TIMEOUT_SECONDS = 5
21
+
22
+
23
+ def _attach_normalized_output(payload: dict[str, Any], *, prompt: str, project_dir: str) -> dict[str, Any]:
24
+ normalized = normalize_output(
25
+ "codex",
26
+ payload,
27
+ context={"prompt": prompt, "project_dir": project_dir},
28
+ )
29
+ merged = dict(payload)
30
+ merged["normalized_output"] = normalized
31
+ return merged
32
+
33
+
34
+ class CodexProvider(CLIProvider):
35
+ """CLIProvider implementation for the Codex CLI (``codex``)."""
36
+
37
+ # -- identity -----------------------------------------------------------
38
+
39
+ def get_name(self) -> str: # noqa: D401
40
+ """Return the canonical provider name."""
41
+ return "codex"
42
+
43
+ # -- detection ----------------------------------------------------------
44
+
45
+ def detect(self) -> bool:
46
+ """Return ``True`` when the ``codex`` binary is available on PATH."""
47
+ return shutil.which("codex") is not None
48
+
49
+ # -- authentication -----------------------------------------------------
50
+
51
+ def check_auth(self) -> tuple[bool | None, str]:
52
+ """Check Codex authentication status via ``codex auth status``."""
53
+ try:
54
+ result = self.run_tool(["codex", "auth", "status"], timeout=_AUTH_CHECK_TIMEOUT_SECONDS)
55
+ if result.returncode == 0:
56
+ return True, result.stdout.strip()
57
+ return False, result.stderr.strip() or result.stdout.strip()
58
+ except Exception as exc:
59
+ return None, f"codex auth check failed: {exc}"
60
+
61
+ # -- invocation ---------------------------------------------------------
62
+
63
+ def invoke(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
64
+ """Invoke ``codex exec --json`` via subprocess."""
65
+ try:
66
+ result = self.run_tool(
67
+ ["codex", "exec", "--json", prompt],
68
+ timeout=timeout,
69
+ cwd=project_dir,
70
+ env={"CLAUDE_PROJECT_DIR": project_dir},
71
+ )
72
+ return _attach_normalized_output({
73
+ "model": "codex-cli",
74
+ "output": result.stdout,
75
+ "exit_code": result.returncode,
76
+ }, prompt=prompt, project_dir=project_dir)
77
+ except subprocess.TimeoutExpired:
78
+ return {"error": "codex-cli timeout", "fallback": "claude"}
79
+ except FileNotFoundError:
80
+ return {"error": "codex-cli not found", "fallback": "claude"}
81
+ except Exception as exc:
82
+ return {"error": str(exc), "fallback": "claude"}
83
+
84
+ def invoke_tmux(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
85
+ """Invoke ``codex exec --json`` via a persistent tmux session.
86
+
87
+ Falls back to :meth:`invoke` on failure.
88
+ """
89
+ try:
90
+ mgr = TmuxSessionManager()
91
+ session_name = mgr.make_session_name("codex", unique_id=str(uuid.uuid4())[:8])
92
+ session = mgr.get_or_create_session(session_name, cwd=project_dir)
93
+ output = mgr.send_command(
94
+ session,
95
+ (
96
+ f"{build_release_env_prefix(project_dir)}"
97
+ f"codex exec --json {shlex.quote(prompt)}"
98
+ ),
99
+ timeout=timeout,
100
+ )
101
+ mgr.kill_session(session)
102
+ return _attach_normalized_output(
103
+ {"model": "codex-cli", "output": output, "exit_code": 0},
104
+ prompt=prompt,
105
+ project_dir=project_dir,
106
+ )
107
+ except Exception as exc:
108
+ _logger.warning("tmux codex invocation failed, falling back to subprocess: %s", exc)
109
+ return self.invoke(prompt, project_dir, timeout=timeout)
110
+
111
+ # -- command helpers ----------------------------------------------------
112
+
113
+ def get_non_interactive_cmd(self, prompt: str) -> list[str]:
114
+ """Return the non-interactive command for codex."""
115
+ return ["codex", "exec", "--json", prompt]
116
+
117
+ # -- configuration ------------------------------------------------------
118
+
119
+ def get_config_path(self) -> str:
120
+ """Return the Codex configuration file path."""
121
+ return os.path.expanduser("~/.codex/config.toml")
122
+
123
+ def write_mcp_config(self, server_url: str, server_name: str = "memory-server") -> None:
124
+ """Write an MCP server entry to ``~/.codex/config.toml``."""
125
+ write_codex_mcp_config(server_url, server_name, config_path=self.get_config_path())
126
+
127
+
128
+ # -- auto-register on import -----------------------------------------------
129
+ register_provider(CodexProvider())
@@ -0,0 +1,143 @@
1
+ """Gemini CLI provider — implements CLIProvider for the ``gemini`` binary."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ import uuid
11
+ from typing import Any
12
+
13
+ from runtime.cli_provider import CLIProvider, register_provider
14
+ from runtime.host_parity import normalize_output
15
+ from runtime.mcp_config_writers import write_gemini_mcp_config
16
+ from runtime.release_run_coordinator import build_release_env_prefix
17
+ from runtime.tmux_session_manager import TmuxSessionManager
18
+
19
+ _logger = logging.getLogger(__name__)
20
+ _AUTH_CHECK_TIMEOUT_SECONDS = 5
21
+
22
+
23
+ def _attach_normalized_output(payload: dict[str, Any], *, prompt: str, project_dir: str) -> dict[str, Any]:
24
+ normalized = normalize_output(
25
+ "gemini",
26
+ payload,
27
+ context={"prompt": prompt, "project_dir": project_dir, "no_json_mode": True},
28
+ )
29
+ merged = dict(payload)
30
+ merged["normalized_output"] = normalized
31
+ return merged
32
+
33
+ HOST_RULES = {
34
+ "compilation_targets": [".gemini/settings.json"],
35
+ "mcp": ["omg-control"],
36
+ "skills": ["omg/control-plane", "omg/mcp-fabric"],
37
+ "automations": ["contract-validate", "provider-routing"],
38
+ }
39
+
40
+
41
+ class GeminiProvider(CLIProvider):
42
+ """CLIProvider implementation for the Gemini CLI (``gemini``)."""
43
+
44
+ # -- identity -----------------------------------------------------------
45
+
46
+ def get_name(self) -> str: # noqa: D401
47
+ """Return the canonical provider name."""
48
+ return "gemini"
49
+
50
+ # -- detection ----------------------------------------------------------
51
+
52
+ def detect(self) -> bool:
53
+ """Return ``True`` when the ``gemini`` binary is available on PATH."""
54
+ return shutil.which("gemini") is not None
55
+
56
+ # -- authentication -----------------------------------------------------
57
+
58
+ def check_auth(self) -> tuple[bool | None, str]:
59
+ """Check Gemini authentication status via ``gemini auth status``."""
60
+ try:
61
+ result = self.run_tool(["gemini", "auth", "status"], timeout=_AUTH_CHECK_TIMEOUT_SECONDS)
62
+ if result.returncode == 0:
63
+ return True, result.stdout.strip()
64
+ return False, result.stderr.strip() or result.stdout.strip()
65
+ except Exception as exc:
66
+ return None, f"gemini auth check failed: {exc}"
67
+
68
+ # -- invocation ---------------------------------------------------------
69
+
70
+ def invoke(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
71
+ """Invoke ``gemini -p`` via subprocess.
72
+
73
+ Gemini CLI has no ``--json`` flag — output is plain text stdout.
74
+ """
75
+ try:
76
+ result = self.run_tool(
77
+ ["gemini", "-p", prompt],
78
+ timeout=timeout,
79
+ cwd=project_dir,
80
+ env={"CLAUDE_PROJECT_DIR": project_dir},
81
+ )
82
+ return _attach_normalized_output({
83
+ "model": "gemini-cli",
84
+ "output": result.stdout,
85
+ "exit_code": result.returncode,
86
+ }, prompt=prompt, project_dir=project_dir)
87
+ except subprocess.TimeoutExpired:
88
+ return {"error": "gemini-cli timeout", "fallback": "claude"}
89
+ except FileNotFoundError:
90
+ return {"error": "gemini-cli not found", "fallback": "claude"}
91
+ except Exception as exc:
92
+ return {"error": str(exc), "fallback": "claude"}
93
+
94
+ def invoke_tmux(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
95
+ """Invoke ``gemini -p`` via a persistent tmux session.
96
+
97
+ Falls back to :meth:`invoke` on failure.
98
+ """
99
+ try:
100
+ mgr = TmuxSessionManager()
101
+ session_name = mgr.make_session_name("gemini", unique_id=str(uuid.uuid4())[:8])
102
+ session = mgr.get_or_create_session(session_name, cwd=project_dir)
103
+ output = mgr.send_command(
104
+ session,
105
+ (
106
+ f"{build_release_env_prefix(project_dir)}"
107
+ f"gemini -p {shlex.quote(prompt)}"
108
+ ),
109
+ timeout=timeout,
110
+ )
111
+ mgr.kill_session(session)
112
+ return _attach_normalized_output(
113
+ {"model": "gemini-cli", "output": output, "exit_code": 0},
114
+ prompt=prompt,
115
+ project_dir=project_dir,
116
+ )
117
+ except Exception as exc:
118
+ _logger.warning("tmux gemini invocation failed, falling back to subprocess: %s", exc)
119
+ return self.invoke(prompt, project_dir, timeout=timeout)
120
+
121
+ # -- command helpers ----------------------------------------------------
122
+
123
+ def get_non_interactive_cmd(self, prompt: str) -> list[str]:
124
+ """Return the non-interactive command for gemini."""
125
+ return ["gemini", "-p", prompt]
126
+
127
+ # -- configuration ------------------------------------------------------
128
+
129
+ def get_config_path(self) -> str:
130
+ """Return the Gemini configuration file path."""
131
+ return os.path.expanduser("~/.gemini/settings.json")
132
+
133
+ def write_mcp_config(self, server_url: str, server_name: str = "memory-server") -> None:
134
+ """Write an MCP server entry to ``~/.gemini/settings.json``.
135
+
136
+ Uses JSON format with ``mcpServers`` key and ``httpUrl`` field,
137
+ merging into any existing configuration.
138
+ """
139
+ write_gemini_mcp_config(server_url, server_name, config_path=self.get_config_path())
140
+
141
+
142
+ # -- auto-register on import -----------------------------------------------
143
+ register_provider(GeminiProvider())
@@ -0,0 +1,167 @@
1
+ """Kimi Code CLI provider -- implements CLIProvider for the ``kimi`` binary."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import shlex
8
+ import shutil
9
+ import subprocess
10
+ import uuid
11
+ from typing import Any
12
+
13
+ from runtime.cli_provider import CLIProvider, register_provider
14
+ from runtime.host_parity import normalize_output
15
+ from runtime.mcp_config_writers import write_kimi_mcp_config
16
+ from runtime.release_run_coordinator import build_release_env_prefix
17
+ from runtime.tmux_session_manager import TmuxSessionManager
18
+
19
+ _logger = logging.getLogger(__name__)
20
+
21
+
22
+ def _attach_normalized_output(payload: dict[str, Any], *, prompt: str, project_dir: str) -> dict[str, Any]:
23
+ normalized = normalize_output(
24
+ "kimi",
25
+ payload,
26
+ context={"prompt": prompt, "project_dir": project_dir},
27
+ )
28
+ merged = dict(payload)
29
+ merged["normalized_output"] = normalized
30
+ return merged
31
+
32
+ HOST_RULES = {
33
+ "compilation_targets": [".kimi/mcp.json"],
34
+ "mcp": ["omg-control"],
35
+ "skills": ["omg/control-plane", "omg/mcp-fabric"],
36
+ "automations": ["contract-validate", "provider-routing"],
37
+ }
38
+
39
+
40
+ class KimiCodeProvider(CLIProvider):
41
+ """CLIProvider implementation for the Kimi Code CLI (``kimi``)."""
42
+
43
+ # -- identity -----------------------------------------------------------
44
+
45
+ def get_name(self) -> str: # noqa: D401
46
+ """Return the canonical provider name."""
47
+ return "kimi"
48
+
49
+ # -- detection ----------------------------------------------------------
50
+
51
+ def detect(self) -> bool:
52
+ """Return ``True`` when the ``kimi`` binary is available on PATH."""
53
+ return shutil.which("kimi") is not None
54
+
55
+ # -- authentication -----------------------------------------------------
56
+
57
+ def check_auth(self) -> tuple[bool | None, str]:
58
+ """Check Kimi authentication by parsing ``~/.kimi/config.toml`` for stored credentials."""
59
+ try:
60
+ config_path = os.path.expanduser("~/.kimi/config.toml")
61
+ if not os.path.exists(config_path):
62
+ return False, "not authenticated — config file not found"
63
+
64
+ with open(config_path) as fh:
65
+ content = fh.read()
66
+
67
+ # Look for a token entry in the TOML file
68
+ if "token" in content:
69
+ return True, "authenticated"
70
+ return False, "not authenticated — no token in config"
71
+ except Exception as exc:
72
+ return None, f"kimi auth check failed: {exc}"
73
+
74
+ # -- invocation ---------------------------------------------------------
75
+
76
+ def invoke(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
77
+ """Invoke ``kimi --print -p`` via subprocess."""
78
+ try:
79
+ result = self.run_tool(
80
+ ["kimi", "--print", "-p", prompt],
81
+ timeout=timeout,
82
+ cwd=project_dir,
83
+ env={"CLAUDE_PROJECT_DIR": project_dir},
84
+ )
85
+ return _attach_normalized_output({
86
+ "model": "kimi-cli",
87
+ "output": result.stdout,
88
+ "exit_code": result.returncode,
89
+ }, prompt=prompt, project_dir=project_dir)
90
+ except subprocess.TimeoutExpired:
91
+ return {"error": "kimi-cli timeout", "fallback": "claude"}
92
+ except FileNotFoundError:
93
+ return {"error": "kimi-cli not found", "fallback": "claude"}
94
+ except Exception as exc:
95
+ return {"error": str(exc), "fallback": "claude"}
96
+
97
+ def invoke_json(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
98
+ """Invoke ``kimi --print --output-format stream-json -p`` for JSONL event stream output."""
99
+ try:
100
+ result = self.run_tool(
101
+ ["kimi", "--print", "--output-format", "stream-json", "-p", prompt],
102
+ timeout=timeout,
103
+ cwd=project_dir,
104
+ env={"CLAUDE_PROJECT_DIR": project_dir},
105
+ )
106
+ return _attach_normalized_output({
107
+ "model": "kimi-cli",
108
+ "output": result.stdout,
109
+ "exit_code": result.returncode,
110
+ }, prompt=prompt, project_dir=project_dir)
111
+ except subprocess.TimeoutExpired:
112
+ return {"error": "kimi-cli timeout", "fallback": "claude"}
113
+ except FileNotFoundError:
114
+ return {"error": "kimi-cli not found", "fallback": "claude"}
115
+ except Exception as exc:
116
+ return {"error": str(exc), "fallback": "claude"}
117
+
118
+ def invoke_tmux(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny]
119
+ """Invoke ``kimi --print -p`` via a persistent tmux session.
120
+
121
+ Falls back to :meth:`invoke` on failure.
122
+ """
123
+ try:
124
+ mgr = TmuxSessionManager()
125
+ session_name = mgr.make_session_name("kimi", unique_id=str(uuid.uuid4())[:8])
126
+ session = mgr.get_or_create_session(session_name, cwd=project_dir)
127
+ output = mgr.send_command(
128
+ session,
129
+ (
130
+ f"{build_release_env_prefix(project_dir)}"
131
+ f"kimi --print -p {shlex.quote(prompt)}"
132
+ ),
133
+ timeout=timeout,
134
+ )
135
+ mgr.kill_session(session)
136
+ return _attach_normalized_output(
137
+ {"model": "kimi-cli", "output": output, "exit_code": 0},
138
+ prompt=prompt,
139
+ project_dir=project_dir,
140
+ )
141
+ except Exception as exc:
142
+ _logger.warning("tmux kimi invocation failed, falling back to subprocess: %s", exc)
143
+ return self.invoke(prompt, project_dir, timeout=timeout)
144
+
145
+ # -- command helpers ----------------------------------------------------
146
+
147
+ def get_non_interactive_cmd(self, prompt: str) -> list[str]:
148
+ """Return the non-interactive command for kimi."""
149
+ return ["kimi", "--print", "-p", prompt]
150
+
151
+ # -- configuration ------------------------------------------------------
152
+
153
+ def get_config_path(self) -> str:
154
+ """Return the Kimi MCP configuration file path."""
155
+ return os.path.expanduser("~/.kimi/mcp.json")
156
+
157
+ def write_mcp_config(self, server_url: str, server_name: str = "memory-server") -> None:
158
+ """Write an MCP server entry to ``~/.kimi/mcp.json``.
159
+
160
+ Uses standard ``mcpServers`` JSON format with ``type: "http"`` and ``url`` field,
161
+ merging into any existing configuration.
162
+ """
163
+ write_kimi_mcp_config(server_url, server_name, config_path=self.get_config_path())
164
+
165
+
166
+ # -- auto-register on import -----------------------------------------------
167
+ register_provider(KimiCodeProvider())
@@ -0,0 +1,99 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ import shutil
6
+ import subprocess
7
+ from pathlib import Path
8
+ from typing import cast
9
+ from typing import Any
10
+
11
+ from runtime.cli_provider import CLIProvider, register_provider
12
+ from runtime.mcp_config_writers import _atomic_write_text # pyright: ignore[reportPrivateUsage]
13
+
14
+ HOST_RULES = {
15
+ "compilation_targets": ["opencode.json"],
16
+ "mcp": ["omg-control"],
17
+ "mcp_key": "mcp",
18
+ }
19
+
20
+
21
+ class OpenCodeProvider(CLIProvider):
22
+ def get_name(self) -> str: # pyright: ignore[reportImplicitOverride]
23
+ return "opencode"
24
+
25
+ def detect(self) -> bool: # pyright: ignore[reportImplicitOverride]
26
+ return shutil.which("opencode") is not None
27
+
28
+ def check_auth(self) -> tuple[bool | None, str]: # pyright: ignore[reportImplicitOverride]
29
+ auth_path = Path(os.path.expanduser("~/.local/share/opencode/auth.json"))
30
+ if not auth_path.exists():
31
+ return False, f"auth not found: missing {auth_path}"
32
+ try:
33
+ parsed = cast(object, json.loads(auth_path.read_text()))
34
+ except (json.JSONDecodeError, ValueError) as exc:
35
+ return False, f"auth not found: invalid json: {exc}"
36
+ except OSError as exc:
37
+ return False, f"auth not found: unreadable file: {exc}"
38
+
39
+ if not parsed:
40
+ return False, "auth not found: empty auth content"
41
+ return True, "auth found"
42
+
43
+ def invoke(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny, reportImplicitOverride]
44
+ try:
45
+ result = self.run_tool(
46
+ ["opencode", prompt],
47
+ timeout=timeout,
48
+ cwd=project_dir,
49
+ env={"CLAUDE_PROJECT_DIR": project_dir},
50
+ )
51
+ return {
52
+ "model": "opencode-cli",
53
+ "output": result.stdout,
54
+ "exit_code": result.returncode,
55
+ }
56
+ except subprocess.TimeoutExpired:
57
+ return {"error": "opencode-cli timeout", "fallback": "claude"}
58
+ except FileNotFoundError:
59
+ return {"error": "opencode-cli not found", "fallback": "claude"}
60
+ except Exception as exc:
61
+ return {"error": str(exc), "fallback": "claude"}
62
+
63
+ def invoke_tmux(self, prompt: str, project_dir: str, timeout: int = 120) -> dict[str, Any]: # pyright: ignore[reportExplicitAny, reportImplicitOverride]
64
+ return self.invoke(prompt, project_dir, timeout=timeout)
65
+
66
+ def get_non_interactive_cmd(self, prompt: str) -> list[str]: # pyright: ignore[reportImplicitOverride]
67
+ return ["opencode", prompt]
68
+
69
+ def get_config_path(self) -> str: # pyright: ignore[reportImplicitOverride]
70
+ return os.path.expanduser("~/.config/opencode/opencode.json")
71
+
72
+ def get_project_config_path(self, root: str = ".") -> str:
73
+ return str(Path(root) / "opencode.json")
74
+
75
+ def get_plugin_dir(self, root: str = ".") -> str:
76
+ return str(Path(root) / ".opencode" / "plugins")
77
+
78
+ def write_mcp_config(self, server_url: str, server_name: str = "memory-server") -> None: # pyright: ignore[reportImplicitOverride]
79
+ config_path = Path(self.get_config_path())
80
+ config: dict[str, object]
81
+ if config_path.exists():
82
+ try:
83
+ loaded = cast(object, json.loads(config_path.read_text()))
84
+ config = cast(dict[str, object], loaded) if isinstance(loaded, dict) else {}
85
+ except (json.JSONDecodeError, ValueError):
86
+ config = {}
87
+ else:
88
+ config = {}
89
+
90
+ mcp = config.get("mcp")
91
+ if not isinstance(mcp, dict):
92
+ mcp = {}
93
+ config["mcp"] = mcp
94
+
95
+ mcp[server_name] = {"type": "http", "url": server_url}
96
+ _atomic_write_text(config_path, json.dumps(config, indent=2) + "\n")
97
+
98
+
99
+ register_provider(OpenCodeProvider())