@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,205 @@
1
+ """pursue — goal-driven execution loop.
2
+
3
+ The Agentik OS native equivalent of a goal-driven worker. Takes a
4
+ ``verify_cmd`` and an ``intent``. Iterates: ask the provider to act, run
5
+ ``verify_cmd``, if exit 0 → success; otherwise feed the failure back and
6
+ iterate. Caps at ``max_iterations`` and writes a per-iteration log.
7
+
8
+ Why this exists:
9
+ Claude Code's bundled ``/goal`` does this in the editor. We rebuild it
10
+ as a portable engine primitive so OmegaOS workers (running in any
11
+ context — daemon, CLI, autonomous charter) can use the same loop without
12
+ depending on a specific bundled skill we don't control.
13
+
14
+ Output:
15
+ Each iteration appends to ``Agentik_Runtime/sessions/<task_id>/pursue.log``
16
+ with ``{iteration, attempted_change, verify_exit, verify_tail}``.
17
+ On success, writes a ``done.json`` (via ``omega_engine.done_signal``)
18
+ with ``status=done_clean`` and a summary. On budget exhaustion, the same
19
+ but with ``status=failed`` and the cumulative attempts as ``errors``.
20
+
21
+ The provider used is the engine's normal ModelRouter — works with the
22
+ MockProvider in tests and with ClaudeProvider in production.
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import json
27
+ import os
28
+ import shlex
29
+ import subprocess
30
+ import time
31
+ import uuid
32
+ from dataclasses import dataclass, field
33
+ from pathlib import Path
34
+ from typing import Any
35
+
36
+
37
+ @dataclass
38
+ class PursueResult:
39
+ task_id: str
40
+ status: str # "done_clean" | "failed"
41
+ iterations: int
42
+ final_verify_exit: int | None
43
+ log_path: Path
44
+ done_path: Path
45
+ artifacts: dict[str, Any] = field(default_factory=dict)
46
+
47
+
48
+ def _run_verify(verify_cmd: str, *, cwd: str | None = None,
49
+ timeout: int = 600) -> tuple[int, str]:
50
+ """Run the verify command in a shell and capture (exit_code, tail-of-output).
51
+
52
+ Returns a 2-tuple. ``tail`` is the last ~80 lines of stdout+stderr so we
53
+ can feed it back to the provider as the iteration's "what broke" context.
54
+ """
55
+ try:
56
+ proc = subprocess.run(
57
+ verify_cmd, shell=True, check=False, capture_output=True,
58
+ text=True, timeout=timeout, cwd=cwd,
59
+ )
60
+ except subprocess.TimeoutExpired:
61
+ return 124, "(verify_cmd timed out)"
62
+ out = (proc.stdout or "") + (proc.stderr or "")
63
+ tail = "\n".join(out.splitlines()[-80:])
64
+ return proc.returncode, tail
65
+
66
+
67
+ def pursue(
68
+ intent: str,
69
+ verify_cmd: str,
70
+ *,
71
+ omega_home: str | Path | None = None,
72
+ task_id: str | None = None,
73
+ project: str | None = None,
74
+ max_iterations: int = 20,
75
+ cwd: str | None = None,
76
+ role: str = "worker",
77
+ timeout_per_iter: int = 600,
78
+ router=None,
79
+ ) -> PursueResult:
80
+ """Drive an agent toward a goal until ``verify_cmd`` exits 0.
81
+
82
+ Args:
83
+ intent: the natural-language goal the agent is pursuing.
84
+ verify_cmd: the shell command that proves the goal is met (exit 0).
85
+ omega_home: ``$OMEGA_HOME`` (defaults to env or ``~/Omega``).
86
+ task_id: optional id; one is generated if not provided.
87
+ project: project slug; if set, the cwd defaults to that project's
88
+ directory and per-project artefacts live there.
89
+ max_iterations: hard cap on attempts (default 20).
90
+ cwd: working directory for ``verify_cmd``. Defaults to project path
91
+ when ``project`` is set, else current directory.
92
+ role: provider role to use (default ``worker``).
93
+ timeout_per_iter: timeout (seconds) per provider call + verify pair.
94
+ router: an ``omega_engine.router.ModelRouter`` — defaults to one
95
+ built from env (mock if no real provider configured).
96
+
97
+ Returns: a ``PursueResult`` describing the outcome.
98
+ """
99
+ home = Path(omega_home or os.environ.get("OMEGA_HOME") or
100
+ Path.home() / "Omega")
101
+ task_id = task_id or "pur-" + uuid.uuid4().hex[:8]
102
+
103
+ # Local imports — keep this module's import-cost low.
104
+ from omega_engine.done_signal import DoneSignal, session_dir, write_done
105
+ from omega_engine.envelope import EnvelopeContext, build_envelope
106
+ from omega_engine.provider import AgentRequest
107
+
108
+ if router is None:
109
+ from omega_engine.router import ModelRouter
110
+ from omega_engine.provider import MockProvider
111
+ router = ModelRouter.single(MockProvider())
112
+
113
+ # Resolve cwd from project if not explicit.
114
+ if cwd is None and project:
115
+ cwd = str(home / "Agentik_Coding" / "projects" / project)
116
+ cwd = cwd or os.getcwd()
117
+
118
+ sess = session_dir(home, task_id)
119
+ log_path = sess / "pursue.log"
120
+ done_p = sess / ".done.json"
121
+
122
+ def log_iter(payload: dict[str, Any]) -> None:
123
+ with open(log_path, "a") as fh:
124
+ fh.write(json.dumps({"ts": int(time.time()), **payload}) + "\n")
125
+
126
+ provider = router.resolve(role)
127
+ last_exit: int | None = None
128
+ last_tail: str = ""
129
+ attempts: list[dict[str, Any]] = []
130
+
131
+ for i in range(1, max_iterations + 1):
132
+ # Build a rich envelope: the agent sees the goal, the verify_cmd,
133
+ # the previous failure tail, and its done.json contract.
134
+ ctx = EnvelopeContext(
135
+ role=role,
136
+ intent=(
137
+ f"GOAL: {intent}\n\n"
138
+ f"VERIFY: `{verify_cmd}` (must exit 0 to be done).\n\n"
139
+ + (f"PREVIOUS FAILURE (iter {i - 1}, exit {last_exit}):\n"
140
+ f"```\n{last_tail}\n```\n" if i > 1 else "")
141
+ + f"This is iteration {i} of {max_iterations}. "
142
+ f"Make one focused, surgical change."
143
+ ),
144
+ task_id=task_id,
145
+ verify_cmd=verify_cmd,
146
+ done_json_path=str(done_p),
147
+ project={"slug": project, "path": cwd} if project else None,
148
+ )
149
+ envelope = build_envelope(home, ctx)
150
+ request = AgentRequest(
151
+ role=role, prompt=envelope["user"], context={
152
+ "task": intent, "verify_cmd": verify_cmd,
153
+ }, system=envelope["system"],
154
+ )
155
+
156
+ try:
157
+ result = provider.run(request)
158
+ except Exception as exc: # noqa: BLE001
159
+ log_iter({"iter": i, "provider_error": str(exc)[:300]})
160
+ attempts.append({"iter": i, "error": str(exc)[:300]})
161
+ continue
162
+
163
+ # Run verify after the provider's turn.
164
+ exit_code, tail = _run_verify(
165
+ verify_cmd, cwd=cwd, timeout=timeout_per_iter,
166
+ )
167
+ last_exit = exit_code
168
+ last_tail = tail
169
+ log_iter({
170
+ "iter": i, "verify_exit": exit_code,
171
+ "provider_text": (result.text or "")[:300],
172
+ "verify_tail": tail[-400:],
173
+ })
174
+ attempts.append({"iter": i, "exit": exit_code})
175
+
176
+ if exit_code == 0:
177
+ sig = DoneSignal(
178
+ status="done_clean",
179
+ summary=f"goal '{intent}' verified by `{verify_cmd}` in {i} iter(s)",
180
+ artifacts={"attempts": attempts, "log": str(log_path)},
181
+ files_changed=list(result.artifacts.get("files") or []),
182
+ )
183
+ write_done(home, task_id, sig)
184
+ return PursueResult(
185
+ task_id=task_id, status="done_clean", iterations=i,
186
+ final_verify_exit=0, log_path=log_path, done_path=done_p,
187
+ artifacts=dict(sig.artifacts),
188
+ )
189
+
190
+ # Budget exhausted — honest failure.
191
+ sig = DoneSignal(
192
+ status="failed",
193
+ summary=(
194
+ f"goal '{intent}' not met after {max_iterations} iterations "
195
+ f"(last exit {last_exit})"
196
+ ),
197
+ artifacts={"attempts": attempts, "log": str(log_path)},
198
+ errors=[f"final verify exit: {last_exit}", last_tail[-200:]],
199
+ )
200
+ write_done(home, task_id, sig)
201
+ return PursueResult(
202
+ task_id=task_id, status="failed", iterations=max_iterations,
203
+ final_verify_exit=last_exit, log_path=log_path, done_path=done_p,
204
+ artifacts=dict(sig.artifacts),
205
+ )
@@ -32,3 +32,31 @@ class ModelRouter:
32
32
  def single(cls, provider: AgentProvider) -> "ModelRouter":
33
33
  """A router that sends every role to one provider — used for tests."""
34
34
  return cls({provider.id: provider}, {}, provider.id)
35
+
36
+ @classmethod
37
+ def auto(cls) -> "ModelRouter":
38
+ """Build the best router for the host.
39
+
40
+ Preference order:
41
+
42
+ 1. ``claude`` CLI on PATH + logged in → ClaudeMaxProvider
43
+ (Max subscription, no API key).
44
+ 2. ``ANTHROPIC_API_KEY`` env var set → ClaudeProvider (API).
45
+ 3. Otherwise → MockProvider (deterministic offline).
46
+
47
+ Use this everywhere the engine needs a "sensible default" — the
48
+ mission runner, smoke, pursue, audit pipeline. Tests still use
49
+ ``single(MockProvider())`` for determinism.
50
+ """
51
+ import os
52
+ from omega_engine.provider import (
53
+ ClaudeMaxProvider,
54
+ ClaudeProvider,
55
+ MockProvider,
56
+ )
57
+
58
+ if ClaudeMaxProvider.is_available():
59
+ return cls.single(ClaudeMaxProvider())
60
+ if os.environ.get("ANTHROPIC_API_KEY"):
61
+ return cls.single(ClaudeProvider())
62
+ return cls.single(MockProvider())
@@ -0,0 +1,48 @@
1
+ """Skill discovery + safety audit for Claude Code skills.
2
+
3
+ OmegaOS pulls skills from many sources: the curated SSOT, Anthropic's
4
+ official marketplace, Vercel Labs' skills CLI, davila7 templates, ad-hoc
5
+ GitHub repos. Each source is a different trust surface. This package is
6
+ the safety net:
7
+
8
+ * ``marketplaces.py`` — the catalog of known marketplaces with a
9
+ ``trust`` rating.
10
+ * ``auditor.py`` — static + heuristic safety check on a SKILL.md
11
+ before it lands in ``~/.claude/skills/``.
12
+ * ``finder.py`` — search across marketplaces.
13
+ * ``installer.py`` — validated install with audit gate.
14
+
15
+ The user's hard rule: every new skill must pass the auditor first.
16
+ Malware patterns (shell-pipe-curl-bash, ``eval``, opaque base64 blobs)
17
+ hard-fail; suspicious-but-legitimate patterns (broad ``allowed-tools``,
18
+ external network calls) warn but don't block — the operator gets the
19
+ report and decides.
20
+ """
21
+ from omega_engine.skill_discovery.auditor import (
22
+ SkillAuditIssue,
23
+ SkillAuditVerdict,
24
+ audit_skill_file,
25
+ audit_skill_text,
26
+ )
27
+ from omega_engine.skill_discovery.finder import (
28
+ DiscoveredSkill,
29
+ discover_skills,
30
+ list_curated,
31
+ )
32
+ from omega_engine.skill_discovery.installer import (
33
+ SkillInstallResult,
34
+ install_skill_from_github,
35
+ )
36
+ from omega_engine.skill_discovery.marketplaces import (
37
+ Marketplace,
38
+ load_marketplaces,
39
+ )
40
+
41
+
42
+ __all__ = [
43
+ "Marketplace", "load_marketplaces",
44
+ "SkillAuditIssue", "SkillAuditVerdict",
45
+ "audit_skill_file", "audit_skill_text",
46
+ "DiscoveredSkill", "discover_skills", "list_curated",
47
+ "SkillInstallResult", "install_skill_from_github",
48
+ ]
@@ -0,0 +1,232 @@
1
+ """Skill safety auditor — block obvious malware before install.
2
+
3
+ A SKILL.md can ship arbitrary instructions and tool grants. We treat
4
+ each candidate skill as untrusted and run a battery of static checks
5
+ that catch the most common attack patterns:
6
+
7
+ * ``curl … | sh`` and equivalents — remote code execution on install
8
+ * Opaque base64/hex blobs > N bytes — likely encoded payloads
9
+ * ``eval`` / ``exec(`` / ``os.system`` in inline scripts
10
+ * Network calls to unfamiliar hosts
11
+ * ``allowed-tools`` that grants ``Bash`` unrestricted (no glob)
12
+ * Hidden HTML/script injection in markdown
13
+ * Missing ``description`` / ``name`` (signals careless author)
14
+ * Excessive size (likely scraped content, not a real skill)
15
+
16
+ Issues are tagged ``severity`` ∈ {block, warn, info}. The verdict
17
+ function aggregates into a score (0-100) and a verified-or-not boolean.
18
+ Block-severity issues hard-fail (verified=False, score capped).
19
+ """
20
+ from __future__ import annotations
21
+
22
+ import re
23
+ from dataclasses import dataclass, field
24
+ from pathlib import Path
25
+ from typing import Any
26
+
27
+ import yaml
28
+
29
+
30
+ # ---- patterns ----------------------------------------------------------------
31
+
32
+ # `curl ... | sh` / `wget ... | bash` and similar pipe-and-execute patterns.
33
+ _PIPE_EXEC_RE = re.compile(
34
+ r"(?:curl|wget|fetch)\b[^|;]*?\|\s*(?:sh|bash|zsh|fish|pwsh|python\d?)",
35
+ re.IGNORECASE,
36
+ )
37
+
38
+ # `eval(...)`, `exec(...)`, `os.system(...)`, `subprocess.call(... shell=True ...)`
39
+ _EVAL_EXEC_RE = re.compile(
40
+ r"\b(eval|exec)\s*\(", re.IGNORECASE,
41
+ )
42
+ _OS_SYSTEM_RE = re.compile(
43
+ r"\b(os\.system|subprocess\.\w+\([^)]*shell\s*=\s*True)",
44
+ re.IGNORECASE,
45
+ )
46
+
47
+ # Long base64-looking blocks (40+ continuous base64 chars on one line).
48
+ _BASE64_RE = re.compile(r"[A-Za-z0-9+/=]{120,}")
49
+
50
+ # Catchy script tags inside markdown.
51
+ _SCRIPT_TAG_RE = re.compile(r"<\s*script\b", re.IGNORECASE)
52
+
53
+ # Unrestricted Bash grant: just `Bash` (no glob) is a red flag.
54
+ _BASH_FREE_RE = re.compile(r"(?:^|\s)Bash(?!\(|[A-Za-z])")
55
+
56
+ # Network calls to suspicious hosts (raw IPs, .ru/.cn/.tk).
57
+ _SUSPICIOUS_HOST_RE = re.compile(
58
+ r"https?://(?:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|[^/\s]+\.(?:ru|cn|tk|onion))",
59
+ re.IGNORECASE,
60
+ )
61
+
62
+ # Hidden HTML comments that might mask code.
63
+ _HTML_COMMENT_RE = re.compile(r"<!--.*?-->", re.DOTALL)
64
+
65
+
66
+ # ---- data model --------------------------------------------------------------
67
+
68
+
69
+ @dataclass(frozen=True)
70
+ class SkillAuditIssue:
71
+ severity: str # "block" | "warn" | "info"
72
+ rule: str # short rule id (e.g. "pipe-exec")
73
+ message: str
74
+ excerpt: str = "" # the offending snippet, trimmed
75
+
76
+
77
+ @dataclass
78
+ class SkillAuditVerdict:
79
+ skill_name: str
80
+ score: int # 0-100
81
+ verified: bool # iff no block issues
82
+ issues: list[SkillAuditIssue] = field(default_factory=list)
83
+ metadata: dict[str, Any] = field(default_factory=dict)
84
+
85
+ @property
86
+ def block_count(self) -> int:
87
+ return sum(1 for i in self.issues if i.severity == "block")
88
+
89
+ @property
90
+ def warn_count(self) -> int:
91
+ return sum(1 for i in self.issues if i.severity == "warn")
92
+
93
+
94
+ # ---- the audit ---------------------------------------------------------------
95
+
96
+
97
+ def _split_frontmatter(text: str) -> tuple[dict[str, Any], str]:
98
+ """Split YAML frontmatter from the body. Returns (frontmatter, body)."""
99
+ m = re.match(r"^---\s*\n(.*?)\n---\s*\n", text, re.DOTALL)
100
+ if not m:
101
+ return {}, text
102
+ try:
103
+ front = yaml.safe_load(m.group(1)) or {}
104
+ except yaml.YAMLError:
105
+ front = {}
106
+ return (front if isinstance(front, dict) else {}), text[m.end():]
107
+
108
+
109
+ def audit_skill_text(
110
+ text: str, *, skill_name: str = "<unnamed>",
111
+ ) -> SkillAuditVerdict:
112
+ """Audit a SKILL.md body in memory. Returns the structured verdict."""
113
+ issues: list[SkillAuditIssue] = []
114
+ front, body = _split_frontmatter(text)
115
+
116
+ # --- frontmatter sanity ---
117
+ if not front.get("name") and skill_name == "<unnamed>":
118
+ issues.append(SkillAuditIssue(
119
+ "warn", "missing-name",
120
+ "skill has no `name` in frontmatter or filename",
121
+ ))
122
+ if not front.get("description"):
123
+ issues.append(SkillAuditIssue(
124
+ "warn", "missing-description",
125
+ "skill has no `description` — operators can't tell what it does",
126
+ ))
127
+ allowed = front.get("allowed-tools") or ""
128
+ if isinstance(allowed, list):
129
+ allowed_str = " ".join(str(x) for x in allowed)
130
+ else:
131
+ allowed_str = str(allowed)
132
+ if _BASH_FREE_RE.search(" " + allowed_str + " "):
133
+ issues.append(SkillAuditIssue(
134
+ "warn", "unrestricted-bash",
135
+ "`allowed-tools` grants `Bash` without a glob — any shell "
136
+ "command runs without per-use approval",
137
+ ))
138
+ if front.get("disable-model-invocation") is False and not front.get("description"):
139
+ issues.append(SkillAuditIssue(
140
+ "warn", "auto-invoke-no-desc",
141
+ "auto-invocable skill with no description — Claude can't "
142
+ "decide when to use it",
143
+ ))
144
+
145
+ # --- body patterns ---
146
+ for match in _PIPE_EXEC_RE.finditer(body):
147
+ issues.append(SkillAuditIssue(
148
+ "block", "pipe-exec",
149
+ "downloads-and-executes pattern detected (curl|sh, wget|bash)",
150
+ excerpt=match.group(0)[:120],
151
+ ))
152
+ for match in _OS_SYSTEM_RE.finditer(body):
153
+ issues.append(SkillAuditIssue(
154
+ "block", "shell-true-exec",
155
+ "subprocess with shell=True or os.system — arbitrary command exec",
156
+ excerpt=match.group(0)[:120],
157
+ ))
158
+ # eval/exec is sometimes legitimate (e.g. in code samples) — flag as warn.
159
+ for match in _EVAL_EXEC_RE.finditer(body):
160
+ issues.append(SkillAuditIssue(
161
+ "warn", "eval-exec",
162
+ "eval/exec call present — may be safe but warrants review",
163
+ excerpt=match.group(0)[:120],
164
+ ))
165
+ for match in _BASE64_RE.finditer(body):
166
+ issues.append(SkillAuditIssue(
167
+ "block", "opaque-blob",
168
+ "long base64-looking block (likely encoded payload)",
169
+ excerpt=match.group(0)[:60] + "…",
170
+ ))
171
+ if _SCRIPT_TAG_RE.search(body):
172
+ issues.append(SkillAuditIssue(
173
+ "warn", "script-tag",
174
+ "<script> tag in markdown — unusual for a SKILL.md",
175
+ ))
176
+ # Hidden HTML comments — count them; rarely needed in a SKILL.md.
177
+ comments = list(_HTML_COMMENT_RE.finditer(body))
178
+ if len(comments) > 5:
179
+ issues.append(SkillAuditIssue(
180
+ "info", "many-html-comments",
181
+ f"{len(comments)} HTML comments — could be hiding intent",
182
+ ))
183
+ for match in _SUSPICIOUS_HOST_RE.finditer(body):
184
+ issues.append(SkillAuditIssue(
185
+ "warn", "suspicious-host",
186
+ f"URL points at a suspicious host: {match.group(0)[:80]}",
187
+ ))
188
+
189
+ # Excessive size flag.
190
+ if len(text) > 200_000:
191
+ issues.append(SkillAuditIssue(
192
+ "warn", "excessive-size",
193
+ f"SKILL.md is {len(text):,} bytes — much larger than typical",
194
+ ))
195
+
196
+ # --- score ---
197
+ block_n = sum(1 for i in issues if i.severity == "block")
198
+ warn_n = sum(1 for i in issues if i.severity == "warn")
199
+ info_n = sum(1 for i in issues if i.severity == "info")
200
+ # Hard cap: any block → score ≤ 30 + verified=False.
201
+ score = 100 - (block_n * 35) - (warn_n * 8) - (info_n * 2)
202
+ if block_n > 0:
203
+ score = min(score, 30)
204
+ score = max(0, min(100, score))
205
+
206
+ return SkillAuditVerdict(
207
+ skill_name=str(front.get("name") or skill_name),
208
+ score=score, verified=(block_n == 0),
209
+ issues=issues,
210
+ metadata={
211
+ "size_bytes": len(text),
212
+ "frontmatter_keys": sorted(front.keys()) if front else [],
213
+ "block": block_n, "warn": warn_n, "info": info_n,
214
+ },
215
+ )
216
+
217
+
218
+ def audit_skill_file(path: str | Path) -> SkillAuditVerdict:
219
+ """Audit a SKILL.md by path."""
220
+ p = Path(path)
221
+ try:
222
+ text = p.read_text()
223
+ except OSError as exc:
224
+ return SkillAuditVerdict(
225
+ skill_name=p.stem,
226
+ score=0, verified=False,
227
+ issues=[SkillAuditIssue(
228
+ "block", "unreadable",
229
+ f"cannot read {p}: {exc}",
230
+ )],
231
+ )
232
+ return audit_skill_text(text, skill_name=p.parent.name)
@@ -0,0 +1,94 @@
1
+ """Skill discovery — search the curated marketplaces.
2
+
3
+ We don't try to be a general crawler. We rely on:
4
+
5
+ * The local SSOT catalog (``claude-plugins.yaml``) — every skill the
6
+ installer already knows about.
7
+ * The ``find-skills`` skill (Vercel Labs) — once installed, it's the
8
+ expert agent for live discovery via ``npx skills find``.
9
+
10
+ This module's job: return a normalised list of *known* skills, with
11
+ their marketplace + trust attribution, and let the CLI pass the list to
12
+ the auditor before any actual install.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ from dataclasses import dataclass
17
+ from pathlib import Path
18
+ from typing import Any
19
+
20
+ import yaml
21
+
22
+ from omega_engine.skill_discovery.marketplaces import (
23
+ Marketplace,
24
+ load_marketplaces,
25
+ )
26
+
27
+
28
+ @dataclass
29
+ class DiscoveredSkill:
30
+ name: str
31
+ description: str
32
+ marketplace_id: str
33
+ marketplace_trust: str
34
+ scope: str # "user" | "project" | "local"
35
+ recommended: bool = False
36
+ secrets: list[str] = None # type: ignore[assignment]
37
+ category: str = ""
38
+
39
+ def __post_init__(self) -> None:
40
+ if self.secrets is None:
41
+ self.secrets = []
42
+
43
+
44
+ def list_curated(omega_home: str | Path) -> list[DiscoveredSkill]:
45
+ """Read the curated skill list from the SSOT catalog."""
46
+ path = (Path(omega_home) / "Agentik_SSOT" / "claude-plugins"
47
+ / "claude-plugins.yaml")
48
+ if not path.exists():
49
+ return []
50
+ data = yaml.safe_load(path.read_text()) or {}
51
+ markets = {m.id: m for m in load_marketplaces(omega_home)}
52
+ out: list[DiscoveredSkill] = []
53
+ for entry in data.get("catalog") or []:
54
+ mid = entry.get("marketplace", "")
55
+ m = markets.get(mid)
56
+ out.append(DiscoveredSkill(
57
+ name=entry.get("name", entry.get("id", "?")),
58
+ description=entry.get("description", ""),
59
+ marketplace_id=mid,
60
+ marketplace_trust=(m.trust if m else "low"),
61
+ scope=entry.get("scope", "user"),
62
+ recommended=bool(entry.get("recommended", False)),
63
+ secrets=list(entry.get("secrets") or []),
64
+ category=entry.get("category", ""),
65
+ ))
66
+ return out
67
+
68
+
69
+ def discover_skills(
70
+ omega_home: str | Path,
71
+ *,
72
+ query: str | None = None,
73
+ min_trust: str = "low",
74
+ recommended_only: bool = False,
75
+ ) -> list[DiscoveredSkill]:
76
+ """Search the local catalog. ``query`` matches name + description
77
+ (case-insensitive substring). ``min_trust`` filters by marketplace
78
+ trust level. ``recommended_only`` returns only the curated picks.
79
+ """
80
+ from omega_engine.skill_discovery.marketplaces import trust_floor
81
+ floor = trust_floor(min_trust)
82
+ out: list[DiscoveredSkill] = []
83
+ q = (query or "").strip().lower()
84
+ for s in list_curated(omega_home):
85
+ if recommended_only and not s.recommended:
86
+ continue
87
+ if trust_floor(s.marketplace_trust) < floor:
88
+ continue
89
+ if q:
90
+ hay = f"{s.name} {s.description}".lower()
91
+ if q not in hay:
92
+ continue
93
+ out.append(s)
94
+ return out