moai-adk 0.32.8__py3-none-any.whl → 0.41.2__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 +56 -84
- 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 +40 -24
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +248 -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 +44 -6
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +303 -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 +252 -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 +19 -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 +21 -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 +124 -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 +17 -15
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +105 -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 +197 -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 +431 -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 +194 -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 +395 -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 +473 -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 +378 -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 +387 -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 +419 -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 +384 -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 +505 -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 +490 -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 +390 -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 +433 -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 +378 -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 +212 -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 +192 -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 +365 -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 +94 -227
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +26 -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 +17 -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 +284 -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 +426 -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 +229 -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 +250 -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 +231 -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 +206 -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 +224 -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 +207 -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 +210 -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 +474 -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 +307 -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 +215 -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 +190 -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 +188 -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 +337 -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 +13 -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 +222 -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 +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 +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.2.dist-info}/METADATA +905 -109
- moai_adk-0.41.2.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.2.dist-info}/WHEEL +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.2.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.32.8.dist-info → moai_adk-0.41.2.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()
|
|
@@ -28,10 +28,26 @@ from datetime import datetime, timedelta
|
|
|
28
28
|
from pathlib import Path
|
|
29
29
|
from typing import Any, Dict, List, Optional
|
|
30
30
|
|
|
31
|
+
# =============================================================================
|
|
32
|
+
# Windows UTF-8 Encoding Fix (Issue #249)
|
|
33
|
+
# Ensures emoji characters are properly displayed on Windows terminals
|
|
34
|
+
# =============================================================================
|
|
35
|
+
if sys.platform == "win32":
|
|
36
|
+
try:
|
|
37
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
38
|
+
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
|
39
|
+
except (AttributeError, OSError):
|
|
40
|
+
# Python < 3.7 or reconfigure not available
|
|
41
|
+
pass
|
|
42
|
+
|
|
31
43
|
# Add module path
|
|
32
44
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src"))
|
|
33
45
|
|
|
34
|
-
from lib.path_utils import
|
|
46
|
+
from lib.path_utils import ( # noqa: E402
|
|
47
|
+
ensure_moai_dir,
|
|
48
|
+
find_project_root,
|
|
49
|
+
get_safe_moai_path,
|
|
50
|
+
)
|
|
35
51
|
|
|
36
52
|
# Import unified timeout manager and Git operations manager
|
|
37
53
|
try:
|
|
@@ -120,16 +136,18 @@ logger = logging.getLogger(__name__)
|
|
|
120
136
|
|
|
121
137
|
|
|
122
138
|
def load_hook_timeout() -> int:
|
|
123
|
-
"""Load hook timeout from config.
|
|
139
|
+
"""Load hook timeout from config.yaml (default: 5000ms)
|
|
124
140
|
|
|
125
141
|
Returns:
|
|
126
142
|
Timeout in milliseconds
|
|
127
143
|
"""
|
|
128
144
|
try:
|
|
129
|
-
|
|
145
|
+
import yaml
|
|
146
|
+
|
|
147
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
130
148
|
if config_file.exists():
|
|
131
149
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
132
|
-
config: Dict[str, Any] =
|
|
150
|
+
config: Dict[str, Any] = yaml.safe_load(f) or {}
|
|
133
151
|
return config.get("hooks", {}).get("timeout_ms", 5000)
|
|
134
152
|
except Exception:
|
|
135
153
|
pass
|
|
@@ -137,16 +155,18 @@ def load_hook_timeout() -> int:
|
|
|
137
155
|
|
|
138
156
|
|
|
139
157
|
def get_graceful_degradation() -> bool:
|
|
140
|
-
"""Load graceful_degradation setting from config.
|
|
158
|
+
"""Load graceful_degradation setting from config.yaml (default: true)
|
|
141
159
|
|
|
142
160
|
Returns:
|
|
143
161
|
Whether graceful degradation is enabled
|
|
144
162
|
"""
|
|
145
163
|
try:
|
|
146
|
-
|
|
164
|
+
import yaml
|
|
165
|
+
|
|
166
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
147
167
|
if config_file.exists():
|
|
148
168
|
with open(config_file, "r", encoding="utf-8") as f:
|
|
149
|
-
config: Dict[str, Any] =
|
|
169
|
+
config: Dict[str, Any] = yaml.safe_load(f) or {}
|
|
150
170
|
return config.get("hooks", {}).get("graceful_degradation", True)
|
|
151
171
|
except Exception:
|
|
152
172
|
pass
|
|
@@ -172,13 +192,13 @@ def cleanup_old_files(config: Dict[str, Any]) -> Dict[str, int]:
|
|
|
172
192
|
cleanup_days = cleanup_config.get("cleanup_days", 7)
|
|
173
193
|
cutoff_date = datetime.now() - timedelta(days=cleanup_days)
|
|
174
194
|
|
|
175
|
-
# Clean up temporary files
|
|
176
|
-
temp_dir =
|
|
195
|
+
# Clean up temporary files (use safe path to prevent creation in wrong directory)
|
|
196
|
+
temp_dir = get_safe_moai_path("temp")
|
|
177
197
|
if temp_dir.exists():
|
|
178
198
|
stats["temp_cleaned"] = cleanup_directory(temp_dir, cutoff_date, None, patterns=["*"])
|
|
179
199
|
|
|
180
|
-
# Clean up cache files
|
|
181
|
-
cache_dir =
|
|
200
|
+
# Clean up cache files (use safe path to prevent creation in wrong directory)
|
|
201
|
+
cache_dir = get_safe_moai_path("cache")
|
|
182
202
|
if cache_dir.exists():
|
|
183
203
|
stats["cache_cleaned"] = cleanup_directory(cache_dir, cutoff_date, None, patterns=["*"])
|
|
184
204
|
|
|
@@ -256,9 +276,8 @@ def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
|
256
276
|
Success status
|
|
257
277
|
"""
|
|
258
278
|
try:
|
|
259
|
-
# Create logs directory
|
|
260
|
-
logs_dir =
|
|
261
|
-
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
279
|
+
# Create logs directory (use ensure_moai_dir for safe creation in project root)
|
|
280
|
+
logs_dir = ensure_moai_dir("logs/sessions")
|
|
262
281
|
|
|
263
282
|
# Collect session information
|
|
264
283
|
session_metrics = {
|
|
@@ -293,9 +312,8 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
293
312
|
Success status
|
|
294
313
|
"""
|
|
295
314
|
try:
|
|
296
|
-
# Create memory directory
|
|
297
|
-
|
|
298
|
-
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
315
|
+
# Create memory directory (use ensure_moai_dir for safe creation in project root)
|
|
316
|
+
ensure_moai_dir("memory")
|
|
299
317
|
|
|
300
318
|
# Collect work state
|
|
301
319
|
work_state = {
|
|
@@ -307,7 +325,7 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
307
325
|
}
|
|
308
326
|
|
|
309
327
|
# Save state
|
|
310
|
-
state_file =
|
|
328
|
+
state_file = get_safe_moai_path("memory/last-session-state.json")
|
|
311
329
|
with open(state_file, "w", encoding="utf-8") as f:
|
|
312
330
|
json.dump(work_state, f, indent=2, ensure_ascii=False)
|
|
313
331
|
|
|
@@ -492,8 +510,8 @@ def extract_specs_from_memory() -> List[str]:
|
|
|
492
510
|
specs = []
|
|
493
511
|
|
|
494
512
|
try:
|
|
495
|
-
# Query recent SPECs from command_execution_state.json
|
|
496
|
-
state_file =
|
|
513
|
+
# Query recent SPECs from command_execution_state.json (use safe path)
|
|
514
|
+
state_file = get_safe_moai_path("memory/command-execution-state.json")
|
|
497
515
|
if state_file.exists():
|
|
498
516
|
with open(state_file, "r", encoding="utf-8") as f:
|
|
499
517
|
state_data = json.load(f)
|
|
@@ -524,10 +542,8 @@ def scan_root_violations(config: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
|
524
542
|
violations = []
|
|
525
543
|
|
|
526
544
|
try:
|
|
527
|
-
# Get project root
|
|
528
|
-
project_root =
|
|
529
|
-
if not project_root.exists():
|
|
530
|
-
project_root = find_project_root()
|
|
545
|
+
# Get project root (always use find_project_root for consistent behavior)
|
|
546
|
+
project_root = find_project_root()
|
|
531
547
|
|
|
532
548
|
# Scan root directory
|
|
533
549
|
for item in project_root.iterdir():
|