@agentikos/omega-os 0.1.0 → 0.19.5

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 (379) hide show
  1. package/README.md +56 -14
  2. package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
  3. package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
  4. package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
  5. package/bootstrap/lib/claude-code-settings.py +176 -0
  6. package/bootstrap/lib/common.sh +457 -1
  7. package/bootstrap/lib/llm-clis.py +341 -0
  8. package/bootstrap/lib/manifest-helpers.py +384 -0
  9. package/bootstrap/lib/steps.sh +1000 -26
  10. package/bootstrap/manifest.example.yaml +93 -2
  11. package/bootstrap/templates/aisb/CLAUDE.md +305 -0
  12. package/bootstrap/templates/aisb/architect.md +204 -0
  13. package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
  14. package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
  15. package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
  16. package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
  17. package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
  18. package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
  19. package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
  20. package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
  21. package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
  22. package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
  23. package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
  24. package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
  25. package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
  26. package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
  27. package/bootstrap/templates/aisb/construct.md +135 -0
  28. package/bootstrap/templates/aisb/keymaker.md +227 -0
  29. package/bootstrap/templates/aisb/link.md +170 -0
  30. package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
  31. package/bootstrap/templates/aisb/merovingian.md +159 -0
  32. package/bootstrap/templates/aisb/morpheus.md +243 -0
  33. package/bootstrap/templates/aisb/neo.md +147 -0
  34. package/bootstrap/templates/aisb/niobe.md +197 -0
  35. package/bootstrap/templates/aisb/oracle.md +244 -0
  36. package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
  37. package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
  38. package/bootstrap/templates/aisb/pythia.md +153 -0
  39. package/bootstrap/templates/aisb/seraph.md +315 -0
  40. package/bootstrap/templates/aisb/smith.md +202 -0
  41. package/bootstrap/templates/aisb/zion.md +172 -0
  42. package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
  43. package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
  44. package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
  45. package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
  46. package/docs/AUDITS.md +85 -0
  47. package/docs/COMPLETION-PLAN.md +48 -0
  48. package/docs/GAP-ANALYSIS.md +214 -0
  49. package/docs/INSTALL.md +47 -9
  50. package/docs/MCP-AND-PLUGINS.md +31 -4
  51. package/docs/SIMULATION.md +171 -0
  52. package/docs/simulate.sh +211 -0
  53. package/install.sh +164 -17
  54. package/omega/Agentik_Engine/README.md +27 -10
  55. package/omega/Agentik_Engine/omega_engine/__init__.py +212 -2
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/account.py +502 -0
  105. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  106. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  107. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  108. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  109. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  110. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  114. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  115. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  116. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  117. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  121. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  122. package/omega/Agentik_Engine/omega_engine/autonomous.py +538 -0
  123. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  124. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  125. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  126. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  127. package/omega/Agentik_Engine/omega_engine/cli.py +4564 -56
  128. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  129. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  130. package/omega/Agentik_Engine/omega_engine/daemons/__init__.py +14 -0
  131. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  132. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  133. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  134. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  135. package/omega/Agentik_Engine/omega_engine/daemons/autonomous.py +56 -0
  136. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +236 -0
  137. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +315 -0
  138. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  139. package/omega/Agentik_Engine/omega_engine/educators/__init__.py +51 -0
  140. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  143. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  144. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/artifact.py +65 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/automation.py +76 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/base.py +327 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/claudecode.py +71 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/connection.py +75 -0
  155. package/omega/Agentik_Engine/omega_engine/educators/coworker.py +68 -0
  156. package/omega/Agentik_Engine/omega_engine/educators/loop.py +82 -0
  157. package/omega/Agentik_Engine/omega_engine/educators/prompt.py +68 -0
  158. package/omega/Agentik_Engine/omega_engine/educators/skill.py +69 -0
  159. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  160. package/omega/Agentik_Engine/omega_engine/executor.py +195 -16
  161. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  167. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  168. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  169. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  170. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  171. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  172. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  173. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  174. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  175. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  176. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  177. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  178. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  179. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  180. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  181. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  182. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  183. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  184. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  185. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  186. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  187. package/omega/Agentik_Engine/omega_engine/mission.py +29 -14
  188. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  189. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  190. package/omega/Agentik_Engine/omega_engine/provider.py +408 -13
  191. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  192. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__init__.py +21 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  198. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  199. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/rag/agentic.py +83 -0
  203. package/omega/Agentik_Engine/omega_engine/rag/base.py +42 -0
  204. package/omega/Agentik_Engine/omega_engine/rag/corrective.py +119 -0
  205. package/omega/Agentik_Engine/omega_engine/rag/graph.py +169 -0
  206. package/omega/Agentik_Engine/omega_engine/rag/hybrid.py +205 -0
  207. package/omega/Agentik_Engine/omega_engine/rag/multimodal.py +136 -0
  208. package/omega/Agentik_Engine/omega_engine/rag/router.py +110 -0
  209. package/omega/Agentik_Engine/omega_engine/reducer.py +21 -3
  210. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  211. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  212. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  213. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  214. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  215. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  216. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  217. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  218. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  219. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  220. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  221. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  222. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  223. package/omega/Agentik_Engine/omega_engine/store.py +132 -25
  224. package/omega/Agentik_Engine/omega_engine/sync.py +445 -0
  225. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  226. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  227. package/omega/Agentik_Engine/omega_engine/tools.py +272 -0
  228. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  229. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  230. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  231. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  232. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  233. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  234. package/omega/Agentik_Engine/pyproject.toml +1 -1
  235. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  304. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  305. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  306. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  307. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  308. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  309. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  310. package/omega/Agentik_Engine/tests/test_account.py +338 -0
  311. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  312. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  313. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  314. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  315. package/omega/Agentik_Engine/tests/test_autonomous.py +361 -0
  316. package/omega/Agentik_Engine/tests/test_educators.py +233 -0
  317. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  318. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  319. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  320. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  321. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  322. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  323. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  324. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  325. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  326. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  327. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  328. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  329. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  330. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  331. package/omega/Agentik_Engine/tests/test_rag.py +287 -0
  332. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  333. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  334. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  335. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  336. package/omega/Agentik_Engine/tests/test_snapshot_partial.py +172 -0
  337. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  338. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  339. package/omega/Agentik_Engine/tests/test_tools_and_sync.py +312 -0
  340. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  341. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  342. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  343. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  344. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  345. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  346. package/omega/Agentik_Runtime/audits.db +0 -0
  347. package/omega/Agentik_SSOT/VERSION +1 -1
  348. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  349. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  350. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  351. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  352. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  356. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  357. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  359. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  360. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  361. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  362. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  363. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  364. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  365. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  366. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  367. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  368. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  369. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  370. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  371. package/omega/Agentik_SSOT/skills/rag-route.md +82 -0
  372. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  373. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  374. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  375. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  376. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  377. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  378. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  379. package/package.json +2 -2
