@agentikos/omega-os 0.2.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 (367) 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/marketplaces/design-discipline.yaml +86 -0
  340. package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
  341. package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
  342. package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
  343. package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
  344. package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
  345. package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
  346. package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
  347. package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
  348. package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
  349. package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
  350. package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
  351. package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
  352. package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
  353. package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
  354. package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
  355. package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
  356. package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
  357. package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
  358. package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
  359. package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
  360. package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
  361. package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
  362. package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
  363. package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
  364. package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
  365. package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
  366. package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
  367. package/package.json +2 -2
@@ -0,0 +1,217 @@
1
+ """Tests for the Agentik OS native primitives `pursue` and `cadence`.
2
+
3
+ These are the Agentik OS equivalents of Claude Code's bundled /goal and
4
+ /loop, re-implemented as engine primitives that run on the Claude Code Max
5
+ subscription with no per-API-call surcharge. The tests exercise:
6
+
7
+ * `pursue()` — goal-driven loop. Uses the MockProvider so we can drive
8
+ the loop deterministically + a verify_cmd whose exit code we control
9
+ by touching a sentinel file.
10
+ * `cadence` — charter persistence (schedule / list / disable / remove)
11
+ and the round-trip with the autonomous supervisor on disk.
12
+ * `sync` — the directory-based SKILL.md layout is picked up and
13
+ projected to a Claude Code-shaped skills tree.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import sys
18
+ import tempfile
19
+ import unittest
20
+ from pathlib import Path
21
+
22
+ import yaml
23
+
24
+
25
+ HERE = Path(__file__).resolve().parent
26
+ sys.path.insert(0, str(HERE.parent))
27
+
28
+ from omega_engine.cadence import ( # noqa: E402
29
+ disable_cadence,
30
+ list_cadences,
31
+ remove_cadence,
32
+ schedule_cadence,
33
+ )
34
+ from omega_engine.done_signal import read_done # noqa: E402
35
+ from omega_engine.provider import MockProvider # noqa: E402
36
+ from omega_engine.pursue import pursue # noqa: E402
37
+ from omega_engine.router import ModelRouter # noqa: E402
38
+
39
+
40
+ class TestPursueSuccessOnFirstIteration(unittest.TestCase):
41
+ def test_verify_passes_first_try(self):
42
+ with tempfile.TemporaryDirectory() as td:
43
+ home = Path(td)
44
+ router = ModelRouter.single(MockProvider())
45
+ result = pursue(
46
+ intent="hello world",
47
+ verify_cmd="true", # always exits 0
48
+ omega_home=home,
49
+ max_iterations=3,
50
+ router=router,
51
+ cwd=str(home),
52
+ )
53
+ self.assertEqual(result.status, "done_clean")
54
+ self.assertEqual(result.iterations, 1)
55
+ self.assertEqual(result.final_verify_exit, 0)
56
+ self.assertTrue(result.log_path.exists())
57
+ self.assertTrue(result.done_path.exists())
58
+ sig = read_done(home, result.task_id)
59
+ self.assertEqual(sig.status, "done_clean")
60
+ self.assertIn("hello world", sig.summary)
61
+
62
+
63
+ class TestPursueExhaustsBudget(unittest.TestCase):
64
+ def test_verify_never_passes_returns_failed(self):
65
+ with tempfile.TemporaryDirectory() as td:
66
+ home = Path(td)
67
+ router = ModelRouter.single(MockProvider())
68
+ result = pursue(
69
+ intent="impossible",
70
+ verify_cmd="false", # always exits 1
71
+ omega_home=home,
72
+ max_iterations=3,
73
+ router=router,
74
+ cwd=str(home),
75
+ )
76
+ self.assertEqual(result.status, "failed")
77
+ self.assertEqual(result.iterations, 3)
78
+ self.assertEqual(result.final_verify_exit, 1)
79
+ # Per-iteration log has 3 lines
80
+ lines = result.log_path.read_text().strip().splitlines()
81
+ self.assertEqual(len(lines), 3)
82
+ sig = read_done(home, result.task_id)
83
+ self.assertEqual(sig.status, "failed")
84
+ self.assertEqual(len(sig.artifacts["attempts"]), 3)
85
+
86
+
87
+ class TestPursueEventualSuccess(unittest.TestCase):
88
+ def test_sentinel_appears_mid_run(self):
89
+ """A verify_cmd that passes only after a sentinel file exists.
90
+
91
+ We simulate "the agent's edit landed at iter N" by pre-creating the
92
+ sentinel file after the loop starts is impossible (synchronous test),
93
+ so we use a verify_cmd whose first call fails and second call passes
94
+ via a touch in the cmd itself (every odd attempt creates, every even
95
+ attempt reads — but exit-code 0 only when the file already existed).
96
+ """
97
+ with tempfile.TemporaryDirectory() as td:
98
+ home = Path(td)
99
+ sentinel = home / "GOAL"
100
+ # First call: touch the file, exit 1. Second call: file exists, exit 0.
101
+ verify_cmd = (
102
+ f"test -f {sentinel} || (touch {sentinel} && exit 1)"
103
+ )
104
+ router = ModelRouter.single(MockProvider())
105
+ result = pursue(
106
+ intent="reach the sentinel",
107
+ verify_cmd=verify_cmd,
108
+ omega_home=home,
109
+ max_iterations=5,
110
+ router=router,
111
+ cwd=str(home),
112
+ )
113
+ self.assertEqual(result.status, "done_clean")
114
+ self.assertEqual(result.iterations, 2)
115
+
116
+
117
+ class TestCadenceSchedule(unittest.TestCase):
118
+ def test_schedule_cron_writes_yaml(self):
119
+ with tempfile.TemporaryDirectory() as td:
120
+ home = Path(td)
121
+ path = schedule_cadence(
122
+ intent="ping the API",
123
+ trigger_type="cron",
124
+ schedule="*/5 * * * *",
125
+ omega_home=home,
126
+ )
127
+ self.assertTrue(path.exists())
128
+ data = yaml.safe_load(path.read_text())
129
+ self.assertTrue(data["id"].startswith("cadence-"))
130
+ self.assertEqual(data["trigger"]["type"], "cron")
131
+ self.assertEqual(data["trigger"]["schedule"], "*/5 * * * *")
132
+ self.assertEqual(data["spec"]["intent"], "ping the API")
133
+ self.assertTrue(data["enabled"])
134
+
135
+ def test_schedule_delay_validates_integer(self):
136
+ with tempfile.TemporaryDirectory() as td:
137
+ home = Path(td)
138
+ with self.assertRaises(ValueError):
139
+ schedule_cadence(
140
+ intent="x", trigger_type="delay", schedule="not-int",
141
+ omega_home=home,
142
+ )
143
+
144
+ def test_schedule_rejects_unknown_trigger(self):
145
+ with tempfile.TemporaryDirectory() as td:
146
+ home = Path(td)
147
+ with self.assertRaises(ValueError):
148
+ schedule_cadence(
149
+ intent="x", trigger_type="hourly", schedule="1",
150
+ omega_home=home,
151
+ )
152
+
153
+ def test_list_returns_each_charter(self):
154
+ with tempfile.TemporaryDirectory() as td:
155
+ home = Path(td)
156
+ schedule_cadence("first", "cron", "* * * * *", omega_home=home,
157
+ charter_id="cadence-aaa")
158
+ schedule_cadence("second", "delay", "60", omega_home=home,
159
+ charter_id="cadence-bbb")
160
+ entries = list_cadences(home)
161
+ ids = {e["id"] for e in entries}
162
+ self.assertEqual(ids, {"cadence-aaa", "cadence-bbb"})
163
+
164
+ def test_disable_flips_enabled_field(self):
165
+ with tempfile.TemporaryDirectory() as td:
166
+ home = Path(td)
167
+ schedule_cadence("x", "cron", "* * * * *", omega_home=home,
168
+ charter_id="cadence-x")
169
+ self.assertTrue(disable_cadence("cadence-x", omega_home=home))
170
+ entries = list_cadences(home)
171
+ self.assertFalse(entries[0]["enabled"])
172
+ # Second disable is a no-op.
173
+ self.assertFalse(disable_cadence("cadence-x", omega_home=home))
174
+
175
+ def test_remove_deletes_charter(self):
176
+ with tempfile.TemporaryDirectory() as td:
177
+ home = Path(td)
178
+ schedule_cadence("x", "cron", "* * * * *", omega_home=home,
179
+ charter_id="cadence-x")
180
+ self.assertTrue(remove_cadence("cadence-x", omega_home=home))
181
+ self.assertEqual(list_cadences(home), [])
182
+ self.assertFalse(remove_cadence("cadence-x", omega_home=home))
183
+
184
+
185
+ class TestSyncSkillProjection(unittest.TestCase):
186
+ def test_directory_layout_projected_to_claude_code(self):
187
+ """A SKILL.md in a sub-directory must be projected to the native shape."""
188
+ from omega_engine.sync import SyncEngine
189
+ with tempfile.TemporaryDirectory() as td:
190
+ home = Path(td)
191
+ # Source layout: Agentik_SSOT/skills/pursue/SKILL.md (+ supporting)
192
+ src_skill = home / "Agentik_SSOT" / "skills" / "pursue"
193
+ src_skill.mkdir(parents=True)
194
+ (src_skill / "SKILL.md").write_text("---\nname: pursue\n---\n# pursue")
195
+ (src_skill / "examples.md").write_text("an example")
196
+ (src_skill / "scripts").mkdir()
197
+ (src_skill / "scripts" / "helper.sh").write_text("#!/bin/sh\n")
198
+ # Run sync directly against this home.
199
+ outcomes = SyncEngine().sync_all(home)
200
+ # We just need to know the projection didn't crash + skills were written.
201
+ self.assertTrue(any(o.get("skills_written", 0) >= 1 for o in outcomes),
202
+ msg=f"no skill projected; outcomes={outcomes}")
203
+
204
+ def test_flat_layout_still_works(self):
205
+ from omega_engine.sync import SyncEngine
206
+ with tempfile.TemporaryDirectory() as td:
207
+ home = Path(td)
208
+ src_dir = home / "Agentik_SSOT" / "skills"
209
+ src_dir.mkdir(parents=True)
210
+ (src_dir / "legacy.md").write_text("# legacy flat skill")
211
+ outcomes = SyncEngine().sync_all(home)
212
+ self.assertTrue(any(o.get("skills_written", 0) >= 1 for o in outcomes),
213
+ msg=f"flat layout not projected; outcomes={outcomes}")
214
+
215
+
216
+ if __name__ == "__main__":
217
+ unittest.main(verbosity=2)
@@ -0,0 +1,207 @@
1
+ """Tests for v0.19.2 fixes (full-system review pass):
2
+
3
+ 1. Topology role aliases (aisb→niobe, manager→keymaker, worker→construct,
4
+ audit→seraph) — load_agent_prompt now resolves them to the AISB suite.
5
+ 2. Every SSOT skill has valid YAML frontmatter (rag-route.md was the
6
+ last offender — now fixed).
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import os
11
+ import re
12
+ import sys
13
+ import tempfile
14
+ import unittest
15
+ from pathlib import Path
16
+
17
+
18
+ HERE = Path(__file__).resolve().parent
19
+ sys.path.insert(0, str(HERE.parent))
20
+
21
+ from omega_engine import prompts as P # noqa: E402
22
+
23
+
24
+ REPO_ROOT = Path(__file__).resolve().parents[3]
25
+ SSOT_SKILLS = REPO_ROOT / "omega" / "Agentik_SSOT" / "skills"
26
+
27
+
28
+ # ---------------------------------------------------------------------------
29
+ # Alias map
30
+ # ---------------------------------------------------------------------------
31
+
32
+
33
+ class TestRoleAliases(unittest.TestCase):
34
+ """Topology uses generic role names; AISB suite uses canonical names.
35
+ The alias map bridges the gap so `load_agent_prompt("worker")` resolves
36
+ to `construct.md`, etc."""
37
+
38
+ def _make_aisb(self, root: Path, *, names: list[str]) -> None:
39
+ """Seed a fake $OMEGA_HOME/Agentik_SSOT/agents/aisb/ tree."""
40
+ aisb = root / "Agentik_SSOT" / "agents" / "aisb"
41
+ aisb.mkdir(parents=True)
42
+ for n in names:
43
+ (aisb / f"{n}.md").write_text(
44
+ f"---\nname: {n}\n---\n# {n} agent prompt\nrole identity body."
45
+ )
46
+
47
+ def test_worker_resolves_to_construct(self):
48
+ with tempfile.TemporaryDirectory() as tmp:
49
+ home = Path(tmp)
50
+ self._make_aisb(home, names=["construct", "oracle", "seraph"])
51
+ P.clear_cache()
52
+ path = P.find_agent_file(home, "worker")
53
+ self.assertIsNotNone(path,
54
+ "worker should alias to construct.md")
55
+ self.assertEqual(path.name, "construct.md")
56
+
57
+ def test_manager_resolves_to_keymaker(self):
58
+ with tempfile.TemporaryDirectory() as tmp:
59
+ home = Path(tmp)
60
+ self._make_aisb(home, names=["keymaker", "oracle"])
61
+ P.clear_cache()
62
+ path = P.find_agent_file(home, "manager")
63
+ self.assertEqual(path.name, "keymaker.md")
64
+
65
+ def test_audit_resolves_to_seraph(self):
66
+ with tempfile.TemporaryDirectory() as tmp:
67
+ home = Path(tmp)
68
+ self._make_aisb(home, names=["seraph"])
69
+ P.clear_cache()
70
+ self.assertEqual(P.find_agent_file(home, "audit").name,
71
+ "seraph.md")
72
+
73
+ def test_aisb_resolves_to_niobe(self):
74
+ with tempfile.TemporaryDirectory() as tmp:
75
+ home = Path(tmp)
76
+ self._make_aisb(home, names=["niobe"])
77
+ P.clear_cache()
78
+ self.assertEqual(P.find_agent_file(home, "aisb").name,
79
+ "niobe.md")
80
+
81
+ def test_direct_match_wins_over_alias(self):
82
+ """If a topology defines its own ``worker.md``, that wins over the
83
+ alias-to-construct."""
84
+ with tempfile.TemporaryDirectory() as tmp:
85
+ home = Path(tmp)
86
+ self._make_aisb(home, names=["worker", "construct"])
87
+ P.clear_cache()
88
+ path = P.find_agent_file(home, "worker")
89
+ self.assertEqual(path.name, "worker.md")
90
+
91
+ def test_unknown_role_returns_none(self):
92
+ with tempfile.TemporaryDirectory() as tmp:
93
+ home = Path(tmp)
94
+ self._make_aisb(home, names=["oracle"])
95
+ P.clear_cache()
96
+ self.assertIsNone(P.find_agent_file(home, "nope-not-real"))
97
+
98
+ def test_load_agent_prompt_alias_pulls_body(self):
99
+ """load_agent_prompt should return the construct body when asked
100
+ for 'worker', not None."""
101
+ with tempfile.TemporaryDirectory() as tmp:
102
+ home = Path(tmp)
103
+ self._make_aisb(home, names=["construct"])
104
+ P.clear_cache()
105
+ body = P.load_agent_prompt(home, "worker")
106
+ self.assertIsNotNone(body)
107
+ self.assertIn("construct agent prompt", body)
108
+ self.assertIn("role identity body", body)
109
+
110
+ def test_alias_falls_back_to_other_suite(self):
111
+ """If aisb/ doesn't have it, the alias should also try other suites."""
112
+ with tempfile.TemporaryDirectory() as tmp:
113
+ home = Path(tmp)
114
+ other = home / "Agentik_SSOT" / "agents" / "custom"
115
+ other.mkdir(parents=True)
116
+ (other / "construct.md").write_text(
117
+ "---\nname: construct\n---\n# custom suite construct"
118
+ )
119
+ P.clear_cache()
120
+ path = P.find_agent_file(home, "worker")
121
+ self.assertIsNotNone(path)
122
+ self.assertTrue(str(path).endswith("custom/construct.md"))
123
+
124
+
125
+ class TestTopologyMappingMatchesTemplates(unittest.TestCase):
126
+ """The topology YAML's role names must all resolve to a real prompt
127
+ after applying the alias map. This guards against a topology drift
128
+ where a new role is added but no alias / no template ships."""
129
+
130
+ def test_every_topology_role_resolves(self):
131
+ import yaml as _yaml
132
+ topo = REPO_ROOT / "omega" / "Agentik_Orchestration" / "topologies" / "aisb-oracle-worker.yaml"
133
+ if not topo.exists():
134
+ self.skipTest("topology not present")
135
+ data = _yaml.safe_load(topo.read_text())
136
+ templates = REPO_ROOT / "bootstrap" / "templates" / "aisb"
137
+ if not templates.is_dir():
138
+ self.skipTest("AISB templates not present")
139
+ available = {p.stem for p in templates.glob("*.md")}
140
+ for node in data["nodes"]:
141
+ role = node["role"]
142
+ # The role itself OR its alias must be in the templates set
143
+ candidates = [role]
144
+ aliased = P._ROLE_ALIASES.get(role)
145
+ if aliased:
146
+ candidates.append(aliased)
147
+ self.assertTrue(
148
+ any(c in available for c in candidates),
149
+ f"topology role {role!r} has no template "
150
+ f"(tried {candidates}; available {sorted(available)})",
151
+ )
152
+
153
+
154
+ # ---------------------------------------------------------------------------
155
+ # SSOT skills frontmatter
156
+ # ---------------------------------------------------------------------------
157
+
158
+
159
+ class TestSSOTSkillsFrontmatter(unittest.TestCase):
160
+ """Every skill under Agentik_SSOT/skills/ must have a valid YAML
161
+ frontmatter (name + description). Without it, the skill is silently
162
+ skipped by the Claude Code skill loader."""
163
+
164
+ def test_every_skill_has_name_and_description(self):
165
+ if not SSOT_SKILLS.is_dir():
166
+ self.skipTest("SSOT skills dir not in repo")
167
+ bad: list[tuple[str, str]] = []
168
+ for entry in sorted(SSOT_SKILLS.iterdir()):
169
+ if entry.is_dir():
170
+ sm = entry / "SKILL.md"
171
+ elif entry.suffix == ".md":
172
+ sm = entry
173
+ else:
174
+ continue
175
+ if not sm.exists():
176
+ continue
177
+ src = sm.read_text()
178
+ if not src.startswith("---"):
179
+ bad.append((entry.name, "no frontmatter"))
180
+ continue
181
+ end = src.find("---", 3)
182
+ if end < 0:
183
+ bad.append((entry.name, "unclosed frontmatter"))
184
+ continue
185
+ fm = src[3:end]
186
+ if "name:" not in fm:
187
+ bad.append((entry.name, "no name field"))
188
+ if "description:" not in fm:
189
+ bad.append((entry.name, "no description field"))
190
+ self.assertEqual(bad, [],
191
+ f"SSOT skills with bad frontmatter: {bad}")
192
+
193
+ def test_rag_route_now_has_frontmatter(self):
194
+ if not SSOT_SKILLS.is_dir():
195
+ self.skipTest("SSOT skills dir not in repo")
196
+ p = SSOT_SKILLS / "rag-route.md"
197
+ if not p.exists():
198
+ self.skipTest("rag-route.md not present")
199
+ src = p.read_text()
200
+ self.assertTrue(src.startswith("---"),
201
+ "rag-route.md must have YAML frontmatter")
202
+ self.assertIn("name: rag-route", src)
203
+ self.assertIn("description:", src)
204
+
205
+
206
+ if __name__ == "__main__":
207
+ unittest.main()