@robbiesrobotics/alice-agents 1.5.8 → 1.5.9
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 +5 -2
- package/package.json +1 -1
- package/templates/skills/acculynx/SKILL.md +183 -0
- package/templates/skills/acculynx/references/analysis_template.py +116 -0
- package/templates/skills/acculynx/references/dashboard_page.tsx +641 -0
- package/templates/skills/claude-code/SKILL.md +2 -2
- package/templates/skills/coding-agent/SKILL.md +68 -0
- package/templates/skills/crawl4ai/SKILL.md +119 -0
- package/templates/skills/crawl4ai/scripts/crwl +3 -0
- package/templates/workspaces/accuscope/AGENTS.md +38 -0
- package/templates/workspaces/accuscope/FEEDBACK.md +27 -0
- package/templates/workspaces/accuscope/HEARTBEAT.md +26 -0
- package/templates/workspaces/accuscope/IDENTITY.md +48 -0
- package/templates/workspaces/accuscope/LEARNINGS.md +46 -0
- package/templates/workspaces/accuscope/MEMORY.md +47 -0
- package/templates/workspaces/accuscope/PLAYBOOK.md +65 -0
- package/templates/workspaces/accuscope/SOUL.md +40 -0
- package/templates/workspaces/accuscope/TOOLS.md +63 -0
- package/templates/workspaces/accuscope/USER.md +39 -0
- package/templates/workspaces/aiden/AGENTS.md +52 -0
- package/templates/workspaces/aiden/FEEDBACK.md +12 -0
- package/templates/workspaces/aiden/HEARTBEAT.md +9 -0
- package/templates/workspaces/aiden/IDENTITY.md +6 -0
- package/templates/workspaces/aiden/LEARNINGS.md +6 -0
- package/templates/workspaces/aiden/MEMORY.md +22 -0
- package/templates/workspaces/aiden/PLAYBOOK.md +16 -0
- package/templates/workspaces/aiden/SOUL.md +1 -1
- package/templates/workspaces/aiden/USER.md +17 -0
- package/templates/workspaces/alex/AGENTS.md +52 -0
- package/templates/workspaces/alex/FEEDBACK.md +11 -0
- package/templates/workspaces/alex/HEARTBEAT.md +9 -0
- package/templates/workspaces/alex/IDENTITY.md +6 -0
- package/templates/workspaces/alex/LEARNINGS.md +5 -0
- package/templates/workspaces/alex/MEMORY.md +22 -0
- package/templates/workspaces/alex/PLAYBOOK.md +16 -0
- package/templates/workspaces/alex/SOUL.md +1 -1
- package/templates/workspaces/alex/USER.md +13 -0
- package/templates/workspaces/aria/AGENTS.md +18 -0
- package/templates/workspaces/aria/FEEDBACK.md +12 -0
- package/templates/workspaces/aria/HEARTBEAT.md +32 -0
- package/templates/workspaces/aria/IDENTITY.md +12 -0
- package/templates/workspaces/aria/LEARNINGS.md +31 -0
- package/templates/workspaces/aria/MEMORY.md +29 -0
- package/templates/workspaces/aria/PLAYBOOK.md +71 -0
- package/templates/workspaces/aria/SOUL.md +57 -0
- package/templates/workspaces/aria/TOOLS.md +47 -0
- package/templates/workspaces/aria/USER.md +18 -0
- package/templates/workspaces/audrey/AGENTS.md +59 -0
- package/templates/workspaces/audrey/FEEDBACK.md +11 -0
- package/templates/workspaces/audrey/HEARTBEAT.md +9 -0
- package/templates/workspaces/audrey/IDENTITY.md +6 -0
- package/templates/workspaces/audrey/LEARNINGS.md +5 -0
- package/templates/workspaces/audrey/MEMORY.md +22 -0
- package/templates/workspaces/audrey/PLAYBOOK.md +16 -0
- package/templates/workspaces/audrey/SOUL.md +1 -1
- package/templates/workspaces/audrey/TOOLS.md +15 -0
- package/templates/workspaces/audrey/USER.md +13 -0
- package/templates/workspaces/avery/AGENTS.md +52 -0
- package/templates/workspaces/avery/FEEDBACK.md +12 -0
- package/templates/workspaces/avery/HEARTBEAT.md +5 -0
- package/templates/workspaces/avery/IDENTITY.md +6 -0
- package/templates/workspaces/avery/LEARNINGS.md +6 -0
- package/templates/workspaces/avery/MEMORY.md +22 -0
- package/templates/workspaces/avery/PLAYBOOK.md +16 -0
- package/templates/workspaces/avery/SOUL.md +1 -1
- package/templates/workspaces/avery/USER.md +17 -0
- package/templates/workspaces/avery/skills/claude-code/SKILL.md +38 -0
- package/templates/workspaces/avery/skills/claude-code/claude_code +55 -0
- package/templates/workspaces/caleb/AGENTS.md +52 -0
- package/templates/workspaces/caleb/FEEDBACK.md +11 -0
- package/templates/workspaces/caleb/HEARTBEAT.md +9 -0
- package/templates/workspaces/caleb/IDENTITY.md +6 -0
- package/templates/workspaces/caleb/LEARNINGS.md +5 -0
- package/templates/workspaces/caleb/MEMORY.md +22 -0
- package/templates/workspaces/caleb/PLAYBOOK.md +16 -0
- package/templates/workspaces/caleb/SOUL.md +1 -1
- package/templates/workspaces/caleb/TOOLS.md +30 -0
- package/templates/workspaces/caleb/USER.md +13 -0
- package/templates/workspaces/clara/AGENTS.md +59 -0
- package/templates/workspaces/clara/FEEDBACK.md +12 -0
- package/templates/workspaces/clara/HEARTBEAT.md +5 -0
- package/templates/workspaces/clara/IDENTITY.md +6 -0
- package/templates/workspaces/clara/LEARNINGS.md +6 -0
- package/templates/workspaces/clara/MEMORY.md +22 -0
- package/templates/workspaces/clara/PLAYBOOK.md +16 -0
- package/templates/workspaces/clara/SOUL.md +1 -1
- package/templates/workspaces/clara/TOOLS.md +15 -0
- package/templates/workspaces/clara/USER.md +17 -0
- package/templates/workspaces/daphne/AGENTS.md +59 -0
- package/templates/workspaces/daphne/FEEDBACK.md +18 -0
- package/templates/workspaces/daphne/HEARTBEAT.md +5 -0
- package/templates/workspaces/daphne/IDENTITY.md +6 -0
- package/templates/workspaces/daphne/LEARNINGS.md +6 -0
- package/templates/workspaces/daphne/MEMORY.md +22 -0
- package/templates/workspaces/daphne/PLAYBOOK.md +48 -0
- package/templates/workspaces/daphne/SOUL.md +1 -1
- package/templates/workspaces/daphne/TOOLS.md +15 -0
- package/templates/workspaces/daphne/USER.md +17 -0
- package/templates/workspaces/darius/AGENTS.md +52 -0
- package/templates/workspaces/darius/FEEDBACK.md +12 -0
- package/templates/workspaces/darius/HEARTBEAT.md +5 -0
- package/templates/workspaces/darius/IDENTITY.md +6 -0
- package/templates/workspaces/darius/LEARNINGS.md +6 -0
- package/templates/workspaces/darius/MEMORY.md +22 -0
- package/templates/workspaces/darius/PLAYBOOK.md +16 -0
- package/templates/workspaces/darius/SOUL.md +1 -1
- package/templates/workspaces/darius/USER.md +17 -0
- package/templates/workspaces/darius/skills/claude-code/SKILL.md +38 -0
- package/templates/workspaces/darius/skills/claude-code/claude_code +55 -0
- package/templates/workspaces/devon/AGENTS.md +52 -0
- package/templates/workspaces/devon/FEEDBACK.md +11 -0
- package/templates/workspaces/devon/HEARTBEAT.md +5 -0
- package/templates/workspaces/devon/IDENTITY.md +6 -0
- package/templates/workspaces/devon/LEARNINGS.md +11 -0
- package/templates/workspaces/devon/MEMORY.md +22 -0
- package/templates/workspaces/devon/PLAYBOOK.md +16 -0
- package/templates/workspaces/devon/SOUL.md +1 -1
- package/templates/workspaces/devon/USER.md +13 -0
- package/templates/workspaces/devon/check_github.py +12 -0
- package/templates/workspaces/devon/check_mc_env.py +30 -0
- package/templates/workspaces/devon/check_sb.py +34 -0
- package/templates/workspaces/devon/check_vercel.py +12 -0
- package/templates/workspaces/devon/get_mc_files.py +17 -0
- package/templates/workspaces/devon/write_heartbeat.py +67 -0
- package/templates/workspaces/dylan/.env.example +33 -0
- package/templates/workspaces/dylan/00007_verify_licenses_table.sql +100 -0
- package/templates/workspaces/dylan/AGENTS.md +52 -0
- package/templates/workspaces/dylan/FEEDBACK.md +28 -0
- package/templates/workspaces/dylan/HEARTBEAT.md +5 -0
- package/templates/workspaces/dylan/IDENTITY.md +6 -0
- package/templates/workspaces/dylan/LEARNINGS.md +70 -0
- package/templates/workspaces/dylan/MEMORY.md +22 -0
- package/templates/workspaces/dylan/PLAYBOOK.md +16 -0
- package/templates/workspaces/dylan/SOUL.md +1 -1
- package/templates/workspaces/dylan/STRIPE_PIPELINE.md +185 -0
- package/templates/workspaces/dylan/USER.md +17 -0
- package/templates/workspaces/dylan/n8n-stripe-welcome-workflow.json +123 -0
- package/templates/workspaces/dylan/skills/claude-code/SKILL.md +38 -0
- package/templates/workspaces/dylan/skills/claude-code/claude_code +55 -0
- package/templates/workspaces/dylan/stripe-webhook-handler.py +433 -0
- package/templates/workspaces/dylan/test_mock_webhook.py +103 -0
- package/templates/workspaces/elena/AGENTS.md +59 -0
- package/templates/workspaces/elena/FEEDBACK.md +11 -0
- package/templates/workspaces/elena/HEARTBEAT.md +9 -0
- package/templates/workspaces/elena/IDENTITY.md +6 -0
- package/templates/workspaces/elena/LEARNINGS.md +5 -0
- package/templates/workspaces/elena/MEMORY.md +22 -0
- package/templates/workspaces/elena/PLAYBOOK.md +16 -0
- package/templates/workspaces/elena/SOUL.md +1 -1
- package/templates/workspaces/elena/TOOLS.md +15 -0
- package/templates/workspaces/elena/USER.md +13 -0
- package/templates/workspaces/eva/AGENTS.md +59 -0
- package/templates/workspaces/eva/FEEDBACK.md +11 -0
- package/templates/workspaces/eva/HEARTBEAT.md +9 -0
- package/templates/workspaces/eva/IDENTITY.md +6 -0
- package/templates/workspaces/eva/LEARNINGS.md +5 -0
- package/templates/workspaces/eva/MEMORY.md +22 -0
- package/templates/workspaces/eva/PLAYBOOK.md +16 -0
- package/templates/workspaces/eva/SOUL.md +1 -1
- package/templates/workspaces/eva/TOOLS.md +15 -0
- package/templates/workspaces/eva/USER.md +13 -0
- package/templates/workspaces/felix/AGENTS.md +52 -0
- package/templates/workspaces/felix/FEEDBACK.md +11 -0
- package/templates/workspaces/felix/HEARTBEAT.md +5 -0
- package/templates/workspaces/felix/IDENTITY.md +6 -0
- package/templates/workspaces/felix/LEARNINGS.md +17 -0
- package/templates/workspaces/felix/MEMORY.md +22 -0
- package/templates/workspaces/felix/PLAYBOOK.md +16 -0
- package/templates/workspaces/felix/SOUL.md +1 -1
- package/templates/workspaces/felix/USER.md +13 -0
- package/templates/workspaces/felix/fidelia-psychology.html +1594 -0
- package/templates/workspaces/felix/task.txt +164 -0
- package/templates/workspaces/hannah/AGENTS.md +59 -0
- package/templates/workspaces/hannah/FEEDBACK.md +12 -0
- package/templates/workspaces/hannah/HEARTBEAT.md +5 -0
- package/templates/workspaces/hannah/IDENTITY.md +6 -0
- package/templates/workspaces/hannah/LEARNINGS.md +6 -0
- package/templates/workspaces/hannah/MEMORY.md +22 -0
- package/templates/workspaces/hannah/PLAYBOOK.md +16 -0
- package/templates/workspaces/hannah/SOUL.md +1 -1
- package/templates/workspaces/hannah/TOOLS.md +15 -0
- package/templates/workspaces/hannah/USER.md +17 -0
- package/templates/workspaces/isaac/AGENTS.md +52 -0
- package/templates/workspaces/isaac/FEEDBACK.md +12 -0
- package/templates/workspaces/isaac/HEARTBEAT.md +9 -0
- package/templates/workspaces/isaac/IDENTITY.md +6 -0
- package/templates/workspaces/isaac/LEARNINGS.md +6 -0
- package/templates/workspaces/isaac/MEMORY.md +22 -0
- package/templates/workspaces/isaac/PLAYBOOK.md +16 -0
- package/templates/workspaces/isaac/SOUL.md +1 -1
- package/templates/workspaces/isaac/USER.md +17 -0
- package/templates/workspaces/isaac/skills/claude-code/SKILL.md +38 -0
- package/templates/workspaces/isaac/skills/claude-code/claude_code +55 -0
- package/templates/workspaces/logan/AGENTS.md +59 -0
- package/templates/workspaces/logan/FEEDBACK.md +11 -0
- package/templates/workspaces/logan/HEARTBEAT.md +9 -0
- package/templates/workspaces/logan/IDENTITY.md +6 -0
- package/templates/workspaces/logan/LEARNINGS.md +5 -0
- package/templates/workspaces/logan/MEMORY.md +22 -0
- package/templates/workspaces/logan/PLAYBOOK.md +16 -0
- package/templates/workspaces/logan/SOUL.md +1 -1
- package/templates/workspaces/logan/TOOLS.md +15 -0
- package/templates/workspaces/logan/USER.md +13 -0
- package/templates/workspaces/maxxipro/AGENTS.md +29 -0
- package/templates/workspaces/maxxipro/FEEDBACK.md +19 -0
- package/templates/workspaces/maxxipro/HEARTBEAT.md +22 -0
- package/templates/workspaces/maxxipro/IDENTITY.md +35 -0
- package/templates/workspaces/maxxipro/KNOWLEDGE.md +335 -0
- package/templates/workspaces/maxxipro/LEARNINGS.md +47 -0
- package/templates/workspaces/maxxipro/MEMORY.md +60 -0
- package/templates/workspaces/maxxipro/OUTREACH_TEMPLATES.md +143 -0
- package/templates/workspaces/maxxipro/PLAYBOOK.md +81 -0
- package/templates/workspaces/maxxipro/SOUL.md +146 -0
- package/templates/workspaces/maxxipro/TOOLS.md +81 -0
- package/templates/workspaces/maxxipro/USER.md +40 -0
- package/templates/workspaces/morgan/AGENTS.md +59 -0
- package/templates/workspaces/morgan/FEEDBACK.md +19 -0
- package/templates/workspaces/morgan/HEARTBEAT.md +5 -0
- package/templates/workspaces/morgan/IDENTITY.md +6 -0
- package/templates/workspaces/morgan/LEARNINGS.md +18 -0
- package/templates/workspaces/morgan/MEMORY.md +22 -0
- package/templates/workspaces/morgan/PLAYBOOK.md +16 -0
- package/templates/workspaces/morgan/SOUL.md +1 -1
- package/templates/workspaces/morgan/TOOLS.md +15 -0
- package/templates/workspaces/morgan/USER.md +13 -0
- package/templates/workspaces/nadia/AGENTS.md +59 -0
- package/templates/workspaces/nadia/FEEDBACK.md +12 -0
- package/templates/workspaces/nadia/HEARTBEAT.md +5 -0
- package/templates/workspaces/nadia/IDENTITY.md +6 -0
- package/templates/workspaces/nadia/LEARNINGS.md +6 -0
- package/templates/workspaces/nadia/MEMORY.md +22 -0
- package/templates/workspaces/nadia/PLAYBOOK.md +16 -0
- package/templates/workspaces/nadia/SOUL.md +1 -1
- package/templates/workspaces/nadia/TOOLS.md +15 -0
- package/templates/workspaces/nadia/USER.md +13 -0
- package/templates/workspaces/nate/AGENTS.md +24 -0
- package/templates/workspaces/nate/FEEDBACK.md +12 -0
- package/templates/workspaces/nate/HEARTBEAT.md +33 -0
- package/templates/workspaces/nate/IDENTITY.md +15 -0
- package/templates/workspaces/nate/LEARNINGS.md +33 -0
- package/templates/workspaces/nate/MEMORY.md +39 -0
- package/templates/workspaces/nate/PLAYBOOK.md +160 -0
- package/templates/workspaces/nate/SOUL.md +50 -0
- package/templates/workspaces/nate/TOOLS.md +111 -0
- package/templates/workspaces/nate/USER.md +32 -0
- package/templates/workspaces/olivia/.last-openclaw-version +1 -0
- package/templates/workspaces/olivia/.npmrc.tmp +0 -0
- package/templates/workspaces/olivia/AGENTS.md +77 -0
- package/templates/workspaces/olivia/ALPHA_CODING_BENCHMARK.txt +148 -0
- package/templates/workspaces/olivia/ALPHA_MODEL_GUIDE.md +393 -0
- package/templates/workspaces/olivia/FEEDBACK.md +13 -0
- package/templates/workspaces/olivia/HEADTOHEAD_BENCHMARK.txt +1289 -0
- package/templates/workspaces/olivia/HEARTBEAT.md +267 -0
- package/templates/workspaces/olivia/IDENTITY.md +6 -0
- package/templates/workspaces/olivia/LEARNINGS.md +708 -0
- package/templates/workspaces/olivia/MEMORY.md +202 -0
- package/templates/workspaces/olivia/MISSION_CONTROL_DESIGN_SPEC_v1.md +1143 -0
- package/templates/workspaces/olivia/MVP-COMPLETION-SUMMARY.md +175 -0
- package/templates/workspaces/olivia/NETWORK_IMPLEMENTATION_PLAN.md +1556 -0
- package/templates/workspaces/olivia/NEW_NODES_BENCHMARK.txt +947 -0
- package/templates/workspaces/olivia/PLAYBOOK.md +42 -0
- package/templates/workspaces/olivia/SELF-HEALING-COMPLETE.md +150 -0
- package/templates/workspaces/olivia/SOUL.md +8 -8
- package/templates/workspaces/olivia/TOOLS.md +15 -0
- package/templates/workspaces/olivia/USER.md +17 -0
- package/templates/workspaces/olivia/alicefleet-supabase-credentials.md +50 -0
- package/templates/workspaces/olivia/dzombo-copy-rewrite.md +115 -0
- package/templates/workspaces/olivia/dzombo-implementation-plan.md +1248 -0
- package/templates/workspaces/olivia/fidelia-psychology.html +1594 -0
- package/templates/workspaces/olivia/lead_debug.png +0 -0
- package/templates/workspaces/olivia/minimatch-10.2.4.tgz +0 -0
- package/templates/workspaces/olivia/operation-bllm-research.md +157 -0
- package/templates/workspaces/olivia/qa-audit-mission-control-v2.md +538 -0
- package/templates/workspaces/olivia/roofmaxx_logo.svg +1 -0
- package/templates/workspaces/olivia/roofmaxx_social.jpg +0 -0
- package/templates/workspaces/olivia/skills/1password/SKILL.md +53 -0
- package/templates/workspaces/olivia/skills/1password/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/README.md +57 -0
- package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/SKILL.md +534 -0
- package/templates/workspaces/olivia/skills/afrexai-recruiting-engine/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/agent-security/SKILL.md +69 -0
- package/templates/workspaces/olivia/skills/agent-security/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/agentic-security-audit/SKILL.md +855 -0
- package/templates/workspaces/olivia/skills/agentic-security-audit/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/ai-automation-consulting/SKILL.md +67 -0
- package/templates/workspaces/olivia/skills/ai-automation-consulting/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/ai-automation-consulting/skill.json +12 -0
- package/templates/workspaces/olivia/skills/ai-presentation-maker/SKILL.md +1104 -0
- package/templates/workspaces/olivia/skills/ai-presentation-maker/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/ai-productivity-audit/SKILL.md +181 -0
- package/templates/workspaces/olivia/skills/ai-productivity-audit/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/ai-researcher/README.md +31 -0
- package/templates/workspaces/olivia/skills/ai-researcher/SKILL.md +59 -0
- package/templates/workspaces/olivia/skills/ai-researcher/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/ai-seo-writer/README.md +19 -0
- package/templates/workspaces/olivia/skills/ai-seo-writer/SKILL.md +100 -0
- package/templates/workspaces/olivia/skills/ai-seo-writer/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/analytics-tracking-2/SKILL.md +309 -0
- package/templates/workspaces/olivia/skills/analytics-tracking-2/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/api-doc-writer/SKILL.md +232 -0
- package/templates/workspaces/olivia/skills/api-doc-writer/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/api-generator/SKILL.md +49 -0
- package/templates/workspaces/olivia/skills/api-generator/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/api-generator/tips.md +10 -0
- package/templates/workspaces/olivia/skills/apple-notes/SKILL.md +50 -0
- package/templates/workspaces/olivia/skills/apple-notes/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/apple-reminders/SKILL.md +67 -0
- package/templates/workspaces/olivia/skills/apple-reminders/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/automation-workflows/SKILL.md +267 -0
- package/templates/workspaces/olivia/skills/automation-workflows/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/autoresearch/SKILL.md +46 -0
- package/templates/workspaces/olivia/skills/autoresearch/aria_write.py +148 -0
- package/templates/workspaces/olivia/skills/autoresearch/autoresearch.py +75 -0
- package/templates/workspaces/olivia/skills/azure-devops/SKILL.md +115 -0
- package/templates/workspaces/olivia/skills/azure-devops/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/blogwatcher/SKILL.md +46 -0
- package/templates/workspaces/olivia/skills/blogwatcher/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/blucli/SKILL.md +27 -0
- package/templates/workspaces/olivia/skills/blucli/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/check-analytics/SKILL.md +92 -0
- package/templates/workspaces/olivia/skills/check-analytics/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/cloud-architect/SKILL.md +89 -0
- package/templates/workspaces/olivia/skills/cloud-architect/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/cloud-infra-automation/SKILL.md +50 -0
- package/templates/workspaces/olivia/skills/cloud-infra-automation/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/cloud-storage/SKILL.md +61 -0
- package/templates/workspaces/olivia/skills/cloud-storage/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/cloud-storage/auth.md +97 -0
- package/templates/workspaces/olivia/skills/cloud-storage/costs.md +88 -0
- package/templates/workspaces/olivia/skills/cloud-storage/providers.md +55 -0
- package/templates/workspaces/olivia/skills/copywriting-pro/SKILL.md +107 -0
- package/templates/workspaces/olivia/skills/copywriting-pro/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/data-analyst-pro/SKILL.md +21 -0
- package/templates/workspaces/olivia/skills/data-analyst-pro/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/database-designer/README.md +388 -0
- package/templates/workspaces/olivia/skills/database-designer/SKILL.md +66 -0
- package/templates/workspaces/olivia/skills/database-designer/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/database-designer/index_optimizer.py +926 -0
- package/templates/workspaces/olivia/skills/database-designer/migration_generator.py +1199 -0
- package/templates/workspaces/olivia/skills/database-designer/schema_analyzer.py +982 -0
- package/templates/workspaces/olivia/skills/deploy-agent/SKILL.md +255 -0
- package/templates/workspaces/olivia/skills/deploy-agent/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/devops-automation-pack/SKILL.md +72 -0
- package/templates/workspaces/olivia/skills/devops-automation-pack/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/devops-automation-pack/deploy.sh +0 -0
- package/templates/workspaces/olivia/skills/financial-analysis-agent/SKILL.md +489 -0
- package/templates/workspaces/olivia/skills/financial-analysis-agent/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/README.md +72 -0
- package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/SKILL.md +226 -0
- package/templates/workspaces/olivia/skills/gdpr-compliance-tracker/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/gifgrep/SKILL.md +47 -0
- package/templates/workspaces/olivia/skills/gifgrep/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/github/SKILL.md +47 -0
- package/templates/workspaces/olivia/skills/github/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/gog/SKILL.md +36 -0
- package/templates/workspaces/olivia/skills/gog/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/growth-strategy-hub/SKILL.md +135 -0
- package/templates/workspaces/olivia/skills/growth-strategy-hub/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/growth-strategy-hub/metadata.json +4 -0
- package/templates/workspaces/olivia/skills/hetzner-cloud/SKILL.md +130 -0
- package/templates/workspaces/olivia/skills/hetzner-cloud/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/himalaya/SKILL.md +217 -0
- package/templates/workspaces/olivia/skills/himalaya/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/hotel-recommendation/SKILL.md +117 -0
- package/templates/workspaces/olivia/skills/hotel-recommendation/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/hr-policy-generator/SKILL.md +54 -0
- package/templates/workspaces/olivia/skills/hr-policy-generator/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/human-writing/SKILL.md +41 -0
- package/templates/workspaces/olivia/skills/human-writing/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/imsg/SKILL.md +25 -0
- package/templates/workspaces/olivia/skills/imsg/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/in-depth-research/SKILL.md +124 -0
- package/templates/workspaces/olivia/skills/in-depth-research/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/in-depth-research/methodology.md +75 -0
- package/templates/workspaces/olivia/skills/in-depth-research/output-formats.md +168 -0
- package/templates/workspaces/olivia/skills/in-depth-research/sources.md +80 -0
- package/templates/workspaces/olivia/skills/javascript-skills/README.md +71 -0
- package/templates/workspaces/olivia/skills/javascript-skills/SKILL.md +746 -0
- package/templates/workspaces/olivia/skills/javascript-skills/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/leadership-strategy-playbook/SKILL.md +147 -0
- package/templates/workspaces/olivia/skills/leadership-strategy-playbook/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/market-research-agent/README.md +29 -0
- package/templates/workspaces/olivia/skills/market-research-agent/SKILL.md +52 -0
- package/templates/workspaces/olivia/skills/market-research-agent/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/marketing-analytics/SKILL.md +74 -0
- package/templates/workspaces/olivia/skills/marketing-analytics/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/marketing-master-io/SKILL.md +125 -0
- package/templates/workspaces/olivia/skills/marketing-master-io/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/marketing-strategy-pmm/SKILL.md +398 -0
- package/templates/workspaces/olivia/skills/marketing-strategy-pmm/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/meta-ads-analytics/SKILL.md +53 -0
- package/templates/workspaces/olivia/skills/meta-ads-analytics/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/obsidian/SKILL.md +55 -0
- package/templates/workspaces/olivia/skills/obsidian/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/openclaw-accounting/SKILL.md +125 -0
- package/templates/workspaces/olivia/skills/openclaw-accounting/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/CHANGELOG.md +35 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/CHANNELLOG.md +73 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/README.md +161 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/SKILL.md +130 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/config.json +36 -0
- package/templates/workspaces/olivia/skills/openclaw-security-toolkit/metadata.json +19 -0
- package/templates/workspaces/olivia/skills/openhue/SKILL.md +30 -0
- package/templates/workspaces/olivia/skills/openhue/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/orgx-operations-agent/SKILL.md +41 -0
- package/templates/workspaces/olivia/skills/orgx-operations-agent/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/outreach/SKILL.md +84 -0
- package/templates/workspaces/olivia/skills/outreach/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/outreach/by-type.md +166 -0
- package/templates/workspaces/olivia/skills/outreach/templates.md +154 -0
- package/templates/workspaces/olivia/skills/outreach/tracking.md +145 -0
- package/templates/workspaces/olivia/skills/persona-hr-coordinator/SKILL.md +38 -0
- package/templates/workspaces/olivia/skills/persona-hr-coordinator/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/personal-productivity/SKILL.md +161 -0
- package/templates/workspaces/olivia/skills/personal-productivity/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/personal-productivity/index.js +363 -0
- package/templates/workspaces/olivia/skills/personal-productivity/package.json +15 -0
- package/templates/workspaces/olivia/skills/personal-travel/README.md +34 -0
- package/templates/workspaces/olivia/skills/personal-travel/SKILL.md +46 -0
- package/templates/workspaces/olivia/skills/personal-travel/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/presentation-html-generator-skill/SKILL.md +185 -0
- package/templates/workspaces/olivia/skills/presentation-html-generator-skill/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/product-manager/SKILL.md +77 -0
- package/templates/workspaces/olivia/skills/product-manager/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/quant-strategy/SKILL.md +28 -0
- package/templates/workspaces/olivia/skills/quant-strategy/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/sales-pipeline-tracker/README.md +29 -0
- package/templates/workspaces/olivia/skills/sales-pipeline-tracker/SKILL.md +45 -0
- package/templates/workspaces/olivia/skills/sales-pipeline-tracker/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/security-auditor/SKILL.md +399 -0
- package/templates/workspaces/olivia/skills/security-auditor/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/security-hardening/SKILL.md +296 -0
- package/templates/workspaces/olivia/skills/security-hardening/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/security-scanner/SKILL.md +67 -0
- package/templates/workspaces/olivia/skills/security-scanner/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/seo-optimization/SKILL.md +31 -0
- package/templates/workspaces/olivia/skills/seo-optimization/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/service-booking/SKILL.md +193 -0
- package/templates/workspaces/olivia/skills/service-booking/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/sme-hr-automation/SKILL.md +131 -0
- package/templates/workspaces/olivia/skills/sme-hr-automation/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/social-media-scheduler/README.md +29 -0
- package/templates/workspaces/olivia/skills/social-media-scheduler/SKILL.md +49 -0
- package/templates/workspaces/olivia/skills/social-media-scheduler/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/sonoscli/SKILL.md +26 -0
- package/templates/workspaces/olivia/skills/sonoscli/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/strategy-advisor/SKILL.md +33 -0
- package/templates/workspaces/olivia/skills/strategy-advisor/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/summarize/SKILL.md +49 -0
- package/templates/workspaces/olivia/skills/summarize/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/things-mac/SKILL.md +61 -0
- package/templates/workspaces/olivia/skills/things-mac/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/travel-itinerary-planner/SKILL.md +121 -0
- package/templates/workspaces/olivia/skills/travel-itinerary-planner/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/travel-manager/SKILL.md +36 -0
- package/templates/workspaces/olivia/skills/travel-manager/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/travel-planning/SKILL.md +238 -0
- package/templates/workspaces/olivia/skills/travel-planning/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/travel-planning/booking-guide.md +91 -0
- package/templates/workspaces/olivia/skills/travel-planning/memory-template.md +111 -0
- package/templates/workspaces/olivia/skills/travel-planning/multi-city.md +131 -0
- package/templates/workspaces/olivia/skills/travel-planning/packing-templates.md +155 -0
- package/templates/workspaces/olivia/skills/travel-planning/setup.md +66 -0
- package/templates/workspaces/olivia/skills/update-it-all/SKILL.md +143 -0
- package/templates/workspaces/olivia/skills/update-it-all/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/voice/SKILL.md +62 -0
- package/templates/workspaces/olivia/skills/weather/SKILL.md +49 -0
- package/templates/workspaces/olivia/skills/weather/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/web-researcher/SKILL.md +21 -0
- package/templates/workspaces/olivia/skills/web-researcher/_meta.json +6 -0
- package/templates/workspaces/olivia/skills/website-seo/SKILL.md +284 -0
- package/templates/workspaces/olivia/skills/website-seo/_meta.json +6 -0
- package/templates/workspaces/olivia/stripe-welcome-n8n.json +103 -0
- package/templates/workspaces/olivia/test2.wav.wav +0 -0
- package/templates/workspaces/olivia/test_speech.json +1 -0
- package/templates/workspaces/olivia/test_speech.srt +0 -0
- package/templates/workspaces/olivia/test_speech.tsv +1 -0
- package/templates/workspaces/olivia/test_speech.txt +0 -0
- package/templates/workspaces/olivia/test_speech.vtt +2 -0
- package/templates/workspaces/owen/AGENTS.md +59 -0
- package/templates/workspaces/owen/FEEDBACK.md +12 -0
- package/templates/workspaces/owen/HEARTBEAT.md +5 -0
- package/templates/workspaces/owen/IDENTITY.md +6 -0
- package/templates/workspaces/owen/LEARNINGS.md +46 -0
- package/templates/workspaces/owen/MEMORY.md +22 -0
- package/templates/workspaces/owen/PLAYBOOK.md +16 -0
- package/templates/workspaces/owen/SOUL.md +1 -1
- package/templates/workspaces/owen/TOOLS.md +15 -0
- package/templates/workspaces/owen/USER.md +17 -0
- package/templates/workspaces/parker/AGENTS.md +59 -0
- package/templates/workspaces/parker/FEEDBACK.md +11 -0
- package/templates/workspaces/parker/HEARTBEAT.md +5 -0
- package/templates/workspaces/parker/IDENTITY.md +6 -0
- package/templates/workspaces/parker/LEARNINGS.md +17 -0
- package/templates/workspaces/parker/MEMORY.md +22 -0
- package/templates/workspaces/parker/PLAYBOOK.md +16 -0
- package/templates/workspaces/parker/SOUL.md +1 -1
- package/templates/workspaces/parker/TOOLS.md +15 -0
- package/templates/workspaces/parker/USER.md +13 -0
- package/templates/workspaces/quinn/AGENTS.md +52 -0
- package/templates/workspaces/quinn/FEEDBACK.md +11 -0
- package/templates/workspaces/quinn/HEARTBEAT.md +5 -0
- package/templates/workspaces/quinn/IDENTITY.md +6 -0
- package/templates/workspaces/quinn/LEARNINGS.md +35 -0
- package/templates/workspaces/quinn/MEMORY.md +22 -0
- package/templates/workspaces/quinn/PLAYBOOK.md +16 -0
- package/templates/workspaces/quinn/SOUL.md +1 -1
- package/templates/workspaces/quinn/USER.md +17 -0
- package/templates/workspaces/quinn/alice-login-page.png +0 -0
- package/templates/workspaces/rowan/AGENTS.md +59 -0
- package/templates/workspaces/rowan/FEEDBACK.md +12 -0
- package/templates/workspaces/rowan/HEARTBEAT.md +5 -0
- package/templates/workspaces/rowan/IDENTITY.md +6 -0
- package/templates/workspaces/rowan/LEARNINGS.md +12 -0
- package/templates/workspaces/rowan/MEMORY.md +22 -0
- package/templates/workspaces/rowan/PLAYBOOK.md +16 -0
- package/templates/workspaces/rowan/SOUL.md +1 -1
- package/templates/workspaces/rowan/USER.md +17 -0
- package/templates/workspaces/selena/AGENTS.md +59 -0
- package/templates/workspaces/selena/FEEDBACK.md +12 -0
- package/templates/workspaces/selena/HEARTBEAT.md +5 -0
- package/templates/workspaces/selena/IDENTITY.md +6 -0
- package/templates/workspaces/selena/LEARNINGS.md +24 -0
- package/templates/workspaces/selena/MEMORY.md +22 -0
- package/templates/workspaces/selena/PLAYBOOK.md +16 -0
- package/templates/workspaces/selena/SOUL.md +1 -1
- package/templates/workspaces/selena/USER.md +17 -0
- package/templates/workspaces/selena/kids-ai-security-compliance-plan.md +791 -0
- package/templates/workspaces/selena/kidspark-coppa-compliance-audit.md +866 -0
- package/templates/workspaces/sloane/AGENTS.md +59 -0
- package/templates/workspaces/sloane/FEEDBACK.md +12 -0
- package/templates/workspaces/sloane/HEARTBEAT.md +9 -0
- package/templates/workspaces/sloane/IDENTITY.md +6 -0
- package/templates/workspaces/sloane/LEARNINGS.md +6 -0
- package/templates/workspaces/sloane/MEMORY.md +22 -0
- package/templates/workspaces/sloane/PLAYBOOK.md +16 -0
- package/templates/workspaces/sloane/SOUL.md +1 -1
- package/templates/workspaces/sloane/TOOLS.md +15 -0
- package/templates/workspaces/sloane/USER.md +13 -0
- package/templates/workspaces/smoketestagent/AGENTS.md +52 -0
- package/templates/workspaces/smoketestagent/FEEDBACK.md +3 -0
- package/templates/workspaces/smoketestagent/HEARTBEAT.md +14 -0
- package/templates/workspaces/smoketestagent/IDENTITY.md +6 -0
- package/templates/workspaces/smoketestagent/LEARNINGS.md +3 -0
- package/templates/workspaces/smoketestagent/MEMORY.md +24 -0
- package/templates/workspaces/smoketestagent/PLAYBOOK.md +7 -0
- package/templates/workspaces/smoketestagent/SOUL.md +32 -0
- package/templates/workspaces/smoketestagent/TOOLS.md +13 -0
- package/templates/workspaces/smoketestagent/USER.md +5 -0
- package/templates/workspaces/sophie/AGENTS.md +59 -0
- package/templates/workspaces/sophie/FEEDBACK.md +12 -0
- package/templates/workspaces/sophie/HEARTBEAT.md +9 -0
- package/templates/workspaces/sophie/IDENTITY.md +6 -0
- package/templates/workspaces/sophie/LEARNINGS.md +6 -0
- package/templates/workspaces/sophie/MEMORY.md +22 -0
- package/templates/workspaces/sophie/PLAYBOOK.md +16 -0
- package/templates/workspaces/sophie/SOUL.md +1 -1
- package/templates/workspaces/sophie/TOOLS.md +15 -0
- package/templates/workspaces/sophie/USER.md +17 -0
- package/templates/workspaces/tommy/AGENTS.md +59 -0
- package/templates/workspaces/tommy/FEEDBACK.md +12 -0
- package/templates/workspaces/tommy/HEARTBEAT.md +9 -0
- package/templates/workspaces/tommy/IDENTITY.md +6 -0
- package/templates/workspaces/tommy/LEARNINGS.md +6 -0
- package/templates/workspaces/tommy/MEMORY.md +22 -0
- package/templates/workspaces/tommy/PLAYBOOK.md +16 -0
- package/templates/workspaces/tommy/SOUL.md +1 -1
- package/templates/workspaces/tommy/TOOLS.md +15 -0
- package/templates/workspaces/tommy/USER.md +17 -0
- package/templates/workspaces/uma/AGENTS.md +59 -0
- package/templates/workspaces/uma/FEEDBACK.md +11 -0
- package/templates/workspaces/uma/HEARTBEAT.md +5 -0
- package/templates/workspaces/uma/IDENTITY.md +6 -0
- package/templates/workspaces/uma/LEARNINGS.md +11 -0
- package/templates/workspaces/uma/MEMORY.md +22 -0
- package/templates/workspaces/uma/PLAYBOOK.md +16 -0
- package/templates/workspaces/uma/SOUL.md +1 -1
- package/templates/workspaces/uma/TOOLS.md +15 -0
- package/templates/workspaces/uma/USER.md +13 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
A.L.I.C.E. Stripe Webhook Handler
|
|
4
|
+
Runs on: Ubuntu Desktop (alpha@100.106.110.119)
|
|
5
|
+
Port: 5001 (FLASK_PORT)
|
|
6
|
+
|
|
7
|
+
Handles: checkout.session.completed
|
|
8
|
+
Actions:
|
|
9
|
+
1. Validate Stripe webhook signature
|
|
10
|
+
2. Generate license key (ALICE-XXXX-XXXX-XXXX)
|
|
11
|
+
3. Write to Supabase licenses + teams + team_tokens tables
|
|
12
|
+
4. Trigger n8n welcome email workflow
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
python3 stripe-webhook-handler.py
|
|
16
|
+
|
|
17
|
+
For local testing:
|
|
18
|
+
python3 stripe-webhook-handler.py --test
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
import json
|
|
24
|
+
import re
|
|
25
|
+
import hmac
|
|
26
|
+
import hashlib
|
|
27
|
+
import logging
|
|
28
|
+
import argparse
|
|
29
|
+
from datetime import datetime, timezone
|
|
30
|
+
from typing import Optional
|
|
31
|
+
|
|
32
|
+
import stripe
|
|
33
|
+
import supabase
|
|
34
|
+
import requests
|
|
35
|
+
from flask import Flask, request, jsonify
|
|
36
|
+
|
|
37
|
+
# ─── Logging ──────────────────────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
logging.basicConfig(
|
|
40
|
+
level=logging.INFO,
|
|
41
|
+
format="%(asctime)s [%(levelname)s] %(name)s — %(message)s",
|
|
42
|
+
handlers=[logging.StreamHandler(sys.stdout)],
|
|
43
|
+
)
|
|
44
|
+
logger = logging.getLogger("stripe-webhook")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# ─── Config ───────────────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
def _require_env(name: str) -> str:
|
|
50
|
+
val = os.environ.get(name)
|
|
51
|
+
if not val:
|
|
52
|
+
raise RuntimeError(f"Missing required environment variable: {name}")
|
|
53
|
+
return val
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class Config:
|
|
57
|
+
# Stripe
|
|
58
|
+
STRIPE_SECRET_KEY: str = _require_env("STRIPE_SECRET_KEY")
|
|
59
|
+
STRIPE_WEBHOOK_SECRET: str = _require_env("STRIPE_WEBHOOK_SECRET")
|
|
60
|
+
|
|
61
|
+
# Supabase
|
|
62
|
+
SUPABASE_URL: str = _require_env("SUPABASE_URL")
|
|
63
|
+
SUPABASE_SERVICE_ROLE_KEY: str = _require_env("SUPABASE_SERVICE_ROLE_KEY")
|
|
64
|
+
|
|
65
|
+
# n8n welcome email trigger
|
|
66
|
+
N8N_WEBHOOK_URL: str = _require_env(
|
|
67
|
+
"N8N_WEBHOOK_URL"
|
|
68
|
+
) # e.g. http://100.106.110.119:5678/webhook/stripe-checkout-completed
|
|
69
|
+
|
|
70
|
+
# Flask
|
|
71
|
+
FLASK_PORT: int = int(os.environ.get("FLASK_PORT", "5001"))
|
|
72
|
+
FLASK_HOST: str = os.environ.get("FLASK_HOST", "0.0.0.0")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# ─── App ──────────────────────────────────────────────────────────────────────
|
|
76
|
+
|
|
77
|
+
app = Flask(__name__)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# ─── License Key Generation ───────────────────────────────────────────────────
|
|
81
|
+
|
|
82
|
+
def generate_license_key() -> str:
|
|
83
|
+
"""Generate an A.L.I.C.E. license key: ALICE-XXXX-XXXX-XXXX"""
|
|
84
|
+
import secrets
|
|
85
|
+
chunks = [secrets.token_hex(2).upper() for _ in range(3)]
|
|
86
|
+
return "ALICE-" + "-".join(chunks)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# ─── Supabase Helpers ─────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
def get_supabase_client():
|
|
92
|
+
return supabase.create_client(
|
|
93
|
+
Config.SUPABASE_URL,
|
|
94
|
+
Config.SUPABASE_SERVICE_ROLE_KEY,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def find_existing_license(sb, stripe_session_id: str) -> Optional[dict]:
|
|
99
|
+
"""Check if license already exists for this Stripe session (deduplication)."""
|
|
100
|
+
resp = (
|
|
101
|
+
sb.table("licenses")
|
|
102
|
+
.select("key, email, plan, stripe_session_id")
|
|
103
|
+
.eq("stripe_session_id", stripe_session_id)
|
|
104
|
+
.maybe_single()
|
|
105
|
+
)
|
|
106
|
+
return resp.data
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def insert_license(sb, email: str, plan: str, stripe_session_id: str, stripe_customer_id: Optional[str]):
|
|
110
|
+
"""Insert a new license record and return it."""
|
|
111
|
+
import secrets
|
|
112
|
+
license_key = generate_license_key()
|
|
113
|
+
resp = (
|
|
114
|
+
sb.table("licenses")
|
|
115
|
+
.insert({
|
|
116
|
+
"email": email,
|
|
117
|
+
"plan": plan,
|
|
118
|
+
"stripe_session_id": stripe_session_id,
|
|
119
|
+
"stripe_customer_id": stripe_customer_id,
|
|
120
|
+
"metadata": {"source": "stripe-webhook-handler.py"},
|
|
121
|
+
})
|
|
122
|
+
.execute()
|
|
123
|
+
)
|
|
124
|
+
if not resp.data:
|
|
125
|
+
raise RuntimeError("License insert returned no data")
|
|
126
|
+
# Override the auto-generated key with our deterministic one
|
|
127
|
+
created = resp.data[0]
|
|
128
|
+
upd = sb.table("licenses").update({"key": license_key}).eq("id", created["id"]).execute()
|
|
129
|
+
created["key"] = license_key
|
|
130
|
+
return created
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def provision_team_and_tokens(sb, license_key: str, email: str):
|
|
134
|
+
"""
|
|
135
|
+
Provision a team + ingest/worker tokens for Mission Control.
|
|
136
|
+
Returns (team_id, ingest_token, worker_token) on success, (None, '', '') on failure.
|
|
137
|
+
"""
|
|
138
|
+
import secrets
|
|
139
|
+
|
|
140
|
+
# Slug from email: normalize and append timestamp
|
|
141
|
+
slug_base = re.sub(r"[^a-z0-9]", "-", email.lower())[:50]
|
|
142
|
+
slug = f"{slug_base}-{int(datetime.now(timezone.utc).timestamp())}"
|
|
143
|
+
|
|
144
|
+
team_resp = sb.table("teams").insert({
|
|
145
|
+
"name": f"{email}'s Team",
|
|
146
|
+
"slug": slug,
|
|
147
|
+
"plan": "pro",
|
|
148
|
+
"owner_email": email,
|
|
149
|
+
}).execute()
|
|
150
|
+
|
|
151
|
+
if not team_resp.data:
|
|
152
|
+
logger.warning("Team insert failed — continuing without team tokens")
|
|
153
|
+
return None, "", ""
|
|
154
|
+
|
|
155
|
+
team_id = team_resp.data[0]["id"]
|
|
156
|
+
ingest_token = "mc_ingest_" + secrets.token_hex(32)
|
|
157
|
+
worker_token = "mc_worker_" + secrets.token_hex(32)
|
|
158
|
+
|
|
159
|
+
token_resp = sb.table("team_tokens").insert({
|
|
160
|
+
"team_id": team_id,
|
|
161
|
+
"license_key": license_key,
|
|
162
|
+
"ingest_token": ingest_token,
|
|
163
|
+
"worker_token": worker_token,
|
|
164
|
+
}).execute()
|
|
165
|
+
|
|
166
|
+
if not token_resp.data:
|
|
167
|
+
logger.warning("Token insert failed — continuing without tokens")
|
|
168
|
+
return team_id, "", ""
|
|
169
|
+
|
|
170
|
+
return team_id, ingest_token, worker_token
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# ─── n8n Welcome Email Trigger ───────────────────────────────────────────────
|
|
174
|
+
|
|
175
|
+
def trigger_n8n_welcome_email(
|
|
176
|
+
license_key: str,
|
|
177
|
+
email: str,
|
|
178
|
+
plan: str,
|
|
179
|
+
ingest_token: str,
|
|
180
|
+
worker_token: str,
|
|
181
|
+
alice_cloud_token: str,
|
|
182
|
+
):
|
|
183
|
+
"""
|
|
184
|
+
POST to the n8n webhook URL to trigger the welcome email workflow.
|
|
185
|
+
n8n will use the template variables to render the full welcome email.
|
|
186
|
+
"""
|
|
187
|
+
payload = {
|
|
188
|
+
"license_key": license_key,
|
|
189
|
+
"email": email,
|
|
190
|
+
"plan": plan,
|
|
191
|
+
"ingest_token": ingest_token,
|
|
192
|
+
"worker_token": worker_token,
|
|
193
|
+
"alice_cloud_token": alice_cloud_token,
|
|
194
|
+
# Timestamp for audit
|
|
195
|
+
"purchased_at": datetime.now(timezone.utc).isoformat(),
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
try:
|
|
199
|
+
resp = requests.post(
|
|
200
|
+
Config.N8N_WEBHOOK_URL,
|
|
201
|
+
json=payload,
|
|
202
|
+
headers={"Content-Type": "application/json"},
|
|
203
|
+
timeout=15,
|
|
204
|
+
)
|
|
205
|
+
resp.raise_for_status()
|
|
206
|
+
logger.info(
|
|
207
|
+
f"n8n welcome email triggered for {email} — status {resp.status_code}"
|
|
208
|
+
)
|
|
209
|
+
return True
|
|
210
|
+
except requests.RequestException as exc:
|
|
211
|
+
logger.error(f"n8n webhook failed: {exc}")
|
|
212
|
+
return False
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
# ─── Stripe Signature Verification ───────────────────────────────────────────
|
|
216
|
+
|
|
217
|
+
def verify_stripe_signature(body: bytes, sig_header: str) -> stripe.Event:
|
|
218
|
+
"""Verify and construct a Stripe event from the raw request body."""
|
|
219
|
+
try:
|
|
220
|
+
event = stripe.Webhook.construct_event(body, sig_header, Config.STRIPE_WEBHOOK_SECRET)
|
|
221
|
+
except stripe.error.SignatureVerificationError as exc:
|
|
222
|
+
logger.warning(f"Stripe signature verification failed: {exc}")
|
|
223
|
+
raise
|
|
224
|
+
return event
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
# ─── Webhook Handler ───────────────────────────────────────────────────────────
|
|
228
|
+
|
|
229
|
+
@app.route("/webhook/stripe", methods=["POST"])
|
|
230
|
+
def handle_stripe_webhook():
|
|
231
|
+
"""Main Stripe webhook endpoint. Expects Stripe-Signature header."""
|
|
232
|
+
|
|
233
|
+
# Get raw body for signature verification
|
|
234
|
+
body = request.get_data()
|
|
235
|
+
sig_header = request.headers.get("Stripe-Signature", "")
|
|
236
|
+
|
|
237
|
+
if not sig_header:
|
|
238
|
+
logger.warning("Missing Stripe-Signature header")
|
|
239
|
+
return jsonify({"error": "Missing Stripe-Signature header"}), 400
|
|
240
|
+
|
|
241
|
+
# Verify signature
|
|
242
|
+
try:
|
|
243
|
+
event = verify_stripe_signature(body, sig_header)
|
|
244
|
+
except Exception:
|
|
245
|
+
return jsonify({"error": "Signature verification failed"}), 400
|
|
246
|
+
|
|
247
|
+
logger.info(f"Received Stripe event: {event.type} (id={event.id})")
|
|
248
|
+
|
|
249
|
+
if event.type != "checkout.session.completed":
|
|
250
|
+
logger.info(f"Ignoring event type: {event.type}")
|
|
251
|
+
return jsonify({"received": True, "ignored": True})
|
|
252
|
+
|
|
253
|
+
session = event.data.object
|
|
254
|
+
|
|
255
|
+
# Extract email
|
|
256
|
+
email = session.get("customer_details", {}).get("email") or session.get("customer_email")
|
|
257
|
+
if not email:
|
|
258
|
+
logger.warning("No email in checkout session")
|
|
259
|
+
return jsonify({"error": "No email in session"}), 400
|
|
260
|
+
|
|
261
|
+
# Extract plan from metadata
|
|
262
|
+
plan = session.metadata.get("plan", "pro") if session.metadata else "pro"
|
|
263
|
+
if plan not in ("pro", "cloud"):
|
|
264
|
+
plan = "pro"
|
|
265
|
+
|
|
266
|
+
stripe_session_id = session.id
|
|
267
|
+
stripe_customer_id = session.customer if isinstance(session.customer, str) else None
|
|
268
|
+
|
|
269
|
+
logger.info(
|
|
270
|
+
f"Processing checkout.completed — email={email} plan={plan} session={stripe_session_id}"
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
sb = get_supabase_client()
|
|
274
|
+
|
|
275
|
+
# Deduplication check
|
|
276
|
+
existing = find_existing_license(sb, stripe_session_id)
|
|
277
|
+
if existing:
|
|
278
|
+
logger.info(f"License already exists for session {stripe_session_id} — skipping")
|
|
279
|
+
return jsonify({"received": True, "deduplicated": True})
|
|
280
|
+
|
|
281
|
+
# Insert license
|
|
282
|
+
try:
|
|
283
|
+
license_record = insert_license(sb, email, plan, stripe_session_id, stripe_customer_id)
|
|
284
|
+
license_key = license_record["key"]
|
|
285
|
+
logger.info(f"License created: {license_key}")
|
|
286
|
+
except Exception as exc:
|
|
287
|
+
logger.error(f"Failed to create license: {exc}")
|
|
288
|
+
return jsonify({"error": "Failed to create license"}), 500
|
|
289
|
+
|
|
290
|
+
# Provision team + tokens
|
|
291
|
+
team_id, ingest_token, worker_token = provision_team_and_tokens(sb, license_key, email)
|
|
292
|
+
|
|
293
|
+
# alice_cloud_token is the ingest token (same concept, different name)
|
|
294
|
+
alice_cloud_token = ingest_token
|
|
295
|
+
|
|
296
|
+
# Trigger n8n welcome email workflow
|
|
297
|
+
n8n_ok = trigger_n8n_welcome_email(
|
|
298
|
+
license_key=license_key,
|
|
299
|
+
email=email,
|
|
300
|
+
plan=plan,
|
|
301
|
+
ingest_token=ingest_token,
|
|
302
|
+
worker_token=worker_token,
|
|
303
|
+
alice_cloud_token=alice_cloud_token,
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
if not n8n_ok:
|
|
307
|
+
logger.warning("n8n trigger failed — email may not be sent")
|
|
308
|
+
|
|
309
|
+
return jsonify({
|
|
310
|
+
"received": True,
|
|
311
|
+
"license_key": license_key,
|
|
312
|
+
"email": email,
|
|
313
|
+
"plan": plan,
|
|
314
|
+
"team_provisioned": team_id is not None,
|
|
315
|
+
"n8n_triggered": n8n_ok,
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
@app.route("/health", methods=["GET"])
|
|
320
|
+
def health():
|
|
321
|
+
"""Health check endpoint."""
|
|
322
|
+
return jsonify({"status": "ok", "service": "stripe-webhook-handler"})
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
# ─── Test / Mock Mode ──────────────────────────────────────────────────────────
|
|
326
|
+
|
|
327
|
+
@app.route("/test/mock-webhook", methods=["POST"])
|
|
328
|
+
def handle_mock_webhook():
|
|
329
|
+
"""
|
|
330
|
+
Internal test endpoint — simulates a checkout.session.completed event
|
|
331
|
+
without Stripe signature validation. DO NOT expose in production.
|
|
332
|
+
"""
|
|
333
|
+
body = request.get_json() or {}
|
|
334
|
+
|
|
335
|
+
email = body.get("email", "test@example.com")
|
|
336
|
+
plan = body.get("plan", "pro")
|
|
337
|
+
|
|
338
|
+
logger.info(f"[MOCK] Processing mock checkout — email={email} plan={plan}")
|
|
339
|
+
|
|
340
|
+
import secrets
|
|
341
|
+
license_key = generate_license_key()
|
|
342
|
+
stripe_session_id = "cs_test_mock_" + secrets.token_hex(16)
|
|
343
|
+
stripe_customer_id = None
|
|
344
|
+
|
|
345
|
+
sb = get_supabase_client()
|
|
346
|
+
|
|
347
|
+
# Check existing
|
|
348
|
+
existing = find_existing_license(sb, stripe_session_id)
|
|
349
|
+
if existing:
|
|
350
|
+
return jsonify({"received": True, "deduplicated": True, "key": existing["key"]})
|
|
351
|
+
|
|
352
|
+
# Insert
|
|
353
|
+
resp = (
|
|
354
|
+
sb.table("licenses")
|
|
355
|
+
.insert({
|
|
356
|
+
"email": email,
|
|
357
|
+
"plan": plan,
|
|
358
|
+
"stripe_session_id": stripe_session_id,
|
|
359
|
+
"stripe_customer_id": stripe_customer_id,
|
|
360
|
+
"metadata": {"source": "stripe-webhook-handler.py:test"},
|
|
361
|
+
})
|
|
362
|
+
.execute()
|
|
363
|
+
)
|
|
364
|
+
created = resp.data[0]
|
|
365
|
+
|
|
366
|
+
# Update with deterministic key
|
|
367
|
+
sb.table("licenses").update({"key": license_key}).eq("id", created["id"]).execute()
|
|
368
|
+
created["key"] = license_key
|
|
369
|
+
|
|
370
|
+
# Provision team + tokens
|
|
371
|
+
team_id, ingest_token, worker_token = provision_team_and_tokens(sb, license_key, email)
|
|
372
|
+
|
|
373
|
+
# Trigger n8n
|
|
374
|
+
alice_cloud_token = ingest_token
|
|
375
|
+
n8n_ok = trigger_n8n_welcome_email(
|
|
376
|
+
license_key=license_key,
|
|
377
|
+
email=email,
|
|
378
|
+
plan=plan,
|
|
379
|
+
ingest_token=ingest_token,
|
|
380
|
+
worker_token=worker_token,
|
|
381
|
+
alice_cloud_token=alice_cloud_token,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
return jsonify({
|
|
385
|
+
"received": True,
|
|
386
|
+
"license_key": license_key,
|
|
387
|
+
"email": email,
|
|
388
|
+
"plan": plan,
|
|
389
|
+
"team_provisioned": team_id is not None,
|
|
390
|
+
"ingest_token": ingest_token,
|
|
391
|
+
"worker_token": worker_token,
|
|
392
|
+
"n8n_triggered": n8n_ok,
|
|
393
|
+
})
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
# ─── CLI ───────────────────────────────────────────────────────────────────────
|
|
397
|
+
|
|
398
|
+
def main():
|
|
399
|
+
parser = argparse.ArgumentParser(description="A.L.I.C.E. Stripe Webhook Handler")
|
|
400
|
+
parser.add_argument("--test", action="store_true", help="Run in test mode (mock endpoint only)")
|
|
401
|
+
args = parser.parse_args()
|
|
402
|
+
|
|
403
|
+
if args.test:
|
|
404
|
+
logger.info("Starting in TEST mode (no Stripe signature required)")
|
|
405
|
+
# Override to run a simple test server without loading full config
|
|
406
|
+
# (full config still loaded so we can use it)
|
|
407
|
+
|
|
408
|
+
try:
|
|
409
|
+
# Verify config loads before starting server
|
|
410
|
+
_ = Config.STRIPE_SECRET_KEY
|
|
411
|
+
_ = Config.STRIPE_WEBHOOK_SECRET
|
|
412
|
+
_ = Config.SUPABASE_URL
|
|
413
|
+
_ = Config.SUPABASE_SERVICE_ROLE_KEY
|
|
414
|
+
_ = Config.N8N_WEBHOOK_URL
|
|
415
|
+
logger.info("Config validated successfully")
|
|
416
|
+
except RuntimeError as exc:
|
|
417
|
+
logger.error(f"Config error: {exc}")
|
|
418
|
+
logger.error("Copy .env.example to ~/alice-observability/.env and fill in Rob's keys")
|
|
419
|
+
sys.exit(1)
|
|
420
|
+
|
|
421
|
+
logger.info(
|
|
422
|
+
f"Starting Flask server on {Config.FLASK_HOST}:{Config.FLASK_PORT}"
|
|
423
|
+
)
|
|
424
|
+
app.run(
|
|
425
|
+
host=Config.FLASK_HOST,
|
|
426
|
+
port=Config.FLASK_PORT,
|
|
427
|
+
debug=False,
|
|
428
|
+
threaded=True,
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
if __name__ == "__main__":
|
|
433
|
+
main()
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
test_mock_webhook.py — Local test for stripe-webhook-handler.py
|
|
4
|
+
|
|
5
|
+
Usage (from Ubuntu Desktop):
|
|
6
|
+
python3 test_mock_webhook.py
|
|
7
|
+
|
|
8
|
+
This script:
|
|
9
|
+
1. Starts the webhook handler in a subprocess
|
|
10
|
+
2. Sends a mock checkout.session.completed event to /test/mock-webhook
|
|
11
|
+
3. Verifies the license was created in Supabase
|
|
12
|
+
4. Kills the handler
|
|
13
|
+
|
|
14
|
+
Requirements: Same env vars as stripe-webhook-handler.py (except STRIPE_WEBHOOK_SECRET
|
|
15
|
+
is not needed for the /test/mock-webhook endpoint).
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import os
|
|
19
|
+
import sys
|
|
20
|
+
import json
|
|
21
|
+
import time
|
|
22
|
+
import subprocess
|
|
23
|
+
import signal
|
|
24
|
+
import requests
|
|
25
|
+
|
|
26
|
+
HANDLER_HOST = os.environ.get("FLASK_HOST", "0.0.0.0")
|
|
27
|
+
HANDLER_PORT = os.environ.get("FLASK_PORT", "5001")
|
|
28
|
+
BASE_URL = f"http://{HANDLER_HOST}:{HANDLER_PORT}"
|
|
29
|
+
|
|
30
|
+
MOCK_PAYLOAD = {
|
|
31
|
+
"email": "test-pipeline@dylan.local",
|
|
32
|
+
"plan": "pro",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def wait_for_handler(timeout=10):
|
|
37
|
+
start = time.time()
|
|
38
|
+
while time.time() - start < timeout:
|
|
39
|
+
try:
|
|
40
|
+
r = requests.get(f"{BASE_URL}/health", timeout=1)
|
|
41
|
+
if r.status_code == 200:
|
|
42
|
+
return True
|
|
43
|
+
except requests.RequestException:
|
|
44
|
+
pass
|
|
45
|
+
time.sleep(0.5)
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def main():
|
|
50
|
+
handler_proc = None
|
|
51
|
+
try:
|
|
52
|
+
# Start the handler as a subprocess
|
|
53
|
+
print("[test] Starting webhook handler...")
|
|
54
|
+
handler_proc = subprocess.Popen(
|
|
55
|
+
[sys.executable, "stripe-webhook-handler.py"],
|
|
56
|
+
cwd=os.path.dirname(os.path.abspath(__file__)) or ".",
|
|
57
|
+
env=os.environ,
|
|
58
|
+
stdout=subprocess.PIPE,
|
|
59
|
+
stderr=subprocess.STDOUT,
|
|
60
|
+
preexec_fn=os.setsid,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Wait for it to come up
|
|
64
|
+
if not wait_for_handler():
|
|
65
|
+
print("[test] FAIL: Handler did not come up in time")
|
|
66
|
+
return 1
|
|
67
|
+
|
|
68
|
+
print("[test] Handler is up. Sending mock webhook...")
|
|
69
|
+
|
|
70
|
+
# Send mock event
|
|
71
|
+
resp = requests.post(
|
|
72
|
+
f"{BASE_URL}/test/mock-webhook",
|
|
73
|
+
json=MOCK_PAYLOAD,
|
|
74
|
+
headers={"Content-Type": "application/json"},
|
|
75
|
+
timeout=15,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
print(f"[test] Response status: {resp.status_code}")
|
|
79
|
+
print(f"[test] Response body: {json.dumps(resp.json(), indent=2)}")
|
|
80
|
+
|
|
81
|
+
if resp.status_code != 200:
|
|
82
|
+
print("[test] FAIL: Non-200 response")
|
|
83
|
+
return 1
|
|
84
|
+
|
|
85
|
+
data = resp.json()
|
|
86
|
+
if not data.get("received"):
|
|
87
|
+
print("[test] FAIL: Handler did not process event")
|
|
88
|
+
return 1
|
|
89
|
+
|
|
90
|
+
print(f"[test] PASS: License created: {data.get('license_key')}")
|
|
91
|
+
print(f"[test] Team provisioned: {data.get('team_provisioned')}")
|
|
92
|
+
print(f"[test] n8n triggered: {data.get('n8n_triggered')}")
|
|
93
|
+
return 0
|
|
94
|
+
|
|
95
|
+
finally:
|
|
96
|
+
if handler_proc:
|
|
97
|
+
print("[test] Stopping handler...")
|
|
98
|
+
os.killpg(os.getpgid(handler_proc.pid), signal.SIGTERM)
|
|
99
|
+
handler_proc.wait(timeout=5)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
if __name__ == "__main__":
|
|
103
|
+
sys.exit(main())
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# AGENTS.md - Elena's Operating Instructions
|
|
2
|
+
|
|
3
|
+
## Session Startup
|
|
4
|
+
|
|
5
|
+
1. Read `SOUL.md` — this is who you are
|
|
6
|
+
2. Read `PLAYBOOK.md` (if exists) — your evolved domain expertise, proven patterns
|
|
7
|
+
3. Read `FEEDBACK.md` (if exists) — recent user feedback to incorporate
|
|
8
|
+
4. Skim `LEARNINGS.md` (last 10 entries) — recent task lessons
|
|
9
|
+
5. Read the task you've been given — focus on delivering results
|
|
10
|
+
6. Check `memory/` for relevant prior work
|
|
11
|
+
|
|
12
|
+
## Your Role
|
|
13
|
+
|
|
14
|
+
You are **Elena**, the **Estimation** specialist. Project estimation, cost analysis, timeline planning, scoping.
|
|
15
|
+
|
|
16
|
+
## How You Work
|
|
17
|
+
|
|
18
|
+
- You receive tasks from A.L.I.C.E. (the orchestrator, also called Alice) via sessions_spawn
|
|
19
|
+
- Do your work using your available tools
|
|
20
|
+
- Return clear, structured results
|
|
21
|
+
- If you need another specialist's help, say so explicitly (e.g., "This also needs Dylan for implementation")
|
|
22
|
+
- Keep notes in `memory/YYYY-MM-DD.md` for continuity
|
|
23
|
+
|
|
24
|
+
## Output Format
|
|
25
|
+
|
|
26
|
+
Structure your responses clearly:
|
|
27
|
+
1. **Summary** — one-line answer
|
|
28
|
+
2. **Details** — the actual work/analysis
|
|
29
|
+
3. **Recommendations** — next steps or suggestions
|
|
30
|
+
4. **Collaboration needs** — other specialists to involve (if any)
|
|
31
|
+
|
|
32
|
+
## Post-Task Reflection
|
|
33
|
+
|
|
34
|
+
After completing any non-trivial task, append a structured entry to `LEARNINGS.md`:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
### YYYY-MM-DD — [one-line task summary]
|
|
38
|
+
- **Outcome:** success | partial | failed
|
|
39
|
+
- **What worked:** [approach, tool, pattern that helped]
|
|
40
|
+
- **What to improve:** [what you'd do differently next time]
|
|
41
|
+
- **Reusable pattern:** [any generalizable insight worth promoting to PLAYBOOK]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Skip this for trivial lookups or single-command tasks. Write it for anything involving judgment, multi-step work, or novel problems.
|
|
45
|
+
|
|
46
|
+
## Red Lines
|
|
47
|
+
|
|
48
|
+
- Don't exceed your domain without flagging it
|
|
49
|
+
- Don't run destructive commands without explicit risk callout
|
|
50
|
+
- `trash` > `rm`
|
|
51
|
+
|
|
52
|
+
## Tier Note
|
|
53
|
+
|
|
54
|
+
{{#if isPro}}
|
|
55
|
+
You are a **Pro tier** agent. Pro tier requires a valid A.L.I.C.E. Pro license key stored at `~/.alice/license`.
|
|
56
|
+
If you were installed without a license key, run the installer interactively to enter your key:
|
|
57
|
+
`npx @robbiesrobotics/alice-agents`
|
|
58
|
+
Purchase or manage your license at: https://getalice.av3.ai/pricing
|
|
59
|
+
{{/if}}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# MEMORY.md — Elena
|
|
2
|
+
|
|
3
|
+
> Persistent memory for Elena, Estimation specialist.
|
|
4
|
+
> This file is yours — add notes, context, and learnings that should persist across sessions.
|
|
5
|
+
|
|
6
|
+
## Identity
|
|
7
|
+
|
|
8
|
+
- **Name:** Elena
|
|
9
|
+
- **Domain:** Estimation
|
|
10
|
+
- **Team:** A.L.I.C.E.
|
|
11
|
+
|
|
12
|
+
## Active Projects
|
|
13
|
+
|
|
14
|
+
<!-- Add ongoing projects and their current status here -->
|
|
15
|
+
|
|
16
|
+
## Key Notes
|
|
17
|
+
|
|
18
|
+
<!-- Jot down anything important to remember across sessions -->
|
|
19
|
+
|
|
20
|
+
## Decisions Made
|
|
21
|
+
|
|
22
|
+
<!-- Record significant decisions and their rationale -->
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# PLAYBOOK.md — Evolved Domain Expertise
|
|
2
|
+
|
|
3
|
+
_This file is your accumulated wisdom. Olivia curates it from your LEARNINGS.md and FEEDBACK.md._
|
|
4
|
+
_Consult this before starting any task._
|
|
5
|
+
|
|
6
|
+
## Patterns
|
|
7
|
+
|
|
8
|
+
_Nothing yet — complete tasks and reflect to build your playbook._
|
|
9
|
+
|
|
10
|
+
## Anti-Patterns
|
|
11
|
+
|
|
12
|
+
_Approaches to avoid, learned from experience._
|
|
13
|
+
|
|
14
|
+
## Preferences
|
|
15
|
+
|
|
16
|
+
_User preferences and standards relevant to your domain._
|
|
@@ -23,7 +23,7 @@ _You are Elena, part of the A.L.I.C.E. multi-agent team._
|
|
|
23
23
|
|
|
24
24
|
## Boundaries
|
|
25
25
|
|
|
26
|
-
- You do NOT talk to
|
|
26
|
+
- You do NOT talk to Rob directly — A.L.I.C.E. handles that
|
|
27
27
|
- Technical implementation details that affect estimates go through Dylan
|
|
28
28
|
- Budget implications of estimates go to Audrey
|
|
29
29
|
- Project execution and delivery management goes to Parker
|