moai-adk 0.32.8__py3-none-any.whl → 0.41.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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/cli/commands/init.py +4 -1
- moai_adk/cli/commands/update.py +31 -26
- moai_adk/cli/worktree/cli.py +54 -43
- moai_adk/cli/worktree/manager.py +17 -14
- moai_adk/cli/worktree/registry.py +313 -19
- moai_adk/core/config/unified.py +237 -63
- 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/language_config_resolver.py +96 -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/project/backup_utils.py +9 -1
- moai_adk/core/project/initializer.py +33 -96
- moai_adk/core/project/phase_executor.py +79 -33
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/realtime_monitoring_dashboard.py +3 -3
- moai_adk/core/rollback_manager.py +46 -19
- moai_adk/core/template/backup.py +4 -3
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +144 -9
- 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/project/configuration.py +1 -1
- moai_adk/statusline/config.py +5 -2
- moai_adk/statusline/main.py +58 -0
- moai_adk/statusline/renderer.py +38 -78
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +218 -51
- moai_adk/templates/.claude/agents/moai/builder-agent.md +46 -11
- moai_adk/templates/.claude/agents/moai/builder-command.md +88 -26
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +753 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +79 -8
- moai_adk/templates/.claude/agents/moai/expert-backend.md +100 -28
- moai_adk/templates/.claude/agents/moai/expert-database.md +20 -12
- moai_adk/templates/.claude/agents/moai/expert-debug.md +19 -8
- moai_adk/templates/.claude/agents/moai/expert-devops.md +36 -25
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +99 -38
- moai_adk/templates/.claude/agents/moai/expert-performance.md +661 -0
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +218 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +55 -4
- moai_adk/templates/.claude/agents/moai/expert-testing.md +737 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +20 -11
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +13 -4
- moai_adk/templates/.claude/agents/moai/manager-docs.md +15 -7
- moai_adk/templates/.claude/agents/moai/manager-git.md +192 -37
- moai_adk/templates/.claude/agents/moai/manager-project.md +13 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +48 -6
- moai_adk/templates/.claude/agents/moai/manager-spec.md +110 -8
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +203 -17
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +217 -23
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +102 -7
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +107 -86
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +50 -4
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +52 -4
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +49 -5
- moai_adk/templates/.claude/commands/moai/0-project.md +503 -307
- moai_adk/templates/.claude/commands/moai/1-plan.md +255 -323
- moai_adk/templates/.claude/commands/moai/2-run.md +257 -315
- moai_adk/templates/.claude/commands/moai/3-sync.md +421 -56
- moai_adk/templates/.claude/commands/moai/9-feedback.md +40 -34
- moai_adk/templates/.claude/hooks/moai/__init__.py +0 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +19 -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_manager.py +12 -14
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +1 -1
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +104 -14
- 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/tool_registry.py +804 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +14 -2
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +256 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +253 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +307 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +231 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +28 -24
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +236 -32
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +265 -2
- moai_adk/templates/.claude/output-styles/moai/yoda.md +23 -2
- moai_adk/templates/.claude/settings.json +43 -6
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +302 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/reference.md +139 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +251 -196
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +252 -0
- 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 +234 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +18 -13
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +20 -14
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +123 -425
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- 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-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +16 -15
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +104 -315
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +6 -6
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +196 -154
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- 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-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-memory-official.md +2 -2
- 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 +432 -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-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +12 -1
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +33 -134
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +31 -18
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +30 -30
- 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-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +311 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +17 -16
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +430 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +17 -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 +17 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +193 -0
- 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 +394 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +17 -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 +17 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +472 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +386 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +418 -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 +383 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +17 -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 +17 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +389 -0
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +17 -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 +17 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +432 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +17 -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 +17 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +211 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- 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-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +191 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- 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-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +93 -227
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +25 -6
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- 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-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +16 -13
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +1 -1
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +283 -0
- 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 +425 -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 +228 -0
- 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 +249 -0
- 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 +230 -0
- 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 +205 -0
- 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 +223 -0
- 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 +206 -0
- 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 +209 -0
- 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-plugin-builder/SKILL.md +473 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/modules/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +306 -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-tool-opencode/SKILL.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/examples.md +697 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/index.md +96 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/acp.md +115 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/agents.md +241 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/commands.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/custom-tools.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/formatters.md +164 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/keybinds.md +150 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/lsp-servers.md +156 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/mcp-servers.md +214 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/models.md +197 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/permissions.md +162 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/rules.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/skills.md +192 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/themes.md +200 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/configure/tools.md +169 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/config.md +211 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/enterprise.md +68 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/intro.md +127 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/migration-1.0.md +82 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/network.md +72 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/providers.md +310 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/core/troubleshooting.md +124 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/ecosystem.md +75 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/plugins.md +218 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/sdk.md +266 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/develop/server.md +207 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/cli.md +159 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/github.md +181 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/gitlab.md +122 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/ide.md +74 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/share.md +106 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/tui.md +129 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/modules/usage/zen.md +118 -0
- moai_adk/templates/.claude/skills/moai-tool-opencode/reference.md +790 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +189 -424
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +187 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +284 -212
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +2 -2
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +1 -1
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +22 -1
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +336 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +12 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +221 -367
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- 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-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +227 -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 +168 -50
- moai_adk/templates/.gitignore +0 -3
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +5 -12
- moai_adk/templates/.moai/config/config.yaml +20 -306
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +105 -10
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +259 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +4 -5
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +12 -55
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +111 -21
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +34 -18
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +19 -75
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +83 -7
- moai_adk/templates/.moai/config/sections/language.yaml +7 -7
- moai_adk/templates/.moai/config/sections/project.yaml +1 -1
- moai_adk/templates/.moai/config/sections/quality.yaml +7 -4
- moai_adk/templates/.moai/config/sections/system.yaml +11 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +19 -13
- moai_adk/templates/.moai/scripts/setup-glm.py +4 -4
- moai_adk/templates/CLAUDE.md +578 -154
- moai_adk/utils/common.py +33 -0
- moai_adk/version.py +1 -1
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/METADATA +905 -109
- moai_adk-0.41.0.dist-info/RECORD +683 -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/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-integration-mcp/SKILL.md +0 -352
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +0 -52
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +0 -334
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +0 -310
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +0 -256
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +0 -253
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +0 -296
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +0 -1269
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +0 -331
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-platform-baas/README.md +0 -186
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +0 -290
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +0 -1225
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +0 -567
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +0 -323
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +0 -204
- 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 -135
- 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 -410
- 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/cache/personalization.json +0 -10
- moai_adk/templates/.moai/config/presets/manual.yaml +0 -28
- moai_adk/templates/.moai/config/presets/personal.yaml +0 -30
- moai_adk/templates/.moai/config/presets/team.yaml +0 -33
- moai_adk-0.32.8.dist-info/RECORD +0 -396
- /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.32.8.dist-info → moai_adk-0.41.0.dist-info}/WHEEL +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""PostToolUse Hook: Automatic Linting
|
|
3
|
+
|
|
4
|
+
Claude Code Event: PostToolUse
|
|
5
|
+
Matcher: Write|Edit
|
|
6
|
+
Purpose: Automatically run linters after Claude writes or edits files
|
|
7
|
+
|
|
8
|
+
Provides feedback to Claude about code quality issues:
|
|
9
|
+
- Python: ruff check, mypy
|
|
10
|
+
- JavaScript/TypeScript: eslint, biome lint
|
|
11
|
+
- Go: golangci-lint
|
|
12
|
+
- Rust: clippy
|
|
13
|
+
- And many more...
|
|
14
|
+
|
|
15
|
+
Exit Codes:
|
|
16
|
+
- 0: Success (linting completed, issues reported as context)
|
|
17
|
+
- 2: Critical lint errors (Claude should address immediately)
|
|
18
|
+
|
|
19
|
+
Output:
|
|
20
|
+
- JSON with additionalContext containing lint issues
|
|
21
|
+
- Exit code 2 triggers Claude to review and fix issues
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import json
|
|
25
|
+
import sys
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Any, Dict, List
|
|
28
|
+
|
|
29
|
+
# Setup import path for shared modules
|
|
30
|
+
HOOKS_DIR = Path(__file__).parent
|
|
31
|
+
LIB_DIR = HOOKS_DIR / "lib"
|
|
32
|
+
if str(LIB_DIR) not in sys.path:
|
|
33
|
+
sys.path.insert(0, str(LIB_DIR))
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from lib.tool_registry import ToolResult, ToolType, get_tool_registry
|
|
37
|
+
except ImportError:
|
|
38
|
+
# Fallback if module not available
|
|
39
|
+
def get_tool_registry():
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
class ToolType:
|
|
43
|
+
LINTER = "linter"
|
|
44
|
+
|
|
45
|
+
class ToolResult:
|
|
46
|
+
def __init__(self, **kwargs):
|
|
47
|
+
for k, v in kwargs.items():
|
|
48
|
+
setattr(self, k, v)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
# Maximum number of issues to report to Claude
|
|
52
|
+
MAX_ISSUES_TO_REPORT = 5
|
|
53
|
+
|
|
54
|
+
# File extensions that should skip linting
|
|
55
|
+
SKIP_EXTENSIONS = {
|
|
56
|
+
".json",
|
|
57
|
+
".lock",
|
|
58
|
+
".min.js",
|
|
59
|
+
".min.css",
|
|
60
|
+
".map",
|
|
61
|
+
".svg",
|
|
62
|
+
".png",
|
|
63
|
+
".jpg",
|
|
64
|
+
".gif",
|
|
65
|
+
".ico",
|
|
66
|
+
".woff",
|
|
67
|
+
".woff2",
|
|
68
|
+
".ttf",
|
|
69
|
+
".eot",
|
|
70
|
+
".md", # Markdown usually doesn't need linting for code generation
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Directories to skip
|
|
74
|
+
SKIP_DIRECTORIES = {
|
|
75
|
+
"node_modules",
|
|
76
|
+
".git",
|
|
77
|
+
".venv",
|
|
78
|
+
"venv",
|
|
79
|
+
"__pycache__",
|
|
80
|
+
".cache",
|
|
81
|
+
"dist",
|
|
82
|
+
"build",
|
|
83
|
+
".next",
|
|
84
|
+
".nuxt",
|
|
85
|
+
"target",
|
|
86
|
+
"vendor",
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def should_skip_file(file_path: str) -> tuple[bool, str]:
|
|
91
|
+
"""Check if file should be skipped for linting.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
file_path: Path to the file
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Tuple of (should_skip, reason)
|
|
98
|
+
"""
|
|
99
|
+
path = Path(file_path)
|
|
100
|
+
|
|
101
|
+
# Check extension
|
|
102
|
+
if path.suffix.lower() in SKIP_EXTENSIONS:
|
|
103
|
+
return True, f"Skipped: {path.suffix} files are not linted"
|
|
104
|
+
|
|
105
|
+
# Check for minified files
|
|
106
|
+
if ".min." in path.name:
|
|
107
|
+
return True, "Skipped: minified file"
|
|
108
|
+
|
|
109
|
+
# Check if in skip directory
|
|
110
|
+
for parent in path.parents:
|
|
111
|
+
if parent.name in SKIP_DIRECTORIES:
|
|
112
|
+
return True, f"Skipped: file in {parent.name}/ directory"
|
|
113
|
+
|
|
114
|
+
# Check if file exists
|
|
115
|
+
if not path.exists():
|
|
116
|
+
return True, "Skipped: file does not exist"
|
|
117
|
+
|
|
118
|
+
return False, ""
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def parse_lint_output(output: str, error: str) -> List[Dict[str, Any]]:
|
|
122
|
+
"""Parse linter output to extract issues.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
output: stdout from linter
|
|
126
|
+
error: stderr from linter
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
List of parsed issues
|
|
130
|
+
"""
|
|
131
|
+
issues = []
|
|
132
|
+
combined = (output + "\n" + error).strip()
|
|
133
|
+
|
|
134
|
+
if not combined:
|
|
135
|
+
return issues
|
|
136
|
+
|
|
137
|
+
# Parse line by line
|
|
138
|
+
for line in combined.split("\n"):
|
|
139
|
+
line = line.strip()
|
|
140
|
+
if not line:
|
|
141
|
+
continue
|
|
142
|
+
|
|
143
|
+
# Skip non-issue lines
|
|
144
|
+
if any(
|
|
145
|
+
skip in line.lower()
|
|
146
|
+
for skip in [
|
|
147
|
+
"warning:",
|
|
148
|
+
"info:",
|
|
149
|
+
"running",
|
|
150
|
+
"checking",
|
|
151
|
+
"finished",
|
|
152
|
+
"success",
|
|
153
|
+
"✓",
|
|
154
|
+
"✔",
|
|
155
|
+
]
|
|
156
|
+
):
|
|
157
|
+
continue
|
|
158
|
+
|
|
159
|
+
# Look for error patterns
|
|
160
|
+
if "error" in line.lower() or ":" in line:
|
|
161
|
+
issues.append({"message": line[:200]}) # Truncate long messages
|
|
162
|
+
|
|
163
|
+
if len(issues) >= MAX_ISSUES_TO_REPORT:
|
|
164
|
+
break
|
|
165
|
+
|
|
166
|
+
return issues
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def lint_file(file_path: str) -> Dict[str, Any]:
|
|
170
|
+
"""Lint a single file using the appropriate linter.
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
file_path: Path to the file to lint
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
Dictionary with linting results
|
|
177
|
+
"""
|
|
178
|
+
results: Dict[str, Any] = {
|
|
179
|
+
"file": file_path,
|
|
180
|
+
"linted": False,
|
|
181
|
+
"issues": [],
|
|
182
|
+
"issues_fixed": 0,
|
|
183
|
+
"tools_run": [],
|
|
184
|
+
"errors": [],
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
# Check if we should skip
|
|
188
|
+
should_skip, skip_reason = should_skip_file(file_path)
|
|
189
|
+
if should_skip:
|
|
190
|
+
results["skipped"] = True
|
|
191
|
+
results["skip_reason"] = skip_reason
|
|
192
|
+
return results
|
|
193
|
+
|
|
194
|
+
# Get tool registry
|
|
195
|
+
registry = get_tool_registry()
|
|
196
|
+
if not registry:
|
|
197
|
+
results["errors"].append("Tool registry not available")
|
|
198
|
+
return results
|
|
199
|
+
|
|
200
|
+
# Get linters for this file
|
|
201
|
+
linters = registry.get_tools_for_file(file_path, ToolType.LINTER)
|
|
202
|
+
if not linters:
|
|
203
|
+
language = registry.get_language_for_file(file_path)
|
|
204
|
+
if language:
|
|
205
|
+
results["skipped"] = True
|
|
206
|
+
results["skip_reason"] = f"No linter available for {language}"
|
|
207
|
+
else:
|
|
208
|
+
results["skipped"] = True
|
|
209
|
+
results["skip_reason"] = "Unknown file type"
|
|
210
|
+
return results
|
|
211
|
+
|
|
212
|
+
# Run linters (use first available)
|
|
213
|
+
for linter in linters[:1]: # Only run the highest priority linter
|
|
214
|
+
result = registry.run_tool(linter, file_path)
|
|
215
|
+
results["tools_run"].append(
|
|
216
|
+
{
|
|
217
|
+
"name": result.tool_name,
|
|
218
|
+
"success": result.success,
|
|
219
|
+
"fixed": result.file_modified,
|
|
220
|
+
}
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
results["linted"] = True
|
|
224
|
+
|
|
225
|
+
if result.file_modified:
|
|
226
|
+
results["issues_fixed"] += 1
|
|
227
|
+
|
|
228
|
+
# Parse issues from output
|
|
229
|
+
if result.output or result.error:
|
|
230
|
+
parsed_issues = parse_lint_output(result.output, result.error)
|
|
231
|
+
results["issues"].extend(parsed_issues)
|
|
232
|
+
|
|
233
|
+
break # Only use first linter
|
|
234
|
+
|
|
235
|
+
return results
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def main() -> None:
|
|
239
|
+
"""Main entry point for PostToolUse linter hook.
|
|
240
|
+
|
|
241
|
+
Reads JSON input from stdin, lints the file if applicable,
|
|
242
|
+
and outputs JSON result for Claude.
|
|
243
|
+
"""
|
|
244
|
+
try:
|
|
245
|
+
# Read JSON input from stdin
|
|
246
|
+
input_data = json.load(sys.stdin)
|
|
247
|
+
except json.JSONDecodeError:
|
|
248
|
+
# Invalid JSON input - exit silently
|
|
249
|
+
sys.exit(0)
|
|
250
|
+
|
|
251
|
+
# Extract tool information
|
|
252
|
+
tool_name = input_data.get("tool_name", "")
|
|
253
|
+
tool_input = input_data.get("tool_input", {})
|
|
254
|
+
|
|
255
|
+
# Only process Write and Edit tools
|
|
256
|
+
if tool_name not in ("Write", "Edit"):
|
|
257
|
+
sys.exit(0)
|
|
258
|
+
|
|
259
|
+
# Get file path from tool input
|
|
260
|
+
file_path = tool_input.get("file_path", "")
|
|
261
|
+
if not file_path:
|
|
262
|
+
sys.exit(0)
|
|
263
|
+
|
|
264
|
+
# Lint the file
|
|
265
|
+
result = lint_file(file_path)
|
|
266
|
+
|
|
267
|
+
# Build output
|
|
268
|
+
output: Dict[str, Any] = {}
|
|
269
|
+
|
|
270
|
+
if result.get("issues"):
|
|
271
|
+
# Issues found - provide context to Claude
|
|
272
|
+
issue_count = len(result["issues"])
|
|
273
|
+
issue_summary = "; ".join([i["message"] for i in result["issues"][:3]])
|
|
274
|
+
|
|
275
|
+
if issue_count > 3:
|
|
276
|
+
issue_summary += f" (+{issue_count - 3} more)"
|
|
277
|
+
|
|
278
|
+
# If issues were auto-fixed, just inform
|
|
279
|
+
if result.get("issues_fixed", 0) > 0:
|
|
280
|
+
output = {
|
|
281
|
+
"hookSpecificOutput": {
|
|
282
|
+
"hookEventName": "PostToolUse",
|
|
283
|
+
"additionalContext": f"Lint: {result['issues_fixed']} issues auto-fixed",
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
print(json.dumps(output))
|
|
287
|
+
sys.exit(0)
|
|
288
|
+
else:
|
|
289
|
+
# Issues need attention - use exit code 2 to alert Claude
|
|
290
|
+
print(f"Lint issues found: {issue_summary}", file=sys.stderr)
|
|
291
|
+
sys.exit(2)
|
|
292
|
+
|
|
293
|
+
elif result.get("linted"):
|
|
294
|
+
# Linting passed with no issues
|
|
295
|
+
output = {"suppressOutput": True}
|
|
296
|
+
print(json.dumps(output))
|
|
297
|
+
sys.exit(0)
|
|
298
|
+
|
|
299
|
+
else:
|
|
300
|
+
# Skipped or no linter available
|
|
301
|
+
output = {"suppressOutput": True}
|
|
302
|
+
print(json.dumps(output))
|
|
303
|
+
sys.exit(0)
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
if __name__ == "__main__":
|
|
307
|
+
main()
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""PreToolUse Hook: Security Guard
|
|
3
|
+
|
|
4
|
+
Claude Code Event: PreToolUse
|
|
5
|
+
Matcher: Write|Edit
|
|
6
|
+
Purpose: Protect sensitive files and prevent dangerous modifications
|
|
7
|
+
|
|
8
|
+
Security Features:
|
|
9
|
+
- Block modifications to .env and secret files
|
|
10
|
+
- Protect lock files (package-lock.json, yarn.lock)
|
|
11
|
+
- Guard .git directory
|
|
12
|
+
- Prevent accidental overwrites of critical configs
|
|
13
|
+
|
|
14
|
+
Exit Codes:
|
|
15
|
+
- 0: Success (with JSON output for permission decision)
|
|
16
|
+
- 2: Error (blocking the operation)
|
|
17
|
+
|
|
18
|
+
Permission Decisions:
|
|
19
|
+
- "allow": Auto-approve safe operations
|
|
20
|
+
- "deny": Block dangerous operations (reason shown to Claude)
|
|
21
|
+
- "ask": Request user confirmation
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import json
|
|
25
|
+
import re
|
|
26
|
+
import sys
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Any, Dict, List, Tuple
|
|
29
|
+
|
|
30
|
+
# Patterns for files that should NEVER be modified
|
|
31
|
+
DENY_PATTERNS = [
|
|
32
|
+
# Environment and secrets
|
|
33
|
+
r"\.env$",
|
|
34
|
+
r"\.env\.[^/]+$", # .env.local, .env.production, etc.
|
|
35
|
+
r"\.envrc$",
|
|
36
|
+
r"secrets?\.(json|ya?ml|toml)$",
|
|
37
|
+
r"credentials?\.(json|ya?ml|toml)$",
|
|
38
|
+
r"\.secrets/.*",
|
|
39
|
+
r"secrets/.*",
|
|
40
|
+
# SSH and certificates
|
|
41
|
+
r"\.ssh/.*",
|
|
42
|
+
r"id_rsa.*",
|
|
43
|
+
r"id_ed25519.*",
|
|
44
|
+
r"\.pem$",
|
|
45
|
+
r"\.key$",
|
|
46
|
+
r"\.crt$",
|
|
47
|
+
# Git internals
|
|
48
|
+
r"\.git/.*",
|
|
49
|
+
# Cloud credentials
|
|
50
|
+
r"\.aws/.*",
|
|
51
|
+
r"\.gcloud/.*",
|
|
52
|
+
r"\.azure/.*",
|
|
53
|
+
r"\.kube/.*",
|
|
54
|
+
# Token files
|
|
55
|
+
r"\.token$",
|
|
56
|
+
r"\.tokens/.*",
|
|
57
|
+
r"auth\.json$",
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
# Patterns for files that require user confirmation
|
|
61
|
+
ASK_PATTERNS = [
|
|
62
|
+
# Lock files
|
|
63
|
+
r"package-lock\.json$",
|
|
64
|
+
r"yarn\.lock$",
|
|
65
|
+
r"pnpm-lock\.ya?ml$",
|
|
66
|
+
r"Gemfile\.lock$",
|
|
67
|
+
r"Cargo\.lock$",
|
|
68
|
+
r"poetry\.lock$",
|
|
69
|
+
r"composer\.lock$",
|
|
70
|
+
r"Pipfile\.lock$",
|
|
71
|
+
r"uv\.lock$",
|
|
72
|
+
# Critical configs
|
|
73
|
+
r"tsconfig\.json$",
|
|
74
|
+
r"pyproject\.toml$",
|
|
75
|
+
r"Cargo\.toml$",
|
|
76
|
+
r"package\.json$",
|
|
77
|
+
r"docker-compose\.ya?ml$",
|
|
78
|
+
r"Dockerfile$",
|
|
79
|
+
r"\.dockerignore$",
|
|
80
|
+
# CI/CD configs
|
|
81
|
+
r"\.github/workflows/.*\.ya?ml$",
|
|
82
|
+
r"\.gitlab-ci\.ya?ml$",
|
|
83
|
+
r"\.circleci/.*",
|
|
84
|
+
r"Jenkinsfile$",
|
|
85
|
+
# Infrastructure
|
|
86
|
+
r"terraform/.*\.tf$",
|
|
87
|
+
r"\.terraform/.*",
|
|
88
|
+
r"kubernetes/.*\.ya?ml$",
|
|
89
|
+
r"k8s/.*\.ya?ml$",
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
# Content patterns that indicate sensitive data
|
|
93
|
+
SENSITIVE_CONTENT_PATTERNS = [
|
|
94
|
+
r"-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----",
|
|
95
|
+
r"-----BEGIN\s+CERTIFICATE-----",
|
|
96
|
+
r"sk-[a-zA-Z0-9]{32,}", # OpenAI API keys
|
|
97
|
+
r"ghp_[a-zA-Z0-9]{36}", # GitHub tokens
|
|
98
|
+
r"gho_[a-zA-Z0-9]{36}", # GitHub OAuth tokens
|
|
99
|
+
r"glpat-[a-zA-Z0-9\-]{20}", # GitLab tokens
|
|
100
|
+
r"xox[baprs]-[a-zA-Z0-9\-]+", # Slack tokens
|
|
101
|
+
r"AKIA[0-9A-Z]{16}", # AWS access keys
|
|
102
|
+
r"ya29\.[a-zA-Z0-9_\-]+", # Google OAuth tokens
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def compile_patterns(patterns: List[str]) -> List[re.Pattern]:
|
|
107
|
+
"""Compile regex patterns for efficient matching."""
|
|
108
|
+
return [re.compile(p, re.IGNORECASE) for p in patterns]
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
DENY_COMPILED = compile_patterns(DENY_PATTERNS)
|
|
112
|
+
ASK_COMPILED = compile_patterns(ASK_PATTERNS)
|
|
113
|
+
SENSITIVE_COMPILED = compile_patterns(SENSITIVE_CONTENT_PATTERNS)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def check_file_path(file_path: str) -> Tuple[str, str]:
|
|
117
|
+
"""Check if file path matches any security patterns.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
file_path: Path to check
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
Tuple of (decision, reason)
|
|
124
|
+
decision: "allow", "deny", or "ask"
|
|
125
|
+
"""
|
|
126
|
+
# Normalize path for matching
|
|
127
|
+
normalized = file_path.replace("\\", "/")
|
|
128
|
+
|
|
129
|
+
# Check deny patterns first
|
|
130
|
+
for pattern in DENY_COMPILED:
|
|
131
|
+
if pattern.search(normalized):
|
|
132
|
+
return "deny", "Protected file: access denied for security reasons"
|
|
133
|
+
|
|
134
|
+
# Check ask patterns
|
|
135
|
+
for pattern in ASK_COMPILED:
|
|
136
|
+
if pattern.search(normalized):
|
|
137
|
+
return "ask", f"Critical config file: {Path(file_path).name}"
|
|
138
|
+
|
|
139
|
+
return "allow", ""
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def check_content_for_secrets(content: str) -> Tuple[bool, str]:
|
|
143
|
+
"""Check if content contains sensitive data patterns.
|
|
144
|
+
|
|
145
|
+
Args:
|
|
146
|
+
content: Content to check
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Tuple of (has_secrets, description)
|
|
150
|
+
"""
|
|
151
|
+
for pattern in SENSITIVE_COMPILED:
|
|
152
|
+
match = pattern.search(content)
|
|
153
|
+
if match:
|
|
154
|
+
# Don't reveal the actual secret or pattern
|
|
155
|
+
return True, "Detected sensitive data (credentials, API keys, or certificates)"
|
|
156
|
+
|
|
157
|
+
return False, ""
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def main() -> None:
|
|
161
|
+
"""Main entry point for PreToolUse security guard hook.
|
|
162
|
+
|
|
163
|
+
Reads JSON input from stdin, checks for security concerns,
|
|
164
|
+
and outputs permission decision.
|
|
165
|
+
"""
|
|
166
|
+
try:
|
|
167
|
+
# Read JSON input from stdin
|
|
168
|
+
input_data = json.load(sys.stdin)
|
|
169
|
+
except json.JSONDecodeError:
|
|
170
|
+
# Invalid JSON input - allow by default
|
|
171
|
+
sys.exit(0)
|
|
172
|
+
|
|
173
|
+
# Extract tool information
|
|
174
|
+
tool_name = input_data.get("tool_name", "")
|
|
175
|
+
tool_input = input_data.get("tool_input", {})
|
|
176
|
+
|
|
177
|
+
# Only process Write and Edit tools
|
|
178
|
+
if tool_name not in ("Write", "Edit"):
|
|
179
|
+
sys.exit(0)
|
|
180
|
+
|
|
181
|
+
# Get file path from tool input
|
|
182
|
+
file_path = tool_input.get("file_path", "")
|
|
183
|
+
if not file_path:
|
|
184
|
+
sys.exit(0)
|
|
185
|
+
|
|
186
|
+
# Check file path against patterns
|
|
187
|
+
decision, reason = check_file_path(file_path)
|
|
188
|
+
|
|
189
|
+
# For Write operations, also check content for secrets
|
|
190
|
+
if tool_name == "Write" and decision == "allow":
|
|
191
|
+
content = tool_input.get("content", "")
|
|
192
|
+
if content:
|
|
193
|
+
has_secrets, secret_reason = check_content_for_secrets(content)
|
|
194
|
+
if has_secrets:
|
|
195
|
+
decision = "deny"
|
|
196
|
+
reason = f"Content contains secrets: {secret_reason}"
|
|
197
|
+
|
|
198
|
+
# Build output based on decision
|
|
199
|
+
output: Dict[str, Any] = {}
|
|
200
|
+
|
|
201
|
+
if decision == "deny":
|
|
202
|
+
output = {
|
|
203
|
+
"hookSpecificOutput": {
|
|
204
|
+
"hookEventName": "PreToolUse",
|
|
205
|
+
"permissionDecision": "deny",
|
|
206
|
+
"permissionDecisionReason": reason,
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
print(json.dumps(output))
|
|
210
|
+
sys.exit(0)
|
|
211
|
+
|
|
212
|
+
elif decision == "ask":
|
|
213
|
+
output = {
|
|
214
|
+
"hookSpecificOutput": {
|
|
215
|
+
"hookEventName": "PreToolUse",
|
|
216
|
+
"permissionDecision": "ask",
|
|
217
|
+
"permissionDecisionReason": reason,
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
print(json.dumps(output))
|
|
221
|
+
sys.exit(0)
|
|
222
|
+
|
|
223
|
+
else:
|
|
224
|
+
# Allow - no output needed (or suppress)
|
|
225
|
+
output = {"suppressOutput": True}
|
|
226
|
+
print(json.dumps(output))
|
|
227
|
+
sys.exit(0)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
if __name__ == "__main__":
|
|
231
|
+
main()
|
|
@@ -31,7 +31,11 @@ from typing import Any, Dict, List, Optional
|
|
|
31
31
|
# Add module path
|
|
32
32
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src"))
|
|
33
33
|
|
|
34
|
-
from lib.path_utils import
|
|
34
|
+
from lib.path_utils import ( # noqa: E402
|
|
35
|
+
ensure_moai_dir,
|
|
36
|
+
find_project_root,
|
|
37
|
+
get_safe_moai_path,
|
|
38
|
+
)
|
|
35
39
|
|
|
36
40
|
# Import unified timeout manager and Git operations manager
|
|
37
41
|
try:
|
|
@@ -120,16 +124,18 @@ logger = logging.getLogger(__name__)
|
|
|
120
124
|
|
|
121
125
|
|
|
122
126
|
def load_hook_timeout() -> int:
|
|
123
|
-
"""Load hook timeout from config.
|
|
127
|
+
"""Load hook timeout from config.yaml (default: 5000ms)
|
|
124
128
|
|
|
125
129
|
Returns:
|
|
126
130
|
Timeout in milliseconds
|
|
127
131
|
"""
|
|
128
132
|
try:
|
|
129
|
-
|
|
133
|
+
import yaml
|
|
134
|
+
|
|
135
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
130
136
|
if config_file.exists():
|
|
131
137
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
132
|
-
config: Dict[str, Any] =
|
|
138
|
+
config: Dict[str, Any] = yaml.safe_load(f) or {}
|
|
133
139
|
return config.get("hooks", {}).get("timeout_ms", 5000)
|
|
134
140
|
except Exception:
|
|
135
141
|
pass
|
|
@@ -137,16 +143,18 @@ def load_hook_timeout() -> int:
|
|
|
137
143
|
|
|
138
144
|
|
|
139
145
|
def get_graceful_degradation() -> bool:
|
|
140
|
-
"""Load graceful_degradation setting from config.
|
|
146
|
+
"""Load graceful_degradation setting from config.yaml (default: true)
|
|
141
147
|
|
|
142
148
|
Returns:
|
|
143
149
|
Whether graceful degradation is enabled
|
|
144
150
|
"""
|
|
145
151
|
try:
|
|
146
|
-
|
|
152
|
+
import yaml
|
|
153
|
+
|
|
154
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
147
155
|
if config_file.exists():
|
|
148
156
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
149
|
-
config: Dict[str, Any] =
|
|
157
|
+
config: Dict[str, Any] = yaml.safe_load(f) or {}
|
|
150
158
|
return config.get("hooks", {}).get("graceful_degradation", True)
|
|
151
159
|
except Exception:
|
|
152
160
|
pass
|
|
@@ -172,13 +180,13 @@ def cleanup_old_files(config: Dict[str, Any]) -> Dict[str, int]:
|
|
|
172
180
|
cleanup_days = cleanup_config.get("cleanup_days", 7)
|
|
173
181
|
cutoff_date = datetime.now() - timedelta(days=cleanup_days)
|
|
174
182
|
|
|
175
|
-
# Clean up temporary files
|
|
176
|
-
temp_dir =
|
|
183
|
+
# Clean up temporary files (use safe path to prevent creation in wrong directory)
|
|
184
|
+
temp_dir = get_safe_moai_path("temp")
|
|
177
185
|
if temp_dir.exists():
|
|
178
186
|
stats["temp_cleaned"] = cleanup_directory(temp_dir, cutoff_date, None, patterns=["*"])
|
|
179
187
|
|
|
180
|
-
# Clean up cache files
|
|
181
|
-
cache_dir =
|
|
188
|
+
# Clean up cache files (use safe path to prevent creation in wrong directory)
|
|
189
|
+
cache_dir = get_safe_moai_path("cache")
|
|
182
190
|
if cache_dir.exists():
|
|
183
191
|
stats["cache_cleaned"] = cleanup_directory(cache_dir, cutoff_date, None, patterns=["*"])
|
|
184
192
|
|
|
@@ -256,9 +264,8 @@ def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
|
256
264
|
Success status
|
|
257
265
|
"""
|
|
258
266
|
try:
|
|
259
|
-
# Create logs directory
|
|
260
|
-
logs_dir =
|
|
261
|
-
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
267
|
+
# Create logs directory (use ensure_moai_dir for safe creation in project root)
|
|
268
|
+
logs_dir = ensure_moai_dir("logs/sessions")
|
|
262
269
|
|
|
263
270
|
# Collect session information
|
|
264
271
|
session_metrics = {
|
|
@@ -293,9 +300,8 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
293
300
|
Success status
|
|
294
301
|
"""
|
|
295
302
|
try:
|
|
296
|
-
# Create memory directory
|
|
297
|
-
|
|
298
|
-
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
303
|
+
# Create memory directory (use ensure_moai_dir for safe creation in project root)
|
|
304
|
+
ensure_moai_dir("memory")
|
|
299
305
|
|
|
300
306
|
# Collect work state
|
|
301
307
|
work_state = {
|
|
@@ -307,7 +313,7 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
307
313
|
}
|
|
308
314
|
|
|
309
315
|
# Save state
|
|
310
|
-
state_file =
|
|
316
|
+
state_file = get_safe_moai_path("memory/last-session-state.json")
|
|
311
317
|
with open(state_file, "w", encoding="utf-8") as f:
|
|
312
318
|
json.dump(work_state, f, indent=2, ensure_ascii=False)
|
|
313
319
|
|
|
@@ -492,8 +498,8 @@ def extract_specs_from_memory() -> List[str]:
|
|
|
492
498
|
specs = []
|
|
493
499
|
|
|
494
500
|
try:
|
|
495
|
-
# Query recent SPECs from command_execution_state.json
|
|
496
|
-
state_file =
|
|
501
|
+
# Query recent SPECs from command_execution_state.json (use safe path)
|
|
502
|
+
state_file = get_safe_moai_path("memory/command-execution-state.json")
|
|
497
503
|
if state_file.exists():
|
|
498
504
|
with open(state_file, "r", encoding="utf-8") as f:
|
|
499
505
|
state_data = json.load(f)
|
|
@@ -524,10 +530,8 @@ def scan_root_violations(config: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
|
524
530
|
violations = []
|
|
525
531
|
|
|
526
532
|
try:
|
|
527
|
-
# Get project root
|
|
528
|
-
project_root =
|
|
529
|
-
if not project_root.exists():
|
|
530
|
-
project_root = find_project_root()
|
|
533
|
+
# Get project root (always use find_project_root for consistent behavior)
|
|
534
|
+
project_root = find_project_root()
|
|
531
535
|
|
|
532
536
|
# Scan root directory
|
|
533
537
|
for item in project_root.iterdir():
|