moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Pre-commit hook for TAG validation (T3: Pre-commit Validation Hook).
|
|
3
|
+
|
|
4
|
+
Validates TAG format and SPEC existence before Git commit.
|
|
5
|
+
Runs in warn mode by default (allows commit with warnings).
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from .lib import (
|
|
16
|
+
extract_tags_from_file,
|
|
17
|
+
get_config_manager,
|
|
18
|
+
spec_document_exists,
|
|
19
|
+
validate_tag,
|
|
20
|
+
)
|
|
21
|
+
from .lib.tag_validator import TAG
|
|
22
|
+
except ImportError:
|
|
23
|
+
# Fallback for direct execution from hooks directory
|
|
24
|
+
try:
|
|
25
|
+
from lib import (
|
|
26
|
+
extract_tags_from_file,
|
|
27
|
+
get_config_manager,
|
|
28
|
+
spec_document_exists,
|
|
29
|
+
validate_tag,
|
|
30
|
+
)
|
|
31
|
+
from lib.tag_validator import TAG
|
|
32
|
+
except ImportError:
|
|
33
|
+
# Final fallback - try relative import from parent
|
|
34
|
+
import sys
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
|
|
37
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
38
|
+
from hooks.moai.lib import (
|
|
39
|
+
extract_tags_from_file,
|
|
40
|
+
get_config_manager,
|
|
41
|
+
spec_document_exists,
|
|
42
|
+
validate_tag,
|
|
43
|
+
)
|
|
44
|
+
from hooks.moai.lib.tag_validator import TAG
|
|
45
|
+
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_file_context(file_path: Path) -> dict:
|
|
50
|
+
"""Get file context for flexible TAG validation.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
file_path: Path to analyze
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
Context dict with file type information
|
|
57
|
+
"""
|
|
58
|
+
import re
|
|
59
|
+
|
|
60
|
+
file_str = str(file_path)
|
|
61
|
+
|
|
62
|
+
return {
|
|
63
|
+
"is_test_file": bool(re.search(r"test_\w+\.py|_\w+_test\.py|tests?/", file_str)),
|
|
64
|
+
"is_impl_file": not bool(re.search(r"test_\w+\.py|_\w+_test\.py|tests?/", file_str)),
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def load_tag_validation_config() -> dict:
|
|
69
|
+
"""Load TAG validation configuration from quality.yaml.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Configuration dict with enabled, mode, and other settings
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
config_manager = get_config_manager()
|
|
76
|
+
quality_config = config_manager.config
|
|
77
|
+
|
|
78
|
+
# Get TAG validation settings
|
|
79
|
+
tag_config = quality_config.get("tag_validation", {})
|
|
80
|
+
|
|
81
|
+
# Apply defaults if not configured (T5.2)
|
|
82
|
+
defaults = {
|
|
83
|
+
"enabled": True,
|
|
84
|
+
"mode": "warn", # warn | enforce | off
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Merge defaults with config
|
|
88
|
+
for key, value in defaults.items():
|
|
89
|
+
if key not in tag_config:
|
|
90
|
+
tag_config[key] = value
|
|
91
|
+
|
|
92
|
+
return tag_config
|
|
93
|
+
|
|
94
|
+
except Exception as e:
|
|
95
|
+
logger.warning(f"Error loading TAG validation config: {e}")
|
|
96
|
+
# Return safe defaults
|
|
97
|
+
return {"enabled": True, "mode": "warn"}
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def validate_tag_format(tag: TAG) -> tuple[bool, list[str]]:
|
|
101
|
+
"""Validate TAG format.
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
tag: TAG to validate
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Tuple of (is_valid, error_messages)
|
|
108
|
+
"""
|
|
109
|
+
is_valid, errors = validate_tag(tag)
|
|
110
|
+
return is_valid, errors
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def check_spec_exists(spec_id: str) -> bool:
|
|
114
|
+
"""Check if SPEC document exists.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
spec_id: SPEC identifier to check
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
True if SPEC exists, False otherwise
|
|
121
|
+
"""
|
|
122
|
+
return spec_document_exists(spec_id)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def validate_file_tags(file_path: Path, config: dict) -> tuple[int, list[str]]:
|
|
126
|
+
"""Validate all TAGs in a file.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
file_path: Path to Python file
|
|
130
|
+
config: TAG validation configuration
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Tuple of (exit_code, error_messages)
|
|
134
|
+
"""
|
|
135
|
+
errors = []
|
|
136
|
+
file_context = get_file_context(file_path)
|
|
137
|
+
|
|
138
|
+
# Extract TAGs from file
|
|
139
|
+
tags = extract_tags_from_file(file_path)
|
|
140
|
+
|
|
141
|
+
if not tags:
|
|
142
|
+
return 0, [] # No TAGs, no errors
|
|
143
|
+
|
|
144
|
+
# Validate each TAG
|
|
145
|
+
for tag in tags:
|
|
146
|
+
# Validate TAG format
|
|
147
|
+
is_valid, format_errors = validate_tag_format(tag)
|
|
148
|
+
|
|
149
|
+
if not is_valid:
|
|
150
|
+
for error in format_errors:
|
|
151
|
+
errors.append(f"{file_path}:{tag.line}: {error}")
|
|
152
|
+
|
|
153
|
+
# Check SPEC existence with context-aware validation
|
|
154
|
+
if not check_spec_exists(tag.spec_id):
|
|
155
|
+
mode = config.get("mode", "warn")
|
|
156
|
+
|
|
157
|
+
# `related` verb: always allow, just show hint
|
|
158
|
+
if tag.verb == "related":
|
|
159
|
+
errors.append(
|
|
160
|
+
f"{file_path}:{tag.line}: Hint: Consider creating SPEC for {tag.spec_id} "
|
|
161
|
+
"(related TAG - no SPEC required)"
|
|
162
|
+
)
|
|
163
|
+
continue # Allow commit
|
|
164
|
+
|
|
165
|
+
# TEST file with `verify` verb: allow with warning
|
|
166
|
+
if file_context["is_test_file"] and tag.verb == "verify":
|
|
167
|
+
errors.append(
|
|
168
|
+
f"{file_path}:{tag.line}: Warning: TEST references missing SPEC: {tag.spec_id} "
|
|
169
|
+
"(verify TAG in test file - commit allowed)"
|
|
170
|
+
)
|
|
171
|
+
continue # Allow commit
|
|
172
|
+
|
|
173
|
+
# Implementation file with `impl` verb: strict validation
|
|
174
|
+
if file_context["is_impl_file"] and tag.verb == "impl":
|
|
175
|
+
if mode == "enforce":
|
|
176
|
+
errors.append(
|
|
177
|
+
f"{file_path}:{tag.line}: Error: Implementation references missing SPEC: {tag.spec_id} "
|
|
178
|
+
"(commit blocked in enforce mode)"
|
|
179
|
+
)
|
|
180
|
+
else:
|
|
181
|
+
errors.append(
|
|
182
|
+
f"{file_path}:{tag.line}: Warning: Implementation references missing SPEC: {tag.spec_id} "
|
|
183
|
+
"(commit allowed in warn mode)"
|
|
184
|
+
)
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
# Default: warn but allow
|
|
188
|
+
errors.append(
|
|
189
|
+
f"{file_path}:{tag.line}: Warning: SPEC document not found: {tag.spec_id} (commit allowed in warn mode)"
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
# Determine exit code
|
|
193
|
+
if errors:
|
|
194
|
+
mode = config.get("mode", "warn")
|
|
195
|
+
if mode == "enforce":
|
|
196
|
+
# Check if any errors are blocking (not hints/warnings)
|
|
197
|
+
blocking_errors = [e for e in errors if "Error:" in e]
|
|
198
|
+
if blocking_errors:
|
|
199
|
+
return 1, errors # Block commit
|
|
200
|
+
return 1, errors # Warning code but commit allowed
|
|
201
|
+
else:
|
|
202
|
+
return 0, [] # Success
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def main() -> int:
|
|
206
|
+
"""Main pre-commit hook entry point.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
Exit code (0 = success, 1 = warning/error)
|
|
210
|
+
"""
|
|
211
|
+
# Load configuration
|
|
212
|
+
config = load_tag_validation_config()
|
|
213
|
+
|
|
214
|
+
# Check if TAG validation is enabled
|
|
215
|
+
if not config.get("enabled", True):
|
|
216
|
+
print("TAG validation disabled")
|
|
217
|
+
return 0
|
|
218
|
+
|
|
219
|
+
# Check if validation mode is 'off'
|
|
220
|
+
mode = config.get("mode", "warn")
|
|
221
|
+
if mode == "off":
|
|
222
|
+
print("TAG validation mode: off")
|
|
223
|
+
return 0
|
|
224
|
+
|
|
225
|
+
# Get staged files from git
|
|
226
|
+
import subprocess
|
|
227
|
+
|
|
228
|
+
try:
|
|
229
|
+
# Get list of staged Python files
|
|
230
|
+
result = subprocess.run(
|
|
231
|
+
["git", "diff", "--cached", "--name-only", "--diff-filter=ACM"],
|
|
232
|
+
capture_output=True,
|
|
233
|
+
text=True,
|
|
234
|
+
check=False,
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
if result.returncode != 0:
|
|
238
|
+
# Not in git repository or no staged files
|
|
239
|
+
return 0
|
|
240
|
+
|
|
241
|
+
staged_files = result.stdout.strip().splitlines()
|
|
242
|
+
|
|
243
|
+
# Filter for Python files only
|
|
244
|
+
python_files = [Path(f) for f in staged_files if f.endswith(".py") and Path(f).exists()]
|
|
245
|
+
|
|
246
|
+
if not python_files:
|
|
247
|
+
# No Python files staged
|
|
248
|
+
return 0
|
|
249
|
+
|
|
250
|
+
except Exception as e:
|
|
251
|
+
logger.warning(f"Error getting staged files: {e}")
|
|
252
|
+
return 0 # Don't block commit on git error
|
|
253
|
+
|
|
254
|
+
# Validate TAGs in all staged Python files
|
|
255
|
+
all_errors = []
|
|
256
|
+
|
|
257
|
+
for file_path in python_files:
|
|
258
|
+
_, file_errors = validate_file_tags(file_path, config)
|
|
259
|
+
|
|
260
|
+
if file_errors:
|
|
261
|
+
all_errors.extend(file_errors)
|
|
262
|
+
|
|
263
|
+
# Display errors
|
|
264
|
+
if all_errors:
|
|
265
|
+
print("\nTAG Validation Results:")
|
|
266
|
+
print("=" * 60)
|
|
267
|
+
|
|
268
|
+
for error in all_errors:
|
|
269
|
+
print(f" {error}")
|
|
270
|
+
|
|
271
|
+
print("=" * 60)
|
|
272
|
+
|
|
273
|
+
if mode == "enforce":
|
|
274
|
+
print("\nCommit blocked due to TAG validation errors (enforce mode)")
|
|
275
|
+
print("Fix the errors and try again, or use --no-verify to bypass")
|
|
276
|
+
else:
|
|
277
|
+
print("\nCommit allowed with warnings (warn mode)")
|
|
278
|
+
print("Consider fixing the TAG validation errors")
|
|
279
|
+
|
|
280
|
+
return 1 # Warning code
|
|
281
|
+
else:
|
|
282
|
+
print("TAG validation: All TAGs valid")
|
|
283
|
+
return 0
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
if __name__ == "__main__":
|
|
287
|
+
sys.exit(main())
|
|
@@ -0,0 +1,268 @@
|
|
|
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, 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 get_project_root() -> Path:
|
|
117
|
+
"""Get the project root directory from environment or current working directory.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
Path to the project root directory.
|
|
121
|
+
"""
|
|
122
|
+
import os
|
|
123
|
+
|
|
124
|
+
project_dir = os.environ.get("CLAUDE_PROJECT_DIR", os.getcwd())
|
|
125
|
+
return Path(project_dir).resolve()
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def check_file_path(file_path: str) -> Tuple[str, str]:
|
|
129
|
+
"""Check if file path matches any security patterns.
|
|
130
|
+
|
|
131
|
+
Security measures:
|
|
132
|
+
- Resolves symlinks and '..' components to prevent path traversal
|
|
133
|
+
- Checks both original and resolved paths against patterns
|
|
134
|
+
- Validates path is within project boundaries
|
|
135
|
+
|
|
136
|
+
Args:
|
|
137
|
+
file_path: Path to check
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
Tuple of (decision, reason)
|
|
141
|
+
decision: "allow", "deny", or "ask"
|
|
142
|
+
"""
|
|
143
|
+
# Resolve path to prevent path traversal attacks
|
|
144
|
+
# This handles: symlinks, '..' components, and normalizes the path
|
|
145
|
+
try:
|
|
146
|
+
resolved_path = Path(file_path).resolve()
|
|
147
|
+
resolved_str = str(resolved_path)
|
|
148
|
+
except (OSError, ValueError):
|
|
149
|
+
# If path resolution fails, deny for safety
|
|
150
|
+
return "deny", "Invalid file path: cannot resolve"
|
|
151
|
+
|
|
152
|
+
# Normalize original path for pattern matching (keeps relative structure visible)
|
|
153
|
+
normalized_original = file_path.replace("\\", "/")
|
|
154
|
+
normalized_resolved = resolved_str.replace("\\", "/")
|
|
155
|
+
|
|
156
|
+
# Check project boundary (optional but recommended)
|
|
157
|
+
project_root = get_project_root()
|
|
158
|
+
try:
|
|
159
|
+
resolved_path.relative_to(project_root)
|
|
160
|
+
except ValueError:
|
|
161
|
+
# Path is outside project directory - potential path traversal attack
|
|
162
|
+
return "deny", "Path traversal detected: file is outside project directory"
|
|
163
|
+
|
|
164
|
+
# Check deny patterns against BOTH original and resolved paths
|
|
165
|
+
# This catches attempts like ".env/../other.txt" (matches .env in original)
|
|
166
|
+
# AND "/absolute/path/to/.env" (matches in resolved)
|
|
167
|
+
for pattern in DENY_COMPILED:
|
|
168
|
+
if pattern.search(normalized_original) or pattern.search(normalized_resolved):
|
|
169
|
+
return "deny", "Protected file: access denied for security reasons"
|
|
170
|
+
|
|
171
|
+
# Check ask patterns against both paths
|
|
172
|
+
for pattern in ASK_COMPILED:
|
|
173
|
+
if pattern.search(normalized_original) or pattern.search(normalized_resolved):
|
|
174
|
+
return "ask", f"Critical config file: {Path(file_path).name}"
|
|
175
|
+
|
|
176
|
+
return "allow", ""
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def check_content_for_secrets(content: str) -> Tuple[bool, str]:
|
|
180
|
+
"""Check if content contains sensitive data patterns.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
content: Content to check
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
Tuple of (has_secrets, description)
|
|
187
|
+
"""
|
|
188
|
+
for pattern in SENSITIVE_COMPILED:
|
|
189
|
+
match = pattern.search(content)
|
|
190
|
+
if match:
|
|
191
|
+
# Don't reveal the actual secret or pattern
|
|
192
|
+
return True, "Detected sensitive data (credentials, API keys, or certificates)"
|
|
193
|
+
|
|
194
|
+
return False, ""
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def main() -> None:
|
|
198
|
+
"""Main entry point for PreToolUse security guard hook.
|
|
199
|
+
|
|
200
|
+
Reads JSON input from stdin, checks for security concerns,
|
|
201
|
+
and outputs permission decision.
|
|
202
|
+
"""
|
|
203
|
+
try:
|
|
204
|
+
# Read JSON input from stdin
|
|
205
|
+
input_data = json.load(sys.stdin)
|
|
206
|
+
except json.JSONDecodeError:
|
|
207
|
+
# Invalid JSON input - allow by default
|
|
208
|
+
sys.exit(0)
|
|
209
|
+
|
|
210
|
+
# Extract tool information
|
|
211
|
+
tool_name = input_data.get("tool_name", "")
|
|
212
|
+
tool_input = input_data.get("tool_input", {})
|
|
213
|
+
|
|
214
|
+
# Only process Write and Edit tools
|
|
215
|
+
if tool_name not in ("Write", "Edit"):
|
|
216
|
+
sys.exit(0)
|
|
217
|
+
|
|
218
|
+
# Get file path from tool input
|
|
219
|
+
file_path = tool_input.get("file_path", "")
|
|
220
|
+
if not file_path:
|
|
221
|
+
sys.exit(0)
|
|
222
|
+
|
|
223
|
+
# Check file path against patterns
|
|
224
|
+
decision, reason = check_file_path(file_path)
|
|
225
|
+
|
|
226
|
+
# For Write operations, also check content for secrets
|
|
227
|
+
if tool_name == "Write" and decision == "allow":
|
|
228
|
+
content = tool_input.get("content", "")
|
|
229
|
+
if content:
|
|
230
|
+
has_secrets, secret_reason = check_content_for_secrets(content)
|
|
231
|
+
if has_secrets:
|
|
232
|
+
decision = "deny"
|
|
233
|
+
reason = f"Content contains secrets: {secret_reason}"
|
|
234
|
+
|
|
235
|
+
# Build output based on decision
|
|
236
|
+
output: dict[str, Any] = {}
|
|
237
|
+
|
|
238
|
+
if decision == "deny":
|
|
239
|
+
output = {
|
|
240
|
+
"hookSpecificOutput": {
|
|
241
|
+
"hookEventName": "PreToolUse",
|
|
242
|
+
"permissionDecision": "deny",
|
|
243
|
+
"permissionDecisionReason": reason,
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
print(json.dumps(output))
|
|
247
|
+
sys.exit(0)
|
|
248
|
+
|
|
249
|
+
elif decision == "ask":
|
|
250
|
+
output = {
|
|
251
|
+
"hookSpecificOutput": {
|
|
252
|
+
"hookEventName": "PreToolUse",
|
|
253
|
+
"permissionDecision": "ask",
|
|
254
|
+
"permissionDecisionReason": reason,
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
print(json.dumps(output))
|
|
258
|
+
sys.exit(0)
|
|
259
|
+
|
|
260
|
+
else:
|
|
261
|
+
# Allow - no output needed (or suppress)
|
|
262
|
+
output = {"suppressOutput": True}
|
|
263
|
+
print(json.dumps(output))
|
|
264
|
+
sys.exit(0)
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
if __name__ == "__main__":
|
|
268
|
+
main()
|