moai-adk 0.25.4__py3-none-any.whl → 0.32.8__py3-none-any.whl
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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +4 -12
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +405 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +491 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +201 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +362 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +370 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +374 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +410 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,708 @@
|
|
|
1
|
+
# Token Optimization - Budget Management
|
|
2
|
+
|
|
3
|
+
Purpose: Efficient 200K token budget management through strategic context loading, phase separation, and model selection for cost-effective AI development.
|
|
4
|
+
|
|
5
|
+
Version: 1.0.0
|
|
6
|
+
Last Updated: 2025-11-25
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Quick Reference (30 seconds)
|
|
11
|
+
|
|
12
|
+
Token Budget: 200K per feature (250K with overhead)
|
|
13
|
+
|
|
14
|
+
Phase Allocation:
|
|
15
|
+
- SPEC Generation: 30K tokens
|
|
16
|
+
- TDD Implementation: 180K tokens
|
|
17
|
+
- Documentation: 40K tokens
|
|
18
|
+
|
|
19
|
+
/clear Execution Rules:
|
|
20
|
+
1. Immediately after /moai:1-plan (saves 45-50K)
|
|
21
|
+
2. When context > 150K tokens
|
|
22
|
+
3. After 50+ conversation messages
|
|
23
|
+
|
|
24
|
+
Model Selection:
|
|
25
|
+
- Sonnet 4.5: Quality-critical (SPEC, security)
|
|
26
|
+
- Haiku 4.5: Speed/cost (simple edits, tests)
|
|
27
|
+
- Cost savings: 60-70% with strategic Haiku use
|
|
28
|
+
|
|
29
|
+
Context Optimization:
|
|
30
|
+
- Target: 20-30K tokens per agent
|
|
31
|
+
- Maximum: 50K tokens
|
|
32
|
+
- Load only necessary files for current task
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Implementation Guide (5 minutes)
|
|
37
|
+
|
|
38
|
+
### Token Budget Allocation
|
|
39
|
+
|
|
40
|
+
Standard Feature Budget (250K tokens):
|
|
41
|
+
|
|
42
|
+
| Phase | Budget | Purpose | Breakdown |
|
|
43
|
+
|-------|--------|---------|-----------|
|
|
44
|
+
| Phase 1: SPEC | 30K | Requirements definition | EARS format, acceptance criteria, complexity |
|
|
45
|
+
| /clear | - | Context reset | Saves 45-50K tokens |
|
|
46
|
+
| Phase 2: TDD | 180K | Implementation + tests | RED (40K) + GREEN (80K) + REFACTOR (60K) |
|
|
47
|
+
| Phase 3: Docs | 40K | Documentation | API docs, architecture, reports |
|
|
48
|
+
| Total | 250K | Complete feature | 60-70% efficiency vs manual |
|
|
49
|
+
|
|
50
|
+
Budget Monitoring:
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
class TokenBudgetManager:
|
|
54
|
+
"""Track and enforce token budget limits."""
|
|
55
|
+
|
|
56
|
+
PHASE_BUDGETS = {
|
|
57
|
+
"spec": 30_000,
|
|
58
|
+
"tdd": 180_000,
|
|
59
|
+
"docs": 40_000
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
TOTAL_BUDGET = 250_000
|
|
63
|
+
WARNING_THRESHOLD = 150_000
|
|
64
|
+
|
|
65
|
+
def __init__(self):
|
|
66
|
+
self.current_phase = None
|
|
67
|
+
self.phase_usage = {
|
|
68
|
+
"spec": 0,
|
|
69
|
+
"tdd": 0,
|
|
70
|
+
"docs": 0
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
def track_usage(self, phase: str, tokens_used: int):
|
|
74
|
+
"""Track token usage for current phase."""
|
|
75
|
+
self.current_phase = phase
|
|
76
|
+
self.phase_usage[phase] += tokens_used
|
|
77
|
+
|
|
78
|
+
# Check budget
|
|
79
|
+
if self.phase_usage[phase] > self.PHASE_BUDGETS[phase]:
|
|
80
|
+
raise TokenBudgetExceededError(
|
|
81
|
+
f"Phase {phase} exceeded budget: "
|
|
82
|
+
f"{self.phase_usage[phase]} > {self.PHASE_BUDGETS[phase]}"
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
# Warn at threshold
|
|
86
|
+
total = self.total_usage()
|
|
87
|
+
if total > self.WARNING_THRESHOLD:
|
|
88
|
+
suggest_clear()
|
|
89
|
+
|
|
90
|
+
def total_usage(self) -> int:
|
|
91
|
+
"""Calculate total token usage across all phases."""
|
|
92
|
+
return sum(self.phase_usage.values())
|
|
93
|
+
|
|
94
|
+
def remaining_budget(self, phase: str) -> int:
|
|
95
|
+
"""Calculate remaining budget for phase."""
|
|
96
|
+
return self.PHASE_BUDGETS[phase] - self.phase_usage[phase]
|
|
97
|
+
|
|
98
|
+
def get_budget_report(self) -> dict:
|
|
99
|
+
"""Generate budget usage report."""
|
|
100
|
+
return {
|
|
101
|
+
"total_budget": self.TOTAL_BUDGET,
|
|
102
|
+
"total_used": self.total_usage(),
|
|
103
|
+
"total_remaining": self.TOTAL_BUDGET - self.total_usage(),
|
|
104
|
+
"phases": {
|
|
105
|
+
phase: {
|
|
106
|
+
"budget": self.PHASE_BUDGETS[phase],
|
|
107
|
+
"used": self.phase_usage[phase],
|
|
108
|
+
"remaining": self.remaining_budget(phase),
|
|
109
|
+
"utilization": (self.phase_usage[phase] / self.PHASE_BUDGETS[phase]) * 100
|
|
110
|
+
}
|
|
111
|
+
for phase in self.PHASE_BUDGETS
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# Usage
|
|
116
|
+
budget = TokenBudgetManager()
|
|
117
|
+
|
|
118
|
+
# Phase 1: SPEC
|
|
119
|
+
budget.track_usage("spec", 25_000)
|
|
120
|
+
print(budget.remaining_budget("spec")) # 5,000 tokens remaining
|
|
121
|
+
|
|
122
|
+
# Execute /clear
|
|
123
|
+
execute_clear()
|
|
124
|
+
|
|
125
|
+
# Phase 2: TDD
|
|
126
|
+
budget.track_usage("tdd", 85_000)
|
|
127
|
+
budget.track_usage("tdd", 75_000)
|
|
128
|
+
print(budget.total_usage()) # 185,000 (triggers warning)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### /clear Execution Strategy
|
|
134
|
+
|
|
135
|
+
Rule 1: Mandatory After SPEC Generation:
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
# Pattern: SPEC → /clear → Implementation
|
|
139
|
+
async def spec_then_implement():
|
|
140
|
+
"""Always execute /clear after SPEC."""
|
|
141
|
+
|
|
142
|
+
# Phase 1: SPEC Generation (heavy context)
|
|
143
|
+
spec = await Task(
|
|
144
|
+
subagent_type="spec-builder",
|
|
145
|
+
prompt="Generate SPEC for user authentication"
|
|
146
|
+
)
|
|
147
|
+
# Context: ~75K tokens (conversation + SPEC content)
|
|
148
|
+
|
|
149
|
+
# MANDATORY: Execute /clear
|
|
150
|
+
execute_clear()
|
|
151
|
+
# Context: Reset to 0, saves 45-50K tokens
|
|
152
|
+
|
|
153
|
+
# Phase 2: Implementation (fresh context)
|
|
154
|
+
impl = await Task(
|
|
155
|
+
subagent_type="tdd-implementer",
|
|
156
|
+
prompt="Implement SPEC-001",
|
|
157
|
+
context={
|
|
158
|
+
"spec_id": "SPEC-001", # Minimal reference
|
|
159
|
+
# SPEC content loaded from file, not conversation
|
|
160
|
+
}
|
|
161
|
+
)
|
|
162
|
+
# Context: Only current phase (~80K tokens)
|
|
163
|
+
|
|
164
|
+
# Total savings: 45-50K tokens
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
Rule 2: Context > 150K Threshold:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
def monitor_context_size():
|
|
171
|
+
"""Monitor and manage context size."""
|
|
172
|
+
|
|
173
|
+
current_tokens = get_current_context_tokens()
|
|
174
|
+
|
|
175
|
+
if current_tokens > 150_000:
|
|
176
|
+
# Warn user
|
|
177
|
+
print(" Context size: {current_tokens}K tokens")
|
|
178
|
+
print(" Recommendation: Execute /clear to reset context")
|
|
179
|
+
|
|
180
|
+
# Provide context summary before clearing
|
|
181
|
+
summary = generate_context_summary()
|
|
182
|
+
|
|
183
|
+
# Execute /clear
|
|
184
|
+
execute_clear()
|
|
185
|
+
|
|
186
|
+
# Restore minimal context
|
|
187
|
+
restore_minimal_context(summary)
|
|
188
|
+
|
|
189
|
+
def get_current_context_tokens() -> int:
|
|
190
|
+
"""Get current context token count."""
|
|
191
|
+
# Use /context command or API
|
|
192
|
+
result = execute_command("/context")
|
|
193
|
+
return parse_token_count(result)
|
|
194
|
+
|
|
195
|
+
def generate_context_summary() -> dict:
|
|
196
|
+
"""Generate compact summary of current context."""
|
|
197
|
+
return {
|
|
198
|
+
"current_spec": get_current_spec_id(),
|
|
199
|
+
"current_phase": get_current_phase(),
|
|
200
|
+
"key_decisions": extract_key_decisions(),
|
|
201
|
+
"pending_actions": extract_pending_actions()
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
def restore_minimal_context(summary: dict):
|
|
205
|
+
"""Restore only essential context after /clear."""
|
|
206
|
+
# Load only necessary files
|
|
207
|
+
load_file(f".moai/specs/{summary['current_spec']}/spec.md")
|
|
208
|
+
# Do NOT reload entire conversation history
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Rule 3: After 50+ Messages:
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
class ConversationMonitor:
|
|
215
|
+
"""Monitor conversation length and suggest /clear."""
|
|
216
|
+
|
|
217
|
+
def __init__(self):
|
|
218
|
+
self.message_count = 0
|
|
219
|
+
self.clear_threshold = 50
|
|
220
|
+
|
|
221
|
+
def track_message(self):
|
|
222
|
+
"""Track each message in conversation."""
|
|
223
|
+
self.message_count += 1
|
|
224
|
+
|
|
225
|
+
if self.message_count >= self.clear_threshold:
|
|
226
|
+
self.suggest_clear()
|
|
227
|
+
|
|
228
|
+
def suggest_clear(self):
|
|
229
|
+
"""Suggest executing /clear."""
|
|
230
|
+
print(f" {self.message_count} messages in conversation")
|
|
231
|
+
print(" Consider executing /clear to reset context")
|
|
232
|
+
print(" This will improve response quality and speed")
|
|
233
|
+
|
|
234
|
+
# Usage
|
|
235
|
+
monitor = ConversationMonitor()
|
|
236
|
+
|
|
237
|
+
# Each user/assistant message
|
|
238
|
+
monitor.track_message()
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### Selective File Loading
|
|
244
|
+
|
|
245
|
+
Good Practices :
|
|
246
|
+
|
|
247
|
+
```python
|
|
248
|
+
class SelectiveFileLoader:
|
|
249
|
+
"""Load only necessary files for current task."""
|
|
250
|
+
|
|
251
|
+
def __init__(self):
|
|
252
|
+
self.loaded_files = set()
|
|
253
|
+
|
|
254
|
+
def load_for_task(self, task_type: str, context: dict):
|
|
255
|
+
"""Load files specific to task type."""
|
|
256
|
+
|
|
257
|
+
if task_type == "backend_implementation":
|
|
258
|
+
# Load only backend-related files
|
|
259
|
+
files = [
|
|
260
|
+
f"src/{context['module']}.py",
|
|
261
|
+
f"tests/test_{context['module']}.py",
|
|
262
|
+
f".moai/specs/{context['spec_id']}/spec.md"
|
|
263
|
+
]
|
|
264
|
+
|
|
265
|
+
elif task_type == "frontend_implementation":
|
|
266
|
+
# Load only frontend-related files
|
|
267
|
+
files = [
|
|
268
|
+
f"src/components/{context['component']}.tsx",
|
|
269
|
+
f"src/components/{context['component']}.test.tsx",
|
|
270
|
+
f".moai/specs/{context['spec_id']}/spec.md"
|
|
271
|
+
]
|
|
272
|
+
|
|
273
|
+
elif task_type == "testing":
|
|
274
|
+
# Load only test files
|
|
275
|
+
files = [
|
|
276
|
+
f"tests/{context['test_module']}.py",
|
|
277
|
+
f"src/{context['implementation_module']}.py"
|
|
278
|
+
]
|
|
279
|
+
|
|
280
|
+
else:
|
|
281
|
+
# Default: Load spec only
|
|
282
|
+
files = [f".moai/specs/{context['spec_id']}/spec.md"]
|
|
283
|
+
|
|
284
|
+
# Load files
|
|
285
|
+
for file in files:
|
|
286
|
+
if file not in self.loaded_files:
|
|
287
|
+
load_file(file)
|
|
288
|
+
self.loaded_files.add(file)
|
|
289
|
+
|
|
290
|
+
def load_headers_only(self, file_path: str):
|
|
291
|
+
"""Load file metadata and headers only (not full content)."""
|
|
292
|
+
with open(file_path) as f:
|
|
293
|
+
# Read first 50 lines (headers, imports, class definitions)
|
|
294
|
+
headers = "".join(f.readlines()[:50])
|
|
295
|
+
return headers
|
|
296
|
+
|
|
297
|
+
def load_function_signatures(self, file_path: str):
|
|
298
|
+
"""Extract only function signatures from file."""
|
|
299
|
+
import ast
|
|
300
|
+
|
|
301
|
+
with open(file_path) as f:
|
|
302
|
+
tree = ast.parse(f.read())
|
|
303
|
+
|
|
304
|
+
signatures = []
|
|
305
|
+
for node in ast.walk(tree):
|
|
306
|
+
if isinstance(node, ast.FunctionDef):
|
|
307
|
+
args = [arg.arg for arg in node.args.args]
|
|
308
|
+
signatures.append(f"{node.name}({', '.join(args)})")
|
|
309
|
+
|
|
310
|
+
return signatures
|
|
311
|
+
|
|
312
|
+
# Usage
|
|
313
|
+
loader = SelectiveFileLoader()
|
|
314
|
+
|
|
315
|
+
# Backend task: Load only backend files
|
|
316
|
+
loader.load_for_task("backend_implementation", {
|
|
317
|
+
"module": "auth",
|
|
318
|
+
"spec_id": "SPEC-001"
|
|
319
|
+
})
|
|
320
|
+
# Loaded: src/auth.py, tests/test_auth.py, spec.md
|
|
321
|
+
# NOT loaded: frontend files, database files, docs
|
|
322
|
+
|
|
323
|
+
# Estimated tokens: ~15K (vs 150K if loading entire codebase)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
Bad Practices :
|
|
327
|
+
|
|
328
|
+
```python
|
|
329
|
+
# BAD: Load entire codebase
|
|
330
|
+
def load_everything():
|
|
331
|
+
for file in glob("src//*.py"):
|
|
332
|
+
load_file(file) # Loads 100+ files
|
|
333
|
+
for file in glob("tests//*.py"):
|
|
334
|
+
load_file(file)
|
|
335
|
+
# Result: 200K+ tokens, exceeds budget
|
|
336
|
+
|
|
337
|
+
# BAD: Load node_modules
|
|
338
|
+
def load_dependencies():
|
|
339
|
+
for file in glob("node_modules//*.js"):
|
|
340
|
+
load_file(file) # Millions of tokens
|
|
341
|
+
|
|
342
|
+
# BAD: Load binary files
|
|
343
|
+
def load_binaries():
|
|
344
|
+
for file in glob("/*.png"):
|
|
345
|
+
load_file(file) # Non-text data
|
|
346
|
+
|
|
347
|
+
# BAD: Load conversation history
|
|
348
|
+
def load_history():
|
|
349
|
+
load_file(".moai/conversation_history.json") # 500K+ tokens
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
### Model Selection Strategy
|
|
355
|
+
|
|
356
|
+
Decision Matrix:
|
|
357
|
+
|
|
358
|
+
| Task Type | Model | Reason | Cost | Speed |
|
|
359
|
+
|-----------|-------|--------|------|-------|
|
|
360
|
+
| SPEC generation | Sonnet 4.5 | High-quality design | $$$ | Slower |
|
|
361
|
+
| Security review | Sonnet 4.5 | Precise analysis | $$$ | Slower |
|
|
362
|
+
| Architecture design | Sonnet 4.5 | Complex reasoning | $$$ | Slower |
|
|
363
|
+
| TDD implementation | Haiku 4.5 | Fast execution | $ | 3x faster |
|
|
364
|
+
| Simple edits | Haiku 4.5 | Minimal complexity | $ | 3x faster |
|
|
365
|
+
| Test generation | Haiku 4.5 | Pattern-based | $ | 3x faster |
|
|
366
|
+
| Documentation | Haiku 4.5 | Template-based | $ | 3x faster |
|
|
367
|
+
|
|
368
|
+
Cost Comparison:
|
|
369
|
+
|
|
370
|
+
```python
|
|
371
|
+
class ModelCostCalculator:
|
|
372
|
+
"""Calculate cost savings with strategic model selection."""
|
|
373
|
+
|
|
374
|
+
COSTS_PER_1M_TOKENS = {
|
|
375
|
+
"sonnet-4.5": {
|
|
376
|
+
"input": 3.00,
|
|
377
|
+
"output": 15.00
|
|
378
|
+
},
|
|
379
|
+
"haiku-4.5": {
|
|
380
|
+
"input": 1.00,
|
|
381
|
+
"output": 5.00
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
def calculate_cost(self, model: str, input_tokens: int, output_tokens: int) -> float:
|
|
386
|
+
"""Calculate cost for specific model and token usage."""
|
|
387
|
+
input_cost = (input_tokens / 1_000_000) * self.COSTS_PER_1M_TOKENS[model]["input"]
|
|
388
|
+
output_cost = (output_tokens / 1_000_000) * self.COSTS_PER_1M_TOKENS[model]["output"]
|
|
389
|
+
return input_cost + output_cost
|
|
390
|
+
|
|
391
|
+
def compare_strategies(self, feature_token_budget: dict):
|
|
392
|
+
"""Compare cost of all-Sonnet vs strategic mix."""
|
|
393
|
+
|
|
394
|
+
# Strategy 1: All Sonnet
|
|
395
|
+
all_sonnet_cost = sum(
|
|
396
|
+
self.calculate_cost("sonnet-4.5", phase["input"], phase["output"])
|
|
397
|
+
for phase in feature_token_budget.values()
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Strategy 2: Strategic mix
|
|
401
|
+
strategic_costs = {
|
|
402
|
+
"spec": self.calculate_cost(
|
|
403
|
+
"sonnet-4.5", # Sonnet for SPEC
|
|
404
|
+
feature_token_budget["spec"]["input"],
|
|
405
|
+
feature_token_budget["spec"]["output"]
|
|
406
|
+
),
|
|
407
|
+
"tdd": self.calculate_cost(
|
|
408
|
+
"haiku-4.5", # Haiku for TDD
|
|
409
|
+
feature_token_budget["tdd"]["input"],
|
|
410
|
+
feature_token_budget["tdd"]["output"]
|
|
411
|
+
),
|
|
412
|
+
"docs": self.calculate_cost(
|
|
413
|
+
"haiku-4.5", # Haiku for docs
|
|
414
|
+
feature_token_budget["docs"]["input"],
|
|
415
|
+
feature_token_budget["docs"]["output"]
|
|
416
|
+
)
|
|
417
|
+
}
|
|
418
|
+
strategic_total = sum(strategic_costs.values())
|
|
419
|
+
|
|
420
|
+
savings = all_sonnet_cost - strategic_total
|
|
421
|
+
savings_percent = (savings / all_sonnet_cost) * 100
|
|
422
|
+
|
|
423
|
+
return {
|
|
424
|
+
"all_sonnet": all_sonnet_cost,
|
|
425
|
+
"strategic_mix": strategic_total,
|
|
426
|
+
"savings": savings,
|
|
427
|
+
"savings_percent": savings_percent
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
# Example calculation
|
|
431
|
+
calculator = ModelCostCalculator()
|
|
432
|
+
|
|
433
|
+
feature_budget = {
|
|
434
|
+
"spec": {"input": 20_000, "output": 10_000},
|
|
435
|
+
"tdd": {"input": 100_000, "output": 80_000},
|
|
436
|
+
"docs": {"input": 30_000, "output": 10_000}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
comparison = calculator.compare_strategies(feature_budget)
|
|
440
|
+
print(f"All Sonnet: ${comparison['all_sonnet']:.2f}")
|
|
441
|
+
print(f"Strategic Mix: ${comparison['strategic_mix']:.2f}")
|
|
442
|
+
print(f"Savings: ${comparison['savings']:.2f} ({comparison['savings_percent']:.1f}%)")
|
|
443
|
+
|
|
444
|
+
# Output:
|
|
445
|
+
# All Sonnet: $32.40
|
|
446
|
+
# Strategic Mix: $11.80
|
|
447
|
+
# Savings: $20.60 (63.6%)
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Advanced Implementation (10+ minutes)
|
|
453
|
+
|
|
454
|
+
### Context Passing Optimization
|
|
455
|
+
|
|
456
|
+
Efficient Context Structure:
|
|
457
|
+
|
|
458
|
+
```python
|
|
459
|
+
class ContextOptimizer:
|
|
460
|
+
"""Optimize context passed between agents."""
|
|
461
|
+
|
|
462
|
+
def __init__(self):
|
|
463
|
+
self.target_size = 30_000 # 30K tokens
|
|
464
|
+
self.max_size = 50_000 # 50K tokens
|
|
465
|
+
|
|
466
|
+
def optimize_context(self, full_context: dict, agent_type: str) -> dict:
|
|
467
|
+
"""Create optimized context for specific agent."""
|
|
468
|
+
|
|
469
|
+
# Extract agent-specific requirements
|
|
470
|
+
optimized = self._extract_required_fields(full_context, agent_type)
|
|
471
|
+
|
|
472
|
+
# Compress large data structures
|
|
473
|
+
optimized = self._compress_large_fields(optimized)
|
|
474
|
+
|
|
475
|
+
# Remove redundant information
|
|
476
|
+
optimized = self._remove_redundancy(optimized)
|
|
477
|
+
|
|
478
|
+
# Validate size
|
|
479
|
+
size = self._estimate_tokens(optimized)
|
|
480
|
+
if size > self.max_size:
|
|
481
|
+
optimized = self._aggressive_compression(optimized)
|
|
482
|
+
|
|
483
|
+
return optimized
|
|
484
|
+
|
|
485
|
+
def _extract_required_fields(self, context: dict, agent_type: str) -> dict:
|
|
486
|
+
"""Extract only fields required by specific agent."""
|
|
487
|
+
|
|
488
|
+
requirements = {
|
|
489
|
+
"backend-expert": ["spec_id", "api_design", "database_schema"],
|
|
490
|
+
"frontend-expert": ["spec_id", "api_endpoints", "ui_components"],
|
|
491
|
+
"security-expert": ["spec_id", "threat_model", "dependencies"],
|
|
492
|
+
"test-engineer": ["spec_id", "code_structure", "test_strategy"],
|
|
493
|
+
"docs-manager": ["spec_id", "api_spec", "architecture"]
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
required = requirements.get(agent_type, ["spec_id"])
|
|
497
|
+
|
|
498
|
+
return {
|
|
499
|
+
field: context[field]
|
|
500
|
+
for field in required
|
|
501
|
+
if field in context
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
def _compress_large_fields(self, context: dict) -> dict:
|
|
505
|
+
"""Compress large data structures."""
|
|
506
|
+
|
|
507
|
+
for key, value in context.items():
|
|
508
|
+
if isinstance(value, str) and len(value) > 5000:
|
|
509
|
+
# Compress long strings
|
|
510
|
+
context[key] = self._summarize_text(value)
|
|
511
|
+
|
|
512
|
+
elif isinstance(value, list) and len(value) > 100:
|
|
513
|
+
# Sample large lists
|
|
514
|
+
context[key] = value[:50] + ["... (truncated)"] + value[-50:]
|
|
515
|
+
|
|
516
|
+
elif isinstance(value, dict) and len(str(value)) > 5000:
|
|
517
|
+
# Compress nested dicts
|
|
518
|
+
context[key] = self._compress_dict(value)
|
|
519
|
+
|
|
520
|
+
return context
|
|
521
|
+
|
|
522
|
+
def _summarize_text(self, text: str, max_length: int = 1000) -> str:
|
|
523
|
+
"""Summarize long text to key points."""
|
|
524
|
+
# Extract first paragraph + last paragraph
|
|
525
|
+
paragraphs = text.split("\n\n")
|
|
526
|
+
if len(paragraphs) > 2:
|
|
527
|
+
summary = paragraphs[0] + "\n\n...\n\n" + paragraphs[-1]
|
|
528
|
+
if len(summary) > max_length:
|
|
529
|
+
return summary[:max_length] + "..."
|
|
530
|
+
return summary
|
|
531
|
+
return text[:max_length]
|
|
532
|
+
|
|
533
|
+
def _estimate_tokens(self, context: dict) -> int:
|
|
534
|
+
"""Estimate token count."""
|
|
535
|
+
import json
|
|
536
|
+
json_str = json.dumps(context, default=str)
|
|
537
|
+
# Rough estimate: 1 token ≈ 4 characters
|
|
538
|
+
return len(json_str) // 4
|
|
539
|
+
|
|
540
|
+
# Usage
|
|
541
|
+
optimizer = ContextOptimizer()
|
|
542
|
+
|
|
543
|
+
large_context = {
|
|
544
|
+
"spec_id": "SPEC-001",
|
|
545
|
+
"full_code": "..." * 10000, # 50KB code
|
|
546
|
+
"api_design": {...},
|
|
547
|
+
"database_schema": {...},
|
|
548
|
+
"test_results": [...] * 500, # 500 test results
|
|
549
|
+
"conversation_history": "..." * 20000 # 100KB history
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
# Optimize for backend-expert
|
|
553
|
+
backend_context = optimizer.optimize_context(large_context, "backend-expert")
|
|
554
|
+
# Result: Only spec_id, api_design, database_schema
|
|
555
|
+
# Size: ~25K tokens (vs 200K+ original)
|
|
556
|
+
|
|
557
|
+
result = await Task(
|
|
558
|
+
subagent_type="backend-expert",
|
|
559
|
+
prompt="Implement backend",
|
|
560
|
+
context=backend_context # Optimized context
|
|
561
|
+
)
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
### Token Usage Monitoring
|
|
565
|
+
|
|
566
|
+
Real-time Monitoring Dashboard:
|
|
567
|
+
|
|
568
|
+
```python
|
|
569
|
+
import time
|
|
570
|
+
from dataclasses import dataclass
|
|
571
|
+
from typing import List
|
|
572
|
+
|
|
573
|
+
@dataclass
|
|
574
|
+
class TokenUsageSnapshot:
|
|
575
|
+
"""Snapshot of token usage at point in time."""
|
|
576
|
+
timestamp: float
|
|
577
|
+
phase: str
|
|
578
|
+
operation: str
|
|
579
|
+
tokens_used: int
|
|
580
|
+
cumulative_tokens: int
|
|
581
|
+
budget_remaining: int
|
|
582
|
+
|
|
583
|
+
class TokenMonitor:
|
|
584
|
+
"""Real-time token usage monitoring."""
|
|
585
|
+
|
|
586
|
+
def __init__(self, total_budget: int = 250_000):
|
|
587
|
+
self.total_budget = total_budget
|
|
588
|
+
self.snapshots: List[TokenUsageSnapshot] = []
|
|
589
|
+
self.cumulative_usage = 0
|
|
590
|
+
|
|
591
|
+
def record_usage(self, phase: str, operation: str, tokens: int):
|
|
592
|
+
"""Record token usage event."""
|
|
593
|
+
self.cumulative_usage += tokens
|
|
594
|
+
|
|
595
|
+
snapshot = TokenUsageSnapshot(
|
|
596
|
+
timestamp=time.time(),
|
|
597
|
+
phase=phase,
|
|
598
|
+
operation=operation,
|
|
599
|
+
tokens_used=tokens,
|
|
600
|
+
cumulative_tokens=self.cumulative_usage,
|
|
601
|
+
budget_remaining=self.total_budget - self.cumulative_usage
|
|
602
|
+
)
|
|
603
|
+
|
|
604
|
+
self.snapshots.append(snapshot)
|
|
605
|
+
|
|
606
|
+
# Check thresholds
|
|
607
|
+
if self.cumulative_usage > 150_000:
|
|
608
|
+
self._warn_threshold()
|
|
609
|
+
|
|
610
|
+
if self.cumulative_usage > self.total_budget:
|
|
611
|
+
self._alert_exceeded()
|
|
612
|
+
|
|
613
|
+
def get_usage_report(self) -> dict:
|
|
614
|
+
"""Generate comprehensive usage report."""
|
|
615
|
+
|
|
616
|
+
phase_breakdown = {}
|
|
617
|
+
for snapshot in self.snapshots:
|
|
618
|
+
if snapshot.phase not in phase_breakdown:
|
|
619
|
+
phase_breakdown[snapshot.phase] = 0
|
|
620
|
+
phase_breakdown[snapshot.phase] += snapshot.tokens_used
|
|
621
|
+
|
|
622
|
+
return {
|
|
623
|
+
"total_budget": self.total_budget,
|
|
624
|
+
"total_used": self.cumulative_usage,
|
|
625
|
+
"budget_remaining": self.total_budget - self.cumulative_usage,
|
|
626
|
+
"utilization": (self.cumulative_usage / self.total_budget) * 100,
|
|
627
|
+
"phase_breakdown": phase_breakdown,
|
|
628
|
+
"efficiency_score": self._calculate_efficiency(),
|
|
629
|
+
"recommendations": self._generate_recommendations()
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
def _calculate_efficiency(self) -> float:
|
|
633
|
+
"""Calculate token usage efficiency (0-100)."""
|
|
634
|
+
# Higher is better (less waste)
|
|
635
|
+
if self.cumulative_usage == 0:
|
|
636
|
+
return 100.0
|
|
637
|
+
|
|
638
|
+
# Efficiency based on staying within budget
|
|
639
|
+
if self.cumulative_usage <= self.total_budget:
|
|
640
|
+
return 100 * (1 - (self.cumulative_usage / self.total_budget))
|
|
641
|
+
else:
|
|
642
|
+
# Penalty for exceeding budget
|
|
643
|
+
return max(0, 100 - ((self.cumulative_usage - self.total_budget) / self.total_budget * 100))
|
|
644
|
+
|
|
645
|
+
def _generate_recommendations(self) -> List[str]:
|
|
646
|
+
"""Generate optimization recommendations."""
|
|
647
|
+
recommendations = []
|
|
648
|
+
|
|
649
|
+
if self.cumulative_usage > 150_000:
|
|
650
|
+
recommendations.append("Execute /clear to reset context")
|
|
651
|
+
|
|
652
|
+
phase_usage = {}
|
|
653
|
+
for snapshot in self.snapshots:
|
|
654
|
+
phase_usage[snapshot.phase] = phase_usage.get(snapshot.phase, 0) + snapshot.tokens_used
|
|
655
|
+
|
|
656
|
+
for phase, usage in phase_usage.items():
|
|
657
|
+
if usage > 100_000:
|
|
658
|
+
recommendations.append(f"Phase '{phase}' using {usage}K tokens - consider breaking into smaller tasks")
|
|
659
|
+
|
|
660
|
+
return recommendations
|
|
661
|
+
|
|
662
|
+
# Usage
|
|
663
|
+
monitor = TokenMonitor(total_budget=250_000)
|
|
664
|
+
|
|
665
|
+
# Record usage throughout workflow
|
|
666
|
+
monitor.record_usage("spec", "generate_spec", 25_000)
|
|
667
|
+
monitor.record_usage("spec", "validate_spec", 5_000)
|
|
668
|
+
# Execute /clear here
|
|
669
|
+
monitor.record_usage("tdd", "red_phase", 40_000)
|
|
670
|
+
monitor.record_usage("tdd", "green_phase", 80_000)
|
|
671
|
+
monitor.record_usage("tdd", "refactor_phase", 60_000)
|
|
672
|
+
monitor.record_usage("docs", "generate_docs", 30_000)
|
|
673
|
+
|
|
674
|
+
# Generate report
|
|
675
|
+
report = monitor.get_usage_report()
|
|
676
|
+
print(f"Total used: {report['total_used']:,} / {report['total_budget']:,}")
|
|
677
|
+
print(f"Utilization: {report['utilization']:.1f}%")
|
|
678
|
+
print(f"Efficiency: {report['efficiency_score']:.1f}")
|
|
679
|
+
print("\nRecommendations:")
|
|
680
|
+
for rec in report['recommendations']:
|
|
681
|
+
print(f"- {rec}")
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
## Works Well With
|
|
687
|
+
|
|
688
|
+
Skills:
|
|
689
|
+
- moai-foundation-delegation-patterns - Context passing
|
|
690
|
+
- moai-foundation-progressive-disclosure - Content structuring
|
|
691
|
+
- moai-cc-memory - Context persistence
|
|
692
|
+
|
|
693
|
+
Commands:
|
|
694
|
+
- /clear - Context reset (mandatory after /moai:1-plan)
|
|
695
|
+
- /context - Check current token usage
|
|
696
|
+
- /moai:1-plan - SPEC generation (30K budget)
|
|
697
|
+
- /moai:2-run - TDD implementation (180K budget)
|
|
698
|
+
- /moai:3-sync - Documentation (40K budget)
|
|
699
|
+
|
|
700
|
+
Memory:
|
|
701
|
+
- Skill("moai-foundation-core") modules/token-optimization.md - Optimization strategies
|
|
702
|
+
- @.moai/config/config.json - Budget configuration
|
|
703
|
+
|
|
704
|
+
---
|
|
705
|
+
|
|
706
|
+
Version: 1.0.0
|
|
707
|
+
Last Updated: 2025-11-25
|
|
708
|
+
Status: Production Ready
|