@@ -0,0 +1,312 @@
1
+ """ToolRegistry + SyncEngine / ClaudeCodeAdapter end-to-end test.
2
+
3
+ Seeds a tempdir OMEGA_HOME with one skill, one command, one MCP-config entry,
4
+ one catalog entry, one tool, and one hook. Asserts the projection produces the
5
+ expected Claude Code native layout (skills/<id>/SKILL.md, commands/<id>.md,
6
+ .mcp.json with mcpServers, settings.json with hooks).
7
+
8
+ Standalone: python3 tests/test_tools_and_sync.py
9
+ """
10
+ import json
11
+ import shutil
12
+ import sys
13
+ import tempfile
14
+ from pathlib import Path
15
+
16
+ sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
17
+
18
+ from omega_engine import cli # noqa: E402
19
+ from omega_engine.sync import ClaudeCodeAdapter, SyncEngine # noqa: E402
20
+ from omega_engine.tools import ( # noqa: E402
21
+ Tool,
22
+ ToolRegistry,
23
+ load_catalog,
24
+ merge_mcp_config,
25
+ )
26
+
27
+
28
+ # --------------------------------------------------------------------------
29
+ # Tempdir helpers
30
+ # --------------------------------------------------------------------------
31
+
32
+
33
+ def _seed_home() -> Path:
34
+ home = Path(tempfile.mkdtemp(prefix="omega-tools-sync-test-"))
35
+ # 8-block scaffolding (only what the test touches)
36
+ for b in ("Agentik_SSOT", "Agentik_Tools", "Agentik_Providers"):
37
+ (home / b).mkdir(parents=True, exist_ok=True)
38
+ # SSOT subdirs
39
+ ssot = home / "Agentik_SSOT"
40
+ (ssot / "skills").mkdir(parents=True, exist_ok=True)
41
+ (ssot / "commands").mkdir(parents=True, exist_ok=True)
42
+ (ssot / "agents").mkdir(parents=True, exist_ok=True)
43
+ (ssot / "hooks").mkdir(parents=True, exist_ok=True)
44
+ (ssot / "mcp").mkdir(parents=True, exist_ok=True)
45
+ return home
46
+
47
+
48
+ def _seed_skill(home: Path, sid: str, body: str) -> None:
49
+ (home / "Agentik_SSOT" / "skills" / f"{sid}.md").write_text(body)
50
+
51
+
52
+ def _seed_command(home: Path, cid: str, body: str) -> None:
53
+ (home / "Agentik_SSOT" / "commands" / f"{cid}.md").write_text(body)
54
+
55
+
56
+ def _seed_agent(home: Path, aid: str, body: str) -> None:
57
+ (home / "Agentik_SSOT" / "agents" / f"{aid}.md").write_text(body)
58
+
59
+
60
+ def _seed_hook(home: Path, fname: str, payload: dict) -> None:
61
+ (home / "Agentik_SSOT" / "hooks" / fname).write_text(json.dumps(payload))
62
+
63
+
64
+ def _seed_catalog(home: Path) -> None:
65
+ import yaml
66
+ cat = {
67
+ "version": 1,
68
+ "catalog": [
69
+ {"id": "filesystem", "name": "Filesystem",
70
+ "description": "sandboxed file access",
71
+ "category": "core",
72
+ "install": {"method": "npx",
73
+ "package": "@modelcontextprotocol/server-filesystem"},
74
+ "recommended": True},
75
+ {"id": "github", "name": "GitHub",
76
+ "description": "issues + PRs",
77
+ "category": "dev",
78
+ "install": {"method": "npx",
79
+ "package": "@modelcontextprotocol/server-github"},
80
+ "secrets": ["GITHUB_TOKEN"],
81
+ "recommended": True},
82
+ ],
83
+ }
84
+ (home / "Agentik_SSOT" / "mcp" / "mcp-catalog.yaml").write_text(
85
+ yaml.safe_dump(cat, sort_keys=False))
86
+
87
+
88
+ def _seed_mcp_config(home: Path) -> None:
89
+ merge_mcp_config(home, {"id": "filesystem", "secret_refs": [], "enabled": True})
90
+ merge_mcp_config(home, {"id": "github", "secret_refs": ["GITHUB_TOKEN"],
91
+ "enabled": True})
92
+
93
+
94
+ def _seed_providers(home: Path) -> None:
95
+ import yaml
96
+ reg = {
97
+ "version": 1,
98
+ "providers": [{"id": "claude", "adapter": "claude"}],
99
+ }
100
+ (home / "Agentik_Providers" / "registry.yaml").write_text(
101
+ yaml.safe_dump(reg, sort_keys=False))
102
+
103
+
104
+ # --------------------------------------------------------------------------
105
+ # 1. ToolRegistry — install / list / remove + idempotent save/load
106
+ # --------------------------------------------------------------------------
107
+
108
+
109
+ def test_registry_install_list_remove():
110
+ home = _seed_home()
111
+ try:
112
+ reg = ToolRegistry.load(home)
113
+ assert reg.list() == []
114
+
115
+ t = Tool(name="filesystem", version="1.2.3",
116
+ path="Agentik_Tools/filesystem/",
117
+ invoke="Agentik_Tools/filesystem/bin/server-filesystem",
118
+ source="mcp:filesystem")
119
+ reg.install(t)
120
+ reg.save(home)
121
+ assert reg.installed_path("filesystem") == home / "Agentik_Tools" / "filesystem"
122
+
123
+ # round-trip
124
+ reg2 = ToolRegistry.load(home)
125
+ assert len(reg2.list()) == 1
126
+ assert reg2.get("filesystem").version == "1.2.3"
127
+
128
+ # remove
129
+ assert reg2.remove("filesystem") is True
130
+ reg2.save(home)
131
+ assert ToolRegistry.load(home).list() == []
132
+ finally:
133
+ shutil.rmtree(home, ignore_errors=True)
134
+
135
+
136
+ # --------------------------------------------------------------------------
137
+ # 2. catalog round-trip
138
+ # --------------------------------------------------------------------------
139
+
140
+
141
+ def test_catalog_loads():
142
+ home = _seed_home()
143
+ try:
144
+ _seed_catalog(home)
145
+ cat = load_catalog(home)
146
+ ids = {e["id"] for e in cat["catalog"]}
147
+ assert ids == {"filesystem", "github"}
148
+ finally:
149
+ shutil.rmtree(home, ignore_errors=True)
150
+
151
+
152
+ # --------------------------------------------------------------------------
153
+ # 3. ClaudeCodeAdapter.project() — full projection
154
+ # --------------------------------------------------------------------------
155
+
156
+
157
+ def test_claude_code_projection():
158
+ home = _seed_home()
159
+ try:
160
+ # seed an SSOT
161
+ _seed_skill(home, "frontend-design",
162
+ "# Frontend design\n\nProduction-grade UI.\n")
163
+ _seed_command(home, "uiuxaudit",
164
+ "# /uiuxaudit\n\nUI/UX forensic audit.\n")
165
+ _seed_agent(home, "oracle",
166
+ "# Oracle\n\nClassify and route.\n")
167
+ _seed_hook(home, "stop.json",
168
+ {"Stop": [{"matcher": "*", "hooks": [{"type": "command",
169
+ "command": "echo stop"}]}]})
170
+ _seed_catalog(home)
171
+ _seed_mcp_config(home)
172
+ _seed_providers(home)
173
+
174
+ # pre-register one tool so .mcp.json gets a real command path
175
+ reg = ToolRegistry.load(home)
176
+ reg.install(Tool(
177
+ name="filesystem",
178
+ path="Agentik_Tools/filesystem/",
179
+ invoke="Agentik_Tools/filesystem/bin/server-filesystem",
180
+ source="mcp:filesystem",
181
+ ))
182
+ reg.save(home)
183
+
184
+ adapter = ClaudeCodeAdapter()
185
+ out = adapter.project(home)
186
+ assert out["projected"]
187
+ target = Path(out["target"])
188
+ assert target.is_dir()
189
+ assert (target / "skills" / "frontend-design" / "SKILL.md").exists()
190
+ assert "Production-grade UI" in (
191
+ target / "skills" / "frontend-design" / "SKILL.md").read_text()
192
+ assert (target / "commands" / "uiuxaudit.md").exists()
193
+ assert (target / "agents" / "oracle.md").exists()
194
+
195
+ # .mcp.json — both servers projected; filesystem has a local command,
196
+ # github falls back to npx.
197
+ mcp = json.loads((target / ".mcp.json").read_text())
198
+ servers = mcp["mcpServers"]
199
+ assert "filesystem" in servers and "github" in servers
200
+ assert servers["filesystem"]["command"].endswith(
201
+ "Agentik_Tools/filesystem/bin/server-filesystem")
202
+ assert servers["github"]["command"] == "npx"
203
+ assert "@modelcontextprotocol/server-github" in servers["github"]["args"]
204
+ # secret refs projected as env placeholders
205
+ assert servers["github"]["env"] == {"GITHUB_TOKEN": "${GITHUB_TOKEN}"}
206
+
207
+ # settings.json — hooks block merged
208
+ settings = json.loads((target / "settings.json").read_text())
209
+ assert "Stop" in settings["hooks"]
210
+
211
+ # idempotency: re-running produces the same outcome
212
+ out2 = adapter.project(home)
213
+ assert out2["skills_written"] == out["skills_written"]
214
+ assert out2["mcp_servers"] == out["mcp_servers"]
215
+ # the .mcp.json content stays the same
216
+ mcp2 = json.loads((target / ".mcp.json").read_text())
217
+ assert mcp == mcp2
218
+ finally:
219
+ shutil.rmtree(home, ignore_errors=True)
220
+
221
+
222
+ # --------------------------------------------------------------------------
223
+ # 4. SyncEngine.sync_all() over the providers registry
224
+ # --------------------------------------------------------------------------
225
+
226
+
227
+ def test_sync_engine_iterates_providers():
228
+ home = _seed_home()
229
+ try:
230
+ _seed_skill(home, "frontend-design", "# Skill\n")
231
+ _seed_catalog(home)
232
+ _seed_mcp_config(home)
233
+ # both claude (real adapter) and glm (stub adapter)
234
+ import yaml
235
+ (home / "Agentik_Providers" / "registry.yaml").write_text(yaml.safe_dump({
236
+ "version": 1,
237
+ "providers": [{"id": "claude"}, {"id": "glm"}],
238
+ }))
239
+ outcomes = SyncEngine().sync_all(home)
240
+ by_id = {o["provider"]: o for o in outcomes}
241
+ assert by_id["claude-code"]["projected"] is True
242
+ assert by_id["glm"]["projected"] is False
243
+ assert "no native projection" in by_id["glm"]["reason"]
244
+ finally:
245
+ shutil.rmtree(home, ignore_errors=True)
246
+
247
+
248
+ # --------------------------------------------------------------------------
249
+ # 5. CLI: `omega sync` returns 0
250
+ # --------------------------------------------------------------------------
251
+
252
+
253
+ def test_cli_sync_returns_zero(monkeypatch=None):
254
+ home = _seed_home()
255
+ try:
256
+ _seed_skill(home, "frontend-design", "# Skill\n")
257
+ _seed_catalog(home)
258
+ _seed_mcp_config(home)
259
+ _seed_providers(home)
260
+
261
+ import os
262
+ old = os.environ.get("OMEGA_HOME")
263
+ os.environ["OMEGA_HOME"] = str(home)
264
+ try:
265
+ rc = cli.main(["sync"])
266
+ finally:
267
+ if old is None:
268
+ os.environ.pop("OMEGA_HOME", None)
269
+ else:
270
+ os.environ["OMEGA_HOME"] = old
271
+ assert rc == 0
272
+ finally:
273
+ shutil.rmtree(home, ignore_errors=True)
274
+
275
+
276
+ # --------------------------------------------------------------------------
277
+ # 6. CLI: `omega tool list` returns 0 on empty registry
278
+ # --------------------------------------------------------------------------
279
+
280
+
281
+ def test_cli_tool_list_empty():
282
+ home = _seed_home()
283
+ try:
284
+ import os
285
+ old = os.environ.get("OMEGA_HOME")
286
+ os.environ["OMEGA_HOME"] = str(home)
287
+ try:
288
+ rc = cli.main(["tool", "list"])
289
+ finally:
290
+ if old is None:
291
+ os.environ.pop("OMEGA_HOME", None)
292
+ else:
293
+ os.environ["OMEGA_HOME"] = old
294
+ assert rc == 0
295
+ finally:
296
+ shutil.rmtree(home, ignore_errors=True)
297
+
298
+
299
+ def _run_all() -> bool:
300
+ tests = [v for k, v in sorted(globals().items())
301
+ if k.startswith("test_") and callable(v)]
302
+ passed = 0
303
+ for t in tests:
304
+ t()
305
+ print(f" PASS {t.__name__}")
306
+ passed += 1
307
+ print(f"\n{passed}/{len(tests)} tools+sync tests passed")
308
+ return passed == len(tests)
309
+
310
+
311
+ if __name__ == "__main__":
312
+ sys.exit(0 if _run_all() else 1)
@@ -0,0 +1,370 @@
1
+ """Tests for the v0.6.0 hardening batch — every new module gets coverage.
2
+
3
+ We don't hit any real provider APIs in tests (no network). For
4
+ validate.py and updater.py we monkeypatch urlopen; for smoke we run
5
+ against MockProvider; for prune/backup/costs/audit_diff we exercise the
6
+ pure-data paths.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import os
12
+ import sqlite3
13
+ import sys
14
+ import tempfile
15
+ import time
16
+ import unittest
17
+ from pathlib import Path
18
+ from unittest import mock
19
+
20
+ import yaml
21
+
22
+
23
+ HERE = Path(__file__).resolve().parent
24
+ sys.path.insert(0, str(HERE.parent))
25
+
26
+
27
+ # ---------------------------------------------------------------------------
28
+ # validate.py
29
+ # ---------------------------------------------------------------------------
30
+
31
+
32
+ class TestValidate(unittest.TestCase):
33
+ def test_validate_claude_no_key_returns_clean_fail(self):
34
+ from omega_engine.validate import validate_one
35
+ with tempfile.TemporaryDirectory() as td:
36
+ r = validate_one(td, "claude")
37
+ self.assertFalse(r.ok)
38
+ self.assertIn("no API key", r.detail)
39
+
40
+ def test_validate_unknown_provider(self):
41
+ from omega_engine.validate import validate_one
42
+ with tempfile.TemporaryDirectory() as td:
43
+ r = validate_one(td, "aliens")
44
+ self.assertFalse(r.ok)
45
+ self.assertIn("no validator", r.detail)
46
+
47
+ def test_validate_all_reads_router(self):
48
+ from omega_engine.validate import validate_all
49
+ with tempfile.TemporaryDirectory() as td:
50
+ home = Path(td)
51
+ (home / "Agentik_SSOT" / "providers").mkdir(parents=True)
52
+ (home / "Agentik_SSOT" / "providers" / "router.yaml").write_text(
53
+ yaml.safe_dump({"providers": [
54
+ {"id": "claude", "enabled": True, "secret_ref": "CLAUDE_API_KEY"},
55
+ {"id": "glm", "enabled": False, "secret_ref": "GLM_API_KEY"},
56
+ ]}))
57
+ results = validate_all(home)
58
+ # Only enabled providers are validated.
59
+ self.assertEqual([r.provider for r in results], ["claude"])
60
+
61
+ def test_validate_claude_with_mock_http_200(self):
62
+ from omega_engine.validate import _validate_claude
63
+ with mock.patch("urllib.request.urlopen") as fake_open:
64
+ fake_resp = mock.MagicMock()
65
+ fake_resp.__enter__ = lambda s: s
66
+ fake_resp.__exit__ = lambda *args: None
67
+ fake_resp.read = lambda: b'{"ok": true}'
68
+ fake_open.return_value = fake_resp
69
+ r = _validate_claude("sk-key")
70
+ self.assertTrue(r.ok)
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # completions.py
75
+ # ---------------------------------------------------------------------------
76
+
77
+
78
+ class TestCompletions(unittest.TestCase):
79
+ def test_extract_tree_from_parser(self):
80
+ from omega_engine.cli import _build_parser
81
+ from omega_engine.completions import extract_tree
82
+ tree = extract_tree(_build_parser())
83
+ self.assertEqual(tree.name, "omega")
84
+ names = {n.name for n in tree.subcommands}
85
+ # A handful of the commands we know must be there.
86
+ for expected in ("doctor", "audit", "skill", "pursue", "cadence",
87
+ "smoke", "backup", "validate"):
88
+ self.assertIn(expected, names)
89
+
90
+ def test_render_bash_contains_top_commands(self):
91
+ from omega_engine.cli import _build_parser
92
+ from omega_engine.completions import extract_tree, render_bash
93
+ text = render_bash(extract_tree(_build_parser()))
94
+ self.assertIn("complete -F _omega_complete omega", text)
95
+ self.assertIn("doctor", text)
96
+ self.assertIn("audit", text)
97
+
98
+ def test_write_all_creates_files(self):
99
+ from omega_engine.cli import _build_parser
100
+ from omega_engine.completions import extract_tree, write_all
101
+ with tempfile.TemporaryDirectory() as td:
102
+ paths = write_all(td, extract_tree(_build_parser()))
103
+ for shell in ("bash", "zsh", "fish"):
104
+ self.assertTrue(paths[shell].exists())
105
+
106
+
107
+ # ---------------------------------------------------------------------------
108
+ # updater.py
109
+ # ---------------------------------------------------------------------------
110
+
111
+
112
+ class TestUpdater(unittest.TestCase):
113
+ def test_parse_semver_handles_prerelease(self):
114
+ from omega_engine.updater import _parse_semver
115
+ self.assertEqual(_parse_semver("1.2.3"), (1, 2, 3))
116
+ self.assertEqual(_parse_semver("1.2.3-beta.1"), (1, 2, 3))
117
+ self.assertEqual(_parse_semver("v0.4.0"), (0, 4, 0)) # leading v → 0
118
+ self.assertEqual(_parse_semver("garbage"), (0, 0, 0))
119
+
120
+ def test_check_returns_outdated_when_newer(self):
121
+ from omega_engine.updater import check_for_updates
122
+ with mock.patch("urllib.request.urlopen") as fake_open:
123
+ fake_resp = mock.MagicMock()
124
+ fake_resp.__enter__ = lambda s: s
125
+ fake_resp.__exit__ = lambda *args: None
126
+ fake_resp.read = lambda: json.dumps({
127
+ "dist-tags": {"latest": "1.0.0"},
128
+ }).encode()
129
+ fake_open.return_value = fake_resp
130
+ info = check_for_updates("0.5.0")
131
+ self.assertTrue(info.is_outdated)
132
+ self.assertEqual(info.latest, "1.0.0")
133
+
134
+ def test_check_returns_uptodate(self):
135
+ from omega_engine.updater import check_for_updates
136
+ with mock.patch("urllib.request.urlopen") as fake_open:
137
+ fake_resp = mock.MagicMock()
138
+ fake_resp.__enter__ = lambda s: s
139
+ fake_resp.__exit__ = lambda *args: None
140
+ fake_resp.read = lambda: json.dumps({
141
+ "dist-tags": {"latest": "0.5.0"},
142
+ }).encode()
143
+ fake_open.return_value = fake_resp
144
+ info = check_for_updates("0.5.0")
145
+ self.assertFalse(info.is_outdated)
146
+
147
+
148
+ # ---------------------------------------------------------------------------
149
+ # smoke.py
150
+ # ---------------------------------------------------------------------------
151
+
152
+
153
+ class TestSmoke(unittest.TestCase):
154
+ def test_smoke_passes_against_mock(self):
155
+ from omega_engine.smoke import run_smoke
156
+ with tempfile.TemporaryDirectory() as td:
157
+ result = run_smoke(omega_home=td)
158
+ self.assertTrue(result.passed,
159
+ msg=f"smoke failed: {result.detail}")
160
+ self.assertEqual(result.final_state, "completed")
161
+ self.assertGreater(result.events_recorded, 0)
162
+
163
+
164
+ # ---------------------------------------------------------------------------
165
+ # prune.py
166
+ # ---------------------------------------------------------------------------
167
+
168
+
169
+ class TestPrune(unittest.TestCase):
170
+ def _seed_telegram_history(self, home: Path, *, old_count: int, new_count: int):
171
+ from omega_engine.telegram_history import _connect, record_inbound
172
+ # Now-recent messages.
173
+ for i in range(new_count):
174
+ record_inbound(home, topic_id=1, text=f"new-{i}")
175
+ # Artificially old rows.
176
+ conn = _connect(home)
177
+ for i in range(old_count):
178
+ conn.execute(
179
+ "INSERT INTO messages (topic_id, role, text, message_id, timestamp) "
180
+ "VALUES (?, ?, ?, ?, ?)",
181
+ (1, "user", f"old-{i}", None, 0),
182
+ )
183
+ conn.commit()
184
+ conn.close()
185
+
186
+ def test_prune_telegram_dry_run_doesnt_delete(self):
187
+ from omega_engine.prune import prune_telegram
188
+ with tempfile.TemporaryDirectory() as td:
189
+ self._seed_telegram_history(Path(td), old_count=3, new_count=2)
190
+ report = prune_telegram(td, older_than_days=30, dry_run=True)
191
+ self.assertEqual(report.rows_deleted, 3)
192
+ self.assertTrue(report.dry_run)
193
+ # Verify nothing was actually deleted.
194
+ from omega_engine.telegram_history import recent_messages
195
+ still = recent_messages(td, topic_id=1, limit=100)
196
+ self.assertEqual(len(still), 5)
197
+
198
+ def test_prune_telegram_yes_actually_deletes(self):
199
+ from omega_engine.prune import prune_telegram
200
+ from omega_engine.telegram_history import recent_messages
201
+ with tempfile.TemporaryDirectory() as td:
202
+ self._seed_telegram_history(Path(td), old_count=3, new_count=2)
203
+ report = prune_telegram(td, older_than_days=30, dry_run=False)
204
+ self.assertEqual(report.rows_deleted, 3)
205
+ still = recent_messages(td, topic_id=1, limit=100)
206
+ self.assertEqual(len(still), 2)
207
+
208
+ def test_prune_all_returns_one_per_target(self):
209
+ from omega_engine.prune import prune_all
210
+ with tempfile.TemporaryDirectory() as td:
211
+ reports = prune_all(td, older_than_days=30, dry_run=True)
212
+ targets = [r.target for r in reports]
213
+ self.assertEqual(targets, ["events", "audits", "telegram", "sessions"])
214
+
215
+
216
+ # ---------------------------------------------------------------------------
217
+ # backup.py
218
+ # ---------------------------------------------------------------------------
219
+
220
+
221
+ class TestBackup(unittest.TestCase):
222
+ def _seed_tree(self, home: Path) -> None:
223
+ # Minimal backupable structure
224
+ (home / "Agentik_Runtime" / "eventlog").mkdir(parents=True)
225
+ (home / "Agentik_Runtime" / "eventlog" / "omega.db").write_text("fake-db")
226
+ (home / "Agentik_Extra" / "etc" / "secrets").mkdir(parents=True)
227
+ (home / "Agentik_Extra" / "etc" / "secrets" / "x.age").write_text("encrypted")
228
+ (home / "Agentik_SSOT").mkdir(parents=True)
229
+ (home / "Agentik_SSOT" / "VERSION").write_text("0.5.0")
230
+ (home / "Agentik_Coding").mkdir(parents=True)
231
+ (home / "Agentik_Coding" / "projects.json").write_text("[]")
232
+
233
+ def test_backup_creates_tarball(self):
234
+ from omega_engine.backup import backup
235
+ with tempfile.TemporaryDirectory() as td:
236
+ home = Path(td) / "Omega"
237
+ home.mkdir()
238
+ self._seed_tree(home)
239
+ result = backup(home, out_dir=Path(td))
240
+ self.assertTrue(result.bundle.exists())
241
+ self.assertGreater(result.bytes, 0)
242
+ self.assertFalse(result.encrypted)
243
+
244
+ def test_backup_then_restore_roundtrip(self):
245
+ from omega_engine.backup import backup, restore
246
+ with tempfile.TemporaryDirectory() as td:
247
+ home = Path(td) / "Omega"
248
+ home.mkdir()
249
+ self._seed_tree(home)
250
+ result = backup(home, out_dir=Path(td))
251
+
252
+ # Restore into a clean tree.
253
+ target = Path(td) / "restored"
254
+ target.mkdir()
255
+ r = restore(result.bundle, target=target)
256
+ self.assertGreater(r.files, 0)
257
+ self.assertTrue((target / "Agentik_SSOT" / "VERSION").exists())
258
+ self.assertEqual(
259
+ (target / "Agentik_SSOT" / "VERSION").read_text(), "0.5.0",
260
+ )
261
+
262
+ def test_verify_passes_on_clean_bundle(self):
263
+ from omega_engine.backup import backup, verify
264
+ with tempfile.TemporaryDirectory() as td:
265
+ home = Path(td) / "Omega"
266
+ home.mkdir()
267
+ self._seed_tree(home)
268
+ result = backup(home, out_dir=Path(td))
269
+ v = verify(result.bundle)
270
+ self.assertTrue(v["ok"])
271
+
272
+
273
+ # ---------------------------------------------------------------------------
274
+ # costs.py
275
+ # ---------------------------------------------------------------------------
276
+
277
+
278
+ class TestCosts(unittest.TestCase):
279
+ def test_estimate_cost_claude(self):
280
+ from omega_engine.costs import estimate_cost
281
+ # 1M in + 1M out on claude-sonnet → 3 + 15 = 18 USD
282
+ cost = estimate_cost(
283
+ "claude", input_tokens=1_000_000, output_tokens=1_000_000,
284
+ model="claude-sonnet-4-6",
285
+ )
286
+ self.assertAlmostEqual(cost, 18.0, places=2)
287
+
288
+ def test_estimate_cost_unknown_provider_zero(self):
289
+ from omega_engine.costs import estimate_cost
290
+ self.assertEqual(
291
+ estimate_cost("not-real", input_tokens=1000, output_tokens=1000),
292
+ 0.0,
293
+ )
294
+
295
+ def test_rate_card_summary_includes_known_providers(self):
296
+ from omega_engine.costs import rate_card_summary
297
+ s = rate_card_summary()
298
+ for p in ("claude", "openai", "glm", "deepseek"):
299
+ self.assertIn(p, s["providers"])
300
+
301
+
302
+ # ---------------------------------------------------------------------------
303
+ # audit_diff.py
304
+ # ---------------------------------------------------------------------------
305
+
306
+
307
+ class TestAuditDiff(unittest.TestCase):
308
+ def test_diff_classifies_fixed_new_persist_regressed(self):
309
+ from omega_engine.audit_diff import diff_runs
310
+ from omega_engine.audits.history import (
311
+ AuditRun, make_run_id, now, record_run,
312
+ )
313
+ with tempfile.TemporaryDirectory() as td:
314
+ base = now()
315
+ f_fixed = {"phase": "p", "location": "a.py:1",
316
+ "message": "bug A", "severity": "high"}
317
+ f_persist = {"phase": "p", "location": "b.py:1",
318
+ "message": "bug B", "severity": "medium"}
319
+ f_regressed1 = {"phase": "p", "location": "c.py:1",
320
+ "message": "bug C", "severity": "low"}
321
+ f_regressed2 = {"phase": "p", "location": "c.py:1",
322
+ "message": "bug C", "severity": "high"}
323
+ f_new = {"phase": "p", "location": "d.py:1",
324
+ "message": "bug D", "severity": "medium"}
325
+
326
+ record_run(td, AuditRun(
327
+ run_id="ar-1", audit_id="codeaudit", scope=".",
328
+ timestamp=base, score=70, verified=False, finding_count=3,
329
+ verdict={"findings": [f_fixed, f_persist, f_regressed1]},
330
+ ))
331
+ record_run(td, AuditRun(
332
+ run_id="ar-2", audit_id="codeaudit", scope=".",
333
+ timestamp=base + 1, score=80, verified=False, finding_count=3,
334
+ verdict={"findings": [f_persist, f_regressed2, f_new]},
335
+ ))
336
+ d = diff_runs(td, "ar-1", "ar-2")
337
+ self.assertEqual(d.delta, 10)
338
+ self.assertEqual(len(d.fixed), 1)
339
+ self.assertEqual(d.fixed[0]["location"], "a.py:1")
340
+ self.assertEqual(len(d.new), 1)
341
+ self.assertEqual(d.new[0]["location"], "d.py:1")
342
+ self.assertEqual(len(d.persist), 2) # b.py + c.py both in both runs
343
+ self.assertEqual(len(d.regressed), 1)
344
+ self.assertEqual(d.regressed[0]["location"], "c.py:1")
345
+
346
+ def test_diff_unknown_run_raises(self):
347
+ from omega_engine.audit_diff import diff_runs
348
+ with tempfile.TemporaryDirectory() as td:
349
+ with self.assertRaises(KeyError):
350
+ diff_runs(td, "missing-1", "missing-2")
351
+
352
+
353
+ # ---------------------------------------------------------------------------
354
+ # ssh-key-rotate template ships
355
+ # ---------------------------------------------------------------------------
356
+
357
+
358
+ class TestSshRotateTemplate(unittest.TestCase):
359
+ def test_template_present_and_parseable(self):
360
+ REPO = Path(__file__).resolve().parents[3]
361
+ tmpl = REPO / "bootstrap" / "templates" / "autonomous" / "ssh-key-rotate.yaml"
362
+ self.assertTrue(tmpl.exists())
363
+ data = yaml.safe_load(tmpl.read_text())
364
+ self.assertEqual(data["id"], "ssh-key-rotate")
365
+ self.assertFalse(data["enabled"]) # opt-in by design
366
+ self.assertEqual(data["trigger"]["type"], "cron")
367
+
368
+
369
+ if __name__ == "__main__":
370
+ unittest.main(verbosity=2)