@agentikos/omega-os 0.2.0 → 0.19.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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 +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,950 @@
|
|
|
1
|
+
"""Phase content generators — produce the docs for each Genesis phase.
|
|
2
|
+
|
|
3
|
+
Each phase is a pure function ``(state) -> list[FileSpec]`` where
|
|
4
|
+
:class:`FileSpec` is a ``(path, content)`` pair anchored to the project
|
|
5
|
+
root. The orchestrator persists every spec to disk inside the per-project
|
|
6
|
+
``docs/`` tree, then flips the state machine.
|
|
7
|
+
|
|
8
|
+
The content of each file is a **structured template** the orchestrator
|
|
9
|
+
fills with what it knows (slug, name, intent, stack). The template
|
|
10
|
+
intentionally LEAVES sections marked ``<!-- TODO: ... -->`` for the
|
|
11
|
+
worker agent to fill — Genesis writes the skeleton; the workers (Layer 5)
|
|
12
|
+
do the deep research.
|
|
13
|
+
|
|
14
|
+
Why a structured template instead of "ask the LLM to write it"
|
|
15
|
+
--------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
The pre-v0.18 ``/prd`` skill called the LLM to author every file from
|
|
18
|
+
scratch. Three problems:
|
|
19
|
+
|
|
20
|
+
1. **Non-deterministic file shape.** Two re-runs produced different
|
|
21
|
+
section layouts → downstream skills couldn't grep reliably.
|
|
22
|
+
2. **No per-section worker dispatch.** When a section was bad, you had
|
|
23
|
+
to regen the whole file.
|
|
24
|
+
3. **No depends_on graph.** Features came out in random order.
|
|
25
|
+
|
|
26
|
+
This module solves all three: the file STRUCTURE is deterministic Python
|
|
27
|
+
code; only the per-section CONTENT is filled by workers. Each worker can
|
|
28
|
+
target ``31-PRD.md#section-3`` instead of "rewrite the PRD".
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
from dataclasses import dataclass
|
|
33
|
+
from typing import Any
|
|
34
|
+
|
|
35
|
+
from omega_engine.genesis.state import GenesisState
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class FileSpec:
|
|
40
|
+
"""One file to write under the project's docs tree."""
|
|
41
|
+
|
|
42
|
+
rel_path: str # relative to project_root, e.g. "docs/00-VISION.md"
|
|
43
|
+
content: str # full file body (markdown)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
# ---------------------------------------------------------------------------
|
|
47
|
+
# Section helpers — every phase uses the same skeleton style
|
|
48
|
+
# ---------------------------------------------------------------------------
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _frontmatter(state: GenesisState, *, kind: str) -> str:
|
|
52
|
+
"""YAML frontmatter on every doc — machine-readable provenance."""
|
|
53
|
+
return (
|
|
54
|
+
f"---\n"
|
|
55
|
+
f"slug: {state.slug}\n"
|
|
56
|
+
f"name: {state.name}\n"
|
|
57
|
+
f"kind: {kind}\n"
|
|
58
|
+
f"phase: {state.phase}\n"
|
|
59
|
+
f"stack:\n"
|
|
60
|
+
f" type: {state.stack.type}\n"
|
|
61
|
+
f" frontend: {state.stack.frontend}\n"
|
|
62
|
+
f" backend: {state.stack.backend}\n"
|
|
63
|
+
f" ui_kit: {state.stack.ui_kit}\n"
|
|
64
|
+
f"generated_at: {state.updated_at}\n"
|
|
65
|
+
f"---\n\n"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _todo(label: str) -> str:
|
|
70
|
+
return f"<!-- TODO: {label} -->"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# PHASE 1 — Vision
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def phase_vision(state: GenesisState) -> list[FileSpec]:
|
|
79
|
+
"""One file: docs/00-VISION.md — product identity + emotional positioning."""
|
|
80
|
+
body = _frontmatter(state, kind="vision") + f"""# Vision — {state.name}
|
|
81
|
+
|
|
82
|
+
> **One-line intent (operator brief):**
|
|
83
|
+
> {state.intent or _todo("operator did not provide an intent — capture it during the vision interview")}
|
|
84
|
+
|
|
85
|
+
## Why this product exists
|
|
86
|
+
|
|
87
|
+
{_todo("3-5 sentences. What void does this fill? Who hurts today, and how?")}
|
|
88
|
+
|
|
89
|
+
## The user we're building for
|
|
90
|
+
|
|
91
|
+
- **Primary persona:** {_todo("1-line role + 1-line stage of life/work")}
|
|
92
|
+
- **Pain we end:** {_todo("the concrete pain, in their words")}
|
|
93
|
+
- **Win we deliver:** {_todo("the concrete win, measurable in minutes / dollars / confidence")}
|
|
94
|
+
|
|
95
|
+
## The 1-second pitch (5-year-old version)
|
|
96
|
+
|
|
97
|
+
{_todo("If you told a 5-year-old what this product does in one sentence, what would you say?")}
|
|
98
|
+
|
|
99
|
+
## What this product is NOT
|
|
100
|
+
|
|
101
|
+
- {_todo("the most likely confusion — and why we're not that")}
|
|
102
|
+
- {_todo("the adjacent market we will not serve")}
|
|
103
|
+
|
|
104
|
+
## Internal compass — 3 principles we will not betray
|
|
105
|
+
|
|
106
|
+
1. {_todo("principle 1 — concrete, verifiable in product decisions")}
|
|
107
|
+
2. {_todo("principle 2 — concrete, verifiable in product decisions")}
|
|
108
|
+
3. {_todo("principle 3 — concrete, verifiable in product decisions")}
|
|
109
|
+
|
|
110
|
+
## Emotional positioning
|
|
111
|
+
|
|
112
|
+
| Adjective | Why it matters here |
|
|
113
|
+
|---|---|
|
|
114
|
+
| {_todo("adjective 1")} | {_todo("why")} |
|
|
115
|
+
| {_todo("adjective 2")} | {_todo("why")} |
|
|
116
|
+
| {_todo("adjective 3")} | {_todo("why")} |
|
|
117
|
+
|
|
118
|
+
## Success — what 'working' looks like 12 months from launch
|
|
119
|
+
|
|
120
|
+
- **User win:** {_todo("a specific user outcome we'd celebrate")}
|
|
121
|
+
- **Business win:** {_todo("a specific revenue / retention / activation number")}
|
|
122
|
+
- **Team win:** {_todo("the team's pride moment, what they'd brag about")}
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
**Next:** ``omega genesis run {state.slug}`` to advance to the **market** phase.
|
|
127
|
+
"""
|
|
128
|
+
return [FileSpec("docs/00-VISION.md", body)]
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# ---------------------------------------------------------------------------
|
|
132
|
+
# PHASE 2 — Market (5 files)
|
|
133
|
+
# ---------------------------------------------------------------------------
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def phase_market(state: GenesisState) -> list[FileSpec]:
|
|
137
|
+
fm = _frontmatter(state, kind="market-research")
|
|
138
|
+
return [
|
|
139
|
+
FileSpec("docs/10-market/11-COMPETITORS.md", fm + f"""# Competitors — {state.name}
|
|
140
|
+
|
|
141
|
+
> Direct, indirect, and adjacent players. We name them so we can decide
|
|
142
|
+
> how we differ — not to copy them.
|
|
143
|
+
|
|
144
|
+
## Direct competitors
|
|
145
|
+
|
|
146
|
+
| Player | URL | Stage | Pricing | Where they win | Where we beat them |
|
|
147
|
+
|---|---|---|---|---|---|
|
|
148
|
+
| {_todo("Player A")} | {_todo("url")} | {_todo("seed/A/B/scale")} | {_todo("from $X")} | {_todo("their strength")} | {_todo("our advantage")} |
|
|
149
|
+
| {_todo("Player B")} | {_todo("url")} | {_todo("stage")} | {_todo("pricing")} | {_todo("strength")} | {_todo("advantage")} |
|
|
150
|
+
|
|
151
|
+
## Indirect / adjacent
|
|
152
|
+
|
|
153
|
+
- {_todo("adjacent player — what they solve that overlaps ~30%")}
|
|
154
|
+
|
|
155
|
+
## Open positioning gap (the wedge)
|
|
156
|
+
|
|
157
|
+
{_todo("one paragraph: the specific job-to-be-done nobody owns yet")}
|
|
158
|
+
|
|
159
|
+
## Switching cost — how a user leaves a competitor for us
|
|
160
|
+
|
|
161
|
+
{_todo("the concrete migration path: what they export, what we import, what we promise during onboarding")}
|
|
162
|
+
"""),
|
|
163
|
+
|
|
164
|
+
FileSpec("docs/10-market/12-ICP.md", fm + f"""# Ideal Customer Profile — {state.name}
|
|
165
|
+
|
|
166
|
+
## ICP — Tier 1 (the bullseye)
|
|
167
|
+
|
|
168
|
+
- **Role / Title:** {_todo("e.g. 'Head of Growth at a 50-200 ARR B2B SaaS'")}
|
|
169
|
+
- **Company stage:** {_todo("series A-B, profitable, 50-200 employees")}
|
|
170
|
+
- **Geography:** {_todo("EU / US / global / French-speaking-only")}
|
|
171
|
+
- **Trigger event:** {_todo("the moment they suddenly need this — funding round, churn spike, hiring freeze")}
|
|
172
|
+
- **Where they hang out:** {_todo("Twitter circles, Slack groups, LinkedIn niches")}
|
|
173
|
+
- **Budget signal:** {_todo("they already pay $X/mo for Y product")}
|
|
174
|
+
|
|
175
|
+
## ICP — Tier 2 (the spillover, lower ACV but volume)
|
|
176
|
+
|
|
177
|
+
{_todo("same shape, secondary segment")}
|
|
178
|
+
|
|
179
|
+
## Anti-ICP (we'd refuse this customer)
|
|
180
|
+
|
|
181
|
+
- {_todo("anti-pattern 1 — why we'd say no even at full price")}
|
|
182
|
+
|
|
183
|
+
## Job-to-be-done
|
|
184
|
+
|
|
185
|
+
> When **{_todo("situation")}**, I want to **{_todo("verb + outcome")}**, so I can **{_todo("higher-level goal")}**.
|
|
186
|
+
"""),
|
|
187
|
+
|
|
188
|
+
FileSpec("docs/10-market/13-PRICING-STRATEGY.md", fm + f"""# Pricing strategy — {state.name}
|
|
189
|
+
|
|
190
|
+
## Pricing axis (what we charge for)
|
|
191
|
+
|
|
192
|
+
{_todo("seats / events / API calls / outcomes / tier features — pick ONE primary axis and one secondary at most")}
|
|
193
|
+
|
|
194
|
+
## Tiers (initial)
|
|
195
|
+
|
|
196
|
+
| Tier | Price | Limits | Who | Why we drew the line here |
|
|
197
|
+
|---|---|---|---|---|
|
|
198
|
+
| Free | $0/mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
|
|
199
|
+
| Pro | ${_todo("X")} /mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
|
|
200
|
+
| Team | ${_todo("X")} /mo | {_todo("limits")} | {_todo("who")} | {_todo("rationale")} |
|
|
201
|
+
| Enterprise | custom | unlimited | {_todo("who")} | {_todo("rationale")} |
|
|
202
|
+
|
|
203
|
+
## Willingness to pay signals (from competitor + ICP research)
|
|
204
|
+
|
|
205
|
+
- {_todo("they currently pay $X for Y — anchor")}
|
|
206
|
+
- {_todo("survey / interview / public pricing reference")}
|
|
207
|
+
|
|
208
|
+
## Stripe Connect configuration
|
|
209
|
+
|
|
210
|
+
- **Mode:** {_todo("destination charges | direct charges | subscriptions")}
|
|
211
|
+
- **Currency:** {_todo("USD / EUR / multi")}
|
|
212
|
+
- **Tax handling:** {_todo("Stripe Tax / Avalara / manual")}
|
|
213
|
+
- **Webhooks we MUST handle:** ``checkout.session.completed``, ``invoice.payment_failed``, ``customer.subscription.*``
|
|
214
|
+
|
|
215
|
+
## Pricing experiments we will run
|
|
216
|
+
|
|
217
|
+
1. {_todo("test 1 — what we change, what we measure")}
|
|
218
|
+
2. {_todo("test 2")}
|
|
219
|
+
"""),
|
|
220
|
+
|
|
221
|
+
FileSpec("docs/10-market/14-GTM-CHANNELS.md", fm + f"""# Go-to-market channels — {state.name}
|
|
222
|
+
|
|
223
|
+
## Rank-ordered channels (top 5 we will lean on)
|
|
224
|
+
|
|
225
|
+
| Rank | Channel | Why this one | Owner | First experiment |
|
|
226
|
+
|---|---|---|---|---|
|
|
227
|
+
| 1 | {_todo("channel")} | {_todo("fit with ICP + cost")} | {_todo("who runs it")} | {_todo("week-1 test")} |
|
|
228
|
+
| 2 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
|
|
229
|
+
| 3 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
|
|
230
|
+
| 4 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
|
|
231
|
+
| 5 | {_todo("channel")} | {_todo("rationale")} | {_todo("who")} | {_todo("test")} |
|
|
232
|
+
|
|
233
|
+
## Channels we explicitly reject
|
|
234
|
+
|
|
235
|
+
- {_todo("channel + why it doesn't fit the ICP")}
|
|
236
|
+
|
|
237
|
+
## Distribution moat — what compounds
|
|
238
|
+
|
|
239
|
+
{_todo("the thing that gets cheaper / better the longer we run it (SEO, community, viral loop, integrations)")}
|
|
240
|
+
"""),
|
|
241
|
+
|
|
242
|
+
FileSpec("docs/10-market/15-POSITIONING.md", fm + f"""# Positioning — {state.name}
|
|
243
|
+
|
|
244
|
+
## The one-sentence positioning statement
|
|
245
|
+
|
|
246
|
+
> For **{_todo("ICP")}** who struggle with **{_todo("pain")}**,
|
|
247
|
+
> **{state.name}** is the **{_todo("product category")}** that
|
|
248
|
+
> **{_todo("unique benefit")}** —
|
|
249
|
+
> unlike **{_todo("alternative")}**, we **{_todo("how we differ")}**.
|
|
250
|
+
|
|
251
|
+
## Category we play in
|
|
252
|
+
|
|
253
|
+
- **Existing category:** {_todo("e.g. 'sales engagement'")}
|
|
254
|
+
- **Our framing:** {_todo("how we re-name the category to favour our shape (e.g. 'AI sales rooms')")}
|
|
255
|
+
|
|
256
|
+
## Three messages, ranked
|
|
257
|
+
|
|
258
|
+
1. **Lead message:** {_todo("the line on the hero")}
|
|
259
|
+
2. **Proof message:** {_todo("the line that closes a skeptic")}
|
|
260
|
+
3. **Differentiator:** {_todo("the line that makes us memorable")}
|
|
261
|
+
|
|
262
|
+
## Anti-positioning — what we will NEVER claim
|
|
263
|
+
|
|
264
|
+
- {_todo("a tempting positioning we will refuse for integrity")}
|
|
265
|
+
"""),
|
|
266
|
+
]
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
# ---------------------------------------------------------------------------
|
|
270
|
+
# PHASE 3 — Branding (3 files, wired to the design-discipline skills)
|
|
271
|
+
# ---------------------------------------------------------------------------
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def phase_branding(state: GenesisState) -> list[FileSpec]:
|
|
275
|
+
fm = _frontmatter(state, kind="branding")
|
|
276
|
+
ui_kit = state.stack.ui_kit
|
|
277
|
+
# The 3 design skills the operator already has installed globally
|
|
278
|
+
# are referenced here so the worker that fills these files knows
|
|
279
|
+
# which skills to invoke.
|
|
280
|
+
design_skills_block = (
|
|
281
|
+
"## Design discipline — skills the worker MUST invoke when filling this\n\n"
|
|
282
|
+
"- **`/emil-design-eng`** (https://github.com/emilkowalski/skill) — "
|
|
283
|
+
"Emil Kowalski's design engineering discipline; bias toward subtle, "
|
|
284
|
+
"tactile, motion-aware interfaces.\n"
|
|
285
|
+
"- **`/impeccable`** (https://github.com/pbakaus/impeccable) — "
|
|
286
|
+
"Pixel-level craft. No half-baked components, no inconsistent spacing.\n"
|
|
287
|
+
"- **`/taste-skill`** (https://www.tasteskill.dev) — taste calibration "
|
|
288
|
+
"across typography, colour, hierarchy, motion.\n"
|
|
289
|
+
"- **`/shadcn-ui`** — every component from "
|
|
290
|
+
"https://ui.shadcn.com/docs/components is in scope by default.\n\n"
|
|
291
|
+
)
|
|
292
|
+
return [
|
|
293
|
+
FileSpec("docs/20-brand/21-BRAND-IDENTITY.md", fm + f"""# Brand identity — {state.name}
|
|
294
|
+
|
|
295
|
+
{design_skills_block}
|
|
296
|
+
|
|
297
|
+
## Personality (5-7 adjectives, ranked)
|
|
298
|
+
|
|
299
|
+
1. {_todo("adjective 1")}
|
|
300
|
+
2. {_todo("adjective 2")}
|
|
301
|
+
3. {_todo("adjective 3")}
|
|
302
|
+
|
|
303
|
+
## Voice rules
|
|
304
|
+
|
|
305
|
+
- **We sound like:** {_todo("1 sentence describing the voice — e.g. 'a senior engineer who respects your time'")}
|
|
306
|
+
- **We never sound:** {_todo("anti-pattern — e.g. 'hype, exclamation marks, AI-marketing-ese'")}
|
|
307
|
+
|
|
308
|
+
## Tone matrix
|
|
309
|
+
|
|
310
|
+
| Context | Tone | Example phrase |
|
|
311
|
+
|---|---|---|
|
|
312
|
+
| Onboarding | {_todo("welcoming | direct")} | "{_todo("phrase")}" |
|
|
313
|
+
| Error | {_todo("clear | accountable")} | "{_todo("phrase")}" |
|
|
314
|
+
| Success | {_todo("understated | warm")} | "{_todo("phrase")}" |
|
|
315
|
+
| Marketing | {_todo("confident | specific")} | "{_todo("phrase")}" |
|
|
316
|
+
|
|
317
|
+
## Visual mood (mood-board references)
|
|
318
|
+
|
|
319
|
+
- {_todo("ref 1 — Linear, Vercel, Stripe, Things, …")}
|
|
320
|
+
- {_todo("ref 2")}
|
|
321
|
+
- {_todo("ref 3 — and ONE we explicitly want to be NOT like")}
|
|
322
|
+
|
|
323
|
+
## Logo direction
|
|
324
|
+
|
|
325
|
+
- **Mark:** {_todo("wordmark | symbol+wordmark | letter mark")}
|
|
326
|
+
- **Energy:** {_todo("static | kinetic | playful | severe")}
|
|
327
|
+
- **Constraint:** {_todo("monochrome-first / colour-first / both")}
|
|
328
|
+
"""),
|
|
329
|
+
|
|
330
|
+
FileSpec("docs/20-brand/22-DESIGN-SYSTEM.md", fm + f"""# Design system — {state.name}
|
|
331
|
+
|
|
332
|
+
{design_skills_block}
|
|
333
|
+
|
|
334
|
+
## Foundation
|
|
335
|
+
|
|
336
|
+
- **UI kit:** ``{ui_kit}``
|
|
337
|
+
- **shadcn theme:** {_todo("oklch palette name + 1-line justification")}
|
|
338
|
+
- **Type scale:** {_todo("modular scale ratio (1.125 / 1.250 / 1.333)")}
|
|
339
|
+
- **Radius:** {_todo("rounded-md by default | sharp | very rounded")}
|
|
340
|
+
- **Spacing unit:** {_todo("4px / 8px / Tailwind default")}
|
|
341
|
+
|
|
342
|
+
## Colour tokens (oklch, light + dark)
|
|
343
|
+
|
|
344
|
+
| Token | Light | Dark | Used on |
|
|
345
|
+
|---|---|---|---|
|
|
346
|
+
| bg | {_todo("L 100% C 0 H 0")} | {_todo("L 8% C 0 H 0")} | page backgrounds |
|
|
347
|
+
| fg | {_todo("L 14% C 0.02 H 250")} | {_todo("L 96% C 0.02 H 250")} | primary text |
|
|
348
|
+
| primary | {_todo("L 60% C 0.18 H 250")} | {_todo("L 65% C 0.18 H 250")} | CTAs |
|
|
349
|
+
| accent | {_todo("L 70% C 0.20 H 30")} | {_todo("L 70% C 0.20 H 30")} | highlights |
|
|
350
|
+
|
|
351
|
+
## Typography pairings
|
|
352
|
+
|
|
353
|
+
- **Display:** {_todo("font + weight + tracking")}
|
|
354
|
+
- **Body:** {_todo("font + weight + line-height")}
|
|
355
|
+
- **Mono:** {_todo("font for code/numbers")}
|
|
356
|
+
|
|
357
|
+
## Component inventory we will ship in v1
|
|
358
|
+
|
|
359
|
+
(from https://ui.shadcn.com/docs/components — pick + extend)
|
|
360
|
+
|
|
361
|
+
- {_todo("button: 4 variants + 3 sizes")}
|
|
362
|
+
- {_todo("card, input, select, dialog, sheet, tabs")}
|
|
363
|
+
- {_todo("toast, tooltip, dropdown")}
|
|
364
|
+
- {_todo("app-specific: chat-bubble | data-card | flow-canvas")}
|
|
365
|
+
|
|
366
|
+
## Components we will NOT use
|
|
367
|
+
|
|
368
|
+
- {_todo("e.g. carousel — never tells the story we want")}
|
|
369
|
+
"""),
|
|
370
|
+
|
|
371
|
+
FileSpec("docs/20-brand/23-MOTION-LANGUAGE.md", fm + f"""# Motion language — {state.name}
|
|
372
|
+
|
|
373
|
+
{design_skills_block}
|
|
374
|
+
|
|
375
|
+
## Motion principles (Emil Kowalski + Impeccable)
|
|
376
|
+
|
|
377
|
+
1. **Purpose first.** Motion is only allowed when it serves comprehension
|
|
378
|
+
or feedback. Decorative motion is rejected.
|
|
379
|
+
2. **Spring physics, not curves.** Use Framer Motion springs with
|
|
380
|
+
``stiffness`` 300-500 + ``damping`` 25-40 — easing only for transforms
|
|
381
|
+
tied to user gestures.
|
|
382
|
+
3. **150-250ms.** Anything outside this window feels broken (too fast
|
|
383
|
+
feels jittery, too slow feels slow).
|
|
384
|
+
4. **Mass + drag.** Heavy elements move slower; light elements snap.
|
|
385
|
+
5. **Reduced-motion compliance.** Every transition checks
|
|
386
|
+
``prefers-reduced-motion`` and disables the spring.
|
|
387
|
+
|
|
388
|
+
## Motion catalogue we will ship
|
|
389
|
+
|
|
390
|
+
| Event | Spec | Why |
|
|
391
|
+
|---|---|---|
|
|
392
|
+
| Page enter | {_todo("fade + 8px translateY, 200ms spring")} | {_todo("reason")} |
|
|
393
|
+
| Modal open | {_todo("scale 0.96→1 + fade, 180ms")} | {_todo("reason")} |
|
|
394
|
+
| Hover affordance | {_todo("y -2px, instant on touch")} | {_todo("reason")} |
|
|
395
|
+
| Tab switch | {_todo("layoutId + 200ms spring")} | {_todo("reason")} |
|
|
396
|
+
| Toast | {_todo("slide-in 250ms, auto-dismiss 4s")} | {_todo("reason")} |
|
|
397
|
+
|
|
398
|
+
## Library
|
|
399
|
+
|
|
400
|
+
- **Primary:** ``framer-motion`` (matches React + shadcn)
|
|
401
|
+
- **For complex orchestration:** ``gsap`` (only when framer-motion can't, with rationale per use)
|
|
402
|
+
- **For 3D / WebGL:** ``three.js`` + ``@react-three/fiber`` (only for hero / brand moments)
|
|
403
|
+
"""),
|
|
404
|
+
]
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
# ---------------------------------------------------------------------------
|
|
408
|
+
# PHASE 4 — PRD suite (9 files)
|
|
409
|
+
# ---------------------------------------------------------------------------
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
def phase_prd(state: GenesisState) -> list[FileSpec]:
|
|
413
|
+
fm = _frontmatter(state, kind="prd")
|
|
414
|
+
s = state.stack
|
|
415
|
+
return [
|
|
416
|
+
FileSpec("docs/30-prd/31-PRD.md", fm + f"""# Product Requirements Document — {state.name}
|
|
417
|
+
|
|
418
|
+
## 1. Problem
|
|
419
|
+
|
|
420
|
+
{_todo("3-5 sentences. Same problem as VISION but here with concrete user behaviours that prove the pain.")}
|
|
421
|
+
|
|
422
|
+
## 2. Goals (v1 — what we MUST ship)
|
|
423
|
+
|
|
424
|
+
| Goal | Measurable success | Owner |
|
|
425
|
+
|---|---|---|
|
|
426
|
+
| {_todo("goal")} | {_todo("metric + threshold")} | {_todo("role")} |
|
|
427
|
+
|
|
428
|
+
## 3. Non-goals (for v1)
|
|
429
|
+
|
|
430
|
+
- {_todo("explicit feature we WILL NOT build in v1")}
|
|
431
|
+
- {_todo("audience we WILL NOT serve in v1")}
|
|
432
|
+
|
|
433
|
+
## 4. Personas
|
|
434
|
+
|
|
435
|
+
(See ``docs/10-market/12-ICP.md`` for full ICPs.)
|
|
436
|
+
|
|
437
|
+
## 5. Top user stories — v1 scope
|
|
438
|
+
|
|
439
|
+
| ID | Story | Acceptance |
|
|
440
|
+
|---|---|---|
|
|
441
|
+
| US-01 | As a {_todo("role")}, I want to {_todo("verb + object")}, so I can {_todo("higher-level goal")} | {_todo("verifiable criterion")} |
|
|
442
|
+
| US-02 | … | … |
|
|
443
|
+
|
|
444
|
+
## 6. Feature list
|
|
445
|
+
|
|
446
|
+
See ``docs/40-features/F-*.md`` — each feature has its own spec with
|
|
447
|
+
``depends_on`` (the DAG the v0.19 plan executor uses).
|
|
448
|
+
|
|
449
|
+
## 7. Constraints
|
|
450
|
+
|
|
451
|
+
- **Stack:** {s.frontend} + {s.backend} + {s.deploy} + {s.payments}
|
|
452
|
+
- **Compliance:** {_todo("GDPR / SOC2 / HIPAA / none")}
|
|
453
|
+
- **Performance budget:** {_todo("LCP <2.5s, CLS <0.1, bundle <X KB")}
|
|
454
|
+
|
|
455
|
+
## 8. Risks + mitigations
|
|
456
|
+
|
|
457
|
+
| Risk | Mitigation |
|
|
458
|
+
|---|---|
|
|
459
|
+
| {_todo("risk 1")} | {_todo("mitigation")} |
|
|
460
|
+
| {_todo("risk 2")} | {_todo("mitigation")} |
|
|
461
|
+
"""),
|
|
462
|
+
|
|
463
|
+
FileSpec("docs/30-prd/32-TECH-ARCHITECTURE.md", fm + f"""# Technical architecture — {state.name}
|
|
464
|
+
|
|
465
|
+
## Stack lock
|
|
466
|
+
|
|
467
|
+
| Layer | Choice | Version policy |
|
|
468
|
+
|---|---|---|
|
|
469
|
+
| Frontend | ``{s.frontend}`` | latest LTS — fetched via Context7 at install |
|
|
470
|
+
| Backend | ``{s.backend}`` | latest stable |
|
|
471
|
+
| Deploy | ``{s.deploy}`` | — |
|
|
472
|
+
| Payments | ``{s.payments}`` | latest API |
|
|
473
|
+
| Auth | ``{s.auth}`` | — |
|
|
474
|
+
| UI kit | ``{s.ui_kit}`` | latest |
|
|
475
|
+
| Extras | {", ".join(s.extras) or "—"} | per-lib best practice |
|
|
476
|
+
|
|
477
|
+
## Repo shape (monorepo or single?)
|
|
478
|
+
|
|
479
|
+
{_todo("single-repo / Turborepo / pnpm workspaces — and why")}
|
|
480
|
+
|
|
481
|
+
## Folder structure
|
|
482
|
+
|
|
483
|
+
```
|
|
484
|
+
{state.slug}/
|
|
485
|
+
├── apps/
|
|
486
|
+
│ └── web/ # Next.js App Router
|
|
487
|
+
│ ├── app/
|
|
488
|
+
│ ├── components/
|
|
489
|
+
│ └── lib/
|
|
490
|
+
├── packages/ # if monorepo
|
|
491
|
+
├── convex/ # backend functions (if convex)
|
|
492
|
+
├── docs/ # Genesis output (this tree)
|
|
493
|
+
├── plan/ # v0.19 plan store
|
|
494
|
+
└── .env.local
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
## Deployment topology
|
|
498
|
+
|
|
499
|
+
- **Web:** {_todo("Vercel project name + region")}
|
|
500
|
+
- **Backend:** {_todo("Convex deployment name + region")}
|
|
501
|
+
- **DNS:** {_todo("apex domain + subdomain plan")}
|
|
502
|
+
|
|
503
|
+
## Observability
|
|
504
|
+
|
|
505
|
+
- **Errors:** Sentry
|
|
506
|
+
- **Analytics:** {_todo("PostHog | Plausible | Mixpanel — and one reason")}
|
|
507
|
+
- **Performance:** Vercel Analytics + Speed Insights
|
|
508
|
+
"""),
|
|
509
|
+
|
|
510
|
+
FileSpec("docs/30-prd/33-DESIGN-SYSTEM-DETAIL.md", fm + f"""# Design system — implementation detail
|
|
511
|
+
|
|
512
|
+
(High-level system in ``docs/20-brand/22-DESIGN-SYSTEM.md``.)
|
|
513
|
+
|
|
514
|
+
## Tailwind v4 config
|
|
515
|
+
|
|
516
|
+
{_todo("the @theme block with the oklch palette, font stack, radius, spacing")}
|
|
517
|
+
|
|
518
|
+
## shadcn theme
|
|
519
|
+
|
|
520
|
+
{_todo("the components.json baseColor + the per-token override block")}
|
|
521
|
+
|
|
522
|
+
## Component conventions
|
|
523
|
+
|
|
524
|
+
- Every shadcn component MUST be in ``components/ui/<name>.tsx``.
|
|
525
|
+
- App-specific components go in ``components/<feature>/<Name>.tsx``.
|
|
526
|
+
- NEVER edit shadcn primitives in-place — wrap and extend.
|
|
527
|
+
|
|
528
|
+
## Accessibility floor
|
|
529
|
+
|
|
530
|
+
- WCAG 2.1 AA on every page.
|
|
531
|
+
- ``/a11yaudit`` MUST score ≥ 85 on every PR.
|
|
532
|
+
"""),
|
|
533
|
+
|
|
534
|
+
FileSpec("docs/30-prd/34-LAYOUTS.md", fm + f"""# Layouts — {state.name}
|
|
535
|
+
|
|
536
|
+
## Top-level routes
|
|
537
|
+
|
|
538
|
+
| Route | Purpose | Auth required | Layout |
|
|
539
|
+
|---|---|---|---|
|
|
540
|
+
| ``/`` | Marketing landing | no | marketing |
|
|
541
|
+
| ``/sign-in`` | Auth | no | minimal |
|
|
542
|
+
| ``/dashboard`` | App home | yes | app |
|
|
543
|
+
| ``/dashboard/{_todo("...")}`` | feature | yes | app |
|
|
544
|
+
| ``/settings`` | Account | yes | app |
|
|
545
|
+
|
|
546
|
+
## App-shell layout
|
|
547
|
+
|
|
548
|
+
```
|
|
549
|
+
┌─────────────────────────────────────────────┐
|
|
550
|
+
│ top-bar (logo · search · profile) │
|
|
551
|
+
├──────┬──────────────────────────────────────┤
|
|
552
|
+
│ side │ main content │
|
|
553
|
+
│ nav │ │
|
|
554
|
+
│ │ │
|
|
555
|
+
└──────┴──────────────────────────────────────┘
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
## Marketing layout
|
|
559
|
+
|
|
560
|
+
{_todo("hero, social proof, features grid, pricing, footer — order + one-line each")}
|
|
561
|
+
"""),
|
|
562
|
+
|
|
563
|
+
FileSpec("docs/30-prd/35-DATA-MODEL.md", fm + f"""# Data model — {state.name}
|
|
564
|
+
|
|
565
|
+
## Entities (Convex tables / Postgres tables)
|
|
566
|
+
|
|
567
|
+
| Entity | Fields | Indexed by | Relationships |
|
|
568
|
+
|---|---|---|---|
|
|
569
|
+
| users | id, email, name, createdAt, planTier | byEmail | 1-to-many → projects |
|
|
570
|
+
| {_todo("entity")} | {_todo("fields")} | {_todo("indexes")} | {_todo("relationships")} |
|
|
571
|
+
|
|
572
|
+
## Convex schema (schema.ts)
|
|
573
|
+
|
|
574
|
+
```typescript
|
|
575
|
+
{_todo("import { defineSchema, defineTable } from convex/server; …")}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## Migrations strategy
|
|
579
|
+
|
|
580
|
+
- Every schema change carries a migration script in ``convex/migrations/``.
|
|
581
|
+
- ``omega plan build`` REJECTS a feature whose ``depends_on`` includes a
|
|
582
|
+
schema change that hasn't been verified by ``/dataaudit``.
|
|
583
|
+
|
|
584
|
+
## PII + secrets
|
|
585
|
+
|
|
586
|
+
- {_todo("which fields are PII — and where they're encrypted at rest")}
|
|
587
|
+
- {_todo("which fields are secrets — and the vault path that holds them")}
|
|
588
|
+
"""),
|
|
589
|
+
|
|
590
|
+
FileSpec("docs/30-prd/36-AGENT-PLAYBOOK.md", fm + f"""# Agent playbook — {state.name}
|
|
591
|
+
|
|
592
|
+
> This file is read by every worker the v0.19 plan executor dispatches.
|
|
593
|
+
> It tells the worker WHAT IT MUST RESPECT, project-wide.
|
|
594
|
+
|
|
595
|
+
## Stack contract
|
|
596
|
+
|
|
597
|
+
- Frontend: ``{s.frontend}`` — App Router, Server Components by default.
|
|
598
|
+
- Backend: ``{s.backend}`` — queries + mutations only; no ad-hoc REST.
|
|
599
|
+
- Auth: ``{s.auth}`` — use the official middleware. Never roll your own.
|
|
600
|
+
- Payments: ``{s.payments}`` — webhook verification is non-negotiable.
|
|
601
|
+
|
|
602
|
+
## Skills the workers MUST invoke when the task touches their domain
|
|
603
|
+
|
|
604
|
+
| Worker domain | Skill |
|
|
605
|
+
|---|---|
|
|
606
|
+
| UI / pages | ``/shadcn-ui`` + ``/emil-design-eng`` + ``/impeccable`` + ``/taste-skill`` |
|
|
607
|
+
| Convex queries / mutations | ``/convex`` + ``/convex-best-practices`` |
|
|
608
|
+
| Stripe integration | ``/stripe-best-practices`` |
|
|
609
|
+
| Vercel deploy | ``/vl-deploy-to-vercel`` |
|
|
610
|
+
| Forms | ``/mk-form-cro`` |
|
|
611
|
+
| SEO surfaces | ``/seoaudit`` + ``/mk-schema-markup`` |
|
|
612
|
+
| Performance | ``/perfaudit`` |
|
|
613
|
+
| Accessibility | ``/a11yaudit`` |
|
|
614
|
+
| Motion | ``/motionaudit`` |
|
|
615
|
+
|
|
616
|
+
## Non-negotiables (worker MUST refuse the task if it violates these)
|
|
617
|
+
|
|
618
|
+
1. **No inline styles** unless the design system needs an escape hatch — and even then, document it.
|
|
619
|
+
2. **Server Components by default** in Next.js — ``"use client"`` only when state/effects/event handlers are needed.
|
|
620
|
+
3. **All routes auth-checked** via Clerk middleware. A page without a Clerk check is a security bug.
|
|
621
|
+
4. **Convex calls only from Server Components or via ``useQuery``** — never raw fetch().
|
|
622
|
+
5. **Every PR runs ``/perfaudit`` + ``/a11yaudit`` + ``/codeaudit`` before merge.**
|
|
623
|
+
|
|
624
|
+
## Verify per task
|
|
625
|
+
|
|
626
|
+
Each task has a ``verify_cmd`` set by the v0.19 plan builder. It's
|
|
627
|
+
non-negotiable: the worker writes ``.done.json`` with ``status=done_clean``
|
|
628
|
+
ONLY when verify_cmd exits 0. If it doesn't, status=pending — and the
|
|
629
|
+
worker explains in ``pending_actions`` what blocked it.
|
|
630
|
+
"""),
|
|
631
|
+
|
|
632
|
+
FileSpec("docs/30-prd/37-TESTING-STRATEGY.md", fm + f"""# Testing strategy — {state.name}
|
|
633
|
+
|
|
634
|
+
## Test pyramid
|
|
635
|
+
|
|
636
|
+
| Layer | What | Tool | Run when |
|
|
637
|
+
|---|---|---|---|
|
|
638
|
+
| Unit | Pure functions, utils | Vitest | every save |
|
|
639
|
+
| Component | shadcn-derived components | Vitest + Testing Library | every save |
|
|
640
|
+
| Integration | Convex query+mutation flow | Vitest + convex-test | pre-commit |
|
|
641
|
+
| E2E auth flow | Sign-in → Dashboard → core action | Playwright + Clerk sign-in-token | on PR |
|
|
642
|
+
| Forensic | Full ``/e2e`` skill | OmegaOS Quality Arsenal | pre-launch |
|
|
643
|
+
|
|
644
|
+
## E2E auth — the Clerk sign-in-token + ticket strategy
|
|
645
|
+
|
|
646
|
+
(Documented in ``/e2e`` skill — bypasses 2FA in CI safely.)
|
|
647
|
+
|
|
648
|
+
## Snapshot policy
|
|
649
|
+
|
|
650
|
+
- Component snapshots on every PR.
|
|
651
|
+
- Pixel-level visual regression via Playwright screenshots for the top 10 routes.
|
|
652
|
+
|
|
653
|
+
## CI integration
|
|
654
|
+
|
|
655
|
+
- Pre-commit: lint + unit + component tests.
|
|
656
|
+
- PR: integration + e2e on changed surfaces.
|
|
657
|
+
- Pre-merge: ``/codeaudit`` + ``/perfaudit`` + ``/a11yaudit`` GREEN.
|
|
658
|
+
"""),
|
|
659
|
+
|
|
660
|
+
FileSpec("docs/30-prd/38-CHANGELOG.md", fm + f"""# Changelog — {state.name}
|
|
661
|
+
|
|
662
|
+
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
663
|
+
|
|
664
|
+
## [Unreleased]
|
|
665
|
+
|
|
666
|
+
### Added
|
|
667
|
+
- {_todo("feature")}
|
|
668
|
+
|
|
669
|
+
### Changed
|
|
670
|
+
- {_todo("change")}
|
|
671
|
+
|
|
672
|
+
### Fixed
|
|
673
|
+
- {_todo("fix")}
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
## [0.0.1] — {state.created_at[:10]}
|
|
678
|
+
|
|
679
|
+
### Added
|
|
680
|
+
- Project genesis tree created by ``omega genesis`` (this run).
|
|
681
|
+
"""),
|
|
682
|
+
|
|
683
|
+
FileSpec("docs/30-prd/39-GLOSSARY.md", fm + f"""# Glossary — {state.name}
|
|
684
|
+
|
|
685
|
+
| Term | Definition | Source of truth |
|
|
686
|
+
|---|---|---|
|
|
687
|
+
| {_todo("term")} | {_todo("definition")} | {_todo("file / link")} |
|
|
688
|
+
"""),
|
|
689
|
+
]
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
# ---------------------------------------------------------------------------
|
|
693
|
+
# PHASE 5 — Features (N files with explicit DAG)
|
|
694
|
+
# ---------------------------------------------------------------------------
|
|
695
|
+
|
|
696
|
+
|
|
697
|
+
def _default_feature_skeleton(state: GenesisState) -> list[dict[str, Any]]:
|
|
698
|
+
"""A starter feature DAG every web project needs.
|
|
699
|
+
|
|
700
|
+
Each dict is the metadata the orchestrator writes into the feature
|
|
701
|
+
file's frontmatter PLUS the YAML stored in ``plan/DAG.json``.
|
|
702
|
+
Topological order: F-001 → F-002 → … with explicit depends_on.
|
|
703
|
+
"""
|
|
704
|
+
return [
|
|
705
|
+
{
|
|
706
|
+
"id": "F-001", "slug": "foundation",
|
|
707
|
+
"title": "Foundation — Next.js app + Convex backend + Clerk auth",
|
|
708
|
+
"depends_on": [],
|
|
709
|
+
"wave": 1, "estimated_minutes": 90,
|
|
710
|
+
"files_owned": [
|
|
711
|
+
"package.json", "next.config.ts", "tsconfig.json",
|
|
712
|
+
"app/layout.tsx", "app/page.tsx",
|
|
713
|
+
"convex/schema.ts", "middleware.ts",
|
|
714
|
+
],
|
|
715
|
+
"verify_cmd": "pnpm build && pnpm test -- --run",
|
|
716
|
+
"skill": "/convex + /vercel-react-best-practices",
|
|
717
|
+
},
|
|
718
|
+
{
|
|
719
|
+
"id": "F-002", "slug": "design-system",
|
|
720
|
+
"title": "Design system — Tailwind v4 + shadcn theme + 12 base components",
|
|
721
|
+
"depends_on": ["F-001"],
|
|
722
|
+
"wave": 1, "estimated_minutes": 60,
|
|
723
|
+
"files_owned": [
|
|
724
|
+
"app/globals.css", "components.json",
|
|
725
|
+
"components/ui/*.tsx",
|
|
726
|
+
],
|
|
727
|
+
"verify_cmd": "pnpm build && pnpm test -- components/ui",
|
|
728
|
+
"skill": "/shadcn-ui + /design-system + /taste-skill",
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
"id": "F-003", "slug": "auth-flow",
|
|
732
|
+
"title": "Auth flow — sign-in / sign-up / sign-out + ClerkProvider",
|
|
733
|
+
"depends_on": ["F-001", "F-002"],
|
|
734
|
+
"wave": 1, "estimated_minutes": 45,
|
|
735
|
+
"files_owned": [
|
|
736
|
+
"app/sign-in/page.tsx", "app/sign-up/page.tsx",
|
|
737
|
+
"components/auth/*.tsx",
|
|
738
|
+
],
|
|
739
|
+
"verify_cmd": "pnpm test -- e2e/auth.spec.ts",
|
|
740
|
+
"skill": "/emil-design-eng + /impeccable",
|
|
741
|
+
},
|
|
742
|
+
{
|
|
743
|
+
"id": "F-004", "slug": "marketing-landing",
|
|
744
|
+
"title": "Marketing landing — hero, features grid, pricing teaser, footer",
|
|
745
|
+
"depends_on": ["F-002"],
|
|
746
|
+
"wave": 2, "estimated_minutes": 90,
|
|
747
|
+
"files_owned": [
|
|
748
|
+
"app/page.tsx", "components/marketing/*.tsx",
|
|
749
|
+
],
|
|
750
|
+
"verify_cmd": "pnpm test -- marketing && pnpm exec playwright test e2e/landing.spec.ts",
|
|
751
|
+
"skill": "/shadcn-ui + /taste-skill + /copyaudit + /seoaudit",
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
"id": "F-005", "slug": "dashboard-shell",
|
|
755
|
+
"title": "Dashboard shell — top bar + side nav + protected layout",
|
|
756
|
+
"depends_on": ["F-003"],
|
|
757
|
+
"wave": 2, "estimated_minutes": 60,
|
|
758
|
+
"files_owned": [
|
|
759
|
+
"app/(app)/layout.tsx", "app/(app)/dashboard/page.tsx",
|
|
760
|
+
"components/app-shell/*.tsx",
|
|
761
|
+
],
|
|
762
|
+
"verify_cmd": "pnpm test -- e2e/dashboard.spec.ts",
|
|
763
|
+
"skill": "/shadcn-ui + /impeccable",
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
"id": "F-006", "slug": "billing-stripe-connect",
|
|
767
|
+
"title": "Billing — Stripe subscription + webhook + customer portal",
|
|
768
|
+
"depends_on": ["F-001", "F-003"],
|
|
769
|
+
"wave": 2, "estimated_minutes": 120,
|
|
770
|
+
"files_owned": [
|
|
771
|
+
"app/api/stripe/webhook/route.ts",
|
|
772
|
+
"convex/billing/*.ts",
|
|
773
|
+
"app/(app)/settings/billing/page.tsx",
|
|
774
|
+
],
|
|
775
|
+
"verify_cmd": "pnpm test -- billing",
|
|
776
|
+
"skill": "/stripe-best-practices",
|
|
777
|
+
},
|
|
778
|
+
# Operator-specific features go from F-007 onwards. The
|
|
779
|
+
# orchestrator's feature-phase output emits this skeleton + a
|
|
780
|
+
# TODO block calling out the operator to add the product-specific
|
|
781
|
+
# features in the correct topological order.
|
|
782
|
+
]
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
def phase_features(state: GenesisState) -> list[FileSpec]:
|
|
786
|
+
"""Emit:
|
|
787
|
+
* one ``F-NNN-<slug>.md`` per default feature (with frontmatter
|
|
788
|
+
carrying ``depends_on``, ``wave``, ``estimated_minutes``,
|
|
789
|
+
``files_owned``, ``verify_cmd``, ``skill``).
|
|
790
|
+
* one ``F-TEMPLATE.md`` for the operator to copy when adding their
|
|
791
|
+
product-specific features.
|
|
792
|
+
* one ``DAG.json`` under ``plan/`` that the v0.19 plan builder
|
|
793
|
+
consumes.
|
|
794
|
+
"""
|
|
795
|
+
fm = _frontmatter(state, kind="feature-spec")
|
|
796
|
+
skeleton = _default_feature_skeleton(state)
|
|
797
|
+
specs: list[FileSpec] = []
|
|
798
|
+
|
|
799
|
+
# Feature files (one per F-NNN)
|
|
800
|
+
for f in skeleton:
|
|
801
|
+
body = f"""---
|
|
802
|
+
slug: {state.slug}
|
|
803
|
+
feature_id: {f['id']}
|
|
804
|
+
feature_slug: {f['slug']}
|
|
805
|
+
title: {f['title']}
|
|
806
|
+
depends_on: {f['depends_on']}
|
|
807
|
+
wave: {f['wave']}
|
|
808
|
+
estimated_minutes: {f['estimated_minutes']}
|
|
809
|
+
files_owned: {f['files_owned']}
|
|
810
|
+
verify_cmd: "{f['verify_cmd']}"
|
|
811
|
+
skill: "{f['skill']}"
|
|
812
|
+
generated_at: {state.updated_at}
|
|
813
|
+
---
|
|
814
|
+
|
|
815
|
+
# {f['id']} — {f['title']}
|
|
816
|
+
|
|
817
|
+
## Why this exists
|
|
818
|
+
|
|
819
|
+
{_todo("1-2 sentences: what user pain or business win this directly serves.")}
|
|
820
|
+
|
|
821
|
+
## Acceptance criteria (verifiable by `{f['verify_cmd']}`)
|
|
822
|
+
|
|
823
|
+
- [ ] {_todo("checkbox 1")}
|
|
824
|
+
- [ ] {_todo("checkbox 2")}
|
|
825
|
+
- [ ] {_todo("checkbox 3")}
|
|
826
|
+
|
|
827
|
+
## Files this feature owns
|
|
828
|
+
|
|
829
|
+
{chr(10).join(f"- ``{p}``" for p in f['files_owned'])}
|
|
830
|
+
|
|
831
|
+
## Depends on
|
|
832
|
+
|
|
833
|
+
{(chr(10).join(f"- {d}" for d in f['depends_on'])) if f['depends_on'] else "_(none — first wave)_"}
|
|
834
|
+
|
|
835
|
+
## How the worker should approach this
|
|
836
|
+
|
|
837
|
+
1. Read this file.
|
|
838
|
+
2. Read every file in ``files_owned`` (most don't exist yet → that's OK).
|
|
839
|
+
3. Read ``docs/30-prd/36-AGENT-PLAYBOOK.md`` and respect EVERY non-negotiable.
|
|
840
|
+
4. Invoke the skill: ``{f['skill']}``.
|
|
841
|
+
5. Implement, then run ``{f['verify_cmd']}``.
|
|
842
|
+
6. Write ``.done.json`` only when the verify command exits 0.
|
|
843
|
+
|
|
844
|
+
## Skill block
|
|
845
|
+
|
|
846
|
+
The worker spawn injects this skill list into the system prompt:
|
|
847
|
+
``{f['skill']}``.
|
|
848
|
+
"""
|
|
849
|
+
specs.append(FileSpec(
|
|
850
|
+
f"docs/40-features/{f['id']}-{f['slug']}.md", body,
|
|
851
|
+
))
|
|
852
|
+
|
|
853
|
+
# Template for operator-authored features
|
|
854
|
+
template = fm + """# F-TEMPLATE — Copy this file when adding a new feature
|
|
855
|
+
|
|
856
|
+
> Rename to ``F-NNN-<slug>.md`` (NNN strictly increasing, no gaps).
|
|
857
|
+
> The v0.19 plan builder reads every file matching ``F-[0-9]+-*.md`` and
|
|
858
|
+
> sorts by id, but enforces order via the ``depends_on`` DAG — NOT by
|
|
859
|
+
> filename.
|
|
860
|
+
|
|
861
|
+
Frontmatter required:
|
|
862
|
+
|
|
863
|
+
```yaml
|
|
864
|
+
---
|
|
865
|
+
slug: <project-slug>
|
|
866
|
+
feature_id: F-NNN
|
|
867
|
+
feature_slug: <kebab-case>
|
|
868
|
+
title: <one-line title>
|
|
869
|
+
depends_on: [F-XXX, F-YYY]
|
|
870
|
+
wave: 2
|
|
871
|
+
estimated_minutes: 45
|
|
872
|
+
files_owned:
|
|
873
|
+
- apps/web/app/<route>/page.tsx
|
|
874
|
+
- convex/<feature>/*.ts
|
|
875
|
+
verify_cmd: "pnpm test -- e2e/<feature>.spec.ts"
|
|
876
|
+
skill: "/shadcn-ui + /taste-skill"
|
|
877
|
+
---
|
|
878
|
+
```
|
|
879
|
+
"""
|
|
880
|
+
specs.append(FileSpec("docs/40-features/F-TEMPLATE.md", template))
|
|
881
|
+
|
|
882
|
+
# DAG.json — the machine-readable view the v0.19 plan builder consumes
|
|
883
|
+
import json as _json
|
|
884
|
+
dag = {
|
|
885
|
+
"slug": state.slug,
|
|
886
|
+
"generated_at": state.updated_at,
|
|
887
|
+
"features": skeleton,
|
|
888
|
+
}
|
|
889
|
+
specs.append(FileSpec("plan/DAG.json", _json.dumps(dag, indent=2)))
|
|
890
|
+
|
|
891
|
+
return specs
|
|
892
|
+
|
|
893
|
+
|
|
894
|
+
# ---------------------------------------------------------------------------
|
|
895
|
+
# PHASE 6 — Plan (handoff to v0.19)
|
|
896
|
+
# ---------------------------------------------------------------------------
|
|
897
|
+
|
|
898
|
+
|
|
899
|
+
def phase_plan(state: GenesisState) -> list[FileSpec]:
|
|
900
|
+
"""Final phase — emits the handoff doc that tells the operator how to
|
|
901
|
+
move from Genesis to the v0.19 Plan executor."""
|
|
902
|
+
fm = _frontmatter(state, kind="genesis-handoff")
|
|
903
|
+
body = fm + f"""# Genesis complete — ready for `omega plan`
|
|
904
|
+
|
|
905
|
+
The Genesis pipeline has finished. Every doc is in place under
|
|
906
|
+
``docs/``; the feature DAG is at ``plan/DAG.json``.
|
|
907
|
+
|
|
908
|
+
## What you have now
|
|
909
|
+
|
|
910
|
+
- ``docs/00-VISION.md`` — product identity
|
|
911
|
+
- ``docs/10-market/{{11..15}}-*.md`` — 5 market files
|
|
912
|
+
- ``docs/20-brand/{{21..23}}-*.md`` — 3 brand files
|
|
913
|
+
- ``docs/30-prd/{{31..39}}-*.md`` — 9 PRD files
|
|
914
|
+
- ``docs/40-features/F-001..F-006*.md`` — starter feature DAG
|
|
915
|
+
- ``plan/DAG.json`` — machine-readable DAG
|
|
916
|
+
|
|
917
|
+
## The next step
|
|
918
|
+
|
|
919
|
+
```bash
|
|
920
|
+
omega plan build {state.slug} # ingests DAG.json into the v0.19 plan store
|
|
921
|
+
omega plan next {state.slug} # returns the next eligible task (1 at a time)
|
|
922
|
+
omega plan run {state.slug} # multi-day autonomous loop with FSM-enforced ordering
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
## What still needs operator attention
|
|
926
|
+
|
|
927
|
+
- Fill the `<!-- TODO -->` blocks in every doc. Most will be picked up by
|
|
928
|
+
the v0.19 plan executor when it dispatches worker briefs, but some
|
|
929
|
+
(especially Vision §3 personas, Market §11 competitors) benefit from
|
|
930
|
+
a single human pass first.
|
|
931
|
+
- Add your product-specific features beyond F-006. Copy
|
|
932
|
+
``docs/40-features/F-TEMPLATE.md``, increment the id, list
|
|
933
|
+
``depends_on``.
|
|
934
|
+
- Re-run ``omega plan build {state.slug}`` after editing the DAG — it's
|
|
935
|
+
idempotent and re-validates the topological order.
|
|
936
|
+
|
|
937
|
+
## Stack summary (for the workers)
|
|
938
|
+
|
|
939
|
+
| | |
|
|
940
|
+
|---|---|
|
|
941
|
+
| Type | ``{state.stack.type}`` |
|
|
942
|
+
| Frontend | ``{state.stack.frontend}`` |
|
|
943
|
+
| Backend | ``{state.stack.backend}`` |
|
|
944
|
+
| Deploy | ``{state.stack.deploy}`` |
|
|
945
|
+
| Payments | ``{state.stack.payments}`` |
|
|
946
|
+
| UI kit | ``{state.stack.ui_kit}`` |
|
|
947
|
+
| Auth | ``{state.stack.auth}`` |
|
|
948
|
+
| Extras | {", ".join(state.stack.extras) or "—"} |
|
|
949
|
+
"""
|
|
950
|
+
return [FileSpec("docs/GENESIS-COMPLETE.md", body)]
|