@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,234 @@
|
|
|
1
|
+
"""Graphify integration — `safishamsi/graphify` as a Claude Code skill.
|
|
2
|
+
|
|
3
|
+
What graphify actually is (verified against the upstream CLI at runtime):
|
|
4
|
+
|
|
5
|
+
* `graphifyy` (PyPI) installs a CLI named `graphify`.
|
|
6
|
+
* `graphify install` registers a Claude Code **skill** at
|
|
7
|
+
`~/.claude/skills/graphify/`. From inside Claude Code, typing
|
|
8
|
+
`/graphify .` triggers the skill — Claude reads the files and writes
|
|
9
|
+
the graph to `<project>/graphify-out/`.
|
|
10
|
+
* The CLI itself does NOT extract graphs. It manages the skill
|
|
11
|
+
(`install`, `uninstall`) and queries an existing graph (`path`,
|
|
12
|
+
`explain`, `diagnose`, `global list`).
|
|
13
|
+
|
|
14
|
+
So this wrapper is intentionally lean. It:
|
|
15
|
+
|
|
16
|
+
1. detects whether the CLI is installed (`is_graphify_installed`)
|
|
17
|
+
2. registers the skill via `graphify install` (`graphify_install_skill`)
|
|
18
|
+
3. reads an existing `graphify-out/graph.json` and parses it
|
|
19
|
+
(`graphify_load_graph` → `GraphifyReport`)
|
|
20
|
+
4. merges the parsed graph into the engine's `GraphRetriever` so
|
|
21
|
+
multi-RAG can answer relational queries (`graphify_into_rag`)
|
|
22
|
+
|
|
23
|
+
The graph is BUILT by Claude inside Claude Code (`/graphify .`). The engine
|
|
24
|
+
CONSUMES the resulting `graph.json` — never the other way around.
|
|
25
|
+
"""
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import json
|
|
29
|
+
import shutil
|
|
30
|
+
import subprocess
|
|
31
|
+
from dataclasses import dataclass, field
|
|
32
|
+
from pathlib import Path
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_CLI = "graphify"
|
|
37
|
+
_DEFAULT_OUT = "graphify-out"
|
|
38
|
+
_DEFAULT_JSON = "graph.json"
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class GraphifyError(RuntimeError):
|
|
42
|
+
"""Base class for graphify integration errors."""
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class GraphifyNotInstalled(GraphifyError):
|
|
46
|
+
"""The `graphify` CLI is not on PATH."""
|
|
47
|
+
|
|
48
|
+
def __init__(self) -> None:
|
|
49
|
+
super().__init__(
|
|
50
|
+
"graphify CLI not found. Install with: `pip install graphifyy && "
|
|
51
|
+
"graphify install`"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class GraphifyGraphMissing(GraphifyError):
|
|
56
|
+
"""A `graphify-out/graph.json` was expected but not found."""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@dataclass
|
|
60
|
+
class GraphifyReport:
|
|
61
|
+
"""Parsed result of a graphify run.
|
|
62
|
+
|
|
63
|
+
`nodes`/`edges` are the parsed structure. `summary` is whatever
|
|
64
|
+
top-level metadata graphify wrote alongside (mode, repo path, version,
|
|
65
|
+
statistics). `json_path` is the actual file we read — usually
|
|
66
|
+
`output_dir/graph.json` but callers can point at any path.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
output_dir: Path
|
|
70
|
+
nodes: list[dict[str, Any]] = field(default_factory=list)
|
|
71
|
+
edges: list[dict[str, Any]] = field(default_factory=list)
|
|
72
|
+
summary: dict[str, Any] = field(default_factory=dict)
|
|
73
|
+
json_path: Path | None = None
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def html_path(self) -> Path:
|
|
77
|
+
return self.output_dir / "graph.html"
|
|
78
|
+
|
|
79
|
+
@property
|
|
80
|
+
def report_path(self) -> Path:
|
|
81
|
+
return self.output_dir / "GRAPH_REPORT.md"
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def is_graphify_installed() -> bool:
|
|
85
|
+
"""True iff the `graphify` CLI is on PATH."""
|
|
86
|
+
return shutil.which(_CLI) is not None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def graphify_version() -> str | None:
|
|
90
|
+
"""Return the CLI's reported version, or None if missing/unreadable."""
|
|
91
|
+
if not is_graphify_installed():
|
|
92
|
+
return None
|
|
93
|
+
try:
|
|
94
|
+
out = subprocess.run(
|
|
95
|
+
[_CLI, "--version"],
|
|
96
|
+
check=False, capture_output=True, text=True, timeout=30,
|
|
97
|
+
)
|
|
98
|
+
except (OSError, subprocess.SubprocessError):
|
|
99
|
+
return None
|
|
100
|
+
text = (out.stdout or out.stderr or "").strip()
|
|
101
|
+
return text or None
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def graphify_install_skill(*, platform: str = "claude") -> dict[str, Any]:
|
|
105
|
+
"""Register the graphify skill into a Claude-Code-compatible platform.
|
|
106
|
+
|
|
107
|
+
By default writes `~/.claude/skills/graphify/SKILL.md` (the Claude Code
|
|
108
|
+
skill that powers the `/graphify` slash command). Other supported
|
|
109
|
+
platforms include `cursor`, `gemini`, `codex` — see `graphify --help`.
|
|
110
|
+
|
|
111
|
+
Idempotent: re-running over an installed skill is safe (graphify itself
|
|
112
|
+
handles the overwrite).
|
|
113
|
+
"""
|
|
114
|
+
if not is_graphify_installed():
|
|
115
|
+
raise GraphifyNotInstalled()
|
|
116
|
+
try:
|
|
117
|
+
proc = subprocess.run(
|
|
118
|
+
[_CLI, "install", "--platform", platform],
|
|
119
|
+
check=False, capture_output=True, text=True, timeout=120,
|
|
120
|
+
)
|
|
121
|
+
except subprocess.TimeoutExpired as exc:
|
|
122
|
+
raise GraphifyError("graphify install timed out") from exc
|
|
123
|
+
if proc.returncode != 0:
|
|
124
|
+
raise GraphifyError(
|
|
125
|
+
f"graphify install (platform={platform}) exited "
|
|
126
|
+
f"{proc.returncode}: "
|
|
127
|
+
f"{(proc.stderr or proc.stdout or '').strip()[:500]}"
|
|
128
|
+
)
|
|
129
|
+
return {
|
|
130
|
+
"platform": platform,
|
|
131
|
+
"stdout": (proc.stdout or "").strip(),
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def graphify_load_graph(
|
|
136
|
+
target: str | Path,
|
|
137
|
+
*,
|
|
138
|
+
json_path: str | Path | None = None,
|
|
139
|
+
) -> GraphifyReport:
|
|
140
|
+
"""Load an existing `graphify-out/graph.json` and parse it.
|
|
141
|
+
|
|
142
|
+
The graph is produced by typing `/graphify .` inside Claude Code at
|
|
143
|
+
`target/`. This function never invokes Claude — it only consumes the
|
|
144
|
+
artefact Claude produced.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
target: the project root. We look for `target/graphify-out/graph.json`.
|
|
148
|
+
json_path: override the JSON path explicitly (skips the default lookup).
|
|
149
|
+
|
|
150
|
+
Raises:
|
|
151
|
+
GraphifyGraphMissing: no graph.json found at the resolved location.
|
|
152
|
+
GraphifyError: the file exists but isn't parseable.
|
|
153
|
+
"""
|
|
154
|
+
if json_path is not None:
|
|
155
|
+
jp = Path(json_path).resolve()
|
|
156
|
+
else:
|
|
157
|
+
jp = (Path(target) / _DEFAULT_OUT / _DEFAULT_JSON).resolve()
|
|
158
|
+
|
|
159
|
+
if not jp.exists():
|
|
160
|
+
raise GraphifyGraphMissing(
|
|
161
|
+
f"no graph.json at {jp}. "
|
|
162
|
+
f"Build one with `/graphify .` inside Claude Code at {target!s}."
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
try:
|
|
166
|
+
data = json.loads(jp.read_text())
|
|
167
|
+
except (json.JSONDecodeError, OSError) as exc:
|
|
168
|
+
raise GraphifyError(f"unparsable JSON at {jp}: {exc}") from exc
|
|
169
|
+
|
|
170
|
+
nodes = list(data.get("nodes") or [])
|
|
171
|
+
edges = list(data.get("edges") or data.get("links") or [])
|
|
172
|
+
summary = {
|
|
173
|
+
k: v for k, v in data.items() if k not in {"nodes", "edges", "links"}
|
|
174
|
+
}
|
|
175
|
+
return GraphifyReport(
|
|
176
|
+
output_dir=jp.parent, nodes=nodes, edges=edges, summary=summary,
|
|
177
|
+
json_path=jp,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def graphify_into_rag(report: GraphifyReport, graph_retriever: Any) -> dict[str, int]:
|
|
182
|
+
"""Feed a `GraphifyReport` into the engine's `GraphRetriever`.
|
|
183
|
+
|
|
184
|
+
Each graphify node becomes a graph node (its `id` or `name` becomes the
|
|
185
|
+
key, the path/file/kind/symbol becomes metadata). Each edge becomes a
|
|
186
|
+
typed undirected edge — `edge_type` from `kind`/`type`/`relation`.
|
|
187
|
+
|
|
188
|
+
Returns counts so callers can log "added 1,234 nodes and 4,567 edges".
|
|
189
|
+
The retriever isn't imported eagerly so the engine works on machines
|
|
190
|
+
without graphify installed.
|
|
191
|
+
"""
|
|
192
|
+
n_nodes = n_edges = 0
|
|
193
|
+
for node in report.nodes:
|
|
194
|
+
node_id = str(node.get("id") or node.get("name") or "").strip()
|
|
195
|
+
if not node_id:
|
|
196
|
+
continue
|
|
197
|
+
text = str(
|
|
198
|
+
node.get("text")
|
|
199
|
+
or node.get("description")
|
|
200
|
+
or node.get("name")
|
|
201
|
+
or node_id
|
|
202
|
+
)
|
|
203
|
+
meta = {
|
|
204
|
+
k: v for k, v in node.items()
|
|
205
|
+
if k not in {"id", "name", "text", "description"}
|
|
206
|
+
}
|
|
207
|
+
graph_retriever.add_node(node_id, text=text, metadata=meta)
|
|
208
|
+
n_nodes += 1
|
|
209
|
+
|
|
210
|
+
for edge in report.edges:
|
|
211
|
+
a = str(
|
|
212
|
+
edge.get("source")
|
|
213
|
+
or edge.get("from")
|
|
214
|
+
or edge.get("a")
|
|
215
|
+
or ""
|
|
216
|
+
).strip()
|
|
217
|
+
b = str(
|
|
218
|
+
edge.get("target")
|
|
219
|
+
or edge.get("to")
|
|
220
|
+
or edge.get("b")
|
|
221
|
+
or ""
|
|
222
|
+
).strip()
|
|
223
|
+
if not a or not b:
|
|
224
|
+
continue
|
|
225
|
+
etype = str(
|
|
226
|
+
edge.get("kind")
|
|
227
|
+
or edge.get("type")
|
|
228
|
+
or edge.get("relation")
|
|
229
|
+
or "rel"
|
|
230
|
+
)
|
|
231
|
+
graph_retriever.add_edge(a, b, edge_type=etype)
|
|
232
|
+
n_edges += 1
|
|
233
|
+
|
|
234
|
+
return {"nodes": n_nodes, "edges": n_edges}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"""Smith — the reflection loop that turns past failures into systemic upgrades.
|
|
2
|
+
|
|
3
|
+
The audit history table records every score across time, but no one's
|
|
4
|
+
reading it. This module does the reading + finds patterns + writes
|
|
5
|
+
structured insights to ``Agentik_Extra/staging/promotion/`` where the
|
|
6
|
+
educator pipeline can promote the best ones into the SSOT.
|
|
7
|
+
|
|
8
|
+
What we look at:
|
|
9
|
+
|
|
10
|
+
* **Audit history** — which audits drop below threshold the most? On
|
|
11
|
+
which projects? On which kinds of files?
|
|
12
|
+
* **Worker outcomes** — which task descriptions correlate with
|
|
13
|
+
audit rejection? Where do workers go pending most often?
|
|
14
|
+
* **Mission durations** — which roles eat the most tokens?
|
|
15
|
+
* **Cost per mission** — when did Sonnet vs. Opus pay off?
|
|
16
|
+
|
|
17
|
+
What we propose:
|
|
18
|
+
|
|
19
|
+
* **Audit threshold tweaks** — if codeaudit always fails at 78 on
|
|
20
|
+
project X but the operator never fixes the same finding kind,
|
|
21
|
+
suggest a per-project threshold override.
|
|
22
|
+
* **Skill recommendations** — patterns of repeated work suggest a
|
|
23
|
+
new skill the operator should create.
|
|
24
|
+
* **Model upgrades** — when a worker fails twice on Haiku, propose
|
|
25
|
+
bumping that intent class to Sonnet via the classifier.
|
|
26
|
+
|
|
27
|
+
This is *proposal only*. The educator staging pipeline (which already
|
|
28
|
+
exists) gates any actual change. Smith never edits the live tree
|
|
29
|
+
directly.
|
|
30
|
+
"""
|
|
31
|
+
from __future__ import annotations
|
|
32
|
+
|
|
33
|
+
import json
|
|
34
|
+
import os
|
|
35
|
+
import sqlite3
|
|
36
|
+
import time
|
|
37
|
+
from collections import Counter, defaultdict
|
|
38
|
+
from dataclasses import dataclass, field
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from typing import Any
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@dataclass
|
|
44
|
+
class Insight:
|
|
45
|
+
"""One actionable observation Smith found."""
|
|
46
|
+
kind: str # "weak_audit" | "pending_pattern" | "cost_outlier" | "skill_suggestion"
|
|
47
|
+
title: str
|
|
48
|
+
detail: str
|
|
49
|
+
evidence: list[str] = field(default_factory=list)
|
|
50
|
+
severity: str = "info" # "info" | "warn" | "high"
|
|
51
|
+
proposed_action: str = ""
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@dataclass
|
|
55
|
+
class ReflectionReport:
|
|
56
|
+
generated_at: int
|
|
57
|
+
omega_home: str
|
|
58
|
+
insights: list[Insight] = field(default_factory=list)
|
|
59
|
+
counts: dict[str, int] = field(default_factory=dict)
|
|
60
|
+
|
|
61
|
+
def to_dict(self) -> dict:
|
|
62
|
+
return {
|
|
63
|
+
"generated_at": self.generated_at,
|
|
64
|
+
"omega_home": self.omega_home,
|
|
65
|
+
"insights": [
|
|
66
|
+
{"kind": i.kind, "title": i.title, "detail": i.detail,
|
|
67
|
+
"evidence": i.evidence, "severity": i.severity,
|
|
68
|
+
"proposed_action": i.proposed_action}
|
|
69
|
+
for i in self.insights
|
|
70
|
+
],
|
|
71
|
+
"counts": self.counts,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _audit_db(home: Path) -> Path:
|
|
76
|
+
return home / "Agentik_Runtime" / "audits.db"
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _event_db(home: Path) -> Path:
|
|
80
|
+
return home / "Agentik_Runtime" / "eventlog" / "omega.db"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _staging_dir(home: Path) -> Path:
|
|
84
|
+
d = home / "Agentik_Extra" / "staging" / "promotion"
|
|
85
|
+
d.mkdir(parents=True, exist_ok=True)
|
|
86
|
+
return d
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _analyse_audit_history(home: Path) -> list[Insight]:
|
|
90
|
+
"""Find audits that consistently fail or trend down."""
|
|
91
|
+
db = _audit_db(home)
|
|
92
|
+
if not db.exists():
|
|
93
|
+
return []
|
|
94
|
+
insights: list[Insight] = []
|
|
95
|
+
conn = sqlite3.connect(str(db))
|
|
96
|
+
try:
|
|
97
|
+
# Average score per audit_id over the last 30 days
|
|
98
|
+
cutoff = int(time.time()) - 30 * 86400
|
|
99
|
+
rows = conn.execute(
|
|
100
|
+
"SELECT audit_id, AVG(score) AS avg_score, COUNT(*) AS n, "
|
|
101
|
+
" SUM(CASE WHEN verified = 1 THEN 1 ELSE 0 END) AS verified "
|
|
102
|
+
"FROM audit_runs WHERE timestamp > ? "
|
|
103
|
+
"GROUP BY audit_id HAVING n >= 3",
|
|
104
|
+
(cutoff,),
|
|
105
|
+
).fetchall()
|
|
106
|
+
for audit_id, avg_score, n, verified in rows:
|
|
107
|
+
avg = float(avg_score or 0)
|
|
108
|
+
if avg < 75.0:
|
|
109
|
+
insights.append(Insight(
|
|
110
|
+
kind="weak_audit",
|
|
111
|
+
title=f"{audit_id} averages {avg:.1f}/100 over {n} runs",
|
|
112
|
+
detail=(
|
|
113
|
+
f"{audit_id} is failing consistently. "
|
|
114
|
+
f"{verified}/{n} runs reached the threshold."
|
|
115
|
+
),
|
|
116
|
+
evidence=[f"30d_avg={avg:.1f}", f"runs={n}",
|
|
117
|
+
f"verified={verified}"],
|
|
118
|
+
severity="warn" if avg >= 60 else "high",
|
|
119
|
+
proposed_action=(
|
|
120
|
+
f"Run `omega audit run {audit_id} --fix` to see if "
|
|
121
|
+
"the smart batcher can clear it. If the same "
|
|
122
|
+
"findings recur, lower the threshold OR write a "
|
|
123
|
+
"checker skill that prevents that class of failure."
|
|
124
|
+
),
|
|
125
|
+
))
|
|
126
|
+
# Trend: compare last 7d vs prior 23d for each audit
|
|
127
|
+
for audit_id in {r[0] for r in rows}:
|
|
128
|
+
r_recent = conn.execute(
|
|
129
|
+
"SELECT AVG(score) FROM audit_runs "
|
|
130
|
+
"WHERE audit_id = ? AND timestamp > ?",
|
|
131
|
+
(audit_id, int(time.time()) - 7 * 86400),
|
|
132
|
+
).fetchone()
|
|
133
|
+
r_old = conn.execute(
|
|
134
|
+
"SELECT AVG(score) FROM audit_runs "
|
|
135
|
+
"WHERE audit_id = ? AND timestamp BETWEEN ? AND ?",
|
|
136
|
+
(audit_id, cutoff, int(time.time()) - 7 * 86400),
|
|
137
|
+
).fetchone()
|
|
138
|
+
recent = float(r_recent[0] or 0)
|
|
139
|
+
old = float(r_old[0] or 0)
|
|
140
|
+
if recent > 0 and old > 0 and (old - recent) > 10:
|
|
141
|
+
insights.append(Insight(
|
|
142
|
+
kind="weak_audit",
|
|
143
|
+
title=f"{audit_id} dropped from {old:.0f} → {recent:.0f}",
|
|
144
|
+
detail=(
|
|
145
|
+
f"Regression of {old - recent:.0f} points in the "
|
|
146
|
+
"last 7 days. Something landed that's hurting "
|
|
147
|
+
"this dimension."
|
|
148
|
+
),
|
|
149
|
+
evidence=[f"recent_avg={recent:.1f}",
|
|
150
|
+
f"prior_avg={old:.1f}"],
|
|
151
|
+
severity="high",
|
|
152
|
+
proposed_action=(
|
|
153
|
+
f"Bisect with `omega audit diff <last_good_run> "
|
|
154
|
+
f"<recent_run>` to see which findings are new."
|
|
155
|
+
),
|
|
156
|
+
))
|
|
157
|
+
finally:
|
|
158
|
+
conn.close()
|
|
159
|
+
return insights
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _analyse_done_jsons(home: Path) -> list[Insight]:
|
|
163
|
+
"""Find patterns in worker .done.json statuses."""
|
|
164
|
+
sess = home / "Agentik_Runtime" / "sessions"
|
|
165
|
+
if not sess.is_dir():
|
|
166
|
+
return []
|
|
167
|
+
status_counter: Counter = Counter()
|
|
168
|
+
pending_actions: Counter = Counter()
|
|
169
|
+
for done in sess.glob("*/.done.json"):
|
|
170
|
+
try:
|
|
171
|
+
data = json.loads(done.read_text())
|
|
172
|
+
except (json.JSONDecodeError, OSError):
|
|
173
|
+
continue
|
|
174
|
+
status_counter[data.get("status", "unknown")] += 1
|
|
175
|
+
for action in (data.get("pending_actions") or []):
|
|
176
|
+
pending_actions[action[:60]] += 1
|
|
177
|
+
|
|
178
|
+
insights: list[Insight] = []
|
|
179
|
+
total = sum(status_counter.values())
|
|
180
|
+
if total >= 10:
|
|
181
|
+
failed_pct = status_counter.get("failed", 0) / total
|
|
182
|
+
pending_pct = status_counter.get("pending", 0) / total
|
|
183
|
+
if failed_pct > 0.2:
|
|
184
|
+
insights.append(Insight(
|
|
185
|
+
kind="pending_pattern",
|
|
186
|
+
title=f"{failed_pct:.0%} of workers ended status=failed",
|
|
187
|
+
detail=(
|
|
188
|
+
f"Out of {total} recent worker outcomes, "
|
|
189
|
+
f"{status_counter['failed']} failed. The audit "
|
|
190
|
+
"gate is catching real issues — good. But the "
|
|
191
|
+
"rate is high, look at common errors."
|
|
192
|
+
),
|
|
193
|
+
evidence=[f"total={total}",
|
|
194
|
+
f"failed={status_counter.get('failed', 0)}",
|
|
195
|
+
f"pending={status_counter.get('pending', 0)}"],
|
|
196
|
+
severity="warn",
|
|
197
|
+
proposed_action=(
|
|
198
|
+
"Run `omega memory search 'errors'` to spot "
|
|
199
|
+
"common failure modes; consider escalating those "
|
|
200
|
+
"intent classes to a stronger model."
|
|
201
|
+
),
|
|
202
|
+
))
|
|
203
|
+
if pending_pct > 0.3:
|
|
204
|
+
insights.append(Insight(
|
|
205
|
+
kind="pending_pattern",
|
|
206
|
+
title=f"{pending_pct:.0%} workers end pending with un-actioned items",
|
|
207
|
+
detail="A lot of work is being deferred. Either tasks are too big or context is missing.",
|
|
208
|
+
evidence=[f"pending={status_counter.get('pending', 0)}",
|
|
209
|
+
f"total={total}"],
|
|
210
|
+
severity="warn",
|
|
211
|
+
proposed_action=(
|
|
212
|
+
"Break missions into smaller intents OR seed the "
|
|
213
|
+
"envelope with more parent context (envelope.py)."
|
|
214
|
+
),
|
|
215
|
+
))
|
|
216
|
+
|
|
217
|
+
# Repeated pending actions = a skill begging to be created
|
|
218
|
+
repeat = [(text, n) for text, n in pending_actions.most_common(5)
|
|
219
|
+
if n >= 3]
|
|
220
|
+
for text, n in repeat:
|
|
221
|
+
insights.append(Insight(
|
|
222
|
+
kind="skill_suggestion",
|
|
223
|
+
title=f"Repeated pending action ({n}x): {text}",
|
|
224
|
+
detail=(
|
|
225
|
+
f"This pending_action appeared {n} times in recent "
|
|
226
|
+
"worker reports. It's a candidate for its own skill or "
|
|
227
|
+
"a reusable helper."
|
|
228
|
+
),
|
|
229
|
+
evidence=[f"frequency={n}"],
|
|
230
|
+
severity="info",
|
|
231
|
+
proposed_action=(
|
|
232
|
+
f"Create a SKILL.md in Agentik_SSOT/skills/ that "
|
|
233
|
+
f"automates: {text[:80]}"
|
|
234
|
+
),
|
|
235
|
+
))
|
|
236
|
+
return insights
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
def reflect(
|
|
240
|
+
omega_home: str | Path, *, write_proposals: bool = True,
|
|
241
|
+
) -> ReflectionReport:
|
|
242
|
+
"""Run a full Smith reflection. Returns the structured report.
|
|
243
|
+
|
|
244
|
+
With ``write_proposals=True`` (default), insights are also written
|
|
245
|
+
as JSON files in ``Agentik_Extra/staging/promotion/smith-<ts>-N.json``
|
|
246
|
+
where the existing educator pipeline picks them up.
|
|
247
|
+
"""
|
|
248
|
+
home = Path(omega_home or os.environ.get("OMEGA_HOME")
|
|
249
|
+
or Path.home() / "Omega")
|
|
250
|
+
insights = _analyse_audit_history(home) + _analyse_done_jsons(home)
|
|
251
|
+
report = ReflectionReport(
|
|
252
|
+
generated_at=int(time.time()),
|
|
253
|
+
omega_home=str(home),
|
|
254
|
+
insights=insights,
|
|
255
|
+
counts={"insights": len(insights)},
|
|
256
|
+
)
|
|
257
|
+
if write_proposals and insights:
|
|
258
|
+
out = _staging_dir(home)
|
|
259
|
+
for i, ins in enumerate(insights, start=1):
|
|
260
|
+
(out / f"smith-{report.generated_at}-{i}.json").write_text(
|
|
261
|
+
json.dumps({
|
|
262
|
+
"kind": ins.kind, "title": ins.title,
|
|
263
|
+
"detail": ins.detail, "evidence": ins.evidence,
|
|
264
|
+
"severity": ins.severity,
|
|
265
|
+
"proposed_action": ins.proposed_action,
|
|
266
|
+
}, indent=2),
|
|
267
|
+
)
|
|
268
|
+
return report
|