@agentikos/omega-os 0.1.0 → 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -14
- 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 +1000 -26
- package/bootstrap/manifest.example.yaml +93 -2
- 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/COMPLETION-PLAN.md +48 -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 +27 -10
- package/omega/Agentik_Engine/omega_engine/__init__.py +212 -2
- 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_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__/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__/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__/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__/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__/sync.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 +502 -0
- 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/autonomous.py +538 -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 +4564 -56
- 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/__init__.py +14 -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/autonomous.py +56 -0
- package/omega/Agentik_Engine/omega_engine/daemons/engine.py +236 -0
- package/omega/Agentik_Engine/omega_engine/daemons/telegram.py +315 -0
- package/omega/Agentik_Engine/omega_engine/done_signal.py +154 -0
- package/omega/Agentik_Engine/omega_engine/educators/__init__.py +51 -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/educators/artifact.py +65 -0
- package/omega/Agentik_Engine/omega_engine/educators/automation.py +76 -0
- package/omega/Agentik_Engine/omega_engine/educators/base.py +327 -0
- package/omega/Agentik_Engine/omega_engine/educators/claudecode.py +71 -0
- package/omega/Agentik_Engine/omega_engine/educators/connection.py +75 -0
- package/omega/Agentik_Engine/omega_engine/educators/coworker.py +68 -0
- package/omega/Agentik_Engine/omega_engine/educators/loop.py +82 -0
- package/omega/Agentik_Engine/omega_engine/educators/prompt.py +68 -0
- package/omega/Agentik_Engine/omega_engine/educators/skill.py +69 -0
- package/omega/Agentik_Engine/omega_engine/envelope.py +219 -0
- package/omega/Agentik_Engine/omega_engine/executor.py +195 -16
- 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 +29 -14
- 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 +408 -13
- 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/__init__.py +21 -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/rag/agentic.py +83 -0
- package/omega/Agentik_Engine/omega_engine/rag/base.py +42 -0
- package/omega/Agentik_Engine/omega_engine/rag/corrective.py +119 -0
- package/omega/Agentik_Engine/omega_engine/rag/graph.py +169 -0
- package/omega/Agentik_Engine/omega_engine/rag/hybrid.py +205 -0
- package/omega/Agentik_Engine/omega_engine/rag/multimodal.py +136 -0
- package/omega/Agentik_Engine/omega_engine/rag/router.py +110 -0
- package/omega/Agentik_Engine/omega_engine/reducer.py +21 -3
- 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 +132 -25
- package/omega/Agentik_Engine/omega_engine/sync.py +445 -0
- 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/tools.py +272 -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_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_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_progress.cpython-313-pytest-8.4.2.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_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_report.cpython-313-pytest-8.4.2.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 +338 -0
- 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_autonomous.py +361 -0
- package/omega/Agentik_Engine/tests/test_educators.py +233 -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_rag.py +287 -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_snapshot_partial.py +172 -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_tools_and_sync.py +312 -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/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/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/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/rag-route.md +82 -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
package/bootstrap/lib/common.sh
CHANGED
|
@@ -7,6 +7,12 @@ STATE_DIR="$OMEGA_HOME/Agentik_Extra/var"
|
|
|
7
7
|
STATE_FILE="$STATE_DIR/.install-state"
|
|
8
8
|
LOG_FILE="$STATE_DIR/logs/install.log"
|
|
9
9
|
|
|
10
|
+
# --- user defaults ---
|
|
11
|
+
# The friendly name used when --create-user is given with no explicit value.
|
|
12
|
+
# Chosen because it matches the install dir (~/Omega), is short, neutral, and
|
|
13
|
+
# never collides with a stock Linux/macOS account. (Override on the CLI.)
|
|
14
|
+
OMEGA_DEFAULT_NEW_USER="${OMEGA_DEFAULT_NEW_USER:-omega}"
|
|
15
|
+
|
|
10
16
|
# --- colours (only when attached to a tty) ---
|
|
11
17
|
if [ -t 1 ]; then
|
|
12
18
|
C_OK=$'\033[32m'; C_ERR=$'\033[31m'; C_INFO=$'\033[36m'; C_DIM=$'\033[2m'; C_RST=$'\033[0m'
|
|
@@ -43,7 +49,30 @@ detect_os() {
|
|
|
43
49
|
# --- step state (idempotent / resumable) ---
|
|
44
50
|
step_done() { [ -f "$STATE_FILE" ] && grep -qx "$1" "$STATE_FILE"; }
|
|
45
51
|
mark_done() { mkdir -p "$STATE_DIR"; printf '%s\n' "$1" >> "$STATE_FILE"; }
|
|
46
|
-
reset_state() { rm -f "$STATE_FILE"; }
|
|
52
|
+
reset_state() { rm -f "$STATE_FILE" "$STATE_DIR/.install-version" 2>/dev/null || true; }
|
|
53
|
+
|
|
54
|
+
# state_version_drift — return 0 (drift) when the state file was written by a
|
|
55
|
+
# different OmegaOS version than the one we're about to run. We track the
|
|
56
|
+
# version that wrote a state file in a sibling marker `$STATE_DIR/.install-version`.
|
|
57
|
+
# When drift is detected we reset state automatically so re-running an upgraded
|
|
58
|
+
# installer actually executes the NEW steps instead of skipping them all as
|
|
59
|
+
# "already done". This was the v0.19.x UX regression: a Mac with an old state
|
|
60
|
+
# file from v0.2.0 was skipping every step on a v0.19.x re-run.
|
|
61
|
+
state_version_drift() {
|
|
62
|
+
local current="${OMEGA_BUNDLED_VERSION:-}"
|
|
63
|
+
[ -n "$current" ] || return 1
|
|
64
|
+
local marker="$STATE_DIR/.install-version"
|
|
65
|
+
[ -f "$marker" ] || return 0 # state present but no version marker → drift
|
|
66
|
+
local recorded; recorded="$(cat "$marker" 2>/dev/null || echo '')"
|
|
67
|
+
[ "$recorded" = "$current" ] && return 1
|
|
68
|
+
return 0
|
|
69
|
+
}
|
|
70
|
+
record_state_version() {
|
|
71
|
+
local current="${OMEGA_BUNDLED_VERSION:-}"
|
|
72
|
+
[ -n "$current" ] || return 0
|
|
73
|
+
mkdir -p "$STATE_DIR"
|
|
74
|
+
printf '%s\n' "$current" > "$STATE_DIR/.install-version"
|
|
75
|
+
}
|
|
47
76
|
|
|
48
77
|
# run_step <name> <function>
|
|
49
78
|
run_step() {
|
|
@@ -61,6 +90,132 @@ run_step() {
|
|
|
61
90
|
fi
|
|
62
91
|
}
|
|
63
92
|
|
|
93
|
+
# --- user resolution ---------------------------------------------------------
|
|
94
|
+
#
|
|
95
|
+
# The installer is modular about WHICH user it runs as. Three modes, decided
|
|
96
|
+
# from the CLI by install.sh before anything else happens:
|
|
97
|
+
#
|
|
98
|
+
# 1. (default) no flag — run as the current user; OMEGA_HOME=$HOME/Omega.
|
|
99
|
+
# 2. --user <name> — re-exec as that existing user.
|
|
100
|
+
# 3. --create-user [<name>] — create a system user (Linux only), then
|
|
101
|
+
# re-exec as them. Default name: $OMEGA_DEFAULT_NEW_USER.
|
|
102
|
+
#
|
|
103
|
+
# Re-exec is via `sudo -u <user> -H bash <copied-installer>`. We copy the
|
|
104
|
+
# repo into the target user's ~/.cache/omega-installer/ first because the
|
|
105
|
+
# original clone (e.g. /root/OmegaOS) is rarely readable by the target user.
|
|
106
|
+
|
|
107
|
+
# user_home <name> — print the home directory of a Unix user, or empty if missing.
|
|
108
|
+
user_home() {
|
|
109
|
+
local name="$1" home
|
|
110
|
+
if [ "$(uname -s)" = "Darwin" ]; then
|
|
111
|
+
home="$(dscl . -read "/Users/$name" NFSHomeDirectory 2>/dev/null | awk '{print $2}')"
|
|
112
|
+
else
|
|
113
|
+
home="$(getent passwd "$name" 2>/dev/null | cut -d: -f6)"
|
|
114
|
+
fi
|
|
115
|
+
printf '%s' "$home"
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# ensure_user_exists <name> — create a system user if missing (Linux only).
|
|
119
|
+
# Adds them to the sudo/wheel group so `step_system_deps` can apt/dnf.
|
|
120
|
+
ensure_user_exists() {
|
|
121
|
+
local name="$1"
|
|
122
|
+
if id "$name" >/dev/null 2>&1; then
|
|
123
|
+
info "user '$name' already exists — adopting"
|
|
124
|
+
return 0
|
|
125
|
+
fi
|
|
126
|
+
if [ "$(uname -s)" = "Darwin" ]; then
|
|
127
|
+
die "creating users on macOS is not supported by this installer — pass --user <existing-user> or install as yourself"
|
|
128
|
+
fi
|
|
129
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
130
|
+
die "creating user '$name' requires root — re-run with sudo (e.g. \`sudo bash install.sh --create-user $name\`)"
|
|
131
|
+
fi
|
|
132
|
+
info "creating system user '$name' (shell=/bin/bash, home=/home/$name)"
|
|
133
|
+
if ! useradd -m -s /bin/bash "$name" >>"$LOG_FILE" 2>&1; then
|
|
134
|
+
die "useradd failed for '$name' — see $LOG_FILE"
|
|
135
|
+
fi
|
|
136
|
+
if getent group sudo >/dev/null 2>&1; then
|
|
137
|
+
usermod -aG sudo "$name" >>"$LOG_FILE" 2>&1 || true
|
|
138
|
+
elif getent group wheel >/dev/null 2>&1; then
|
|
139
|
+
usermod -aG wheel "$name" >>"$LOG_FILE" 2>&1 || true
|
|
140
|
+
fi
|
|
141
|
+
# Passwordless sudo for system-deps step only, scoped to apt/dnf. We
|
|
142
|
+
# intentionally do NOT grant NOPASSWD on all sudo — that's the operator's
|
|
143
|
+
# decision later.
|
|
144
|
+
ok "user '$name' created and granted sudo group membership"
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
# resolve_target_user — call this from install.sh BEFORE run_step.
|
|
148
|
+
#
|
|
149
|
+
# Inputs (variables set by install.sh argument parsing):
|
|
150
|
+
# USER_REQUESTED — "" | a username from --user
|
|
151
|
+
# CREATE_USER — 0 | 1 from --create-user
|
|
152
|
+
# CREATE_USER_NAME — name to create (defaults to OMEGA_DEFAULT_NEW_USER)
|
|
153
|
+
# INSTALL_CLEAN_ARGS[] — reconstructed args without --user/--create-user
|
|
154
|
+
#
|
|
155
|
+
# Effect: either sets OMEGA_USER to the current user (no-op), or
|
|
156
|
+
# `exec`s the installer into the resolved user's shell with INSTALL_CLEAN_ARGS.
|
|
157
|
+
resolve_target_user() {
|
|
158
|
+
local current; current="$(id -un)"
|
|
159
|
+
local target=""
|
|
160
|
+
|
|
161
|
+
if [ "${CREATE_USER:-0}" = "1" ]; then
|
|
162
|
+
target="${CREATE_USER_NAME:-$OMEGA_DEFAULT_NEW_USER}"
|
|
163
|
+
ensure_user_exists "$target"
|
|
164
|
+
elif [ -n "${USER_REQUESTED:-}" ]; then
|
|
165
|
+
target="$USER_REQUESTED"
|
|
166
|
+
if ! id "$target" >/dev/null 2>&1; then
|
|
167
|
+
die "user '$target' does not exist — either create it first, or use --create-user $target"
|
|
168
|
+
fi
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
# Mode 1 — no flag, or flag matches current user: just continue.
|
|
172
|
+
if [ -z "$target" ] || [ "$target" = "$current" ]; then
|
|
173
|
+
if [ "$current" = "root" ]; then
|
|
174
|
+
err "running as root with no user mode chosen — this leaves Omega OS owned by root"
|
|
175
|
+
err "pick one:"
|
|
176
|
+
err " bash install.sh --create-user # create a new user named '$OMEGA_DEFAULT_NEW_USER'"
|
|
177
|
+
err " bash install.sh --create-user <name> # create with a custom name"
|
|
178
|
+
err " bash install.sh --user <existing-name> # adopt an existing user"
|
|
179
|
+
die "(if you really want root, set OMEGA_ALLOW_ROOT=1; this is almost never what you want)"
|
|
180
|
+
fi
|
|
181
|
+
OMEGA_USER="$current"
|
|
182
|
+
export OMEGA_USER
|
|
183
|
+
return 0
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
# Mode 2/3 — re-exec as `target`. We need to be either root or current target.
|
|
187
|
+
if [ "$(id -u)" -ne 0 ] && ! have sudo; then
|
|
188
|
+
die "cannot switch to user '$target' without root or sudo — re-run with sudo"
|
|
189
|
+
fi
|
|
190
|
+
|
|
191
|
+
local thome; thome="$(user_home "$target")"
|
|
192
|
+
[ -n "$thome" ] || die "could not resolve home directory for user '$target'"
|
|
193
|
+
|
|
194
|
+
# Copy installer into the target user's cache so they can definitely read it.
|
|
195
|
+
local stage="$thome/.cache/omega-installer"
|
|
196
|
+
info "staging installer for '$target' at $stage"
|
|
197
|
+
if [ "$(id -u)" -eq 0 ]; then
|
|
198
|
+
mkdir -p "$stage"
|
|
199
|
+
cp -R "$REPO_DIR/." "$stage/"
|
|
200
|
+
chown -R "$target:$target" "$stage" 2>/dev/null \
|
|
201
|
+
|| chown -R "$target" "$stage" 2>/dev/null || true
|
|
202
|
+
else
|
|
203
|
+
sudo mkdir -p "$stage"
|
|
204
|
+
sudo cp -R "$REPO_DIR/." "$stage/"
|
|
205
|
+
sudo chown -R "$target" "$stage" 2>/dev/null || true
|
|
206
|
+
fi
|
|
207
|
+
|
|
208
|
+
local exec_args=("${INSTALL_CLEAN_ARGS[@]:-}")
|
|
209
|
+
info "re-executing installer as '$target' (clean args: ${exec_args[*]:-<none>})"
|
|
210
|
+
if [ "$(id -u)" -eq 0 ]; then
|
|
211
|
+
exec sudo -u "$target" -H bash "$stage/install.sh" "${exec_args[@]}"
|
|
212
|
+
else
|
|
213
|
+
exec sudo -u "$target" -H bash "$stage/install.sh" "${exec_args[@]}"
|
|
214
|
+
fi
|
|
215
|
+
# `exec` never returns; if we get here something's wrong.
|
|
216
|
+
die "exec to user '$target' failed"
|
|
217
|
+
}
|
|
218
|
+
|
|
64
219
|
# ask <var> <prompt> <default> — respects --non-interactive
|
|
65
220
|
ask() {
|
|
66
221
|
local __var="$1" __prompt="$2" __default="${3:-}" __reply
|
|
@@ -71,3 +226,304 @@ ask() {
|
|
|
71
226
|
read -r -p "$__prompt ${__default:+[$__default] }" __reply || true
|
|
72
227
|
printf -v "$__var" '%s' "${__reply:-$__default}"
|
|
73
228
|
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
232
|
+
# UX — banner, preflight card, profile picker, step progress, post-install
|
|
233
|
+
# ─────────────────────────────────────────────────────────────────────────────
|
|
234
|
+
|
|
235
|
+
if [ -t 1 ]; then
|
|
236
|
+
C_BOLD=$'\033[1m'
|
|
237
|
+
C_DIM=$'\033[2m'
|
|
238
|
+
# Claude-Code brand orange (#D97757) in 24-bit truecolor. Every modern
|
|
239
|
+
# macOS/Linux terminal (iTerm2, Termius, kitty, alacritty, gnome-terminal,
|
|
240
|
+
# WezTerm) supports truecolor. We expose the legacy C_CYAN/etc names
|
|
241
|
+
# below for back-compat — the banner + boxes use C_ORANGE.
|
|
242
|
+
C_ORANGE=$'\033[38;2;217;119;87m'
|
|
243
|
+
C_CYAN="$C_ORANGE"
|
|
244
|
+
C_GREEN=$'\033[32m'
|
|
245
|
+
C_YELLOW=$'\033[33m'
|
|
246
|
+
C_RED=$'\033[31m'
|
|
247
|
+
C_MAGENTA=$'\033[35m'
|
|
248
|
+
C_BLUE=$'\033[34m'
|
|
249
|
+
else
|
|
250
|
+
# Non-TTY (CI, --non-interactive, pipe) — make every colour var safe
|
|
251
|
+
# to reference. Without these the install.sh plan-mode block crashes
|
|
252
|
+
# on `set -u` when running headless.
|
|
253
|
+
C_BOLD=''; C_DIM=''; C_ORANGE=''; C_CYAN=''; C_GREEN=''; C_YELLOW=''
|
|
254
|
+
C_RED=''; C_MAGENTA=''; C_BLUE=''
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
# --- prompt helpers --------------------------------------------------------
|
|
258
|
+
#
|
|
259
|
+
# prompt_yes_no <question> [default=yes|no]
|
|
260
|
+
# Read a y/n answer from stdin. Default is "yes" when omitted. Returns 0
|
|
261
|
+
# for yes, 1 for no. Re-prompts on garbage input (typo-safe). When stdin
|
|
262
|
+
# is not a TTY (piped/non-interactive), accepts the default silently —
|
|
263
|
+
# `install.sh` already gates the call with `[ -t 0 ]` so the non-TTY
|
|
264
|
+
# path is only hit when the call site forgot, in which case "yes" is the
|
|
265
|
+
# safe assumption (the user opted into the install by running it).
|
|
266
|
+
#
|
|
267
|
+
# This was missing in v0.19.1/0.19.4 and caused a "command not found" abort
|
|
268
|
+
# on the very first install on macOS — the install.sh plan-mode block fell
|
|
269
|
+
# through to `aborted by operator — no changes made` without any work done.
|
|
270
|
+
prompt_yes_no() {
|
|
271
|
+
local q="$1" default="${2:-yes}" reply hint
|
|
272
|
+
case "$default" in
|
|
273
|
+
y|yes|Y|YES) hint="Y/n" ;;
|
|
274
|
+
n|no|N|NO) hint="y/N" ;;
|
|
275
|
+
*) hint="y/n" ;;
|
|
276
|
+
esac
|
|
277
|
+
while :; do
|
|
278
|
+
# Only print the prompt when stdin is a TTY. Always try to read —
|
|
279
|
+
# piped input (e.g. `printf 'n\n' | install.sh`) must be honoured.
|
|
280
|
+
[ -t 0 ] && printf '%s %s[%s]%s ' "$q" "$C_DIM" "$hint" "$C_RST"
|
|
281
|
+
if ! IFS= read -r reply; then
|
|
282
|
+
# EOF (no input at all) → fall back to the default.
|
|
283
|
+
reply=""
|
|
284
|
+
fi
|
|
285
|
+
[ -z "$reply" ] && reply="$default"
|
|
286
|
+
case "$reply" in
|
|
287
|
+
y|Y|yes|YES|Yes) return 0 ;;
|
|
288
|
+
n|N|no|NO|No) return 1 ;;
|
|
289
|
+
*) printf ' please answer y or n\n' ;;
|
|
290
|
+
esac
|
|
291
|
+
done
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
# Stable wall-clock start time — used to print mm:ss next to each step.
|
|
295
|
+
INSTALL_START_TS="${INSTALL_START_TS:-$(date +%s)}"
|
|
296
|
+
STEP_COUNT="${STEP_COUNT:-0}"
|
|
297
|
+
STEP_TOTAL="${STEP_TOTAL:-0}"
|
|
298
|
+
|
|
299
|
+
# Read $OMEGA_REPO/omega/Agentik_SSOT/VERSION (single source of truth).
|
|
300
|
+
omega_version() {
|
|
301
|
+
local f="$OMEGA_REPO/omega/Agentik_SSOT/VERSION"
|
|
302
|
+
[ -f "$f" ] && cat "$f" 2>/dev/null || echo "?.?.?"
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
# install_banner — printed once at the very top of install.sh.
|
|
306
|
+
#
|
|
307
|
+
# The G letter (position 4) used to read as a B because row 3 closed the
|
|
308
|
+
# upper-right with `█▀` (looked like the top loop of B) and the bottom row
|
|
309
|
+
# used `████████▀` instead of a clean ` ▀██████▀ ` arc. v0.19.5 makes the
|
|
310
|
+
# G unambiguous: open right side at row 3, classic arc bottom, with the
|
|
311
|
+
# canonical middle hook at row 5. Colour is Claude-Code brand orange.
|
|
312
|
+
install_banner() {
|
|
313
|
+
local v; v="$(omega_version)"
|
|
314
|
+
printf '\n'
|
|
315
|
+
printf '%s ▄██████▄ ▄▄▄▄███▄▄▄▄ ▄████████ ▄██████▄ ▄████████%s\n' "$C_ORANGE" "$C_RST"
|
|
316
|
+
printf '%s ███ ███ ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
|
|
317
|
+
printf '%s ███ ███ ███ ███ ███ ███ █▀ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
|
|
318
|
+
printf '%s ███ ███ ███ ███ ███ ▄███▄▄▄ ▄███ ▄███▄▄▄▄██▀%s\n' "$C_ORANGE" "$C_RST"
|
|
319
|
+
printf '%s ███ ███ ███ ███ ███ ▀▀███▀▀▀ ▀▀███ ████▄ ▀▀███▀▀▀▀▀ %s\n' "$C_ORANGE" "$C_RST"
|
|
320
|
+
printf '%s ███ ███ ███ ███ ███ ███ █▄ ███ ███ ▀███████████%s\n' "$C_ORANGE" "$C_RST"
|
|
321
|
+
printf '%s ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███%s\n' "$C_ORANGE" "$C_RST"
|
|
322
|
+
printf '%s ▀██████▀ ▀█ ███ █▀ ██████████ ▀██████▀ ███ ███%s\n' "$C_ORANGE" "$C_RST"
|
|
323
|
+
printf '\n'
|
|
324
|
+
printf ' %sOmega OS%s %sv%s%s · %sagentik-os/OmegaOS%s\n' \
|
|
325
|
+
"$C_BOLD" "$C_RST" "$C_DIM" "$v" "$C_RST" "$C_DIM" "$C_RST"
|
|
326
|
+
printf ' %sEvent-sourced, verified-completion agentic operating system.%s\n' \
|
|
327
|
+
"$C_DIM" "$C_RST"
|
|
328
|
+
printf '\n'
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
# preflight_card — print a one-screen detection summary before any step runs.
|
|
332
|
+
# Heuristics only; never blocks. Operator reads it and either accepts or aborts.
|
|
333
|
+
preflight_card() {
|
|
334
|
+
local cpus mem_gb disk_h disk_pct internet shell_name
|
|
335
|
+
cpus="$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo "?")"
|
|
336
|
+
if [ "$(uname -s)" = "Linux" ]; then
|
|
337
|
+
mem_gb="$(awk '/MemTotal/ {printf "%.1f", $2/1024/1024}' /proc/meminfo 2>/dev/null || echo "?")"
|
|
338
|
+
disk_h="$(df -h "$HOME" 2>/dev/null | awk 'NR==2 {print $4 " free / " $2}' || echo "?")"
|
|
339
|
+
disk_pct="$(df -P "$HOME" 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}' || echo "?")"
|
|
340
|
+
else
|
|
341
|
+
mem_gb="$(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f", $1/1024/1024/1024}' || echo "?")"
|
|
342
|
+
disk_h="$(df -h "$HOME" 2>/dev/null | awk 'NR==2 {print $4 " free / " $2}' || echo "?")"
|
|
343
|
+
disk_pct="$(df "$HOME" 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}' || echo "?")"
|
|
344
|
+
fi
|
|
345
|
+
shell_name="$(basename "${SHELL:-/bin/sh}")"
|
|
346
|
+
if curl -sS --max-time 3 -o /dev/null -w '%{http_code}' https://www.google.com 2>/dev/null | grep -q '^[23]'; then
|
|
347
|
+
internet="${C_GREEN}online${C_RST}"
|
|
348
|
+
else
|
|
349
|
+
internet="${C_RED}offline${C_RST}"
|
|
350
|
+
fi
|
|
351
|
+
|
|
352
|
+
local _yes="${C_GREEN}✓${C_RST}"
|
|
353
|
+
local _no="${C_RED}✗${C_RST}"
|
|
354
|
+
_have_mark() { have "$1" && printf '%s %s' "$_yes" "$(command -v "$1" | head -1)" || printf '%s missing' "$_no"; }
|
|
355
|
+
|
|
356
|
+
printf ' %s──── pre-flight detection ────%s\n' "$C_DIM" "$C_RST"
|
|
357
|
+
printf ' %sOS%s %-30s %sPkg manager%s %s\n' "$C_DIM" "$C_RST" "$OMEGA_OS" "$C_DIM" "$C_RST" "$OMEGA_PKG"
|
|
358
|
+
printf ' %sShell%s %-30s %sUser%s %s\n' "$C_DIM" "$C_RST" "$shell_name" "$C_DIM" "$C_RST" "$OMEGA_USER"
|
|
359
|
+
printf ' %sCPUs%s %-30s %sRAM%s %s GiB\n' "$C_DIM" "$C_RST" "$cpus" "$C_DIM" "$C_RST" "$mem_gb"
|
|
360
|
+
printf ' %sDisk%s %-30s %sFull%s %s%%\n' "$C_DIM" "$C_RST" "$disk_h" "$C_DIM" "$C_RST" "$disk_pct"
|
|
361
|
+
printf ' %sInternet%s %-30b %sProfile%s %s\n' "$C_DIM" "$C_RST" "$internet" "$C_DIM" "$C_RST" "$PROFILE"
|
|
362
|
+
printf '\n'
|
|
363
|
+
printf ' %s──── required tools ────%s\n' "$C_DIM" "$C_RST"
|
|
364
|
+
printf ' git %s\n' "$(_have_mark git)"
|
|
365
|
+
printf ' python3 %s\n' "$(_have_mark python3)"
|
|
366
|
+
printf ' tmux %s\n' "$(_have_mark tmux)"
|
|
367
|
+
printf ' sqlite3 %s\n' "$(_have_mark sqlite3)"
|
|
368
|
+
printf ' curl %s\n' "$(_have_mark curl)"
|
|
369
|
+
printf ' jq %s\n' "$(_have_mark jq)"
|
|
370
|
+
printf '\n'
|
|
371
|
+
printf ' %s──── optional (Omega will install or skip)%s\n' "$C_DIM" "$C_RST"
|
|
372
|
+
printf ' claude %s %s(Max OAuth — no API key needed)%s\n' "$(_have_mark claude)" "$C_DIM" "$C_RST"
|
|
373
|
+
printf ' uv %s %s(Python pkg + venv manager)%s\n' "$(_have_mark uv)" "$C_DIM" "$C_RST"
|
|
374
|
+
printf ' node %s %s(MCP servers)%s\n' "$(_have_mark node)" "$C_DIM" "$C_RST"
|
|
375
|
+
printf ' age %s %s(encrypted secrets vault)%s\n' "$(_have_mark age)" "$C_DIM" "$C_RST"
|
|
376
|
+
printf ' gh %s %s(GitHub workflow)%s\n' "$(_have_mark gh)" "$C_DIM" "$C_RST"
|
|
377
|
+
printf '\n'
|
|
378
|
+
|
|
379
|
+
# Soft block: if disk < 2 GB free, warn loud.
|
|
380
|
+
local disk_free_kb
|
|
381
|
+
disk_free_kb="$(df -Pk "$HOME" 2>/dev/null | awk 'NR==2 {print $4}')"
|
|
382
|
+
if [ -n "$disk_free_kb" ] && [ "$disk_free_kb" -lt 2000000 ]; then
|
|
383
|
+
printf ' %s! warning:%s less than ~2 GB free in %s — install may run out of space\n' \
|
|
384
|
+
"$C_YELLOW" "$C_RST" "$HOME"
|
|
385
|
+
printf '\n'
|
|
386
|
+
fi
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
# pick_profile_interactive — whiptail picker when --profile not given.
|
|
390
|
+
# Falls through silently if whiptail is missing or stdin is not a tty.
|
|
391
|
+
pick_profile_interactive() {
|
|
392
|
+
[ "${NONINTERACTIVE:-0}" = "1" ] && return 0
|
|
393
|
+
[ -t 0 ] || return 0
|
|
394
|
+
if [ "$PROFILE_EXPLICIT" = "1" ]; then return 0; fi
|
|
395
|
+
if ! have whiptail; then return 0; fi
|
|
396
|
+
local choice
|
|
397
|
+
choice="$(whiptail --title "Omega OS — install profile" \
|
|
398
|
+
--menu "Pick the install profile for this machine:" 16 78 5 \
|
|
399
|
+
"vps" "Headless 24/7 VPS — daemons + Telegram + autonomous" \
|
|
400
|
+
"workstation" "Local laptop — interactive, no daemons" \
|
|
401
|
+
"minimal" "Engine + CLI only — no MCP, no Telegram, no plugins" \
|
|
402
|
+
3>&1 1>&2 2>&3)" || return 0
|
|
403
|
+
[ -n "$choice" ] && PROFILE="$choice"
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
# step_progress_header <step_name>
|
|
407
|
+
# Wraps run_step. Prints "[N/M] step ⏱ elapsed".
|
|
408
|
+
step_progress_header() {
|
|
409
|
+
local name="$1"
|
|
410
|
+
STEP_COUNT=$((STEP_COUNT + 1))
|
|
411
|
+
local now elapsed mm ss bar tail
|
|
412
|
+
now="$(date +%s)"; elapsed=$((now - INSTALL_START_TS))
|
|
413
|
+
mm=$((elapsed / 60)); ss=$((elapsed % 60))
|
|
414
|
+
if [ "$STEP_TOTAL" -gt 0 ]; then
|
|
415
|
+
bar="[$STEP_COUNT/$STEP_TOTAL]"
|
|
416
|
+
else
|
|
417
|
+
bar="[$STEP_COUNT]"
|
|
418
|
+
fi
|
|
419
|
+
tail="$(printf '%02d:%02d' "$mm" "$ss")"
|
|
420
|
+
log "${C_BLUE}${bar}${C_RST} ${C_BOLD}${name}${C_RST} ${C_DIM}elapsed ${tail}${C_RST}"
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
# path_setup_user_rc — append an idempotent shellrc block exporting OMEGA_HOME
|
|
424
|
+
# and prepending Agentik_Tools/bin to PATH. Honours --no-path-setup.
|
|
425
|
+
path_setup_user_rc() {
|
|
426
|
+
if [ "${NO_PATH_SETUP:-0}" = "1" ]; then
|
|
427
|
+
info "PATH setup skipped (--no-path-setup)"
|
|
428
|
+
return 0
|
|
429
|
+
fi
|
|
430
|
+
local rc
|
|
431
|
+
case "$(basename "${SHELL:-/bin/sh}")" in
|
|
432
|
+
zsh) rc="$HOME/.zshrc" ;;
|
|
433
|
+
bash) rc="$HOME/.bashrc" ;;
|
|
434
|
+
fish) rc="$HOME/.config/fish/config.fish" ;;
|
|
435
|
+
*) rc="$HOME/.profile" ;;
|
|
436
|
+
esac
|
|
437
|
+
# Idempotent: if our marker already exists, just refresh the path inside.
|
|
438
|
+
local marker="# >>> omega-os >>>"
|
|
439
|
+
local close="# <<< omega-os <<<"
|
|
440
|
+
if [ -f "$rc" ] && grep -q "$marker" "$rc" 2>/dev/null; then
|
|
441
|
+
info "PATH already wired in $rc — skipping"
|
|
442
|
+
return 0
|
|
443
|
+
fi
|
|
444
|
+
mkdir -p "$(dirname "$rc")"
|
|
445
|
+
if [ "$(basename "$rc")" = "config.fish" ]; then
|
|
446
|
+
{
|
|
447
|
+
echo ""
|
|
448
|
+
echo "$marker"
|
|
449
|
+
echo "set -gx OMEGA_HOME \"$OMEGA_HOME\""
|
|
450
|
+
echo "set -gx PATH \"\$OMEGA_HOME/Agentik_Tools/bin\" \$PATH"
|
|
451
|
+
echo "$close"
|
|
452
|
+
} >> "$rc"
|
|
453
|
+
else
|
|
454
|
+
{
|
|
455
|
+
echo ""
|
|
456
|
+
echo "$marker"
|
|
457
|
+
echo "export OMEGA_HOME=\"$OMEGA_HOME\""
|
|
458
|
+
echo "export PATH=\"\$OMEGA_HOME/Agentik_Tools/bin:\$PATH\""
|
|
459
|
+
echo "$close"
|
|
460
|
+
} >> "$rc"
|
|
461
|
+
fi
|
|
462
|
+
ok "PATH wired in $rc — open a new shell or \`source $rc\`"
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
# post_install_card — beautiful boxed summary printed at the very end.
|
|
466
|
+
# Reads `omega doctor --json` to compute the verdict.
|
|
467
|
+
post_install_card() {
|
|
468
|
+
local omega="$OMEGA_HOME/Agentik_Tools/bin/omega"
|
|
469
|
+
local verdict_text verdict_color
|
|
470
|
+
if [ -x "$omega" ]; then
|
|
471
|
+
local readiness
|
|
472
|
+
readiness="$(OMEGA_HOME="$OMEGA_HOME" "$omega" doctor --json 2>/dev/null \
|
|
473
|
+
| python3 -c 'import sys,json
|
|
474
|
+
try: d=json.load(sys.stdin); print(d.get("readiness","unknown"))
|
|
475
|
+
except Exception: print("unknown")' 2>/dev/null)" || readiness="unknown"
|
|
476
|
+
case "${readiness,,}" in
|
|
477
|
+
ready) verdict_text="READY" ; verdict_color="$C_GREEN" ;;
|
|
478
|
+
partial) verdict_text="PARTIAL" ; verdict_color="$C_YELLOW" ;;
|
|
479
|
+
not-ready|not_ready) verdict_text="NOT READY"; verdict_color="$C_RED" ;;
|
|
480
|
+
*) verdict_text="UNKNOWN" ; verdict_color="$C_DIM" ;;
|
|
481
|
+
esac
|
|
482
|
+
else
|
|
483
|
+
verdict_text="UNKNOWN" ; verdict_color="$C_DIM"
|
|
484
|
+
fi
|
|
485
|
+
|
|
486
|
+
local now elapsed mm ss
|
|
487
|
+
now="$(date +%s)"; elapsed=$((now - INSTALL_START_TS))
|
|
488
|
+
mm=$((elapsed / 60)); ss=$((elapsed % 60))
|
|
489
|
+
local v; v="$(omega_version)"
|
|
490
|
+
|
|
491
|
+
# Side-rule style — only a left bar + a top/bottom thread.
|
|
492
|
+
# ANSI-safe (no right padding to misalign).
|
|
493
|
+
local bar="${C_CYAN}│${C_RST}"
|
|
494
|
+
local top="${C_CYAN}╭─── ${C_BOLD}Omega OS v$v${C_RST}${C_CYAN} — install complete ─────────${C_RST}"
|
|
495
|
+
local bot="${C_CYAN}╰────────────────────────────────────────────────────────────${C_RST}"
|
|
496
|
+
printf '\n'
|
|
497
|
+
printf ' %s\n' "$top"
|
|
498
|
+
printf ' %s\n' "$bar"
|
|
499
|
+
printf ' %s status %s%s%s\n' "$bar" "$verdict_color$C_BOLD" "$verdict_text" "$C_RST"
|
|
500
|
+
printf ' %s home %s\n' "$bar" "$OMEGA_HOME"
|
|
501
|
+
printf ' %s user %s\n' "$bar" "$OMEGA_USER"
|
|
502
|
+
printf ' %s elapsed %s\n' "$bar" "$(printf '%02d:%02d' "$mm" "$ss")"
|
|
503
|
+
printf ' %s\n' "$bar"
|
|
504
|
+
printf ' %s %snext steps%s\n' "$bar" "$C_BOLD" "$C_RST"
|
|
505
|
+
printf " %s 1. %stmux attach -t AISB-chat%s %salways-on Hermès conversation%s\n" \
|
|
506
|
+
"$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
|
|
507
|
+
printf " %s 2. open a new shell ${C_DIM}(or \`source ~/.zshrc\`)${C_RST}\n" "$bar"
|
|
508
|
+
printf ' %s 3. %somega status%s every task + derived state\n' "$bar" "$C_BOLD" "$C_RST"
|
|
509
|
+
printf ' %s 4. %somega account list%s wire your Claude Max OAuth\n' "$bar" "$C_BOLD" "$C_RST"
|
|
510
|
+
printf ' %s 5. %somega run "hello"%s first verified mission\n' "$bar" "$C_BOLD" "$C_RST"
|
|
511
|
+
printf ' %s 6. %somega%s interactive menu (whiptail)\n' "$bar" "$C_BOLD" "$C_RST"
|
|
512
|
+
printf ' %s\n' "$bar"
|
|
513
|
+
printf ' %s %ssessions%s all Omega/Claude/LLM sessions run inside tmux\n' \
|
|
514
|
+
"$bar" "$C_BOLD" "$C_RST"
|
|
515
|
+
printf " %s ${C_DIM}prefix+Z = picker, prefix+d = detach (keeps running)${C_RST}\n" "$bar"
|
|
516
|
+
printf ' %s\n' "$bar"
|
|
517
|
+
printf ' %s %sdocs%s %sgithub.com/agentik-os/OmegaOS%s\n' "$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
|
|
518
|
+
printf ' %s %sissues%s %sgithub.com/agentik-os/OmegaOS/issues%s\n' "$bar" "$C_BOLD" "$C_RST" "$C_DIM" "$C_RST"
|
|
519
|
+
printf ' %s\n' "$bot"
|
|
520
|
+
|
|
521
|
+
# If PARTIAL or NOT READY, tell them where to look.
|
|
522
|
+
case "$verdict_text" in
|
|
523
|
+
PARTIAL|"NOT READY")
|
|
524
|
+
printf '\n %s↳ Some checks did not pass.%s Run %s\`omega doctor\`%s to see details.\n' \
|
|
525
|
+
"$C_YELLOW" "$C_RST" "$C_BOLD" "$C_RST"
|
|
526
|
+
printf ' Logs are at %s%s%s\n' "$C_DIM" "$LOG_FILE" "$C_RST"
|
|
527
|
+
;;
|
|
528
|
+
esac
|
|
529
|
+
}
|