@agentikos/omega-os 0.2.0 → 0.19.6

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 (376) hide show
  1. package/README.md +33 -3
  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 +790 -21
  10. package/bootstrap/manifest.example.yaml +87 -1
  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/GAP-ANALYSIS.md +214 -0
  48. package/docs/INSTALL.md +47 -9
  49. package/docs/MCP-AND-PLUGINS.md +31 -4
  50. package/docs/SIMULATION.md +171 -0
  51. package/docs/simulate.sh +211 -0
  52. package/install.sh +164 -17
  53. package/omega/Agentik_Engine/README.md +4 -2
  54. package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
  55. package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
  56. package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
  57. package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
  58. package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
  59. package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
  60. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
  61. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
  62. package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
  63. package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
  64. package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
  65. package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
  66. package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
  67. package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
  68. package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
  69. package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
  70. package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
  71. package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
  72. package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
  73. package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
  74. package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
  75. package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
  76. package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
  77. package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
  78. package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
  79. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
  80. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
  81. package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
  82. package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
  83. package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
  84. package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
  85. package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
  86. package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
  87. package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
  88. package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
  89. package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
  90. package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
  91. package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
  92. package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
  93. package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
  94. package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
  95. package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
  96. package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
  97. package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
  98. package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
  99. package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
  100. package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
  101. package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
  102. package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
  103. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
  104. package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
  105. package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
  106. package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
  107. package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
  108. package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
  109. package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
  110. package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
  111. package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
  112. package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
  113. package/omega/Agentik_Engine/omega_engine/account.py +28 -31
  114. package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
  115. package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
  116. package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
  117. package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
  118. package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
  119. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
  120. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
  121. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
  122. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
  123. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
  124. package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
  125. package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
  126. package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
  127. package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
  128. package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
  129. package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
  130. package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
  131. package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
  132. package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
  133. package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
  134. package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
  135. package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
  136. package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
  137. package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
  138. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
  139. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
  140. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
  141. package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
  142. package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
  143. package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
  144. package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
  145. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
  146. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
  147. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
  148. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
  149. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
  150. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
  151. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
  152. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
  153. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
  154. package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
  155. package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
  156. package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
  157. package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
  158. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
  159. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
  160. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
  161. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
  162. package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
  163. package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
  164. package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
  165. package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
  166. package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
  167. package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
  168. package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
  169. package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
  170. package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
  171. package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
  172. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
  173. package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
  174. package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
  175. package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
  176. package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
  177. package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
  178. package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
  179. package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
  180. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  181. package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
  182. package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
  183. package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
  184. package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
  185. package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
  186. package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
  187. package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
  188. package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
  189. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
  190. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
  191. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
  192. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
  193. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
  194. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
  195. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
  196. package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
  197. package/omega/Agentik_Engine/omega_engine/router.py +28 -0
  198. package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
  199. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
  200. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
  201. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
  202. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
  203. package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
  204. package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
  205. package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
  206. package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
  207. package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
  208. package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
  209. package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
  210. package/omega/Agentik_Engine/omega_engine/store.py +88 -41
  211. package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
  212. package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
  213. package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
  214. package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
  215. package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
  216. package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
  217. package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
  218. package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
  219. package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
  220. package/omega/Agentik_Engine/pyproject.toml +1 -1
  221. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
  222. package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
  223. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
  224. package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
  225. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
  226. package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
  227. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
  228. package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
  229. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
  230. package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
  231. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
  232. package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
  233. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
  234. package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
  235. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
  236. package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
  237. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
  238. package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
  239. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
  240. package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
  241. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
  242. package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
  243. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
  244. package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
  245. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
  246. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
  247. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
  248. package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
  249. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
  250. package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
  251. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
  252. package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
  253. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
  254. package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
  255. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
  256. package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
  257. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
  258. package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
  259. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
  260. package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
  261. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
  262. package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
  263. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
  264. package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
  265. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
  266. package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
  267. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
  268. package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
  269. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
  270. package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
  271. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
  272. package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
  273. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
  274. package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
  275. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
  276. package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
  277. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
  278. package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
  279. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
  280. package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
  281. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
  282. package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
  283. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
  284. package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
  285. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
  286. package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
  287. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
  288. package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
  289. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
  290. package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
  291. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
  292. package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
  293. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
  294. package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
  295. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
  296. package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
  297. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
  298. package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
  299. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
  300. package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
  301. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
  302. package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
  303. package/omega/Agentik_Engine/tests/test_account.py +8 -3
  304. package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
  305. package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
  306. package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
  307. package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
  308. package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
  309. package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
  310. package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
  311. package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
  312. package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
  313. package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
  314. package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
  315. package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
  316. package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
  317. package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
  318. package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
  319. package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
  320. package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
  321. package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
  322. package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
  323. package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
  324. package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
  325. package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
  326. package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
  327. package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
  328. package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
  329. package/omega/Agentik_Engine/tests/test_vault.py +173 -0
  330. package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
  331. package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
  332. package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
  333. package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
  334. package/omega/Agentik_Runtime/audits.db +0 -0
  335. package/omega/Agentik_SSOT/VERSION +1 -1
  336. package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
  337. package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
  338. package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
  339. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
  340. package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
  341. package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
  342. package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
  343. package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
  344. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  345. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  346. package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
  347. package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
  348. package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
  349. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  350. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  351. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  352. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  353. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  354. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  355. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  356. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  357. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  358. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  359. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  360. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  361. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  362. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  363. package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
  364. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  365. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  366. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  367. package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
  368. package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
  369. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  370. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  371. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  372. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  373. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  374. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  375. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  376. package/package.json +2 -2
