moai-adk 0.34.0__py3-none-any.whl → 1.1.0__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.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Purpose: Specification-driven test-driven development workflow ensuring clear requirements before implementation through EARS format and RED-GREEN-REFACTOR cycles.
|
|
4
4
|
|
|
5
|
-
Version:
|
|
6
|
-
Last Updated:
|
|
5
|
+
Version: 2.0.0 (Modular Split)
|
|
6
|
+
Last Updated: 2026-01-06
|
|
7
7
|
|
|
8
8
|
---
|
|
9
9
|
|
|
@@ -18,7 +18,7 @@ SPEC-First TDD is MoAI-ADK's development methodology combining:
|
|
|
18
18
|
Three-Phase Workflow:
|
|
19
19
|
```
|
|
20
20
|
Phase 1: SPEC → spec-builder → .moai/specs/SPEC-XXX/spec.md
|
|
21
|
-
Phase 2: TDD
|
|
21
|
+
Phase 2: TDD → tdd-implementer → Code + Tests (≥85% coverage)
|
|
22
22
|
Phase 3: Docs → docs-manager → API docs + diagrams
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -33,6 +33,10 @@ EARS Patterns:
|
|
|
33
33
|
- Unwanted: System SHALL NOT...
|
|
34
34
|
- Optional: WHERE possible, system SHOULD...
|
|
35
35
|
|
|
36
|
+
Extended Documentation:
|
|
37
|
+
- [EARS Format Reference](spec-ears-format.md) - Detailed EARS patterns and examples
|
|
38
|
+
- [TDD Implementation](spec-tdd-implementation.md) - RED-GREEN-REFACTOR workflows
|
|
39
|
+
|
|
36
40
|
---
|
|
37
41
|
|
|
38
42
|
## Implementation Guide (5 minutes)
|
|
@@ -48,12 +52,12 @@ Workflow:
|
|
|
48
52
|
|
|
49
53
|
# 2. spec-builder creates:
|
|
50
54
|
.moai/specs/SPEC-001/
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
spec.md # EARS format requirements
|
|
56
|
+
acceptance.md # Acceptance criteria
|
|
57
|
+
complexity.yaml # Complexity analysis
|
|
54
58
|
|
|
55
59
|
# 3. Execute /clear (mandatory)
|
|
56
|
-
/clear
|
|
60
|
+
/clear # Saves 45-50K tokens, prepares clean context
|
|
57
61
|
```
|
|
58
62
|
|
|
59
63
|
EARS Format Structure:
|
|
@@ -80,342 +84,44 @@ Acceptance Criteria:
|
|
|
80
84
|
- Success returns user ID and confirmation email sent
|
|
81
85
|
|
|
82
86
|
Test Coverage Target: ≥90%
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
### SPEC-001-REQ-02: JWT Token Generation (Event-driven)
|
|
87
|
-
Pattern: Event-driven
|
|
88
|
-
Statement: WHEN a user successfully authenticates, the system SHALL generate a JWT token with 1-hour expiry.
|
|
89
|
-
|
|
90
|
-
Acceptance Criteria:
|
|
91
|
-
- Token includes user ID, email, role claims
|
|
92
|
-
- Token signed with RS256 algorithm
|
|
93
|
-
- Expiry set to 1 hour from generation
|
|
94
|
-
- Refresh token generated with 7-day expiry
|
|
95
|
-
|
|
96
|
-
Test Coverage Target: ≥95%
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
### SPEC-001-REQ-03: Token Validation (State-driven)
|
|
101
|
-
Pattern: State-driven
|
|
102
|
-
Statement: WHILE a request includes Authorization header, the system SHALL validate JWT token before processing.
|
|
103
|
-
|
|
104
|
-
Acceptance Criteria:
|
|
105
|
-
- Expired tokens rejected with 401 Unauthorized
|
|
106
|
-
- Invalid signature rejected with 401 Unauthorized
|
|
107
|
-
- Valid token extracts user claims successfully
|
|
108
|
-
- Token blacklist checked (revoked tokens)
|
|
109
|
-
|
|
110
|
-
Test Coverage Target: ≥95%
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
### SPEC-001-REQ-04: Weak Password Prevention (Unwanted)
|
|
115
|
-
Pattern: Unwanted
|
|
116
|
-
Statement: The system SHALL NOT allow passwords from common password lists (top 10K).
|
|
117
|
-
|
|
118
|
-
Acceptance Criteria:
|
|
119
|
-
- Common passwords rejected (e.g., "password123")
|
|
120
|
-
- Sequential patterns rejected (e.g., "abc123")
|
|
121
|
-
- User-specific patterns rejected (e.g., email prefix)
|
|
122
|
-
- Clear error message with improvement suggestions
|
|
123
|
-
|
|
124
|
-
Test Coverage Target: ≥85%
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
### SPEC-001-REQ-05: OAuth2 Integration (Optional)
|
|
129
|
-
Pattern: Optional
|
|
130
|
-
Statement: WHERE user chooses, the system SHOULD support OAuth2 authentication via Google and GitHub.
|
|
131
|
-
|
|
132
|
-
Acceptance Criteria:
|
|
133
|
-
- OAuth2 providers configurable
|
|
134
|
-
- User can link multiple providers to one account
|
|
135
|
-
- Provider-specific profile data merged
|
|
136
|
-
- Graceful fallback if provider unavailable
|
|
137
|
-
|
|
138
|
-
Test Coverage Target: ≥80%
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Complexity Analysis:
|
|
142
|
-
|
|
143
|
-
```yaml
|
|
144
|
-
# .moai/specs/SPEC-001/complexity.yaml
|
|
145
|
-
complexity_metrics:
|
|
146
|
-
total_requirements: 5
|
|
147
|
-
critical_requirements: 3
|
|
148
|
-
|
|
149
|
-
complexity_breakdown:
|
|
150
|
-
SPEC-001-REQ-01: Medium # Standard CRUD + validation
|
|
151
|
-
SPEC-001-REQ-02: Medium # JWT library integration
|
|
152
|
-
SPEC-001-REQ-03: High # Security validation logic
|
|
153
|
-
SPEC-001-REQ-04: Low # Lookup validation
|
|
154
|
-
SPEC-001-REQ-05: High # External API integration
|
|
155
|
-
|
|
156
|
-
estimated_effort:
|
|
157
|
-
development: 8 hours
|
|
158
|
-
testing: 4 hours
|
|
159
|
-
total: 12 hours
|
|
160
|
-
|
|
161
|
-
risk_factors:
|
|
162
|
-
- Security-critical functionality
|
|
163
|
-
- External OAuth2 provider dependencies
|
|
164
|
-
- Token expiry edge cases
|
|
165
|
-
|
|
166
|
-
dependencies:
|
|
167
|
-
- PyJWT library
|
|
168
|
-
- bcrypt library
|
|
169
|
-
- OAuth2 client libraries
|
|
170
87
|
```
|
|
171
88
|
|
|
172
89
|
---
|
|
173
90
|
|
|
174
91
|
### Phase 2: Test-Driven Development
|
|
175
92
|
|
|
176
|
-
Purpose: Implement requirements through RED-GREEN-REFACTOR cycles with ≥85% coverage.
|
|
177
|
-
|
|
178
93
|
RED-GREEN-REFACTOR Cycle:
|
|
179
94
|
|
|
180
95
|
```python
|
|
181
|
-
#
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
import pytest
|
|
186
|
-
from src.auth.registration import register_user
|
|
187
|
-
from src.models.user import User
|
|
188
|
-
from src.exceptions import ValidationError
|
|
189
|
-
|
|
190
|
-
def test_register_user_with_valid_data():
|
|
191
|
-
"""SPEC-001-REQ-01: User registration with valid data."""
|
|
192
|
-
# Arrange
|
|
193
|
-
email = "user@example.com"
|
|
194
|
-
password = "SecureP@ssw0rd"
|
|
195
|
-
|
|
196
|
-
# Act
|
|
197
|
-
result = register_user(email=email, password=password)
|
|
198
|
-
|
|
199
|
-
# Assert
|
|
200
|
-
assert result.success is True
|
|
201
|
-
assert result.user.email == email
|
|
202
|
-
assert result.user.id is not None
|
|
203
|
-
assert result.confirmation_sent is True
|
|
204
|
-
|
|
205
|
-
# Run test → FAILS (functions don't exist yet)
|
|
206
|
-
|
|
207
|
-
# ====================================
|
|
208
|
-
# GREEN PHASE: Minimal implementation
|
|
209
|
-
# ====================================
|
|
210
|
-
|
|
211
|
-
# src/auth/registration.py
|
|
212
|
-
from dataclasses import dataclass
|
|
213
|
-
from src.models.user import User
|
|
214
|
-
import bcrypt
|
|
215
|
-
import re
|
|
216
|
-
|
|
217
|
-
@dataclass
|
|
218
|
-
class RegistrationResult:
|
|
219
|
-
success: bool
|
|
220
|
-
user: User
|
|
221
|
-
confirmation_sent: bool
|
|
96
|
+
# RED: Write failing test first
|
|
97
|
+
def test_register_user():
|
|
98
|
+
result = register_user("user@example.com", "SecureP@ssw0rd")
|
|
99
|
+
assert result.success is True # Fails - function doesn't exist
|
|
222
100
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
user = User(id=1, email=email, password_hash=password)
|
|
227
|
-
return RegistrationResult(
|
|
228
|
-
success=True,
|
|
229
|
-
user=user,
|
|
230
|
-
confirmation_sent=True
|
|
231
|
-
)
|
|
232
|
-
|
|
233
|
-
# Run test → PASSES (test now passes)
|
|
234
|
-
|
|
235
|
-
# ====================================
|
|
236
|
-
# REFACTOR PHASE: Improve quality
|
|
237
|
-
# ====================================
|
|
238
|
-
|
|
239
|
-
# src/auth/registration.py (refactored)
|
|
240
|
-
from dataclasses import dataclass
|
|
241
|
-
from typing import Optional
|
|
242
|
-
from src.models.user import User
|
|
243
|
-
from src.database import db_session
|
|
244
|
-
from src.email import send_confirmation_email
|
|
245
|
-
from src.exceptions import ValidationError
|
|
246
|
-
import bcrypt
|
|
247
|
-
import re
|
|
248
|
-
|
|
249
|
-
EMAIL_REGEX = re.compile(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')
|
|
250
|
-
PASSWORD_MIN_LENGTH = 8
|
|
251
|
-
|
|
252
|
-
@dataclass
|
|
253
|
-
class RegistrationResult:
|
|
254
|
-
"""Result of user registration attempt."""
|
|
255
|
-
success: bool
|
|
256
|
-
user: Optional[User]
|
|
257
|
-
confirmation_sent: bool
|
|
258
|
-
error: Optional[str] = None
|
|
101
|
+
# GREEN: Minimal implementation
|
|
102
|
+
def register_user(email, password):
|
|
103
|
+
return RegistrationResult(success=True, user=User())
|
|
259
104
|
|
|
105
|
+
# REFACTOR: Improve quality
|
|
260
106
|
def register_user(email: str, password: str) -> RegistrationResult:
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
Implements SPEC-001-REQ-01: User Registration (Ubiquitous)
|
|
264
|
-
|
|
265
|
-
Args:
|
|
266
|
-
email: User email address (must be valid format)
|
|
267
|
-
password: User password (≥8 chars, mixed case, numbers, symbols)
|
|
268
|
-
|
|
269
|
-
Returns:
|
|
270
|
-
RegistrationResult with user data or error
|
|
271
|
-
|
|
272
|
-
Raises:
|
|
273
|
-
ValidationError: If email or password invalid
|
|
274
|
-
|
|
275
|
-
Example:
|
|
276
|
-
>>> result = register_user("user@example.com", "SecureP@ssw0rd")
|
|
277
|
-
>>> result.success
|
|
278
|
-
True
|
|
279
|
-
>>> result.user.email
|
|
280
|
-
'user@example.com'
|
|
281
|
-
"""
|
|
282
|
-
# Validate email format (RFC 5322 compliant)
|
|
283
|
-
if not EMAIL_REGEX.match(email):
|
|
284
|
-
raise ValidationError("Invalid email format")
|
|
285
|
-
|
|
286
|
-
# Check for duplicate email
|
|
287
|
-
existing_user = User.query.filter_by(email=email).first()
|
|
288
|
-
if existing_user:
|
|
289
|
-
raise ValidationError("Email already registered")
|
|
290
|
-
|
|
291
|
-
# Validate password strength
|
|
292
|
-
if not _is_password_strong(password):
|
|
293
|
-
raise ValidationError(
|
|
294
|
-
"Password must be ≥8 characters with mixed case, numbers, and symbols"
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
# Hash password securely
|
|
298
|
-
password_hash = bcrypt.hashpw(
|
|
299
|
-
password.encode('utf-8'),
|
|
300
|
-
bcrypt.gensalt(rounds=12)
|
|
301
|
-
).decode('utf-8')
|
|
302
|
-
|
|
303
|
-
# Create user
|
|
304
|
-
user = User(email=email, password_hash=password_hash)
|
|
305
|
-
db_session.add(user)
|
|
306
|
-
db_session.commit()
|
|
307
|
-
|
|
308
|
-
# Send confirmation email
|
|
309
|
-
confirmation_sent = send_confirmation_email(user.email, user.id)
|
|
310
|
-
|
|
311
|
-
return RegistrationResult(
|
|
312
|
-
success=True,
|
|
313
|
-
user=user,
|
|
314
|
-
confirmation_sent=confirmation_sent
|
|
315
|
-
)
|
|
316
|
-
|
|
317
|
-
def _is_password_strong(password: str) -> bool:
|
|
318
|
-
"""Validate password strength.
|
|
319
|
-
|
|
320
|
-
Requirements:
|
|
321
|
-
- At least 8 characters
|
|
322
|
-
- Contains uppercase letter
|
|
323
|
-
- Contains lowercase letter
|
|
324
|
-
- Contains digit
|
|
325
|
-
- Contains special symbol
|
|
326
|
-
"""
|
|
327
|
-
if len(password) < PASSWORD_MIN_LENGTH:
|
|
328
|
-
return False
|
|
329
|
-
|
|
330
|
-
has_upper = any(c.isupper() for c in password)
|
|
331
|
-
has_lower = any(c.islower() for c in password)
|
|
332
|
-
has_digit = any(c.isdigit() for c in password)
|
|
333
|
-
has_symbol = any(not c.isalnum() for c in password)
|
|
334
|
-
|
|
335
|
-
return all([has_upper, has_lower, has_digit, has_symbol])
|
|
336
|
-
|
|
337
|
-
# Run test → PASSES (with improved implementation)
|
|
338
|
-
# Coverage: 95% (meets ≥90% target)
|
|
339
|
-
```
|
|
340
|
-
|
|
341
|
-
Comprehensive Test Suite:
|
|
107
|
+
"""Register new user with email and password.
|
|
342
108
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
from src.exceptions import ValidationError
|
|
348
|
-
|
|
349
|
-
class TestUserRegistration:
|
|
350
|
-
"""Test suite for SPEC-001-REQ-01: User Registration."""
|
|
351
|
-
|
|
352
|
-
def test_register_user_success(self):
|
|
353
|
-
"""Test successful registration with valid data."""
|
|
354
|
-
result = register_user("user@example.com", "SecureP@ssw0rd")
|
|
355
|
-
assert result.success is True
|
|
356
|
-
assert result.user.email == "user@example.com"
|
|
357
|
-
assert result.confirmation_sent is True
|
|
358
|
-
|
|
359
|
-
def test_register_user_invalid_email(self):
|
|
360
|
-
"""Test registration fails with invalid email format."""
|
|
361
|
-
with pytest.raises(ValidationError, match="Invalid email format"):
|
|
362
|
-
register_user("invalid-email", "SecureP@ssw0rd")
|
|
363
|
-
|
|
364
|
-
def test_register_user_duplicate_email(self):
|
|
365
|
-
"""Test registration fails with duplicate email."""
|
|
366
|
-
register_user("user@example.com", "SecureP@ssw0rd")
|
|
367
|
-
|
|
368
|
-
with pytest.raises(ValidationError, match="Email already registered"):
|
|
369
|
-
register_user("user@example.com", "AnotherP@ssw0rd")
|
|
370
|
-
|
|
371
|
-
def test_register_user_weak_password(self):
|
|
372
|
-
"""Test registration fails with weak password."""
|
|
373
|
-
weak_passwords = [
|
|
374
|
-
"short", # Too short
|
|
375
|
-
"alllowercase1", # No uppercase
|
|
376
|
-
"ALLUPPERCASE1", # No lowercase
|
|
377
|
-
"NoNumbersHere!", # No digits
|
|
378
|
-
"NoSymbols123" # No symbols
|
|
379
|
-
]
|
|
380
|
-
|
|
381
|
-
for weak_pwd in weak_passwords:
|
|
382
|
-
with pytest.raises(ValidationError, match="Password must be"):
|
|
383
|
-
register_user("user@example.com", weak_pwd)
|
|
384
|
-
|
|
385
|
-
def test_register_user_password_hashing(self):
|
|
386
|
-
"""Test password is properly hashed (not stored plain text)."""
|
|
387
|
-
result = register_user("user@example.com", "SecureP@ssw0rd")
|
|
388
|
-
|
|
389
|
-
# Password hash should not equal plain text
|
|
390
|
-
assert result.user.password_hash != "SecureP@ssw0rd"
|
|
391
|
-
|
|
392
|
-
# Hash should be bcrypt format (starts with $2b$)
|
|
393
|
-
assert result.user.password_hash.startswith("$2b$")
|
|
109
|
+
Implements SPEC-001-REQ-01
|
|
110
|
+
"""
|
|
111
|
+
# Validation, hashing, database operations
|
|
112
|
+
return RegistrationResult(success=True, user=user)
|
|
394
113
|
```
|
|
395
114
|
|
|
396
|
-
Coverage
|
|
397
|
-
|
|
115
|
+
Coverage Validation:
|
|
398
116
|
```bash
|
|
399
117
|
# Run tests with coverage
|
|
400
118
|
pytest tests/auth/test_registration.py --cov=src/auth/registration --cov-report=html
|
|
401
|
-
|
|
402
|
-
# Output:
|
|
403
|
-
---------- coverage: platform darwin, python 3.13.0 -----------
|
|
404
|
-
Name Stmts Miss Cover Missing
|
|
405
|
-
-------------------------------------------------------
|
|
406
|
-
src/auth/registration.py 42 2 95% 87, 92
|
|
407
|
-
-------------------------------------------------------
|
|
408
|
-
TOTAL 42 2 95%
|
|
409
|
-
|
|
410
|
-
# Coverage meets ≥90% target
|
|
411
119
|
```
|
|
412
120
|
|
|
413
121
|
---
|
|
414
122
|
|
|
415
123
|
### Phase 3: Documentation Synchronization
|
|
416
124
|
|
|
417
|
-
Purpose: Auto-generate comprehensive documentation from implementation.
|
|
418
|
-
|
|
419
125
|
Workflow:
|
|
420
126
|
```bash
|
|
421
127
|
# 1. Generate documentation
|
|
@@ -423,414 +129,21 @@ Workflow:
|
|
|
423
129
|
|
|
424
130
|
# 2. docs-manager creates:
|
|
425
131
|
.moai/specs/SPEC-001/
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
Auto-Generated API Documentation:
|
|
434
|
-
|
|
435
|
-
```markdown
|
|
436
|
-
# API Documentation - User Authentication
|
|
437
|
-
|
|
438
|
-
## Endpoints
|
|
439
|
-
|
|
440
|
-
### POST /api/auth/register
|
|
441
|
-
Register new user account.
|
|
442
|
-
|
|
443
|
-
Request:
|
|
444
|
-
```json
|
|
445
|
-
{
|
|
446
|
-
"email": "user@example.com",
|
|
447
|
-
"password": "SecureP@ssw0rd"
|
|
448
|
-
}
|
|
449
|
-
```
|
|
450
|
-
|
|
451
|
-
Response (201 Created):
|
|
452
|
-
```json
|
|
453
|
-
{
|
|
454
|
-
"success": true,
|
|
455
|
-
"user": {
|
|
456
|
-
"id": 123,
|
|
457
|
-
"email": "user@example.com",
|
|
458
|
-
"created_at": "2025-11-25T10:30:00Z"
|
|
459
|
-
},
|
|
460
|
-
"message": "Confirmation email sent"
|
|
461
|
-
}
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
Errors:
|
|
465
|
-
- `400 Bad Request`: Invalid email or weak password
|
|
466
|
-
- `409 Conflict`: Email already registered
|
|
467
|
-
|
|
468
|
-
Coverage: 95% (meets ≥90% target)
|
|
469
|
-
|
|
470
|
-
Implementation: `SPEC-001-REQ-01`
|
|
132
|
+
docs/
|
|
133
|
+
api.md # API reference
|
|
134
|
+
architecture.md # Architecture diagram
|
|
135
|
+
testing.md # Test report
|
|
136
|
+
report.md # Implementation summary
|
|
471
137
|
```
|
|
472
138
|
|
|
473
139
|
---
|
|
474
140
|
|
|
475
|
-
## Advanced
|
|
141
|
+
## Advanced Patterns
|
|
476
142
|
|
|
477
|
-
|
|
143
|
+
For comprehensive implementation patterns including MFA examples, iterative SPEC refinement, and CI/CD integration, see:
|
|
478
144
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
```markdown
|
|
482
|
-
### SPEC-002-REQ-03: Multi-Factor Authentication (Event-driven + State-driven)
|
|
483
|
-
Pattern: Event-driven + State-driven
|
|
484
|
-
Statement:
|
|
485
|
-
- WHEN a user attempts login with MFA enabled (Event)
|
|
486
|
-
- WHILE the MFA verification is pending (State)
|
|
487
|
-
- The system SHALL send TOTP code and require verification within 5 minutes
|
|
488
|
-
|
|
489
|
-
Acceptance Criteria:
|
|
490
|
-
1. Event trigger: Login attempt detected
|
|
491
|
-
2. State check: User has MFA enabled
|
|
492
|
-
3. Action: Generate TOTP code (6 digits, 30s validity)
|
|
493
|
-
4. Notification: Send code via SMS or email
|
|
494
|
-
5. Verification: User submits code within 5 minutes
|
|
495
|
-
6. Expiry: Code expires after 5 minutes
|
|
496
|
-
7. Rate limiting: Max 3 failed attempts, then 15-minute lockout
|
|
497
|
-
|
|
498
|
-
Test Scenarios:
|
|
499
|
-
- Happy path: User submits valid code within time
|
|
500
|
-
- Expired code: User submits code after 5 minutes
|
|
501
|
-
- Invalid code: User submits incorrect code
|
|
502
|
-
- Rate limit: User exceeds 3 failed attempts
|
|
503
|
-
- Disabled MFA: User without MFA enabled
|
|
504
|
-
```
|
|
505
|
-
|
|
506
|
-
Implementation:
|
|
507
|
-
|
|
508
|
-
```python
|
|
509
|
-
# RED PHASE: Complex test scenario
|
|
510
|
-
def test_mfa_verification_with_valid_code():
|
|
511
|
-
"""SPEC-002-REQ-03: MFA verification happy path."""
|
|
512
|
-
# Arrange
|
|
513
|
-
user = create_user_with_mfa_enabled()
|
|
514
|
-
login_attempt = initiate_login(user.email, user.password)
|
|
515
|
-
|
|
516
|
-
# System generates TOTP code
|
|
517
|
-
totp_code = get_pending_totp_code(user.id)
|
|
518
|
-
|
|
519
|
-
# Act
|
|
520
|
-
result = verify_mfa(
|
|
521
|
-
user.id,
|
|
522
|
-
code=totp_code,
|
|
523
|
-
timestamp=datetime.now()
|
|
524
|
-
)
|
|
525
|
-
|
|
526
|
-
# Assert
|
|
527
|
-
assert result.success is True
|
|
528
|
-
assert result.token is not None # JWT issued
|
|
529
|
-
assert result.mfa_verified is True
|
|
530
|
-
|
|
531
|
-
def test_mfa_verification_with_expired_code():
|
|
532
|
-
"""SPEC-002-REQ-03: MFA code expiry."""
|
|
533
|
-
user = create_user_with_mfa_enabled()
|
|
534
|
-
login_attempt = initiate_login(user.email, user.password)
|
|
535
|
-
totp_code = get_pending_totp_code(user.id)
|
|
536
|
-
|
|
537
|
-
# Act - submit code after 6 minutes (expired)
|
|
538
|
-
result = verify_mfa(
|
|
539
|
-
user.id,
|
|
540
|
-
code=totp_code,
|
|
541
|
-
timestamp=datetime.now() + timedelta(minutes=6)
|
|
542
|
-
)
|
|
543
|
-
|
|
544
|
-
# Assert
|
|
545
|
-
assert result.success is False
|
|
546
|
-
assert result.error == "Code expired"
|
|
547
|
-
|
|
548
|
-
def test_mfa_rate_limiting():
|
|
549
|
-
"""SPEC-002-REQ-03: Rate limiting after failed attempts."""
|
|
550
|
-
user = create_user_with_mfa_enabled()
|
|
551
|
-
login_attempt = initiate_login(user.email, user.password)
|
|
552
|
-
|
|
553
|
-
# 3 failed attempts
|
|
554
|
-
for _ in range(3):
|
|
555
|
-
verify_mfa(user.id, code="000000") # Invalid code
|
|
556
|
-
|
|
557
|
-
# Act - 4th attempt should be blocked
|
|
558
|
-
result = verify_mfa(user.id, code="123456")
|
|
559
|
-
|
|
560
|
-
# Assert
|
|
561
|
-
assert result.success is False
|
|
562
|
-
assert result.error == "Too many failed attempts. Try again in 15 minutes."
|
|
563
|
-
|
|
564
|
-
# GREEN + REFACTOR PHASE
|
|
565
|
-
from datetime import datetime, timedelta
|
|
566
|
-
from typing import Optional
|
|
567
|
-
import pyotp
|
|
568
|
-
|
|
569
|
-
@dataclass
|
|
570
|
-
class MFAVerificationResult:
|
|
571
|
-
success: bool
|
|
572
|
-
token: Optional[str]
|
|
573
|
-
mfa_verified: bool
|
|
574
|
-
error: Optional[str] = None
|
|
575
|
-
|
|
576
|
-
class MFAManager:
|
|
577
|
-
"""Manage multi-factor authentication."""
|
|
578
|
-
|
|
579
|
-
TOTP_VALIDITY_SECONDS = 300 # 5 minutes
|
|
580
|
-
MAX_FAILED_ATTEMPTS = 3
|
|
581
|
-
LOCKOUT_MINUTES = 15
|
|
582
|
-
|
|
583
|
-
def verify_mfa(
|
|
584
|
-
self,
|
|
585
|
-
user_id: int,
|
|
586
|
-
code: str,
|
|
587
|
-
timestamp: datetime = None
|
|
588
|
-
) -> MFAVerificationResult:
|
|
589
|
-
"""Verify MFA code.
|
|
590
|
-
|
|
591
|
-
Implements SPEC-002-REQ-03: Multi-Factor Authentication
|
|
592
|
-
|
|
593
|
-
Args:
|
|
594
|
-
user_id: User ID attempting verification
|
|
595
|
-
code: 6-digit TOTP code
|
|
596
|
-
timestamp: Verification timestamp (default: now)
|
|
597
|
-
|
|
598
|
-
Returns:
|
|
599
|
-
MFAVerificationResult with verification status
|
|
600
|
-
"""
|
|
601
|
-
timestamp = timestamp or datetime.now()
|
|
602
|
-
|
|
603
|
-
# Get user and pending verification
|
|
604
|
-
user = User.query.get(user_id)
|
|
605
|
-
pending_mfa = PendingMFA.query.filter_by(
|
|
606
|
-
user_id=user_id,
|
|
607
|
-
verified=False
|
|
608
|
-
).first()
|
|
609
|
-
|
|
610
|
-
if not pending_mfa:
|
|
611
|
-
return MFAVerificationResult(
|
|
612
|
-
success=False,
|
|
613
|
-
token=None,
|
|
614
|
-
mfa_verified=False,
|
|
615
|
-
error="No pending MFA verification"
|
|
616
|
-
)
|
|
617
|
-
|
|
618
|
-
# Check rate limiting
|
|
619
|
-
if self._is_rate_limited(user_id):
|
|
620
|
-
return MFAVerificationResult(
|
|
621
|
-
success=False,
|
|
622
|
-
token=None,
|
|
623
|
-
mfa_verified=False,
|
|
624
|
-
error=f"Too many failed attempts. Try again in {self.LOCKOUT_MINUTES} minutes."
|
|
625
|
-
)
|
|
626
|
-
|
|
627
|
-
# Check expiry (5 minutes from generation)
|
|
628
|
-
if timestamp - pending_mfa.created_at > timedelta(seconds=self.TOTP_VALIDITY_SECONDS):
|
|
629
|
-
return MFAVerificationResult(
|
|
630
|
-
success=False,
|
|
631
|
-
token=None,
|
|
632
|
-
mfa_verified=False,
|
|
633
|
-
error="Code expired"
|
|
634
|
-
)
|
|
635
|
-
|
|
636
|
-
# Verify TOTP code
|
|
637
|
-
totp = pyotp.TOTP(user.mfa_secret)
|
|
638
|
-
if not totp.verify(code, valid_window=1):
|
|
639
|
-
self._record_failed_attempt(user_id)
|
|
640
|
-
return MFAVerificationResult(
|
|
641
|
-
success=False,
|
|
642
|
-
token=None,
|
|
643
|
-
mfa_verified=False,
|
|
644
|
-
error="Invalid code"
|
|
645
|
-
)
|
|
646
|
-
|
|
647
|
-
# Success - mark verified and generate JWT
|
|
648
|
-
pending_mfa.verified = True
|
|
649
|
-
pending_mfa.verified_at = timestamp
|
|
650
|
-
db_session.commit()
|
|
651
|
-
|
|
652
|
-
jwt_token = self._generate_jwt_token(user)
|
|
653
|
-
|
|
654
|
-
return MFAVerificationResult(
|
|
655
|
-
success=True,
|
|
656
|
-
token=jwt_token,
|
|
657
|
-
mfa_verified=True
|
|
658
|
-
)
|
|
659
|
-
|
|
660
|
-
def _is_rate_limited(self, user_id: int) -> bool:
|
|
661
|
-
"""Check if user is rate limited."""
|
|
662
|
-
recent_failures = FailedMFAAttempt.query.filter(
|
|
663
|
-
FailedMFAAttempt.user_id == user_id,
|
|
664
|
-
FailedMFAAttempt.timestamp > datetime.now() - timedelta(minutes=self.LOCKOUT_MINUTES)
|
|
665
|
-
).count()
|
|
666
|
-
|
|
667
|
-
return recent_failures >= self.MAX_FAILED_ATTEMPTS
|
|
668
|
-
|
|
669
|
-
def _record_failed_attempt(self, user_id: int):
|
|
670
|
-
"""Record failed MFA attempt for rate limiting."""
|
|
671
|
-
attempt = FailedMFAAttempt(
|
|
672
|
-
user_id=user_id,
|
|
673
|
-
timestamp=datetime.now()
|
|
674
|
-
)
|
|
675
|
-
db_session.add(attempt)
|
|
676
|
-
db_session.commit()
|
|
677
|
-
```
|
|
678
|
-
|
|
679
|
-
### SPEC-TDD Integration Patterns
|
|
680
|
-
|
|
681
|
-
Pattern 1: Iterative SPEC Refinement:
|
|
682
|
-
|
|
683
|
-
```python
|
|
684
|
-
# Initial SPEC (v1.0.0)
|
|
685
|
-
SPEC-003-REQ-01: File upload with size limit (10MB)
|
|
686
|
-
|
|
687
|
-
# Implementation reveals edge case
|
|
688
|
-
# → User uploads 9.9MB file successfully
|
|
689
|
-
# → But total storage exceeds user quota
|
|
690
|
-
|
|
691
|
-
# Refined SPEC (v1.1.0)
|
|
692
|
-
SPEC-003-REQ-01: File upload with size and quota validation
|
|
693
|
-
- Single file limit: 10MB
|
|
694
|
-
- User quota limit: 100MB total
|
|
695
|
-
- Validation: Check both limits before accepting upload
|
|
696
|
-
|
|
697
|
-
# Updated tests
|
|
698
|
-
def test_file_upload_exceeds_quota():
|
|
699
|
-
"""SPEC-003-REQ-01 v1.1.0: Quota validation."""
|
|
700
|
-
user = create_user(quota_limit_mb=100)
|
|
701
|
-
upload_files(user, total_size_mb=95) # Existing files
|
|
702
|
-
|
|
703
|
-
# Attempt upload within file limit but exceeds quota
|
|
704
|
-
result = upload_file(user, file_size_mb=8)
|
|
705
|
-
|
|
706
|
-
assert result.success is False
|
|
707
|
-
assert result.error == "Upload would exceed storage quota"
|
|
708
|
-
```
|
|
709
|
-
|
|
710
|
-
Pattern 2: SPEC-Driven Test Generation:
|
|
711
|
-
|
|
712
|
-
```python
|
|
713
|
-
# Automated test generation from SPEC
|
|
714
|
-
|
|
715
|
-
class SPECTestGenerator:
|
|
716
|
-
"""Generate tests automatically from SPEC requirements."""
|
|
717
|
-
|
|
718
|
-
def generate_tests_for_requirement(self, requirement: dict) -> str:
|
|
719
|
-
"""Generate test code from SPEC requirement."""
|
|
720
|
-
|
|
721
|
-
spec_id = requirement['id']
|
|
722
|
-
pattern = requirement['pattern']
|
|
723
|
-
acceptance_criteria = requirement['acceptance_criteria']
|
|
724
|
-
|
|
725
|
-
if pattern == 'Event-driven':
|
|
726
|
-
return self._generate_event_driven_tests(spec_id, acceptance_criteria)
|
|
727
|
-
elif pattern == 'State-driven':
|
|
728
|
-
return self._generate_state_driven_tests(spec_id, acceptance_criteria)
|
|
729
|
-
elif pattern == 'Unwanted':
|
|
730
|
-
return self._generate_unwanted_tests(spec_id, acceptance_criteria)
|
|
731
|
-
else:
|
|
732
|
-
return self._generate_standard_tests(spec_id, acceptance_criteria)
|
|
733
|
-
|
|
734
|
-
def _generate_event_driven_tests(self, spec_id: str, criteria: list) -> str:
|
|
735
|
-
"""Generate tests for event-driven requirements."""
|
|
736
|
-
|
|
737
|
-
test_template = f'''
|
|
738
|
-
def test_{spec_id.lower().replace('-', '_')}_event_triggered():
|
|
739
|
-
"""{spec_id}: Event-driven requirement test."""
|
|
740
|
-
# Arrange
|
|
741
|
-
{{setup_code}}
|
|
742
|
-
|
|
743
|
-
# Act - Trigger event
|
|
744
|
-
{{trigger_event}}
|
|
745
|
-
|
|
746
|
-
# Assert - Verify system response
|
|
747
|
-
{{assertions}}
|
|
748
|
-
|
|
749
|
-
def test_{spec_id.lower().replace('-', '_')}_no_event():
|
|
750
|
-
"""{spec_id}: No action when event not triggered."""
|
|
751
|
-
# Arrange
|
|
752
|
-
{{setup_code}}
|
|
753
|
-
|
|
754
|
-
# Act - No event triggered
|
|
755
|
-
{{no_event_code}}
|
|
756
|
-
|
|
757
|
-
# Assert - System remains unchanged
|
|
758
|
-
{{no_change_assertions}}
|
|
759
|
-
'''
|
|
760
|
-
return test_template
|
|
761
|
-
|
|
762
|
-
# Usage
|
|
763
|
-
generator = SPECTestGenerator()
|
|
764
|
-
requirement = {
|
|
765
|
-
'id': 'SPEC-001-REQ-02',
|
|
766
|
-
'pattern': 'Event-driven',
|
|
767
|
-
'acceptance_criteria': [...]
|
|
768
|
-
}
|
|
769
|
-
test_code = generator.generate_tests_for_requirement(requirement)
|
|
770
|
-
```
|
|
771
|
-
|
|
772
|
-
### Continuous SPEC-TDD Workflow
|
|
773
|
-
|
|
774
|
-
Automated Pipeline:
|
|
775
|
-
|
|
776
|
-
```yaml
|
|
777
|
-
# .github/workflows/spec-tdd-pipeline.yml
|
|
778
|
-
name: SPEC-First TDD Pipeline
|
|
779
|
-
|
|
780
|
-
on:
|
|
781
|
-
push:
|
|
782
|
-
paths:
|
|
783
|
-
- '.moai/specs/'
|
|
784
|
-
- 'src/'
|
|
785
|
-
- 'tests/'
|
|
786
|
-
|
|
787
|
-
jobs:
|
|
788
|
-
spec-validation:
|
|
789
|
-
name: "Phase 1: SPEC Validation"
|
|
790
|
-
runs-on: ubuntu-latest
|
|
791
|
-
steps:
|
|
792
|
-
- uses: actions/checkout@v4
|
|
793
|
-
|
|
794
|
-
- name: Validate SPEC format
|
|
795
|
-
run: python .moai/scripts/validate_spec.py
|
|
796
|
-
|
|
797
|
-
- name: Check requirement traceability
|
|
798
|
-
run: python .moai/scripts/check_traceability.py
|
|
799
|
-
|
|
800
|
-
- name: Generate test scaffolding
|
|
801
|
-
run: python .moai/scripts/generate_test_scaffolding.py
|
|
802
|
-
|
|
803
|
-
tdd-implementation:
|
|
804
|
-
name: "Phase 2: TDD Implementation"
|
|
805
|
-
needs: spec-validation
|
|
806
|
-
runs-on: ubuntu-latest
|
|
807
|
-
steps:
|
|
808
|
-
- uses: actions/checkout@v4
|
|
809
|
-
|
|
810
|
-
- name: Run RED phase tests
|
|
811
|
-
run: |
|
|
812
|
-
pytest tests/ -v --tb=short || true # Allow failures
|
|
813
|
-
echo "RED phase: Expected failures "
|
|
814
|
-
|
|
815
|
-
- name: Verify tests exist for all requirements
|
|
816
|
-
run: python .moai/scripts/verify_test_coverage_mapping.py
|
|
817
|
-
|
|
818
|
-
quality-gates:
|
|
819
|
-
name: "Phase 3: Quality Gates"
|
|
820
|
-
needs: tdd-implementation
|
|
821
|
-
runs-on: ubuntu-latest
|
|
822
|
-
steps:
|
|
823
|
-
- uses: actions/checkout@v4
|
|
824
|
-
|
|
825
|
-
- name: Run tests with coverage
|
|
826
|
-
run: pytest --cov=src --cov-fail-under=85
|
|
827
|
-
|
|
828
|
-
- name: Validate TRUST 5
|
|
829
|
-
run: python .moai/scripts/validate_trust5.py
|
|
830
|
-
|
|
831
|
-
- name: Generate documentation
|
|
832
|
-
run: python .moai/scripts/generate_docs.py
|
|
833
|
-
```
|
|
145
|
+
- [EARS Format Reference](spec-ears-format.md) - All EARS patterns with examples
|
|
146
|
+
- [TDD Implementation](spec-tdd-implementation.md) - Advanced TDD workflows
|
|
834
147
|
|
|
835
148
|
---
|
|
836
149
|
|
|
@@ -843,9 +156,7 @@ Agents:
|
|
|
843
156
|
- docs-manager - Documentation generation
|
|
844
157
|
|
|
845
158
|
Skills:
|
|
846
|
-
- moai-
|
|
847
|
-
- moai-foundation-trust - Quality framework
|
|
848
|
-
- moai-essentials-testing-integration - Test frameworks
|
|
159
|
+
- moai-workflow-testing - Test frameworks
|
|
849
160
|
|
|
850
161
|
Commands:
|
|
851
162
|
- /moai:1-plan - SPEC generation (Phase 1)
|
|
@@ -853,12 +164,8 @@ Commands:
|
|
|
853
164
|
- /moai:3-sync - Documentation sync (Phase 3)
|
|
854
165
|
- /clear - Token optimization between phases
|
|
855
166
|
|
|
856
|
-
Memory:
|
|
857
|
-
- Skill("moai-foundation-core") modules/execution-rules.md - SPEC decision criteria
|
|
858
|
-
- @.moai/specs/ - SPEC storage location
|
|
859
|
-
|
|
860
167
|
---
|
|
861
168
|
|
|
862
|
-
Version:
|
|
863
|
-
Last Updated:
|
|
169
|
+
Version: 2.0.0
|
|
170
|
+
Last Updated: 2026-01-06
|
|
864
171
|
Status: Production Ready
|