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,208 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""PreToolUse Hook: TDD Enforcement - Check test exists before code write.
|
|
3
|
+
|
|
4
|
+
Enforces test-first development by checking for test files before allowing
|
|
5
|
+
code writes for Python, TypeScript, and JavaScript.
|
|
6
|
+
|
|
7
|
+
Exit Codes:
|
|
8
|
+
- 0: Allow write (test exists or warning mode)
|
|
9
|
+
- 2: Ask user confirmation (enforce mode, no test)
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import json
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Setup import path for shared modules
|
|
17
|
+
HOOKS_DIR = Path(__file__).parent
|
|
18
|
+
LIB_DIR = HOOKS_DIR / "lib"
|
|
19
|
+
if str(LIB_DIR) not in sys.path:
|
|
20
|
+
sys.path.insert(0, str(LIB_DIR))
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
from language_detector import detect_language, get_test_file_path
|
|
24
|
+
except ImportError:
|
|
25
|
+
# Fallback implementations
|
|
26
|
+
def detect_language(file_path: Path) -> str | None:
|
|
27
|
+
ext = file_path.suffix.lower()
|
|
28
|
+
lang_map = {
|
|
29
|
+
".py": "Python",
|
|
30
|
+
".ts": "TypeScript",
|
|
31
|
+
".tsx": "TypeScript",
|
|
32
|
+
".js": "JavaScript",
|
|
33
|
+
".jsx": "JavaScript",
|
|
34
|
+
}
|
|
35
|
+
return lang_map.get(ext)
|
|
36
|
+
|
|
37
|
+
def get_test_file_path(source_file: Path) -> Path | None:
|
|
38
|
+
stem = source_file.stem
|
|
39
|
+
ext = source_file.suffix
|
|
40
|
+
|
|
41
|
+
if ext == ".py":
|
|
42
|
+
return Path("tests") / f"test_{stem}.py"
|
|
43
|
+
elif ext in (".ts", ".tsx", ".js", ".jsx"):
|
|
44
|
+
return source_file.parent / f"{stem}.test{ext}"
|
|
45
|
+
return None
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# File patterns to skip (no test needed)
|
|
49
|
+
SKIP_PATTERNS = [
|
|
50
|
+
"/test/",
|
|
51
|
+
"_test.",
|
|
52
|
+
"_spec.",
|
|
53
|
+
".test.",
|
|
54
|
+
".spec.",
|
|
55
|
+
"config/",
|
|
56
|
+
"configs/",
|
|
57
|
+
"docs/",
|
|
58
|
+
"doc/",
|
|
59
|
+
".md",
|
|
60
|
+
".json",
|
|
61
|
+
".yaml",
|
|
62
|
+
".yml",
|
|
63
|
+
".lock",
|
|
64
|
+
".min.",
|
|
65
|
+
"__tests__/",
|
|
66
|
+
"__mocks__/",
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
# Mode configuration
|
|
70
|
+
MODES = ["warn", "enforce", "off"]
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def get_tdd_mode() -> str:
|
|
74
|
+
"""Get TDD enforcement mode from quality.yaml."""
|
|
75
|
+
config_path = Path(".moai/config/sections/quality.yaml")
|
|
76
|
+
if config_path.exists():
|
|
77
|
+
try:
|
|
78
|
+
import yaml
|
|
79
|
+
|
|
80
|
+
with open(config_path) as f:
|
|
81
|
+
config = yaml.safe_load(f)
|
|
82
|
+
mode = config.get("constitution", {}).get("tdd_mode", "warn")
|
|
83
|
+
if mode in MODES:
|
|
84
|
+
return mode
|
|
85
|
+
except Exception:
|
|
86
|
+
pass
|
|
87
|
+
return "warn"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def should_skip_file(file_path: str) -> bool:
|
|
91
|
+
"""Check if file should skip TDD enforcement.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
file_path: Path to the file
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
True if should skip, False otherwise
|
|
98
|
+
"""
|
|
99
|
+
path_lower = file_path.lower()
|
|
100
|
+
|
|
101
|
+
for pattern in SKIP_PATTERNS:
|
|
102
|
+
if pattern.lower() in path_lower:
|
|
103
|
+
return True
|
|
104
|
+
|
|
105
|
+
return False
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def main():
|
|
109
|
+
"""Main hook logic."""
|
|
110
|
+
# Read hook input
|
|
111
|
+
try:
|
|
112
|
+
input_data = json.loads(sys.stdin.read())
|
|
113
|
+
except json.JSONDecodeError:
|
|
114
|
+
# No input or invalid JSON - allow write
|
|
115
|
+
print(json.dumps({}))
|
|
116
|
+
sys.exit(0)
|
|
117
|
+
|
|
118
|
+
tool_name = input_data.get("tool_name", "")
|
|
119
|
+
tool_input = input_data.get("tool_input", {})
|
|
120
|
+
|
|
121
|
+
# Only check Write operations
|
|
122
|
+
if tool_name != "Write":
|
|
123
|
+
print(json.dumps({}))
|
|
124
|
+
sys.exit(0)
|
|
125
|
+
|
|
126
|
+
file_path = tool_input.get("file_path", "")
|
|
127
|
+
if not file_path:
|
|
128
|
+
print(json.dumps({}))
|
|
129
|
+
sys.exit(0)
|
|
130
|
+
|
|
131
|
+
# Check if should skip
|
|
132
|
+
if should_skip_file(file_path):
|
|
133
|
+
print(json.dumps({}))
|
|
134
|
+
sys.exit(0)
|
|
135
|
+
|
|
136
|
+
# Detect language
|
|
137
|
+
language = detect_language(Path(file_path))
|
|
138
|
+
if not language:
|
|
139
|
+
# Unknown language - skip silently
|
|
140
|
+
print(json.dumps({}))
|
|
141
|
+
sys.exit(0)
|
|
142
|
+
|
|
143
|
+
# Only support Python, TypeScript, JavaScript
|
|
144
|
+
if language not in ("Python", "TypeScript", "JavaScript"):
|
|
145
|
+
print(json.dumps({}))
|
|
146
|
+
sys.exit(0)
|
|
147
|
+
|
|
148
|
+
# Get expected test file path
|
|
149
|
+
test_file = get_test_file_path(Path(file_path))
|
|
150
|
+
if not test_file:
|
|
151
|
+
print(json.dumps({}))
|
|
152
|
+
sys.exit(0)
|
|
153
|
+
|
|
154
|
+
# Check if test file exists
|
|
155
|
+
test_path = Path(test_file)
|
|
156
|
+
test_exists = test_path.exists()
|
|
157
|
+
|
|
158
|
+
# Get TDD mode
|
|
159
|
+
mode = get_tdd_mode()
|
|
160
|
+
|
|
161
|
+
if mode == "off":
|
|
162
|
+
print(json.dumps({}))
|
|
163
|
+
sys.exit(0)
|
|
164
|
+
|
|
165
|
+
output = {
|
|
166
|
+
"hookSpecificOutput": {
|
|
167
|
+
"hookEventName": "PreToolUse",
|
|
168
|
+
"permissionDecision": "allow", # Default: allow write
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if test_exists:
|
|
173
|
+
# Test file exists - allow write
|
|
174
|
+
output["hookSpecificOutput"]["additionalContext"] = f"TDD check passed for {language}: {test_file} exists"
|
|
175
|
+
print(json.dumps(output))
|
|
176
|
+
sys.exit(0)
|
|
177
|
+
|
|
178
|
+
# No test file - handle based on mode
|
|
179
|
+
if mode == "warn":
|
|
180
|
+
output["hookSpecificOutput"]["permissionDecision"] = "allow"
|
|
181
|
+
output["hookSpecificOutput"]["permissionDecisionReason"] = (
|
|
182
|
+
f"TDD Reminder ({language}): Test file not found.\n"
|
|
183
|
+
f"Expected: {test_file}\n"
|
|
184
|
+
f"Best practice: Write test first, then implement code.\n"
|
|
185
|
+
f"Continuing with code write..."
|
|
186
|
+
)
|
|
187
|
+
print(json.dumps(output))
|
|
188
|
+
sys.exit(0)
|
|
189
|
+
|
|
190
|
+
elif mode == "enforce":
|
|
191
|
+
output["hookSpecificOutput"]["permissionDecision"] = "ask"
|
|
192
|
+
output["hookSpecificOutput"]["permissionDecisionReason"] = (
|
|
193
|
+
f"TDD Enforcement ({language}): Test file required.\n\n"
|
|
194
|
+
f"Please create test file first:\n"
|
|
195
|
+
f"1. Create {test_file}\n"
|
|
196
|
+
f"2. Write test cases\n"
|
|
197
|
+
f"3. Then implement code\n\n"
|
|
198
|
+
f"Or configure tdd_mode: warn in quality.yaml to disable enforcement."
|
|
199
|
+
)
|
|
200
|
+
print(json.dumps(output))
|
|
201
|
+
sys.exit(2) # Ask user for confirmation
|
|
202
|
+
|
|
203
|
+
print(json.dumps({}))
|
|
204
|
+
sys.exit(0)
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
if __name__ == "__main__":
|
|
208
|
+
main()
|
|
@@ -18,6 +18,8 @@ Features:
|
|
|
18
18
|
- Generate session summary message
|
|
19
19
|
"""
|
|
20
20
|
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
21
23
|
import json
|
|
22
24
|
import logging
|
|
23
25
|
import shutil
|
|
@@ -26,12 +28,29 @@ import sys
|
|
|
26
28
|
import time
|
|
27
29
|
from datetime import datetime, timedelta
|
|
28
30
|
from pathlib import Path
|
|
29
|
-
from typing import Any
|
|
31
|
+
from typing import Any
|
|
32
|
+
|
|
33
|
+
# =============================================================================
|
|
34
|
+
# Windows UTF-8 Encoding Fix (Issue #249)
|
|
35
|
+
# Ensures emoji characters are properly displayed on Windows terminals
|
|
36
|
+
# =============================================================================
|
|
37
|
+
if sys.platform == "win32":
|
|
38
|
+
try:
|
|
39
|
+
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
40
|
+
sys.stderr.reconfigure(encoding="utf-8", errors="replace")
|
|
41
|
+
except (AttributeError, OSError):
|
|
42
|
+
# Python < 3.7 or reconfigure not available
|
|
43
|
+
pass
|
|
30
44
|
|
|
31
45
|
# Add module path
|
|
32
46
|
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "src"))
|
|
33
47
|
|
|
34
|
-
from lib.
|
|
48
|
+
from lib.atomic_write import atomic_write_json # noqa: E402
|
|
49
|
+
from lib.path_utils import ( # noqa: E402
|
|
50
|
+
ensure_moai_dir,
|
|
51
|
+
find_project_root,
|
|
52
|
+
get_safe_moai_path,
|
|
53
|
+
)
|
|
35
54
|
|
|
36
55
|
# Import unified timeout manager and Git operations manager
|
|
37
56
|
try:
|
|
@@ -120,40 +139,52 @@ logger = logging.getLogger(__name__)
|
|
|
120
139
|
|
|
121
140
|
|
|
122
141
|
def load_hook_timeout() -> int:
|
|
123
|
-
"""Load hook timeout from config.
|
|
142
|
+
"""Load hook timeout from config.yaml (default: 5000ms)
|
|
143
|
+
|
|
144
|
+
Uses try/except instead of exists() check to prevent TOCTOU race conditions.
|
|
124
145
|
|
|
125
146
|
Returns:
|
|
126
147
|
Timeout in milliseconds
|
|
127
148
|
"""
|
|
128
149
|
try:
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
150
|
+
import yaml
|
|
151
|
+
|
|
152
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
153
|
+
# Direct open without exists() check to prevent race condition
|
|
154
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
155
|
+
config: dict[str, Any] = yaml.safe_load(f) or {}
|
|
156
|
+
return config.get("hooks", {}).get("timeout_ms", 5000)
|
|
157
|
+
except FileNotFoundError:
|
|
158
|
+
pass # Config file doesn't exist, use default
|
|
134
159
|
except Exception:
|
|
135
|
-
pass
|
|
160
|
+
pass # Config file corrupted or invalid, use default
|
|
136
161
|
return 5000
|
|
137
162
|
|
|
138
163
|
|
|
139
164
|
def get_graceful_degradation() -> bool:
|
|
140
|
-
"""Load graceful_degradation setting from config.
|
|
165
|
+
"""Load graceful_degradation setting from config.yaml (default: true)
|
|
166
|
+
|
|
167
|
+
Uses try/except instead of exists() check to prevent TOCTOU race conditions.
|
|
141
168
|
|
|
142
169
|
Returns:
|
|
143
170
|
Whether graceful degradation is enabled
|
|
144
171
|
"""
|
|
145
172
|
try:
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
173
|
+
import yaml
|
|
174
|
+
|
|
175
|
+
config_file = get_safe_moai_path("config/config.yaml")
|
|
176
|
+
# Direct open without exists() check to prevent race condition
|
|
177
|
+
with open(config_file, "r", encoding="utf-8") as f:
|
|
178
|
+
config: dict[str, Any] = yaml.safe_load(f) or {}
|
|
179
|
+
return config.get("hooks", {}).get("graceful_degradation", True)
|
|
180
|
+
except FileNotFoundError:
|
|
181
|
+
pass # Config file doesn't exist, use default
|
|
151
182
|
except Exception:
|
|
152
|
-
pass
|
|
183
|
+
pass # Config file corrupted or invalid, use default
|
|
153
184
|
return True
|
|
154
185
|
|
|
155
186
|
|
|
156
|
-
def cleanup_old_files(config:
|
|
187
|
+
def cleanup_old_files(config: dict[str, Any]) -> dict[str, int]:
|
|
157
188
|
"""Clean up old files
|
|
158
189
|
|
|
159
190
|
Args:
|
|
@@ -172,13 +203,13 @@ def cleanup_old_files(config: Dict[str, Any]) -> Dict[str, int]:
|
|
|
172
203
|
cleanup_days = cleanup_config.get("cleanup_days", 7)
|
|
173
204
|
cutoff_date = datetime.now() - timedelta(days=cleanup_days)
|
|
174
205
|
|
|
175
|
-
# Clean up temporary files
|
|
176
|
-
temp_dir =
|
|
206
|
+
# Clean up temporary files (use safe path to prevent creation in wrong directory)
|
|
207
|
+
temp_dir = get_safe_moai_path("temp")
|
|
177
208
|
if temp_dir.exists():
|
|
178
209
|
stats["temp_cleaned"] = cleanup_directory(temp_dir, cutoff_date, None, patterns=["*"])
|
|
179
210
|
|
|
180
|
-
# Clean up cache files
|
|
181
|
-
cache_dir =
|
|
211
|
+
# Clean up cache files (use safe path to prevent creation in wrong directory)
|
|
212
|
+
cache_dir = get_safe_moai_path("cache")
|
|
182
213
|
if cache_dir.exists():
|
|
183
214
|
stats["cache_cleaned"] = cleanup_directory(cache_dir, cutoff_date, None, patterns=["*"])
|
|
184
215
|
|
|
@@ -193,8 +224,8 @@ def cleanup_old_files(config: Dict[str, Any]) -> Dict[str, int]:
|
|
|
193
224
|
def cleanup_directory(
|
|
194
225
|
directory: Path,
|
|
195
226
|
cutoff_date: datetime,
|
|
196
|
-
max_files:
|
|
197
|
-
patterns:
|
|
227
|
+
max_files: int | None,
|
|
228
|
+
patterns: list[str],
|
|
198
229
|
) -> int:
|
|
199
230
|
"""Clean up directory files
|
|
200
231
|
|
|
@@ -246,7 +277,7 @@ def cleanup_directory(
|
|
|
246
277
|
return cleaned_count
|
|
247
278
|
|
|
248
279
|
|
|
249
|
-
def save_session_metrics(payload:
|
|
280
|
+
def save_session_metrics(payload: dict[str, Any]) -> bool:
|
|
250
281
|
"""Save session metrics (P0-1)
|
|
251
282
|
|
|
252
283
|
Args:
|
|
@@ -256,9 +287,8 @@ def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
|
256
287
|
Success status
|
|
257
288
|
"""
|
|
258
289
|
try:
|
|
259
|
-
# Create logs directory
|
|
260
|
-
logs_dir =
|
|
261
|
-
logs_dir.mkdir(parents=True, exist_ok=True)
|
|
290
|
+
# Create logs directory (use ensure_moai_dir for safe creation in project root)
|
|
291
|
+
logs_dir = ensure_moai_dir("logs/sessions")
|
|
262
292
|
|
|
263
293
|
# Collect session information
|
|
264
294
|
session_metrics = {
|
|
@@ -270,10 +300,9 @@ def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
|
270
300
|
"specs_worked_on": extract_specs_from_memory(),
|
|
271
301
|
}
|
|
272
302
|
|
|
273
|
-
# Save session metrics
|
|
303
|
+
# Save session metrics using atomic write (H3)
|
|
274
304
|
session_file = logs_dir / f"session-{session_metrics['session_id']}.json"
|
|
275
|
-
|
|
276
|
-
json.dump(session_metrics, f, indent=2, ensure_ascii=False)
|
|
305
|
+
atomic_write_json(session_file, session_metrics, indent=2, ensure_ascii=False)
|
|
277
306
|
|
|
278
307
|
logger.info(f"Session metrics saved: {session_file}")
|
|
279
308
|
return True
|
|
@@ -283,7 +312,7 @@ def save_session_metrics(payload: Dict[str, Any]) -> bool:
|
|
|
283
312
|
return False
|
|
284
313
|
|
|
285
314
|
|
|
286
|
-
def save_work_state(payload:
|
|
315
|
+
def save_work_state(payload: dict[str, Any]) -> bool:
|
|
287
316
|
"""Save work state snapshot (P0-2)
|
|
288
317
|
|
|
289
318
|
Args:
|
|
@@ -293,9 +322,8 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
293
322
|
Success status
|
|
294
323
|
"""
|
|
295
324
|
try:
|
|
296
|
-
# Create memory directory
|
|
297
|
-
|
|
298
|
-
memory_dir.mkdir(parents=True, exist_ok=True)
|
|
325
|
+
# Create memory directory (use ensure_moai_dir for safe creation in project root)
|
|
326
|
+
ensure_moai_dir("memory")
|
|
299
327
|
|
|
300
328
|
# Collect work state
|
|
301
329
|
work_state = {
|
|
@@ -306,10 +334,9 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
306
334
|
"specs_in_progress": extract_specs_from_memory(),
|
|
307
335
|
}
|
|
308
336
|
|
|
309
|
-
# Save state
|
|
310
|
-
state_file =
|
|
311
|
-
|
|
312
|
-
json.dump(work_state, f, indent=2, ensure_ascii=False)
|
|
337
|
+
# Save work state using atomic write (H3)
|
|
338
|
+
state_file = get_safe_moai_path("memory/last-session-state.json")
|
|
339
|
+
atomic_write_json(state_file, work_state, indent=2, ensure_ascii=False)
|
|
313
340
|
|
|
314
341
|
logger.info(f"Work state saved: {state_file}")
|
|
315
342
|
return True
|
|
@@ -319,7 +346,7 @@ def save_work_state(payload: Dict[str, Any]) -> bool:
|
|
|
319
346
|
return False
|
|
320
347
|
|
|
321
348
|
|
|
322
|
-
def check_uncommitted_changes() ->
|
|
349
|
+
def check_uncommitted_changes() -> str | None:
|
|
323
350
|
"""Warn uncommitted changes (P0-3) using optimized Git operations
|
|
324
351
|
|
|
325
352
|
Returns:
|
|
@@ -367,7 +394,7 @@ def check_uncommitted_changes() -> Optional[str]:
|
|
|
367
394
|
return None
|
|
368
395
|
|
|
369
396
|
|
|
370
|
-
def get_current_branch() ->
|
|
397
|
+
def get_current_branch() -> str | None:
|
|
371
398
|
"""Get current Git branch name using optimized Git operations
|
|
372
399
|
|
|
373
400
|
Returns:
|
|
@@ -487,21 +514,28 @@ def count_recent_commits() -> int:
|
|
|
487
514
|
return 0
|
|
488
515
|
|
|
489
516
|
|
|
490
|
-
def extract_specs_from_memory() ->
|
|
491
|
-
"""Extract SPEC information from memory
|
|
492
|
-
specs = []
|
|
493
|
-
|
|
494
|
-
try:
|
|
495
|
-
# Query recent SPECs from command_execution_state.json
|
|
496
|
-
state_file = Path(".moai/memory/command-execution-state.json")
|
|
497
|
-
if state_file.exists():
|
|
498
|
-
with open(state_file, "r", encoding="utf-8") as f:
|
|
499
|
-
state_data = json.load(f)
|
|
517
|
+
def extract_specs_from_memory() -> list[str]:
|
|
518
|
+
"""Extract SPEC information from memory
|
|
500
519
|
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
520
|
+
Uses try/except instead of exists() check to prevent TOCTOU race conditions.
|
|
521
|
+
"""
|
|
522
|
+
specs: list[str] = []
|
|
504
523
|
|
|
524
|
+
try:
|
|
525
|
+
# Query recent SPECs from command_execution_state.json (use safe path)
|
|
526
|
+
state_file = get_safe_moai_path("memory/command-execution-state.json")
|
|
527
|
+
# Direct open without exists() check to prevent race condition
|
|
528
|
+
with open(state_file, "r", encoding="utf-8") as f:
|
|
529
|
+
state_data = json.load(f)
|
|
530
|
+
|
|
531
|
+
# Extract recent SPEC IDs
|
|
532
|
+
if "last_specs" in state_data:
|
|
533
|
+
specs = state_data["last_specs"][:3] # Latest 3
|
|
534
|
+
|
|
535
|
+
except FileNotFoundError:
|
|
536
|
+
pass # State file doesn't exist yet, return empty list
|
|
537
|
+
except (json.JSONDecodeError, KeyError, TypeError) as e:
|
|
538
|
+
logger.warning(f"Failed to parse specs from memory: {e}")
|
|
505
539
|
except Exception as e:
|
|
506
540
|
logger.warning(f"Failed to extract specs from memory: {e}")
|
|
507
541
|
|
|
@@ -512,7 +546,7 @@ def extract_specs_from_memory() -> List[str]:
|
|
|
512
546
|
# are now imported from lib.common (consolidated from duplicate implementations)
|
|
513
547
|
|
|
514
548
|
|
|
515
|
-
def scan_root_violations(config:
|
|
549
|
+
def scan_root_violations(config: dict[str, Any]) -> list[dict[str, str]]:
|
|
516
550
|
"""Scan project root for document management violations
|
|
517
551
|
|
|
518
552
|
Args:
|
|
@@ -524,10 +558,8 @@ def scan_root_violations(config: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
|
524
558
|
violations = []
|
|
525
559
|
|
|
526
560
|
try:
|
|
527
|
-
# Get project root
|
|
528
|
-
project_root =
|
|
529
|
-
if not project_root.exists():
|
|
530
|
-
project_root = find_project_root()
|
|
561
|
+
# Get project root (always use find_project_root for consistent behavior)
|
|
562
|
+
project_root = find_project_root()
|
|
531
563
|
|
|
532
564
|
# Scan root directory
|
|
533
565
|
for item in project_root.iterdir():
|
|
@@ -563,7 +595,7 @@ def scan_root_violations(config: Dict[str, Any]) -> List[Dict[str, str]]:
|
|
|
563
595
|
return violations
|
|
564
596
|
|
|
565
597
|
|
|
566
|
-
def generate_migration_report(violations:
|
|
598
|
+
def generate_migration_report(violations: list[dict[str, str]]) -> str:
|
|
567
599
|
"""Generate migration suggestions report
|
|
568
600
|
|
|
569
601
|
Args:
|
|
@@ -592,7 +624,7 @@ def generate_migration_report(violations: List[Dict[str, str]]) -> str:
|
|
|
592
624
|
|
|
593
625
|
|
|
594
626
|
def generate_session_summary(
|
|
595
|
-
cleanup_stats:
|
|
627
|
+
cleanup_stats: dict[str, int], work_state: dict[str, Any], violations_count: int = 0
|
|
596
628
|
) -> str:
|
|
597
629
|
"""Generate session summary (P1-3)
|
|
598
630
|
|
|
@@ -632,7 +664,7 @@ def generate_session_summary(
|
|
|
632
664
|
return "\n".join(summary_lines)
|
|
633
665
|
|
|
634
666
|
|
|
635
|
-
def execute_session_end_workflow() -> tuple[
|
|
667
|
+
def execute_session_end_workflow() -> tuple[dict[str, Any], str]:
|
|
636
668
|
"""Execute the session end workflow with proper error handling"""
|
|
637
669
|
start_time = time.time()
|
|
638
670
|
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""MoAI Rank Session Hook
|
|
3
|
+
|
|
4
|
+
This hook submits Claude Code session token usage to the MoAI Rank service.
|
|
5
|
+
It is triggered automatically when a session ends.
|
|
6
|
+
|
|
7
|
+
The hook reads session data from stdin and submits it to the rank service
|
|
8
|
+
if the user has registered with MoAI Rank.
|
|
9
|
+
|
|
10
|
+
Requirements:
|
|
11
|
+
- User must be registered: Run `moai-adk rank register` to connect GitHub account
|
|
12
|
+
- API key stored securely in ~/.moai/rank/credentials.json
|
|
13
|
+
|
|
14
|
+
Privacy:
|
|
15
|
+
- Only token counts are submitted (input, output, cache tokens)
|
|
16
|
+
- Project paths are anonymized using one-way hashing
|
|
17
|
+
- No code or conversation content is transmitted
|
|
18
|
+
|
|
19
|
+
Opt-out: Configure ~/.moai/rank/config.yaml to exclude specific projects:
|
|
20
|
+
rank:
|
|
21
|
+
enabled: true
|
|
22
|
+
exclude_projects:
|
|
23
|
+
- "/path/to/private-project"
|
|
24
|
+
- "*/confidential/*"
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import json
|
|
28
|
+
import sys
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def main():
|
|
32
|
+
"""Main hook entry point."""
|
|
33
|
+
try:
|
|
34
|
+
# Read session data from stdin
|
|
35
|
+
input_data = sys.stdin.read()
|
|
36
|
+
if not input_data:
|
|
37
|
+
return
|
|
38
|
+
|
|
39
|
+
session_data = json.loads(input_data)
|
|
40
|
+
|
|
41
|
+
# Lazy import to avoid startup delay
|
|
42
|
+
try:
|
|
43
|
+
from moai_adk.rank.hook import is_project_excluded, submit_session_hook
|
|
44
|
+
except ImportError:
|
|
45
|
+
# moai-adk not installed or rank module not available
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
# Check if this project is excluded
|
|
49
|
+
project_path = session_data.get("projectPath") or session_data.get("cwd")
|
|
50
|
+
if is_project_excluded(project_path):
|
|
51
|
+
return # Silently skip excluded projects
|
|
52
|
+
|
|
53
|
+
result = submit_session_hook(session_data)
|
|
54
|
+
|
|
55
|
+
if result["success"]:
|
|
56
|
+
print("Session submitted to MoAI Rank", file=sys.stderr)
|
|
57
|
+
elif result["message"] and result["message"] != "Not registered with MoAI Rank":
|
|
58
|
+
print(f"MoAI Rank: {result['message']}", file=sys.stderr)
|
|
59
|
+
|
|
60
|
+
except json.JSONDecodeError:
|
|
61
|
+
# Invalid JSON input, silently skip
|
|
62
|
+
pass
|
|
63
|
+
except Exception as e:
|
|
64
|
+
# Log errors but don't fail the hook
|
|
65
|
+
print(f"MoAI Rank hook error: {e}", file=sys.stderr)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if __name__ == "__main__":
|
|
69
|
+
main()
|