@@ -0,0 +1,359 @@
1
+ """Integration tests for the manifest-driven install helpers.
2
+
3
+ `bootstrap/lib/manifest-helpers.py` is a small Python tool the shell calls
4
+ to project the manifest's `providers:` / `autonomous_agents:` / `options.rag`
5
+ into the SSOT. These tests run it as a subprocess against fixture manifests
6
+ and assert the artefacts land in the right place with the right content.
7
+
8
+ Also a smoke check that the four new install steps (35-providers,
9
+ 55-autonomous, 57-rag, 60-services) are present in the wired installer.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import os
14
+ import shutil
15
+ import subprocess
16
+ import sys
17
+ import tempfile
18
+ import unittest
19
+ from pathlib import Path
20
+
21
+ import yaml
22
+
23
+
24
+ REPO_ROOT = Path(__file__).resolve().parents[3]
25
+ HELPER = REPO_ROOT / "bootstrap" / "lib" / "manifest-helpers.py"
26
+ TEMPLATES = REPO_ROOT / "bootstrap" / "templates" / "autonomous"
27
+ INSTALL_SH = REPO_ROOT / "install.sh"
28
+ STEPS_SH = REPO_ROOT / "bootstrap" / "lib" / "steps.sh"
29
+
30
+
31
+ def _run(*argv: str) -> subprocess.CompletedProcess:
32
+ return subprocess.run(
33
+ [sys.executable, str(HELPER), *argv],
34
+ check=False, capture_output=True, text=True, timeout=60,
35
+ )
36
+
37
+
38
+ class TestProviders(unittest.TestCase):
39
+ def test_providers_writes_router_yaml(self):
40
+ with tempfile.TemporaryDirectory() as td:
41
+ home = Path(td) / "Omega"
42
+ home.mkdir()
43
+ manifest = Path(td) / "manifest.yaml"
44
+ manifest.write_text(yaml.safe_dump({
45
+ "providers": [
46
+ {"id": "claude", "roles": ["oracle", "worker"]},
47
+ {"id": "glm", "roles": ["aisb"]},
48
+ ],
49
+ }))
50
+ proc = _run("providers", str(manifest), str(home))
51
+ self.assertEqual(proc.returncode, 0, msg=proc.stderr)
52
+
53
+ target = home / "Agentik_SSOT" / "providers" / "router.yaml"
54
+ self.assertTrue(target.exists())
55
+ data = yaml.safe_load(target.read_text())
56
+ ids = [p["id"] for p in data["providers"]]
57
+ self.assertEqual(ids, ["claude", "glm"])
58
+ # secret_ref defaulted
59
+ claude = next(p for p in data["providers"] if p["id"] == "claude")
60
+ self.assertEqual(claude["secret_ref"], "CLAUDE_API_KEY")
61
+ self.assertIn("oracle", claude["roles"])
62
+
63
+ def test_providers_no_block_is_noop(self):
64
+ with tempfile.TemporaryDirectory() as td:
65
+ home = Path(td) / "Omega"
66
+ home.mkdir()
67
+ manifest = Path(td) / "manifest.yaml"
68
+ manifest.write_text("profile: vps\n")
69
+ proc = _run("providers", str(manifest), str(home))
70
+ self.assertEqual(proc.returncode, 0)
71
+ self.assertIn("no `providers:`", proc.stdout)
72
+ self.assertFalse(
73
+ (home / "Agentik_SSOT" / "providers" / "router.yaml").exists()
74
+ )
75
+
76
+
77
+ class TestAutonomous(unittest.TestCase):
78
+ def test_copies_template_for_listed_agent(self):
79
+ with tempfile.TemporaryDirectory() as td:
80
+ target = Path(td) / "autonomous"
81
+ manifest = Path(td) / "manifest.yaml"
82
+ manifest.write_text(yaml.safe_dump({
83
+ "autonomous_agents": ["support-agent"],
84
+ }))
85
+ proc = _run("autonomous", str(manifest), str(TEMPLATES), str(target))
86
+ self.assertEqual(proc.returncode, 0, msg=proc.stderr)
87
+ charter = target / "support-agent.yaml"
88
+ self.assertTrue(charter.exists())
89
+ data = yaml.safe_load(charter.read_text())
90
+ self.assertEqual(data["id"], "support-agent")
91
+ self.assertEqual(data["trigger"]["type"], "cron")
92
+
93
+ def test_missing_template_is_reported_not_fatal(self):
94
+ with tempfile.TemporaryDirectory() as td:
95
+ target = Path(td) / "autonomous"
96
+ manifest = Path(td) / "manifest.yaml"
97
+ manifest.write_text(yaml.safe_dump({
98
+ "autonomous_agents": ["does-not-exist"],
99
+ }))
100
+ proc = _run("autonomous", str(manifest), str(TEMPLATES), str(target))
101
+ self.assertEqual(proc.returncode, 0)
102
+ self.assertIn("no template", proc.stdout)
103
+
104
+ def test_existing_charter_is_kept(self):
105
+ with tempfile.TemporaryDirectory() as td:
106
+ target = Path(td) / "autonomous"
107
+ target.mkdir()
108
+ # User-modified charter — installer must NOT clobber it.
109
+ (target / "support-agent.yaml").write_text("id: support-agent\ncustom: true\n")
110
+ manifest = Path(td) / "manifest.yaml"
111
+ manifest.write_text(yaml.safe_dump({
112
+ "autonomous_agents": ["support-agent"],
113
+ }))
114
+ proc = _run("autonomous", str(manifest), str(TEMPLATES), str(target))
115
+ self.assertEqual(proc.returncode, 0)
116
+ self.assertIn("already present", proc.stdout)
117
+ data = yaml.safe_load((target / "support-agent.yaml").read_text())
118
+ self.assertTrue(data.get("custom"))
119
+
120
+
121
+ class TestRag(unittest.TestCase):
122
+ def test_rag_writes_config_yaml(self):
123
+ with tempfile.TemporaryDirectory() as td:
124
+ home = Path(td) / "Omega"
125
+ home.mkdir()
126
+ manifest = Path(td) / "manifest.yaml"
127
+ manifest.write_text(yaml.safe_dump({
128
+ "options": {
129
+ "rag": {
130
+ "envelope": "corrective",
131
+ "strategies": ["hybrid", "graph", "multimodal"],
132
+ }
133
+ }
134
+ }))
135
+ proc = _run("rag", str(manifest), str(home))
136
+ self.assertEqual(proc.returncode, 0)
137
+ target = home / "Agentik_SSOT" / "rag" / "config.yaml"
138
+ self.assertTrue(target.exists())
139
+ data = yaml.safe_load(target.read_text())
140
+ self.assertEqual(data["envelope"], "corrective")
141
+ self.assertEqual(data["strategies"], ["hybrid", "graph", "multimodal"])
142
+
143
+
144
+ class TestInitVault(unittest.TestCase):
145
+ def test_init_vault_runs_against_a_tree(self):
146
+ with tempfile.TemporaryDirectory() as td:
147
+ home = Path(td) / "Omega"
148
+ (home / "Agentik_Engine").mkdir(parents=True)
149
+ # Symlink the real engine in so the helper can import it.
150
+ real_engine = REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
151
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(real_engine)
152
+ proc = _run("init-vault", str(home))
153
+ self.assertEqual(proc.returncode, 0)
154
+ self.assertIn("vault backend:", proc.stdout)
155
+ self.assertTrue(
156
+ (home / "Agentik_Extra" / "etc" / "secrets").is_dir()
157
+ )
158
+
159
+
160
+ class TestAccounts(unittest.TestCase):
161
+ def test_accounts_adds_to_pool_with_token(self):
162
+ with tempfile.TemporaryDirectory() as td:
163
+ home = Path(td) / "Omega"
164
+ (home / "Agentik_Engine").mkdir(parents=True)
165
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
166
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
167
+ )
168
+ manifest = Path(td) / "manifest.yaml"
169
+ manifest.write_text(yaml.safe_dump({
170
+ "accounts": [
171
+ {"id": "max-primary", "label": "Primary",
172
+ "token_env": "TEST_OAUTH_PRIMARY"},
173
+ {"id": "max-secondary"}, # no token_env → uses default name
174
+ ],
175
+ }))
176
+ env = {**os.environ, "TEST_OAUTH_PRIMARY": "fake-oauth-token-xyz"}
177
+ proc = subprocess.run(
178
+ [sys.executable, str(HELPER), "accounts",
179
+ str(manifest), str(home)],
180
+ check=False, capture_output=True, text=True, env=env, timeout=60,
181
+ )
182
+ self.assertEqual(proc.returncode, 0, msg=proc.stderr)
183
+ self.assertIn("token written from $TEST_OAUTH_PRIMARY", proc.stdout)
184
+ self.assertIn("max-secondary", proc.stdout)
185
+ self.assertIn("pool saved with 2 account(s)", proc.stdout)
186
+ # The token must round-trip through the vault.
187
+ sys.path.insert(0, str(home / "Agentik_Engine"))
188
+ from omega_engine.account import read_token # type: ignore
189
+ self.assertEqual(
190
+ read_token(home, "CLAUDE_OAUTH_max-primary"),
191
+ "fake-oauth-token-xyz",
192
+ )
193
+
194
+
195
+ class TestFirstProject(unittest.TestCase):
196
+ def test_first_project_creates_dir(self):
197
+ with tempfile.TemporaryDirectory() as td:
198
+ home = Path(td) / "Omega"
199
+ (home / "Agentik_Engine").mkdir(parents=True)
200
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
201
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
202
+ )
203
+ manifest = Path(td) / "manifest.yaml"
204
+ manifest.write_text(yaml.safe_dump({"first_project": "DemoOne"}))
205
+ env = {**os.environ, "OMEGA_HOME": str(home)}
206
+ proc = subprocess.run(
207
+ [sys.executable, str(HELPER), "first-project",
208
+ str(manifest), str(home)],
209
+ check=False, capture_output=True, text=True, env=env, timeout=60,
210
+ )
211
+ self.assertEqual(proc.returncode, 0, msg=proc.stderr)
212
+ self.assertIn("created project 'DemoOne'", proc.stdout)
213
+ # The project dir was created somewhere under the home.
214
+ self.assertTrue(any(
215
+ p.is_dir() for p in (home / "Agentik_Coding").rglob("*")
216
+ ))
217
+
218
+ def test_first_project_is_idempotent(self):
219
+ with tempfile.TemporaryDirectory() as td:
220
+ home = Path(td) / "Omega"
221
+ (home / "Agentik_Engine").mkdir(parents=True)
222
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
223
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
224
+ )
225
+ manifest = Path(td) / "manifest.yaml"
226
+ manifest.write_text(yaml.safe_dump({"first_project": "AlreadyHere"}))
227
+ env = {**os.environ, "OMEGA_HOME": str(home)}
228
+ # First run creates the project.
229
+ subprocess.run(
230
+ [sys.executable, str(HELPER), "first-project",
231
+ str(manifest), str(home)],
232
+ check=False, capture_output=True, text=True, env=env, timeout=60,
233
+ )
234
+ # Second run is a no-op.
235
+ proc = subprocess.run(
236
+ [sys.executable, str(HELPER), "first-project",
237
+ str(manifest), str(home)],
238
+ check=False, capture_output=True, text=True, env=env, timeout=60,
239
+ )
240
+ self.assertEqual(proc.returncode, 0)
241
+ self.assertIn("already exists", proc.stdout)
242
+
243
+
244
+ class TestMcpEncryption(unittest.TestCase):
245
+ @unittest.skipUnless(
246
+ shutil.which("age") and shutil.which("age-keygen"),
247
+ "age not installed",
248
+ )
249
+ def test_encrypt_mcp_env_real_value_moves_to_vault(self):
250
+ with tempfile.TemporaryDirectory() as td:
251
+ home = Path(td) / "Omega"
252
+ (home / "Agentik_Engine").mkdir(parents=True)
253
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
254
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
255
+ )
256
+ sec = home / "Agentik_Extra" / "etc" / "secrets"
257
+ sec.mkdir(parents=True)
258
+ (sec / "mcp-composio.env").write_text("COMPOSIO_API_KEY=real-key-123\n")
259
+ proc = subprocess.run(
260
+ [sys.executable, str(HELPER), "encrypt-mcp-env",
261
+ str(home), "composio"],
262
+ check=False, capture_output=True, text=True, timeout=60,
263
+ )
264
+ self.assertEqual(proc.returncode, 0, msg=proc.stderr)
265
+ self.assertIn("encrypted mcp-composio.env", proc.stdout)
266
+ self.assertFalse((sec / "mcp-composio.env").exists())
267
+ self.assertTrue((sec / "mcp_composio_ENV.age").exists())
268
+
269
+ def test_encrypt_mcp_env_placeholder_is_left_alone(self):
270
+ with tempfile.TemporaryDirectory() as td:
271
+ home = Path(td) / "Omega"
272
+ (home / "Agentik_Engine").mkdir(parents=True)
273
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
274
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
275
+ )
276
+ sec = home / "Agentik_Extra" / "etc" / "secrets"
277
+ sec.mkdir(parents=True)
278
+ (sec / "mcp-github.env").write_text("# GITHUB_TOKEN= # set later\n")
279
+ proc = subprocess.run(
280
+ [sys.executable, str(HELPER), "encrypt-mcp-env",
281
+ str(home), "github"],
282
+ check=False, capture_output=True, text=True, timeout=60,
283
+ )
284
+ self.assertEqual(proc.returncode, 0)
285
+ # File still present, vault not written.
286
+ self.assertTrue((sec / "mcp-github.env").exists())
287
+
288
+
289
+ class TestDoctorJSON(unittest.TestCase):
290
+ def test_doctor_json_produces_parseable_output(self):
291
+ import json as _json
292
+ with tempfile.TemporaryDirectory() as td:
293
+ home = Path(td) / "Omega"
294
+ # Minimal block tree so doctor doesn't barf.
295
+ for b in ["Agentik_SSOT", "Agentik_Engine", "Agentik_Orchestration",
296
+ "Agentik_Providers", "Agentik_Coding", "Agentik_Tools",
297
+ "Agentik_Runtime", "Agentik_Extra"]:
298
+ (home / b).mkdir(parents=True)
299
+ (home / "Agentik_Engine" / "omega_engine").symlink_to(
300
+ REPO_ROOT / "omega" / "Agentik_Engine" / "omega_engine"
301
+ )
302
+ env = {**os.environ, "OMEGA_HOME": str(home)}
303
+ proc = subprocess.run(
304
+ [sys.executable, "-m", "omega_engine.cli", "doctor", "--json"],
305
+ check=False, capture_output=True, text=True, env=env, timeout=60,
306
+ cwd=str(home / "Agentik_Engine"),
307
+ )
308
+ # Exit code may be 0 or 1, but stdout must be parseable JSON.
309
+ try:
310
+ data = _json.loads(proc.stdout)
311
+ except _json.JSONDecodeError as exc:
312
+ self.fail(f"doctor --json output not JSON: {exc}\nstdout: {proc.stdout[:500]}")
313
+ self.assertEqual(data["omega_home"], str(home))
314
+ self.assertIn("verdict", data)
315
+ self.assertIn("results", data)
316
+ self.assertIsInstance(data["results"], list)
317
+ # Each result has the expected shape.
318
+ for r in data["results"]:
319
+ self.assertIn("section", r)
320
+ self.assertIn("status", r)
321
+ self.assertIn("msg", r)
322
+ self.assertIn(r["status"], {"ok", "warn", "FAIL"})
323
+
324
+
325
+ class TestInstallerWiring(unittest.TestCase):
326
+ """Each new step must be referenced by install.sh AND defined in steps.sh."""
327
+
328
+ def test_install_sh_runs_all_new_steps(self):
329
+ text = INSTALL_SH.read_text()
330
+ for step in (
331
+ "32-accounts", "step_accounts",
332
+ "35-providers", "step_providers",
333
+ "55-autonomous", "step_autonomous",
334
+ "57-rag", "step_rag",
335
+ "58-first-project", "step_first_project",
336
+ ):
337
+ self.assertIn(step, text, f"missing in install.sh: {step}")
338
+
339
+ def test_steps_sh_defines_new_step_functions(self):
340
+ text = STEPS_SH.read_text()
341
+ for fn in ("step_accounts()", "step_providers()", "step_autonomous()",
342
+ "step_rag()", "step_first_project()",
343
+ "_services_linux", "_services_macos", "_launchd_plist"):
344
+ self.assertIn(fn, text, f"missing in steps.sh: {fn}")
345
+
346
+ def test_step_services_enables_systemd(self):
347
+ text = STEPS_SH.read_text()
348
+ self.assertIn("systemctl --user enable --now", text)
349
+ self.assertIn("loginctl enable-linger", text)
350
+
351
+ def test_step_services_has_real_launchd_plists(self):
352
+ text = STEPS_SH.read_text()
353
+ self.assertNotIn("build-out", text)
354
+ self.assertIn("launchctl bootstrap", text)
355
+ self.assertIn("com.agentikos.omega.engine", text)
356
+
357
+
358
+ if __name__ == "__main__":
359
+ unittest.main(verbosity=2)
@@ -0,0 +1,151 @@
1
+ """Smoke tests for the installer UX layer in bootstrap/lib/common.sh.
2
+
3
+ These tests don't run the full installer — they source common.sh inside a
4
+ controlled subshell, call individual helpers, and assert the printed output
5
+ looks correct. Bash-side functions only; no actual install side-effects.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ import subprocess
11
+ import tempfile
12
+ import unittest
13
+ from pathlib import Path
14
+
15
+
16
+ REPO_ROOT = Path(__file__).resolve().parents[3]
17
+ COMMON_SH = REPO_ROOT / "bootstrap" / "lib" / "common.sh"
18
+
19
+
20
+ def _bash(snippet: str, *, env: dict[str, str] | None = None,
21
+ stdin: str = "") -> tuple[int, str, str]:
22
+ """Run a bash snippet that sources common.sh; return (rc, stdout, stderr)."""
23
+ base_env = {**os.environ}
24
+ base_env.setdefault("OMEGA_REPO", str(REPO_ROOT))
25
+ base_env.setdefault("OMEGA_HOME", "/tmp/omega-ux-pytest")
26
+ base_env.setdefault("OMEGA_USER", "tester")
27
+ base_env.setdefault("LOG_FILE", "/tmp/omega-ux-pytest.log")
28
+ base_env.setdefault("NONINTERACTIVE", "1")
29
+ base_env.setdefault("PROFILE", "vps")
30
+ base_env.setdefault("PROFILE_EXPLICIT", "1")
31
+ base_env.setdefault("OMEGA_OS", "linux")
32
+ base_env.setdefault("OMEGA_PKG", "apt")
33
+ if env:
34
+ base_env.update(env)
35
+ # Run with `bash -lc` to get a proper login shell; force colours off so
36
+ # tests don't have to strip ANSI.
37
+ code = (
38
+ f"source '{COMMON_SH}'\n"
39
+ "C_OK=''; C_ERR=''; C_INFO=''; C_DIM=''; C_RST=''\n"
40
+ "C_BOLD=''; C_CYAN=''; C_GREEN=''; C_YELLOW=''; C_RED=''; C_MAGENTA=''; C_BLUE=''\n"
41
+ + snippet
42
+ )
43
+ proc = subprocess.run(
44
+ ["bash", "-c", code],
45
+ env=base_env, capture_output=True, text=True, input=stdin,
46
+ timeout=15,
47
+ )
48
+ return proc.returncode, proc.stdout, proc.stderr
49
+
50
+
51
+ class TestBanner(unittest.TestCase):
52
+ def test_banner_includes_name_and_version(self):
53
+ rc, out, _ = _bash("install_banner")
54
+ self.assertEqual(rc, 0)
55
+ self.assertIn("Omega OS", out)
56
+ self.assertIn("agentik-os/OmegaOS", out)
57
+
58
+ def test_omega_version_reads_ssot_file(self):
59
+ rc, out, _ = _bash("omega_version")
60
+ self.assertEqual(rc, 0)
61
+ # Don't hardcode the version — read it from the SSOT file and
62
+ # require the banner to echo whatever's actually there.
63
+ repo = Path(__file__).resolve().parents[3]
64
+ ssot_version = (repo / "omega" / "Agentik_SSOT" / "VERSION").read_text().strip()
65
+ self.assertIn(ssot_version, out.strip())
66
+
67
+
68
+ class TestPreflightCard(unittest.TestCase):
69
+ def test_lists_os_and_required_tools(self):
70
+ rc, out, _ = _bash("preflight_card")
71
+ self.assertEqual(rc, 0)
72
+ self.assertIn("pre-flight detection", out)
73
+ self.assertIn("required tools", out)
74
+ # All the required-tool ids must appear, regardless of host state
75
+ for tool in ("git", "python3", "tmux", "sqlite3", "curl", "jq"):
76
+ self.assertIn(tool, out)
77
+
78
+
79
+ class TestStepProgress(unittest.TestCase):
80
+ def test_progress_header_increments_count(self):
81
+ rc, out, _ = _bash(
82
+ "STEP_TOTAL=3\nstep_progress_header step-a\n"
83
+ "step_progress_header step-b\nstep_progress_header step-c\n"
84
+ )
85
+ self.assertEqual(rc, 0)
86
+ self.assertIn("[1/3]", out)
87
+ self.assertIn("[2/3]", out)
88
+ self.assertIn("[3/3]", out)
89
+
90
+
91
+ class TestPathSetup(unittest.TestCase):
92
+ def test_appends_marker_to_rc(self):
93
+ with tempfile.TemporaryDirectory() as tmp:
94
+ rc_path = Path(tmp) / ".zshrc"
95
+ rc_path.write_text("# existing\n")
96
+ rc, out, _ = _bash(
97
+ "path_setup_user_rc",
98
+ env={"HOME": tmp, "SHELL": "/bin/zsh",
99
+ "OMEGA_HOME": "/tmp/omega-pytest"},
100
+ )
101
+ self.assertEqual(rc, 0)
102
+ content = rc_path.read_text()
103
+ self.assertIn("# >>> omega-os >>>", content)
104
+ self.assertIn("export OMEGA_HOME=", content)
105
+ self.assertIn("Agentik_Tools/bin", content)
106
+
107
+ def test_idempotent_on_second_call(self):
108
+ with tempfile.TemporaryDirectory() as tmp:
109
+ rc_path = Path(tmp) / ".bashrc"
110
+ rc_path.write_text("")
111
+ _bash("path_setup_user_rc",
112
+ env={"HOME": tmp, "SHELL": "/bin/bash",
113
+ "OMEGA_HOME": "/tmp/omega-pytest"})
114
+ first = rc_path.read_text()
115
+ _bash("path_setup_user_rc",
116
+ env={"HOME": tmp, "SHELL": "/bin/bash",
117
+ "OMEGA_HOME": "/tmp/omega-pytest"})
118
+ second = rc_path.read_text()
119
+ # Marker present exactly once in both reads.
120
+ self.assertEqual(first, second)
121
+ self.assertEqual(first.count("# >>> omega-os >>>"), 1)
122
+
123
+ def test_no_path_setup_flag_skips(self):
124
+ with tempfile.TemporaryDirectory() as tmp:
125
+ rc_path = Path(tmp) / ".zshrc"
126
+ rc_path.write_text("# only this\n")
127
+ _bash("path_setup_user_rc",
128
+ env={"HOME": tmp, "SHELL": "/bin/zsh",
129
+ "OMEGA_HOME": "/tmp/omega-pytest",
130
+ "NO_PATH_SETUP": "1"})
131
+ self.assertEqual(rc_path.read_text(), "# only this\n")
132
+
133
+
134
+ class TestPostInstallCard(unittest.TestCase):
135
+ def test_card_includes_status_and_next_steps(self):
136
+ # omega CLI isn't on PATH inside the test sandbox → readiness=UNKNOWN
137
+ rc, out, _ = _bash("post_install_card")
138
+ self.assertEqual(rc, 0)
139
+ self.assertIn("Omega OS v", out)
140
+ self.assertIn("install complete", out)
141
+ self.assertIn("status", out)
142
+ self.assertIn("next steps", out)
143
+ self.assertIn("omega status", out)
144
+ self.assertIn("omega run", out)
145
+ # No literal $C_DIM / $C_RST tokens
146
+ self.assertNotIn("${C_DIM}", out)
147
+ self.assertNotIn("${C_RST}", out)
148
+
149
+
150
+ if __name__ == "__main__":
151
+ unittest.main()