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,372 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
"""
|
|
4
|
+
Enhanced Output Style Detector for Claude Code Statusline
|
|
5
|
+
|
|
6
|
+
This module provides real-time detection of Claude Code's current output style
|
|
7
|
+
by analyzing session context, environment variables, and behavioral indicators.
|
|
8
|
+
|
|
9
|
+
Key improvements:
|
|
10
|
+
1. Real-time session context analysis
|
|
11
|
+
2. Multiple detection methods with priority ordering
|
|
12
|
+
3. Behavioral pattern recognition
|
|
13
|
+
4. Robust error handling and graceful degradation
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import time
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any, Dict, Optional
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OutputStyleDetector:
|
|
25
|
+
"""
|
|
26
|
+
Enhanced output style detector with multiple detection strategies.
|
|
27
|
+
|
|
28
|
+
Detection Priority:
|
|
29
|
+
1. Session context (most reliable)
|
|
30
|
+
2. Environment variables
|
|
31
|
+
3. Behavioral analysis
|
|
32
|
+
4. Settings file (fallback)
|
|
33
|
+
5. Heuristics (last resort)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Style mapping for consistent display format
|
|
37
|
+
STYLE_MAPPING = {
|
|
38
|
+
# Internal style names
|
|
39
|
+
"streaming": "R2-D2",
|
|
40
|
+
"explanatory": "Explanatory",
|
|
41
|
+
"concise": "Concise",
|
|
42
|
+
"detailed": "Detailed",
|
|
43
|
+
"yoda": "🧙 Yoda Master",
|
|
44
|
+
"yoda-master": "🧙 Yoda Master",
|
|
45
|
+
"tutorial": "🧙 Yoda Master",
|
|
46
|
+
# Display values with emojis
|
|
47
|
+
"🤖 R2-D2": "R2-D2",
|
|
48
|
+
"R2-D2": "R2-D2",
|
|
49
|
+
"🧙 Explanatory": "Explanatory",
|
|
50
|
+
"Explanatory": "Explanatory",
|
|
51
|
+
"🧙 Concise": "Concise",
|
|
52
|
+
"Concise": "Concise",
|
|
53
|
+
"🧙 Detailed": "Detailed",
|
|
54
|
+
"Detailed": "Detailed",
|
|
55
|
+
"🧙 Yoda Master": "🧙 Yoda Master",
|
|
56
|
+
"Yoda Master": "🧙 Yoda Master",
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
def __init__(self):
|
|
60
|
+
self.cache = {}
|
|
61
|
+
self.cache_ttl: float = 5.0 # Cache for 5 seconds to balance performance and accuracy
|
|
62
|
+
|
|
63
|
+
def detect_from_session_context(self, session_data: Dict[str, Any]) -> Optional[str]:
|
|
64
|
+
"""
|
|
65
|
+
Detect output style from Claude Code session context.
|
|
66
|
+
|
|
67
|
+
This is the most reliable method as it uses real-time session data.
|
|
68
|
+
"""
|
|
69
|
+
try:
|
|
70
|
+
# Method 1: Check explicit outputStyle in session
|
|
71
|
+
if "outputStyle" in session_data:
|
|
72
|
+
style = session_data["outputStyle"]
|
|
73
|
+
if style:
|
|
74
|
+
return self._normalize_style(style)
|
|
75
|
+
|
|
76
|
+
# Method 2: Check model configuration for style indicators
|
|
77
|
+
model_info = session_data.get("model", {})
|
|
78
|
+
if isinstance(model_info, dict):
|
|
79
|
+
model_name = model_info.get("name", "").lower()
|
|
80
|
+
display_name = model_info.get("display_name", "").lower()
|
|
81
|
+
|
|
82
|
+
# Check for style indicators in model names
|
|
83
|
+
for text in [model_name, display_name]:
|
|
84
|
+
if "explanatory" in text:
|
|
85
|
+
return "Explanatory"
|
|
86
|
+
elif "yoda" in text or "tutorial" in text:
|
|
87
|
+
return "🧙 Yoda Master"
|
|
88
|
+
elif "concise" in text:
|
|
89
|
+
return "Concise"
|
|
90
|
+
elif "detailed" in text:
|
|
91
|
+
return "Detailed"
|
|
92
|
+
elif "streaming" in text or "r2d2" in text:
|
|
93
|
+
return "R2-D2"
|
|
94
|
+
|
|
95
|
+
# Method 3: Check conversation patterns
|
|
96
|
+
messages = session_data.get("messages", [])
|
|
97
|
+
if messages:
|
|
98
|
+
# Analyze recent message patterns for style indicators
|
|
99
|
+
recent_messages = messages[-3:] # Last 3 messages
|
|
100
|
+
return self._analyze_message_patterns(recent_messages)
|
|
101
|
+
|
|
102
|
+
except Exception as e:
|
|
103
|
+
# Log error but don't fail - continue to next detection method
|
|
104
|
+
print(f"Session context detection error: {e}", file=sys.stderr)
|
|
105
|
+
|
|
106
|
+
return None
|
|
107
|
+
|
|
108
|
+
def detect_from_environment(self) -> Optional[str]:
|
|
109
|
+
"""
|
|
110
|
+
Detect output style from environment variables.
|
|
111
|
+
"""
|
|
112
|
+
try:
|
|
113
|
+
# Check for explicit environment variable
|
|
114
|
+
if "CLAUDE_OUTPUT_STYLE" in os.environ:
|
|
115
|
+
env_style = os.environ["CLAUDE_OUTPUT_STYLE"]
|
|
116
|
+
if env_style:
|
|
117
|
+
return self._normalize_style(env_style)
|
|
118
|
+
|
|
119
|
+
# Check for Claude Code session indicators
|
|
120
|
+
if "CLAUDE_SESSION_ID" in os.environ:
|
|
121
|
+
# Could integrate with Claude Code session management
|
|
122
|
+
pass
|
|
123
|
+
|
|
124
|
+
# Check for process name or command line indicators
|
|
125
|
+
try:
|
|
126
|
+
# This could be enhanced with process inspection if needed
|
|
127
|
+
pass
|
|
128
|
+
except Exception:
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
except Exception as e:
|
|
132
|
+
print(f"Environment detection error: {e}", file=sys.stderr)
|
|
133
|
+
|
|
134
|
+
return None
|
|
135
|
+
|
|
136
|
+
def detect_from_behavioral_analysis(self) -> Optional[str]:
|
|
137
|
+
"""
|
|
138
|
+
Analyze behavioral patterns to infer current output style.
|
|
139
|
+
|
|
140
|
+
This method uses heuristics based on file system state and recent activity.
|
|
141
|
+
"""
|
|
142
|
+
try:
|
|
143
|
+
cwd = Path.cwd()
|
|
144
|
+
|
|
145
|
+
# Check for active Yoda session indicators
|
|
146
|
+
moai_dir = cwd / ".moai"
|
|
147
|
+
if moai_dir.exists():
|
|
148
|
+
# Look for recent Yoda-related activity
|
|
149
|
+
yoda_files = list(moai_dir.rglob("*yoda*"))
|
|
150
|
+
if yoda_files:
|
|
151
|
+
# Check if any Yoda files are recently modified
|
|
152
|
+
recent_yoda = any(f.stat().st_mtime > (time.time() - 300) for f in yoda_files) # Last 5 minutes
|
|
153
|
+
if recent_yoda:
|
|
154
|
+
return "🧙 Yoda Master"
|
|
155
|
+
|
|
156
|
+
# Check for extensive documentation (might indicate Explanatory mode)
|
|
157
|
+
docs_dir = cwd / "docs"
|
|
158
|
+
if docs_dir.exists():
|
|
159
|
+
md_files = list(docs_dir.rglob("*.md"))
|
|
160
|
+
if len(md_files) > 10: # Heuristic threshold
|
|
161
|
+
return "Explanatory"
|
|
162
|
+
|
|
163
|
+
# Check for TODO/task tracking patterns
|
|
164
|
+
todo_file = cwd / ".moai" / "current_session_todo.txt"
|
|
165
|
+
if todo_file.exists():
|
|
166
|
+
content = todo_file.read_text()
|
|
167
|
+
if "plan" in content.lower() or "phase" in content.lower():
|
|
168
|
+
return "Explanatory"
|
|
169
|
+
|
|
170
|
+
except Exception as e:
|
|
171
|
+
print(f"Behavioral analysis error: {e}", file=sys.stderr)
|
|
172
|
+
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
def detect_from_settings(self) -> Optional[str]:
|
|
176
|
+
"""
|
|
177
|
+
Detect output style from settings.json file.
|
|
178
|
+
|
|
179
|
+
This is the least reliable method as it may not reflect current session.
|
|
180
|
+
"""
|
|
181
|
+
try:
|
|
182
|
+
settings_path = Path.cwd() / ".claude" / "settings.json"
|
|
183
|
+
if settings_path.exists():
|
|
184
|
+
with open(settings_path, "r", encoding="utf-8") as f:
|
|
185
|
+
settings = json.load(f)
|
|
186
|
+
output_style = settings.get("outputStyle", "")
|
|
187
|
+
|
|
188
|
+
if output_style:
|
|
189
|
+
return self._normalize_style(output_style)
|
|
190
|
+
|
|
191
|
+
except Exception as e:
|
|
192
|
+
print(f"Settings file detection error: {e}", file=sys.stderr)
|
|
193
|
+
|
|
194
|
+
return None
|
|
195
|
+
|
|
196
|
+
def _normalize_style(self, style: str) -> str:
|
|
197
|
+
"""
|
|
198
|
+
Normalize style name to consistent display format.
|
|
199
|
+
"""
|
|
200
|
+
if not style:
|
|
201
|
+
return "Unknown"
|
|
202
|
+
|
|
203
|
+
# Direct mapping lookup
|
|
204
|
+
if style in self.STYLE_MAPPING:
|
|
205
|
+
return self.STYLE_MAPPING[style]
|
|
206
|
+
|
|
207
|
+
# Case-insensitive lookup
|
|
208
|
+
style_lower = style.lower()
|
|
209
|
+
for key, value in self.STYLE_MAPPING.items():
|
|
210
|
+
if key.lower() == style_lower:
|
|
211
|
+
return value
|
|
212
|
+
|
|
213
|
+
# Pattern-based normalization
|
|
214
|
+
if "r2d2" in style_lower or "streaming" in style_lower:
|
|
215
|
+
return "R2-D2"
|
|
216
|
+
elif "yoda" in style_lower or "master" in style_lower:
|
|
217
|
+
return "🧙 Yoda Master"
|
|
218
|
+
elif "explanatory" in style_lower:
|
|
219
|
+
return "Explanatory"
|
|
220
|
+
elif "concise" in style_lower:
|
|
221
|
+
return "Concise"
|
|
222
|
+
elif "detailed" in style_lower:
|
|
223
|
+
return "Detailed"
|
|
224
|
+
|
|
225
|
+
# Extract from emoji-prefixed values
|
|
226
|
+
if "🤖" in style:
|
|
227
|
+
return "R2-D2"
|
|
228
|
+
elif "🧙" in style:
|
|
229
|
+
# Extract the part after emoji
|
|
230
|
+
parts = style.split("🧙", 1)
|
|
231
|
+
if len(parts) > 1:
|
|
232
|
+
extracted = parts[1].strip()
|
|
233
|
+
return self._normalize_style(extracted)
|
|
234
|
+
|
|
235
|
+
# Fallback: capitalize first letter
|
|
236
|
+
return style.title() if style else "Unknown"
|
|
237
|
+
|
|
238
|
+
def _analyze_message_patterns(self, messages: list) -> Optional[str]:
|
|
239
|
+
"""
|
|
240
|
+
Analyze recent message patterns for style indicators.
|
|
241
|
+
"""
|
|
242
|
+
try:
|
|
243
|
+
if not messages:
|
|
244
|
+
return None
|
|
245
|
+
|
|
246
|
+
# Look for style indicators in recent responses
|
|
247
|
+
full_text = " ".join(msg.get("content", "") for msg in messages[-3:] if msg.get("role") == "assistant")
|
|
248
|
+
|
|
249
|
+
if not full_text:
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
# Style heuristics based on response patterns
|
|
253
|
+
text_lower = full_text.lower()
|
|
254
|
+
|
|
255
|
+
# Yoda Master indicators
|
|
256
|
+
yoda_indicators = [
|
|
257
|
+
"young padawan",
|
|
258
|
+
"the force",
|
|
259
|
+
"master",
|
|
260
|
+
"wisdom",
|
|
261
|
+
"patience",
|
|
262
|
+
]
|
|
263
|
+
yoda_count = sum(1 for indicator in yoda_indicators if indicator in text_lower)
|
|
264
|
+
|
|
265
|
+
if yoda_count >= 2:
|
|
266
|
+
return "🧙 Yoda Master"
|
|
267
|
+
|
|
268
|
+
# Explanatory indicators
|
|
269
|
+
if len(full_text) > 2000: # Long responses
|
|
270
|
+
explanatory_count = sum(
|
|
271
|
+
1
|
|
272
|
+
for phrase in [
|
|
273
|
+
"let me explain",
|
|
274
|
+
"here's how",
|
|
275
|
+
"the reason is",
|
|
276
|
+
"to understand",
|
|
277
|
+
]
|
|
278
|
+
if phrase in text_lower
|
|
279
|
+
)
|
|
280
|
+
if explanatory_count >= 2:
|
|
281
|
+
return "Explanatory"
|
|
282
|
+
|
|
283
|
+
# Concise indicators
|
|
284
|
+
if len(full_text) < 500:
|
|
285
|
+
return "Concise"
|
|
286
|
+
|
|
287
|
+
# Default fallback
|
|
288
|
+
return "R2-D2"
|
|
289
|
+
|
|
290
|
+
except Exception as e:
|
|
291
|
+
print(f"Message pattern analysis error: {e}", file=sys.stderr)
|
|
292
|
+
return None
|
|
293
|
+
|
|
294
|
+
def get_output_style(self, session_context: Optional[Dict[str, Any]] = None) -> str:
|
|
295
|
+
"""
|
|
296
|
+
Get the current output style using all available detection methods.
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
session_context: Optional session context from Claude Code
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
Normalized output style string
|
|
303
|
+
"""
|
|
304
|
+
# Use cache if available and fresh
|
|
305
|
+
cache_key = f"{id(session_context)}_{hash(str(session_context))}"
|
|
306
|
+
current_time = time.time()
|
|
307
|
+
|
|
308
|
+
if cache_key in self.cache:
|
|
309
|
+
cached_style, cached_time = self.cache[cache_key]
|
|
310
|
+
if current_time - cached_time < self.cache_ttl:
|
|
311
|
+
return cached_style
|
|
312
|
+
|
|
313
|
+
# Detection methods in priority order
|
|
314
|
+
detection_methods = [
|
|
315
|
+
(
|
|
316
|
+
"Session Context",
|
|
317
|
+
lambda: self.detect_from_session_context(session_context or {}),
|
|
318
|
+
),
|
|
319
|
+
("Environment", self.detect_from_environment),
|
|
320
|
+
("Behavioral Analysis", self.detect_from_behavioral_analysis),
|
|
321
|
+
("Settings File", self.detect_from_settings),
|
|
322
|
+
]
|
|
323
|
+
|
|
324
|
+
for method_name, method_func in detection_methods:
|
|
325
|
+
try:
|
|
326
|
+
style = method_func()
|
|
327
|
+
if style and style != "Unknown":
|
|
328
|
+
# Cache the result
|
|
329
|
+
self.cache[cache_key] = (style, current_time)
|
|
330
|
+
return style
|
|
331
|
+
except Exception as e:
|
|
332
|
+
print(f"{method_name} detection failed: {e}", file=sys.stderr)
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
# Default fallback - Mr. Alfred is the default output style
|
|
336
|
+
return "Mr. Alfred"
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def safe_collect_output_style() -> str:
|
|
340
|
+
"""
|
|
341
|
+
Legacy compatibility function that maintains the original interface.
|
|
342
|
+
|
|
343
|
+
This function provides backward compatibility with the existing statusline
|
|
344
|
+
system while using the enhanced detection capabilities.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
Detected output style string
|
|
348
|
+
"""
|
|
349
|
+
try:
|
|
350
|
+
# Read session context from stdin if available
|
|
351
|
+
session_context = {}
|
|
352
|
+
try:
|
|
353
|
+
# Handle Docker/non-interactive environments by checking TTY
|
|
354
|
+
input_data = sys.stdin.read() if not sys.stdin.isatty() else "{}"
|
|
355
|
+
if input_data.strip():
|
|
356
|
+
session_context = json.loads(input_data)
|
|
357
|
+
except (json.JSONDecodeError, EOFError):
|
|
358
|
+
pass
|
|
359
|
+
|
|
360
|
+
# Use the enhanced detector
|
|
361
|
+
detector = OutputStyleDetector()
|
|
362
|
+
return detector.get_output_style(session_context)
|
|
363
|
+
|
|
364
|
+
except Exception as e:
|
|
365
|
+
print(f"Output style detection failed: {e}", file=sys.stderr)
|
|
366
|
+
return "Mr. Alfred"
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
# For backward compatibility
|
|
370
|
+
if __name__ == "__main__":
|
|
371
|
+
# If run as a script, output the detected style
|
|
372
|
+
print(safe_collect_output_style())
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Exception hierarchy for MoAI-ADK hooks system.
|
|
3
|
+
|
|
4
|
+
Provides a consistent exception hierarchy for all hooks-related errors.
|
|
5
|
+
This enables structured error handling and proper exception chaining.
|
|
6
|
+
|
|
7
|
+
Hierarchy:
|
|
8
|
+
HooksBaseError
|
|
9
|
+
├── TimeoutError (base timeout from timeout.py)
|
|
10
|
+
│ └── HookTimeoutError (enhanced with context)
|
|
11
|
+
├── GitOperationError
|
|
12
|
+
├── ConfigurationError
|
|
13
|
+
└── ValidationError
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class HooksBaseError(Exception):
|
|
20
|
+
"""Base exception for all hooks system errors.
|
|
21
|
+
|
|
22
|
+
All hook-related exceptions should inherit from this class
|
|
23
|
+
to enable consistent exception handling.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# Re-export TimeoutError from timeout module for convenience
|
|
30
|
+
try:
|
|
31
|
+
from .timeout import TimeoutError
|
|
32
|
+
except ImportError:
|
|
33
|
+
|
|
34
|
+
class TimeoutError(HooksBaseError): # type: ignore[no-redef]
|
|
35
|
+
"""Timeout exception (fallback if timeout module unavailable)."""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# Re-export HookTimeoutError from unified_timeout_manager for convenience
|
|
41
|
+
try:
|
|
42
|
+
from .unified_timeout_manager import HookTimeoutError
|
|
43
|
+
except ImportError:
|
|
44
|
+
|
|
45
|
+
class HookTimeoutError(TimeoutError): # type: ignore[no-redef]
|
|
46
|
+
"""Hook-specific timeout with context (fallback)."""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
message: str,
|
|
51
|
+
hook_id: str = "",
|
|
52
|
+
timeout_seconds: float = 0,
|
|
53
|
+
execution_time: float = 0,
|
|
54
|
+
will_retry: bool = False,
|
|
55
|
+
):
|
|
56
|
+
super().__init__(message)
|
|
57
|
+
self.hook_id = hook_id
|
|
58
|
+
self.timeout_seconds = timeout_seconds
|
|
59
|
+
self.execution_time = execution_time
|
|
60
|
+
self.will_retry = will_retry
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class GitOperationError(HooksBaseError):
|
|
64
|
+
"""Exception for Git operation failures.
|
|
65
|
+
|
|
66
|
+
Attributes:
|
|
67
|
+
command: The Git command that failed
|
|
68
|
+
exit_code: Git command exit code (if available)
|
|
69
|
+
stderr: Error output from Git command
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def __init__(
|
|
73
|
+
self,
|
|
74
|
+
message: str,
|
|
75
|
+
command: str = "",
|
|
76
|
+
exit_code: int | None = None,
|
|
77
|
+
stderr: str = "",
|
|
78
|
+
):
|
|
79
|
+
super().__init__(message)
|
|
80
|
+
self.command = command
|
|
81
|
+
self.exit_code = exit_code
|
|
82
|
+
self.stderr = stderr
|
|
83
|
+
|
|
84
|
+
def __str__(self) -> str:
|
|
85
|
+
parts = [super().__str__()]
|
|
86
|
+
if self.command:
|
|
87
|
+
parts.append(f"Command: {self.command}")
|
|
88
|
+
if self.exit_code is not None:
|
|
89
|
+
parts.append(f"Exit code: {self.exit_code}")
|
|
90
|
+
if self.stderr:
|
|
91
|
+
parts.append(f"Stderr: {self.stderr[:200]}")
|
|
92
|
+
return " | ".join(parts)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ConfigurationError(HooksBaseError):
|
|
96
|
+
"""Exception for configuration-related errors.
|
|
97
|
+
|
|
98
|
+
Raised when configuration files are missing, malformed,
|
|
99
|
+
or contain invalid values.
|
|
100
|
+
|
|
101
|
+
Attributes:
|
|
102
|
+
config_path: Path to the configuration file (if applicable)
|
|
103
|
+
key: Configuration key that caused the error (if applicable)
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
def __init__(
|
|
107
|
+
self,
|
|
108
|
+
message: str,
|
|
109
|
+
config_path: str = "",
|
|
110
|
+
key: str = "",
|
|
111
|
+
):
|
|
112
|
+
super().__init__(message)
|
|
113
|
+
self.config_path = config_path
|
|
114
|
+
self.key = key
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class ValidationError(HooksBaseError):
|
|
118
|
+
"""Exception for validation failures.
|
|
119
|
+
|
|
120
|
+
Raised when input validation or schema validation fails.
|
|
121
|
+
|
|
122
|
+
Attributes:
|
|
123
|
+
field: The field that failed validation
|
|
124
|
+
value: The invalid value (if safe to include)
|
|
125
|
+
expected: Description of expected value format
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
def __init__(
|
|
129
|
+
self,
|
|
130
|
+
message: str,
|
|
131
|
+
field: str = "",
|
|
132
|
+
value: str | None = None,
|
|
133
|
+
expected: str = "",
|
|
134
|
+
):
|
|
135
|
+
super().__init__(message)
|
|
136
|
+
self.field = field
|
|
137
|
+
self.value = value
|
|
138
|
+
self.expected = expected
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class SecurityError(HooksBaseError):
|
|
142
|
+
"""Exception for security-related issues.
|
|
143
|
+
|
|
144
|
+
Raised when security checks fail (e.g., path traversal attempts,
|
|
145
|
+
unauthorized file access).
|
|
146
|
+
|
|
147
|
+
Attributes:
|
|
148
|
+
operation: The operation that was blocked
|
|
149
|
+
resource: The resource that was accessed
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
def __init__(
|
|
153
|
+
self,
|
|
154
|
+
message: str,
|
|
155
|
+
operation: str = "",
|
|
156
|
+
resource: str = "",
|
|
157
|
+
):
|
|
158
|
+
super().__init__(message)
|
|
159
|
+
self.operation = operation
|
|
160
|
+
self.resource = resource
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
__all__ = [
|
|
164
|
+
"HooksBaseError",
|
|
165
|
+
"TimeoutError",
|
|
166
|
+
"HookTimeoutError",
|
|
167
|
+
"GitOperationError",
|
|
168
|
+
"ConfigurationError",
|
|
169
|
+
"ValidationError",
|
|
170
|
+
"SecurityError",
|
|
171
|
+
]
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""File utility functions for MoAI hooks.
|
|
3
|
+
|
|
4
|
+
Provides common file operations with safety checks.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
# Default maximum file size for reading operations (10MB)
|
|
12
|
+
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB in bytes
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def check_file_size(file_path: Path | str, max_size: int = MAX_FILE_SIZE) -> tuple[bool, str]:
|
|
16
|
+
"""Check if file size is within acceptable limits.
|
|
17
|
+
|
|
18
|
+
Args:
|
|
19
|
+
file_path: Path to the file
|
|
20
|
+
max_size: Maximum allowed file size in bytes (default: 10MB)
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Tuple of (is_safe, error_message)
|
|
24
|
+
- is_safe: True if file is safe to read, False otherwise
|
|
25
|
+
- error_message: Error message if unsafe, empty string if safe
|
|
26
|
+
"""
|
|
27
|
+
path = Path(file_path)
|
|
28
|
+
|
|
29
|
+
# Check if file exists
|
|
30
|
+
if not path.exists():
|
|
31
|
+
return False, f"File does not exist: {file_path}"
|
|
32
|
+
|
|
33
|
+
# Check if it's a file (not directory)
|
|
34
|
+
if not path.is_file():
|
|
35
|
+
return False, f"Path is not a file: {file_path}"
|
|
36
|
+
|
|
37
|
+
# Check file size
|
|
38
|
+
try:
|
|
39
|
+
file_size = path.stat().st_size
|
|
40
|
+
if file_size > max_size:
|
|
41
|
+
size_mb = file_size / (1024 * 1024)
|
|
42
|
+
max_mb = max_size / (1024 * 1024)
|
|
43
|
+
return (False, f"File too large: {size_mb:.2f}MB (max: {max_mb:.0f}MB): {file_path}")
|
|
44
|
+
except OSError as e:
|
|
45
|
+
return False, f"Cannot check file size: {e}"
|
|
46
|
+
|
|
47
|
+
return True, ""
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def safe_read_text(file_path: Path | str, max_size: int = MAX_FILE_SIZE) -> str | None:
|
|
51
|
+
"""Safely read text file with size validation.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
file_path: Path to the file
|
|
55
|
+
max_size: Maximum allowed file size in bytes (default: 10MB)
|
|
56
|
+
|
|
57
|
+
Returns:
|
|
58
|
+
File contents as string, or None if file is too large or cannot be read
|
|
59
|
+
"""
|
|
60
|
+
is_safe, error_msg = check_file_size(file_path, max_size)
|
|
61
|
+
if not is_safe:
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
return Path(file_path).read_text(encoding="utf-8")
|
|
66
|
+
except (OSError, UnicodeDecodeError):
|
|
67
|
+
return None
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def safe_read_binary(file_path: Path | str, max_size: int = MAX_FILE_SIZE) -> bytes | None:
|
|
71
|
+
"""Safely read binary file with size validation.
|
|
72
|
+
|
|
73
|
+
Args:
|
|
74
|
+
file_path: Path to the file
|
|
75
|
+
max_size: Maximum allowed file size in bytes (default: 10MB)
|
|
76
|
+
|
|
77
|
+
Returns:
|
|
78
|
+
File contents as bytes, or None if file is too large or cannot be read
|
|
79
|
+
"""
|
|
80
|
+
is_safe, error_msg = check_file_size(file_path, max_size)
|
|
81
|
+
if not is_safe:
|
|
82
|
+
return None
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
return Path(file_path).read_bytes()
|
|
86
|
+
except OSError:
|
|
87
|
+
return None
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
__all__ = [
|
|
91
|
+
"MAX_FILE_SIZE",
|
|
92
|
+
"check_file_size",
|
|
93
|
+
"safe_read_text",
|
|
94
|
+
"safe_read_binary",
|
|
95
|
+
]
|