@agentikos/omega-os 0.2.0 → 0.19.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -3
- package/bootstrap/lib/__pycache__/claude-code-settings.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/llm-clis.cpython-313.pyc +0 -0
- package/bootstrap/lib/__pycache__/manifest-helpers.cpython-313.pyc +0 -0
- package/bootstrap/lib/claude-code-settings.py +176 -0
- package/bootstrap/lib/common.sh +457 -1
- package/bootstrap/lib/llm-clis.py +341 -0
- package/bootstrap/lib/manifest-helpers.py +384 -0
- package/bootstrap/lib/steps.sh +790 -21
- package/bootstrap/manifest.example.yaml +87 -1
- package/bootstrap/templates/aisb/CLAUDE.md +305 -0
- package/bootstrap/templates/aisb/architect.md +204 -0
- package/bootstrap/templates/aisb/checkers/CLAUDE.md +9 -0
- package/bootstrap/templates/aisb/checkers/checker-architect.md +151 -0
- package/bootstrap/templates/aisb/checkers/checker-common.md +171 -0
- package/bootstrap/templates/aisb/checkers/checker-construct.md +129 -0
- package/bootstrap/templates/aisb/checkers/checker-keymaker.md +204 -0
- package/bootstrap/templates/aisb/checkers/checker-link.md +205 -0
- package/bootstrap/templates/aisb/checkers/checker-merovingian.md +219 -0
- package/bootstrap/templates/aisb/checkers/checker-morpheus.md +211 -0
- package/bootstrap/templates/aisb/checkers/checker-neo.md +177 -0
- package/bootstrap/templates/aisb/checkers/checker-niobe.md +156 -0
- package/bootstrap/templates/aisb/checkers/checker-oracle.md +164 -0
- package/bootstrap/templates/aisb/checkers/checker-seraph.md +187 -0
- package/bootstrap/templates/aisb/checkers/checker-smith.md +195 -0
- package/bootstrap/templates/aisb/checkers/checker-zion.md +113 -0
- package/bootstrap/templates/aisb/construct.md +135 -0
- package/bootstrap/templates/aisb/keymaker.md +227 -0
- package/bootstrap/templates/aisb/link.md +170 -0
- package/bootstrap/templates/aisb/lmc-protocol.md +57 -0
- package/bootstrap/templates/aisb/merovingian.md +159 -0
- package/bootstrap/templates/aisb/morpheus.md +243 -0
- package/bootstrap/templates/aisb/neo.md +147 -0
- package/bootstrap/templates/aisb/niobe.md +197 -0
- package/bootstrap/templates/aisb/oracle.md +244 -0
- package/bootstrap/templates/aisb/protocols/handoff-templates.md +204 -0
- package/bootstrap/templates/aisb/protocols/shared-protocol.md +248 -0
- package/bootstrap/templates/aisb/pythia.md +153 -0
- package/bootstrap/templates/aisb/seraph.md +315 -0
- package/bootstrap/templates/aisb/smith.md +202 -0
- package/bootstrap/templates/aisb/zion.md +172 -0
- package/bootstrap/templates/autonomous/audit-patrol.yaml +41 -0
- package/bootstrap/templates/autonomous/smith-reflect.yaml +43 -0
- package/bootstrap/templates/autonomous/ssh-key-rotate.yaml +46 -0
- package/bootstrap/templates/autonomous/support-agent.yaml +38 -0
- package/docs/AUDITS.md +85 -0
- package/docs/GAP-ANALYSIS.md +214 -0
- package/docs/INSTALL.md +47 -9
- package/docs/MCP-AND-PLUGINS.md +31 -4
- package/docs/SIMULATION.md +171 -0
- package/docs/simulate.sh +211 -0
- package/install.sh +164 -17
- package/omega/Agentik_Engine/README.md +4 -2
- package/omega/Agentik_Engine/omega_engine/__init__.py +147 -1
- package/omega/Agentik_Engine/omega_engine/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/agent_messages.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_diff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/audit_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/auto_update.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/backup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/barrier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/bus.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/classifier.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/cli.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/completions.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/costs.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/done_signal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/events.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_bootstrap.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/hermes_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/learning.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/memory.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prompts.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/provider.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/prune.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/pursue.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/smoke.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/store.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/supervisor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/task.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tmux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/tools.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/understand_anything.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/updater.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/validate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/webhooks.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/__pycache__/worker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/account.py +28 -31
- package/omega/Agentik_Engine/omega_engine/agent_messages.py +167 -0
- package/omega/Agentik_Engine/omega_engine/aisb_chat.py +128 -0
- package/omega/Agentik_Engine/omega_engine/audit_diff.py +99 -0
- package/omega/Agentik_Engine/omega_engine/audit_gate.py +149 -0
- package/omega/Agentik_Engine/omega_engine/audits/__init__.py +60 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/batcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/dispatcher.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/generator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/__pycache__/pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/audits/batcher.py +218 -0
- package/omega/Agentik_Engine/omega_engine/audits/dispatcher.py +92 -0
- package/omega/Agentik_Engine/omega_engine/audits/generator.py +234 -0
- package/omega/Agentik_Engine/omega_engine/audits/history.py +168 -0
- package/omega/Agentik_Engine/omega_engine/audits/pipeline.py +198 -0
- package/omega/Agentik_Engine/omega_engine/auto_update.py +339 -0
- package/omega/Agentik_Engine/omega_engine/backup.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cadence.py +158 -0
- package/omega/Agentik_Engine/omega_engine/classifier.py +215 -0
- package/omega/Agentik_Engine/omega_engine/cleanup.py +673 -0
- package/omega/Agentik_Engine/omega_engine/cli.py +4156 -86
- package/omega/Agentik_Engine/omega_engine/completions.py +260 -0
- package/omega/Agentik_Engine/omega_engine/costs.py +100 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/engine.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/__pycache__/telegram.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +53 -4
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +101 -17
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/artifact.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/automation.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/claudecode.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/connection.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/coworker.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/loop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/prompt.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/educators/__pycache__/skill.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +149 -10
- package/omega/Agentik_Engine/omega_engine/genesis/__init__.py +134 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/orchestrator.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/phases.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/stack.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/__pycache__/state.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/genesis/orchestrator.py +262 -0
- package/omega/Agentik_Engine/omega_engine/genesis/phases.py +950 -0
- package/omega/Agentik_Engine/omega_engine/genesis/stack.py +324 -0
- package/omega/Agentik_Engine/omega_engine/genesis/state.py +353 -0
- package/omega/Agentik_Engine/omega_engine/handoff.py +459 -0
- package/omega/Agentik_Engine/omega_engine/hermes.py +426 -0
- package/omega/Agentik_Engine/omega_engine/hermes_bootstrap.py +382 -0
- package/omega/Agentik_Engine/omega_engine/hermes_desktop.py +469 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__init__.py +30 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/__pycache__/graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/integrations/graphify.py +234 -0
- package/omega/Agentik_Engine/omega_engine/learning.py +268 -0
- package/omega/Agentik_Engine/omega_engine/managed_agent.py +467 -0
- package/omega/Agentik_Engine/omega_engine/memory.py +271 -0
- package/omega/Agentik_Engine/omega_engine/menu.py +1065 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__init__.py +144 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/__pycache__/v0_14_0.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/migrations/v0_14_0.py +29 -0
- package/omega/Agentik_Engine/omega_engine/mission.py +16 -13
- package/omega/Agentik_Engine/omega_engine/plan.py +846 -0
- package/omega/Agentik_Engine/omega_engine/prompts.py +158 -0
- package/omega/Agentik_Engine/omega_engine/provider.py +161 -12
- package/omega/Agentik_Engine/omega_engine/prune.py +151 -0
- package/omega/Agentik_Engine/omega_engine/pursue.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/agentic.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/base.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/corrective.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/graph.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/hybrid.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/multimodal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/rag/__pycache__/router.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/router.py +28 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__init__.py +48 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/__init__.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/auditor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/finder.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/installer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/__pycache__/marketplaces.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/auditor.py +232 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/finder.py +94 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/installer.py +129 -0
- package/omega/Agentik_Engine/omega_engine/skill_discovery/marketplaces.py +80 -0
- package/omega/Agentik_Engine/omega_engine/skill_routing.py +388 -0
- package/omega/Agentik_Engine/omega_engine/smoke.py +81 -0
- package/omega/Agentik_Engine/omega_engine/store.py +88 -41
- package/omega/Agentik_Engine/omega_engine/sync.py +142 -1
- package/omega/Agentik_Engine/omega_engine/telegram_history.py +260 -0
- package/omega/Agentik_Engine/omega_engine/tmux.py +526 -0
- package/omega/Agentik_Engine/omega_engine/understand_anything.py +275 -0
- package/omega/Agentik_Engine/omega_engine/updater.py +70 -0
- package/omega/Agentik_Engine/omega_engine/validate.py +186 -0
- package/omega/Agentik_Engine/omega_engine/vault.py +342 -0
- package/omega/Agentik_Engine/omega_engine/webhooks.py +262 -0
- package/omega/Agentik_Engine/omega_engine/worker.py +526 -0
- package/omega/Agentik_Engine/pyproject.toml +1 -1
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_account.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_adversarial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_agents_envelope.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audit_arsenal.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_audits_pipeline.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_auto_update_and_migrations.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_autonomous.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_educators.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_executor.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_genesis_and_plan.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_graphify.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_handoff.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_and_ua.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_hermes_bootstrap_and_desktop.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_steps.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_install_ux.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_installer_wiring.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_intelligence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_llm_clis_and_uninstall.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_managed_agent.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_max_provider_and_menu.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_menu_coverage.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_mission.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_progress.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_project.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_pursue_cadence.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_rag.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_reducer.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_report.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_role_aliases_and_ssot.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_discovery_and_gate.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_power.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_skill_routing.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_snapshot_partial.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_telegram_history.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tmux_and_aisb_chat.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_tools_and_sync.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_v06_features.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_vault.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_webhooks_and_readiness.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313-pytest-8.4.2.pyc +0 -0
- package/omega/Agentik_Engine/tests/__pycache__/test_worker_and_cleanup.cpython-313.pyc +0 -0
- package/omega/Agentik_Engine/tests/test_account.py +8 -3
- package/omega/Agentik_Engine/tests/test_adversarial.py +351 -0
- package/omega/Agentik_Engine/tests/test_agents_envelope.py +274 -0
- package/omega/Agentik_Engine/tests/test_audits_pipeline.py +348 -0
- package/omega/Agentik_Engine/tests/test_auto_update_and_migrations.py +394 -0
- package/omega/Agentik_Engine/tests/test_genesis_and_plan.py +573 -0
- package/omega/Agentik_Engine/tests/test_graphify.py +190 -0
- package/omega/Agentik_Engine/tests/test_handoff.py +311 -0
- package/omega/Agentik_Engine/tests/test_hermes_and_ua.py +387 -0
- package/omega/Agentik_Engine/tests/test_hermes_bootstrap_and_desktop.py +358 -0
- package/omega/Agentik_Engine/tests/test_install_steps.py +359 -0
- package/omega/Agentik_Engine/tests/test_install_ux.py +151 -0
- package/omega/Agentik_Engine/tests/test_installer_wiring.py +496 -0
- package/omega/Agentik_Engine/tests/test_intelligence.py +285 -0
- package/omega/Agentik_Engine/tests/test_llm_clis_and_uninstall.py +228 -0
- package/omega/Agentik_Engine/tests/test_managed_agent.py +363 -0
- package/omega/Agentik_Engine/tests/test_max_provider_and_menu.py +231 -0
- package/omega/Agentik_Engine/tests/test_menu_coverage.py +72 -0
- package/omega/Agentik_Engine/tests/test_pursue_cadence.py +217 -0
- package/omega/Agentik_Engine/tests/test_role_aliases_and_ssot.py +207 -0
- package/omega/Agentik_Engine/tests/test_skill_discovery_and_gate.py +337 -0
- package/omega/Agentik_Engine/tests/test_skill_power.py +259 -0
- package/omega/Agentik_Engine/tests/test_skill_routing.py +189 -0
- package/omega/Agentik_Engine/tests/test_telegram_history.py +209 -0
- package/omega/Agentik_Engine/tests/test_tmux_and_aisb_chat.py +223 -0
- package/omega/Agentik_Engine/tests/test_v06_features.py +370 -0
- package/omega/Agentik_Engine/tests/test_vault.py +173 -0
- package/omega/Agentik_Engine/tests/test_webhooks_and_readiness.py +277 -0
- package/omega/Agentik_Engine/tests/test_worker_and_cleanup.py +541 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-key +3 -0
- package/omega/Agentik_Extra/etc/secrets/.vault-pub +1 -0
- package/omega/Agentik_Runtime/audits.db +0 -0
- package/omega/Agentik_SSOT/VERSION +1 -1
- package/omega/Agentik_SSOT/claude-plugins/claude-plugins.yaml +100 -0
- package/omega/Agentik_SSOT/docs/LAYERS.md +90 -0
- package/omega/Agentik_SSOT/docs/USER-JOURNEY.md +283 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-INTERCONNECTIONS.md +283 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/ARSENAL-ORCHESTRATION-PLAYBOOK.md +364 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/AUDIT-VERIFICATION-CONTRACT.md +272 -0
- package/omega/Agentik_SSOT/docs/quality-arsenal/QUALITY-ARSENAL-PREAMBLE.md +462 -0
- package/omega/Agentik_SSOT/marketplaces/design-discipline.yaml +86 -0
- package/omega/Agentik_SSOT/skills/a11yaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/apiaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/audit-orchestrator.md +212 -0
- package/omega/Agentik_SSOT/skills/audit-pilot.md +466 -0
- package/omega/Agentik_SSOT/skills/audit-tracker.md +147 -0
- package/omega/Agentik_SSOT/skills/automationaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/cadence/SKILL.md +76 -0
- package/omega/Agentik_SSOT/skills/codeaudit/SKILL.md +153 -0
- package/omega/Agentik_SSOT/skills/copyaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dataaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/debugaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/dispatch/SKILL.md +79 -0
- package/omega/Agentik_SSOT/skills/dxaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/featureaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/flowaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/genesis/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/handoff/SKILL.md +117 -0
- package/omega/Agentik_SSOT/skills/logicaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/motionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/newcmd.md +300 -0
- package/omega/Agentik_SSOT/skills/perfaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/plan/SKILL.md +127 -0
- package/omega/Agentik_SSOT/skills/pursue/SKILL.md +68 -0
- package/omega/Agentik_SSOT/skills/quality-arsenal.md +180 -0
- package/omega/Agentik_SSOT/skills/rag-route.md +9 -0
- package/omega/Agentik_SSOT/skills/refontaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/retentionaudit/SKILL.md +165 -0
- package/omega/Agentik_SSOT/skills/secaudit/SKILL.md +157 -0
- package/omega/Agentik_SSOT/skills/seoaudit/SKILL.md +161 -0
- package/omega/Agentik_SSOT/skills/skill-auditor/SKILL.md +83 -0
- package/omega/Agentik_SSOT/skills/skill-finder/SKILL.md +116 -0
- package/omega/Agentik_SSOT/skills/uiuxaudit/SKILL.md +165 -0
- 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()
|