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,268 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Memory collector for MoAI-ADK statusline
|
|
3
|
+
|
|
4
|
+
Collects memory usage information for display in the status bar.
|
|
5
|
+
Uses psutil for cross-platform memory monitoring.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from datetime import datetime, timedelta
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class MemoryInfo:
|
|
19
|
+
"""Memory usage information"""
|
|
20
|
+
|
|
21
|
+
# Process memory (current Python process)
|
|
22
|
+
process_rss_mb: float # Resident Set Size
|
|
23
|
+
process_vms_mb: float # Virtual Memory Size
|
|
24
|
+
|
|
25
|
+
# System memory
|
|
26
|
+
system_total_mb: float
|
|
27
|
+
system_available_mb: float
|
|
28
|
+
system_percent: float
|
|
29
|
+
|
|
30
|
+
# Formatted strings for display
|
|
31
|
+
display_process: str # e.g., "128MB"
|
|
32
|
+
display_system: str # e.g., "8.2GB/16GB"
|
|
33
|
+
display_percent: str # e.g., "51%"
|
|
34
|
+
|
|
35
|
+
timestamp: datetime
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MemoryCollector:
|
|
39
|
+
"""
|
|
40
|
+
Memory collector for statusline display.
|
|
41
|
+
|
|
42
|
+
Features:
|
|
43
|
+
- Process memory monitoring (current Python process)
|
|
44
|
+
- System memory monitoring
|
|
45
|
+
- Caching with configurable TTL
|
|
46
|
+
- Graceful degradation on errors
|
|
47
|
+
- Multiple display format options
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
# Cache configuration
|
|
51
|
+
DEFAULT_CACHE_TTL_SECONDS = 10 # Memory doesn't change rapidly
|
|
52
|
+
|
|
53
|
+
def __init__(self, cache_ttl_seconds: Optional[int] = None):
|
|
54
|
+
"""
|
|
55
|
+
Initialize memory collector.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
cache_ttl_seconds: Cache TTL in seconds. If None, uses default.
|
|
59
|
+
"""
|
|
60
|
+
self._cache_ttl = timedelta(seconds=cache_ttl_seconds or self.DEFAULT_CACHE_TTL_SECONDS)
|
|
61
|
+
self._cache: Optional[MemoryInfo] = None
|
|
62
|
+
self._cache_time: Optional[datetime] = None
|
|
63
|
+
self._logger = logging.getLogger(__name__)
|
|
64
|
+
|
|
65
|
+
# Check if psutil is available
|
|
66
|
+
self._psutil_available = self._check_psutil()
|
|
67
|
+
|
|
68
|
+
def _check_psutil(self) -> bool:
|
|
69
|
+
"""Check if psutil is available."""
|
|
70
|
+
try:
|
|
71
|
+
import psutil # noqa: F401
|
|
72
|
+
|
|
73
|
+
return True
|
|
74
|
+
except ImportError:
|
|
75
|
+
self._logger.warning("psutil not available, memory monitoring disabled")
|
|
76
|
+
return False
|
|
77
|
+
|
|
78
|
+
def get_memory_info(self, force_refresh: bool = False) -> Optional[MemoryInfo]:
|
|
79
|
+
"""
|
|
80
|
+
Get memory usage information.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
force_refresh: If True, bypass cache and force fresh collection
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
MemoryInfo object or None if collection fails
|
|
87
|
+
"""
|
|
88
|
+
if not self._psutil_available:
|
|
89
|
+
return None
|
|
90
|
+
|
|
91
|
+
# Check cache
|
|
92
|
+
if not force_refresh and self._is_cache_valid():
|
|
93
|
+
return self._cache
|
|
94
|
+
|
|
95
|
+
try:
|
|
96
|
+
memory_info = self._collect_memory_info()
|
|
97
|
+
self._update_cache(memory_info)
|
|
98
|
+
return memory_info
|
|
99
|
+
except Exception as e:
|
|
100
|
+
self._logger.error(f"Error collecting memory info: {e}")
|
|
101
|
+
return self._cache # Return stale cache on error
|
|
102
|
+
|
|
103
|
+
def get_display_string(self, mode: str = "process", force_refresh: bool = False) -> str:
|
|
104
|
+
"""
|
|
105
|
+
Get formatted memory string for statusline display.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
mode: Display mode
|
|
109
|
+
- "process": Process memory (e.g., "128MB")
|
|
110
|
+
- "system": System memory usage (e.g., "8.2GB/16GB")
|
|
111
|
+
- "percent": System memory percentage (e.g., "51%")
|
|
112
|
+
- "compact": Process memory compact (e.g., "128M")
|
|
113
|
+
force_refresh: If True, bypass cache
|
|
114
|
+
|
|
115
|
+
Returns:
|
|
116
|
+
Formatted memory string, or "N/A" on error
|
|
117
|
+
"""
|
|
118
|
+
memory_info = self.get_memory_info(force_refresh)
|
|
119
|
+
|
|
120
|
+
if memory_info is None:
|
|
121
|
+
return "N/A"
|
|
122
|
+
|
|
123
|
+
if mode == "process":
|
|
124
|
+
return memory_info.display_process
|
|
125
|
+
elif mode == "system":
|
|
126
|
+
return memory_info.display_system
|
|
127
|
+
elif mode == "percent":
|
|
128
|
+
return memory_info.display_percent
|
|
129
|
+
elif mode == "compact":
|
|
130
|
+
# Compact format without "MB" suffix
|
|
131
|
+
return self._format_compact(memory_info.process_rss_mb)
|
|
132
|
+
else:
|
|
133
|
+
return memory_info.display_process
|
|
134
|
+
|
|
135
|
+
def _collect_memory_info(self) -> MemoryInfo:
|
|
136
|
+
"""
|
|
137
|
+
Collect memory information using psutil.
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
MemoryInfo object with current memory usage
|
|
141
|
+
"""
|
|
142
|
+
import psutil
|
|
143
|
+
|
|
144
|
+
# Get current process info
|
|
145
|
+
process = psutil.Process(os.getpid())
|
|
146
|
+
process_memory = process.memory_info()
|
|
147
|
+
|
|
148
|
+
# Convert to MB
|
|
149
|
+
process_rss_mb = process_memory.rss / (1024 * 1024)
|
|
150
|
+
process_vms_mb = process_memory.vms / (1024 * 1024)
|
|
151
|
+
|
|
152
|
+
# Get system memory info
|
|
153
|
+
system_memory = psutil.virtual_memory()
|
|
154
|
+
system_total_mb = system_memory.total / (1024 * 1024)
|
|
155
|
+
system_available_mb = system_memory.available / (1024 * 1024)
|
|
156
|
+
system_percent = system_memory.percent
|
|
157
|
+
|
|
158
|
+
# Format display strings
|
|
159
|
+
display_process = self._format_size(process_rss_mb)
|
|
160
|
+
display_system = (
|
|
161
|
+
f"{self._format_size(system_total_mb - system_available_mb)}/{self._format_size(system_total_mb)}"
|
|
162
|
+
)
|
|
163
|
+
display_percent = f"{system_percent:.0f}%"
|
|
164
|
+
|
|
165
|
+
return MemoryInfo(
|
|
166
|
+
process_rss_mb=process_rss_mb,
|
|
167
|
+
process_vms_mb=process_vms_mb,
|
|
168
|
+
system_total_mb=system_total_mb,
|
|
169
|
+
system_available_mb=system_available_mb,
|
|
170
|
+
system_percent=system_percent,
|
|
171
|
+
display_process=display_process,
|
|
172
|
+
display_system=display_system,
|
|
173
|
+
display_percent=display_percent,
|
|
174
|
+
timestamp=datetime.now(),
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
def _format_size(self, size_mb: float) -> str:
|
|
178
|
+
"""
|
|
179
|
+
Format size in MB to human-readable string.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
size_mb: Size in megabytes
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Formatted string (e.g., "128MB", "1.2GB")
|
|
186
|
+
"""
|
|
187
|
+
if size_mb >= 1024:
|
|
188
|
+
return f"{size_mb / 1024:.1f}GB"
|
|
189
|
+
elif size_mb >= 100:
|
|
190
|
+
return f"{size_mb:.0f}MB"
|
|
191
|
+
elif size_mb >= 10:
|
|
192
|
+
return f"{size_mb:.1f}MB"
|
|
193
|
+
else:
|
|
194
|
+
return f"{size_mb:.2f}MB"
|
|
195
|
+
|
|
196
|
+
def _format_compact(self, size_mb: float) -> str:
|
|
197
|
+
"""
|
|
198
|
+
Format size in compact format for tight spaces.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
size_mb: Size in megabytes
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
Compact formatted string (e.g., "128M", "1.2G")
|
|
205
|
+
"""
|
|
206
|
+
if size_mb >= 1024:
|
|
207
|
+
return f"{size_mb / 1024:.1f}G"
|
|
208
|
+
else:
|
|
209
|
+
return f"{size_mb:.0f}M"
|
|
210
|
+
|
|
211
|
+
def _is_cache_valid(self) -> bool:
|
|
212
|
+
"""Check if cache is still valid."""
|
|
213
|
+
if self._cache is None or self._cache_time is None:
|
|
214
|
+
return False
|
|
215
|
+
|
|
216
|
+
age = datetime.now() - self._cache_time
|
|
217
|
+
return age < self._cache_ttl
|
|
218
|
+
|
|
219
|
+
def _update_cache(self, memory_info: MemoryInfo) -> None:
|
|
220
|
+
"""Update cache with new memory info."""
|
|
221
|
+
self._cache = memory_info
|
|
222
|
+
self._cache_time = datetime.now()
|
|
223
|
+
|
|
224
|
+
def clear_cache(self) -> None:
|
|
225
|
+
"""Clear the memory cache."""
|
|
226
|
+
self._cache = None
|
|
227
|
+
self._cache_time = None
|
|
228
|
+
|
|
229
|
+
def get_cache_age_seconds(self) -> Optional[float]:
|
|
230
|
+
"""
|
|
231
|
+
Get cache age in seconds.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Cache age in seconds, or None if no cache
|
|
235
|
+
"""
|
|
236
|
+
if self._cache_time is None:
|
|
237
|
+
return None
|
|
238
|
+
return (datetime.now() - self._cache_time).total_seconds()
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
# Singleton instance for convenience
|
|
242
|
+
_default_collector: Optional[MemoryCollector] = None
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def get_memory_collector() -> MemoryCollector:
|
|
246
|
+
"""
|
|
247
|
+
Get the default memory collector instance.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
MemoryCollector singleton instance
|
|
251
|
+
"""
|
|
252
|
+
global _default_collector
|
|
253
|
+
if _default_collector is None:
|
|
254
|
+
_default_collector = MemoryCollector()
|
|
255
|
+
return _default_collector
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
def get_memory_display(mode: str = "process") -> str:
|
|
259
|
+
"""
|
|
260
|
+
Convenience function to get memory display string.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
mode: Display mode ("process", "system", "percent", "compact")
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Formatted memory string
|
|
267
|
+
"""
|
|
268
|
+
return get_memory_collector().get_display_string(mode)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
"""
|
|
3
|
+
Session metrics tracker for statusline
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from datetime import datetime, timedelta
|
|
9
|
+
from typing import Optional
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MetricsTracker:
|
|
15
|
+
"""Tracks session duration with 10-second caching"""
|
|
16
|
+
|
|
17
|
+
# Configuration
|
|
18
|
+
_CACHE_TTL_SECONDS = 10
|
|
19
|
+
|
|
20
|
+
def __init__(self):
|
|
21
|
+
"""Initialize metrics tracker"""
|
|
22
|
+
self._session_start: datetime = datetime.now()
|
|
23
|
+
self._duration_cache: Optional[str] = None
|
|
24
|
+
self._cache_time: Optional[datetime] = None
|
|
25
|
+
self._cache_ttl = timedelta(seconds=self._CACHE_TTL_SECONDS)
|
|
26
|
+
|
|
27
|
+
def get_duration(self) -> str:
|
|
28
|
+
"""
|
|
29
|
+
Get formatted session duration
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
Formatted duration string (e.g., "5m", "1h 30m")
|
|
33
|
+
"""
|
|
34
|
+
# Check cache validity
|
|
35
|
+
if self._is_cache_valid():
|
|
36
|
+
return self._duration_cache
|
|
37
|
+
|
|
38
|
+
# Calculate and format duration
|
|
39
|
+
duration = self._calculate_and_format_duration()
|
|
40
|
+
self._update_cache(duration)
|
|
41
|
+
return duration
|
|
42
|
+
|
|
43
|
+
def _calculate_and_format_duration(self) -> str:
|
|
44
|
+
"""
|
|
45
|
+
Calculate session duration and format it
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
Formatted duration string
|
|
49
|
+
"""
|
|
50
|
+
elapsed = datetime.now() - self._session_start
|
|
51
|
+
total_seconds = int(elapsed.total_seconds())
|
|
52
|
+
|
|
53
|
+
# Format based on duration range
|
|
54
|
+
if total_seconds < 60:
|
|
55
|
+
return f"{total_seconds}s"
|
|
56
|
+
elif total_seconds < 3600:
|
|
57
|
+
minutes = total_seconds // 60
|
|
58
|
+
seconds = total_seconds % 60
|
|
59
|
+
if seconds > 0:
|
|
60
|
+
return f"{minutes}m {seconds}s"
|
|
61
|
+
return f"{minutes}m"
|
|
62
|
+
else:
|
|
63
|
+
hours = total_seconds // 3600
|
|
64
|
+
minutes = (total_seconds % 3600) // 60
|
|
65
|
+
if minutes > 0:
|
|
66
|
+
return f"{hours}h {minutes}m"
|
|
67
|
+
return f"{hours}h"
|
|
68
|
+
|
|
69
|
+
def _is_cache_valid(self) -> bool:
|
|
70
|
+
"""Check if duration cache is still valid"""
|
|
71
|
+
if self._duration_cache is None or self._cache_time is None:
|
|
72
|
+
return False
|
|
73
|
+
return datetime.now() - self._cache_time < self._cache_ttl
|
|
74
|
+
|
|
75
|
+
def _update_cache(self, duration: str) -> None:
|
|
76
|
+
"""Update duration cache"""
|
|
77
|
+
self._duration_cache = duration
|
|
78
|
+
self._cache_time = datetime.now()
|
|
@@ -5,8 +5,10 @@ Provides HookPayload and HookResult classes used by hook handlers
|
|
|
5
5
|
to process events and return execution results to Claude Code.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
8
10
|
from dataclasses import asdict, dataclass
|
|
9
|
-
from typing import Any
|
|
11
|
+
from typing import Any
|
|
10
12
|
|
|
11
13
|
|
|
12
14
|
class HookPayload(dict):
|
|
@@ -27,7 +29,7 @@ class HookPayload(dict):
|
|
|
27
29
|
working_dir = payload.get("cwd", ".")
|
|
28
30
|
"""
|
|
29
31
|
|
|
30
|
-
def __init__(self, data:
|
|
32
|
+
def __init__(self, data: dict[str, Any] | None = None):
|
|
31
33
|
"""Initialize HookPayload with optional data dictionary."""
|
|
32
34
|
super().__init__(data or {})
|
|
33
35
|
|
|
@@ -39,7 +41,7 @@ class HookPayload(dict):
|
|
|
39
41
|
"""Set value in payload."""
|
|
40
42
|
super().__setitem__(key, value)
|
|
41
43
|
|
|
42
|
-
def update(self, other:
|
|
44
|
+
def update(self, other: dict[str, Any]) -> None: # type: ignore[override]
|
|
43
45
|
"""Update payload with another dictionary."""
|
|
44
46
|
super().update(other)
|
|
45
47
|
|
|
@@ -77,10 +79,10 @@ class HookResult:
|
|
|
77
79
|
)
|
|
78
80
|
"""
|
|
79
81
|
|
|
80
|
-
system_message:
|
|
82
|
+
system_message: str | None = None
|
|
81
83
|
continue_execution: bool = True
|
|
82
|
-
context_files:
|
|
83
|
-
hook_specific_output:
|
|
84
|
+
context_files: list[str] = None # type: ignore[assignment]
|
|
85
|
+
hook_specific_output: dict[str, Any] | None = None
|
|
84
86
|
block_execution: bool = False
|
|
85
87
|
|
|
86
88
|
def __post_init__(self):
|
|
@@ -90,7 +92,7 @@ class HookResult:
|
|
|
90
92
|
if self.hook_specific_output is None:
|
|
91
93
|
self.hook_specific_output = {}
|
|
92
94
|
|
|
93
|
-
def to_dict(self) ->
|
|
95
|
+
def to_dict(self) -> dict[str, Any]:
|
|
94
96
|
"""
|
|
95
97
|
Convert HookResult to a dictionary for JSON serialization.
|
|
96
98
|
|
|
@@ -1,28 +1,219 @@
|
|
|
1
|
-
"""Path utility functions for MoAI-ADK hooks
|
|
1
|
+
"""Path utility functions for MoAI-ADK hooks
|
|
2
2
|
|
|
3
|
+
Provides safe project root detection and .moai directory management.
|
|
4
|
+
Prevents .moai directory creation outside of project root.
|
|
5
|
+
|
|
6
|
+
Environment Variables:
|
|
7
|
+
- MOAI_PROJECT_ROOT: Override project root detection (absolute path)
|
|
8
|
+
- CLAUDE_PROJECT_DIR: Claude Code project directory (fallback)
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
3
14
|
from pathlib import Path
|
|
15
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
# Project root markers (files/dirs that indicate project root)
|
|
18
|
+
PROJECT_ROOT_MARKERS = [
|
|
19
|
+
".moai/config/config.yaml", # Primary: MoAI config
|
|
20
|
+
".moai/config/sections", # Section-based config
|
|
21
|
+
"CLAUDE.md", # Claude Code project marker
|
|
22
|
+
".claude", # Claude directory
|
|
23
|
+
".git", # Git repository root
|
|
24
|
+
"pyproject.toml", # Python project
|
|
25
|
+
"package.json", # Node.js project
|
|
26
|
+
"Cargo.toml", # Rust project
|
|
27
|
+
"go.mod", # Go project
|
|
28
|
+
]
|
|
4
29
|
|
|
30
|
+
# Cache for project root to avoid repeated filesystem traversals
|
|
31
|
+
_project_root_cache: Path | None = None
|
|
5
32
|
|
|
6
|
-
|
|
33
|
+
|
|
34
|
+
def get_project_root_from_env() -> Optional[Path]:
|
|
35
|
+
"""Get project root from environment variables.
|
|
36
|
+
|
|
37
|
+
Checks in order:
|
|
38
|
+
1. MOAI_PROJECT_ROOT - explicit override
|
|
39
|
+
2. CLAUDE_PROJECT_DIR - Claude Code's project directory
|
|
40
|
+
|
|
41
|
+
Returns:
|
|
42
|
+
Path if valid directory found, None otherwise
|
|
7
43
|
"""
|
|
8
|
-
|
|
44
|
+
# Check MOAI_PROJECT_ROOT first (explicit override)
|
|
45
|
+
moai_root = os.environ.get("MOAI_PROJECT_ROOT")
|
|
46
|
+
if moai_root:
|
|
47
|
+
root_path = Path(moai_root).resolve()
|
|
48
|
+
if root_path.is_dir():
|
|
49
|
+
return root_path
|
|
9
50
|
|
|
10
|
-
|
|
11
|
-
|
|
51
|
+
# Check CLAUDE_PROJECT_DIR (Claude Code sets this)
|
|
52
|
+
claude_dir = os.environ.get("CLAUDE_PROJECT_DIR")
|
|
53
|
+
if claude_dir:
|
|
54
|
+
root_path = Path(claude_dir).resolve()
|
|
55
|
+
if root_path.is_dir():
|
|
56
|
+
return root_path
|
|
57
|
+
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def find_project_root(start_path: Path | None = None) -> Path:
|
|
62
|
+
"""Find project root by locating project markers.
|
|
63
|
+
|
|
64
|
+
Search order:
|
|
65
|
+
1. Environment variables (MOAI_PROJECT_ROOT, CLAUDE_PROJECT_DIR)
|
|
66
|
+
2. Traverse upward from start_path looking for project markers
|
|
67
|
+
3. Fallback to current working directory
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
start_path: Starting directory for search (defaults to current file location)
|
|
12
71
|
|
|
13
72
|
Returns:
|
|
14
|
-
Path: Project root directory
|
|
73
|
+
Path: Project root directory
|
|
15
74
|
|
|
16
|
-
|
|
17
|
-
|
|
75
|
+
Note:
|
|
76
|
+
Results are cached for performance. Use clear_project_root_cache()
|
|
77
|
+
to force re-detection.
|
|
18
78
|
"""
|
|
19
|
-
|
|
79
|
+
global _project_root_cache
|
|
80
|
+
|
|
81
|
+
# Return cached result if available
|
|
82
|
+
if _project_root_cache is not None:
|
|
83
|
+
return _project_root_cache
|
|
84
|
+
|
|
85
|
+
# Check environment variables first
|
|
86
|
+
env_root = get_project_root_from_env()
|
|
87
|
+
if env_root:
|
|
88
|
+
_project_root_cache = env_root
|
|
89
|
+
return env_root
|
|
20
90
|
|
|
21
|
-
#
|
|
91
|
+
# Determine starting point
|
|
92
|
+
if start_path is None:
|
|
93
|
+
start_path = Path(__file__).resolve().parent
|
|
94
|
+
else:
|
|
95
|
+
start_path = Path(start_path).resolve()
|
|
96
|
+
|
|
97
|
+
# Traverse upward to find project markers
|
|
98
|
+
current = start_path
|
|
22
99
|
while current != current.parent:
|
|
23
|
-
|
|
24
|
-
|
|
100
|
+
for marker in PROJECT_ROOT_MARKERS:
|
|
101
|
+
marker_path = current / marker
|
|
102
|
+
if marker_path.exists():
|
|
103
|
+
_project_root_cache = current
|
|
104
|
+
return current
|
|
25
105
|
current = current.parent
|
|
26
106
|
|
|
27
107
|
# Fallback to current working directory
|
|
28
|
-
|
|
108
|
+
cwd = Path.cwd()
|
|
109
|
+
_project_root_cache = cwd
|
|
110
|
+
return cwd
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def clear_project_root_cache() -> None:
|
|
114
|
+
"""Clear the cached project root.
|
|
115
|
+
|
|
116
|
+
Use when project root may have changed (e.g., after directory change).
|
|
117
|
+
"""
|
|
118
|
+
global _project_root_cache
|
|
119
|
+
_project_root_cache = None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def get_moai_dir() -> Path:
|
|
123
|
+
"""Get the .moai directory path in project root.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
Path: Absolute path to .moai directory
|
|
127
|
+
|
|
128
|
+
Note:
|
|
129
|
+
Does NOT create the directory. Use ensure_moai_dir() for that.
|
|
130
|
+
"""
|
|
131
|
+
return find_project_root() / ".moai"
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def ensure_moai_dir(subpath: str = "") -> Path:
|
|
135
|
+
"""Ensure .moai subdirectory exists in project root.
|
|
136
|
+
|
|
137
|
+
Creates the directory structure if it doesn't exist.
|
|
138
|
+
ONLY creates within project root to prevent pollution.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
subpath: Subdirectory path within .moai (e.g., "cache", "logs/sessions")
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Path: Absolute path to the directory
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
ValueError: If attempting to create outside project root
|
|
148
|
+
"""
|
|
149
|
+
project_root = find_project_root()
|
|
150
|
+
moai_dir = project_root / ".moai"
|
|
151
|
+
|
|
152
|
+
if subpath:
|
|
153
|
+
target_dir = moai_dir / subpath
|
|
154
|
+
else:
|
|
155
|
+
target_dir = moai_dir
|
|
156
|
+
|
|
157
|
+
# Safety check: ensure target is within project root
|
|
158
|
+
try:
|
|
159
|
+
target_dir.resolve().relative_to(project_root.resolve())
|
|
160
|
+
except ValueError:
|
|
161
|
+
raise ValueError(f"Cannot create .moai directory outside project root: {target_dir}")
|
|
162
|
+
|
|
163
|
+
# Create directory if it doesn't exist
|
|
164
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
165
|
+
return target_dir
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def is_within_project_root(path: Path) -> bool:
|
|
169
|
+
"""Check if a path is within the project root.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
path: Path to check
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
True if path is within project root, False otherwise
|
|
176
|
+
"""
|
|
177
|
+
project_root = find_project_root()
|
|
178
|
+
try:
|
|
179
|
+
Path(path).resolve().relative_to(project_root.resolve())
|
|
180
|
+
return True
|
|
181
|
+
except ValueError:
|
|
182
|
+
return False
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def get_safe_moai_path(relative_path: str) -> Path:
|
|
186
|
+
"""Get absolute path within .moai directory safely.
|
|
187
|
+
|
|
188
|
+
This is the recommended way to get paths within .moai.
|
|
189
|
+
Always returns absolute path based on project root.
|
|
190
|
+
|
|
191
|
+
Args:
|
|
192
|
+
relative_path: Path relative to .moai (e.g., "cache/version.json")
|
|
193
|
+
|
|
194
|
+
Returns:
|
|
195
|
+
Path: Absolute path within project root's .moai directory
|
|
196
|
+
|
|
197
|
+
Example:
|
|
198
|
+
>>> get_safe_moai_path("logs/sessions")
|
|
199
|
+
PosixPath('/path/to/project/.moai/logs/sessions')
|
|
200
|
+
|
|
201
|
+
>>> get_safe_moai_path("memory/last-session-state.json")
|
|
202
|
+
PosixPath('/path/to/project/.moai/memory/last-session-state.json')
|
|
203
|
+
"""
|
|
204
|
+
return find_project_root() / ".moai" / relative_path
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def validate_cwd_is_project_root() -> bool:
|
|
208
|
+
"""Validate that current working directory is the project root.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
True if CWD is project root, False otherwise
|
|
212
|
+
|
|
213
|
+
Use Case:
|
|
214
|
+
Hooks should check this before creating .moai directories
|
|
215
|
+
to prevent creating them in wrong locations.
|
|
216
|
+
"""
|
|
217
|
+
cwd = Path.cwd().resolve()
|
|
218
|
+
project_root = find_project_root().resolve()
|
|
219
|
+
return cwd == project_root
|
|
@@ -25,16 +25,27 @@ except ImportError:
|
|
|
25
25
|
pass
|
|
26
26
|
|
|
27
27
|
|
|
28
|
+
# Import find_project_root from path_utils (canonical implementation)
|
|
29
|
+
# This consolidates project root detection to a single source of truth
|
|
30
|
+
try:
|
|
31
|
+
from lib.path_utils import find_project_root as _canonical_find_project_root
|
|
32
|
+
except ImportError:
|
|
33
|
+
# Fallback if path_utils not available
|
|
34
|
+
_canonical_find_project_root = None # type: ignore
|
|
35
|
+
|
|
36
|
+
|
|
28
37
|
# Cache directory for version check results
|
|
29
38
|
CACHE_DIR_NAME = ".moai/cache"
|
|
30
39
|
|
|
31
40
|
|
|
32
41
|
def find_project_root(start_path: str | Path = ".") -> Path:
|
|
33
|
-
"""Find MoAI-ADK project root by searching upward for .
|
|
42
|
+
"""Find MoAI-ADK project root by searching upward for project markers.
|
|
34
43
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
This is a wrapper around path_utils.find_project_root() for backward compatibility.
|
|
45
|
+
The canonical implementation in path_utils provides:
|
|
46
|
+
- Environment variable support (MOAI_PROJECT_ROOT, CLAUDE_PROJECT_DIR)
|
|
47
|
+
- Caching for performance
|
|
48
|
+
- Multiple project marker detection
|
|
38
49
|
|
|
39
50
|
Args:
|
|
40
51
|
start_path: Starting directory (default: current directory)
|
|
@@ -48,17 +59,15 @@ def find_project_root(start_path: str | Path = ".") -> Path:
|
|
|
48
59
|
>>> find_project_root(".claude/hooks/alfred")
|
|
49
60
|
Path("/Users/user/my-project") # Found root 3 levels up
|
|
50
61
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
- Falls back to CLAUDE.md if config.yaml not found
|
|
54
|
-
- Max depth: 10 levels up (prevent infinite loop)
|
|
55
|
-
- Returns absolute path for consistency
|
|
56
|
-
|
|
57
|
-
TDD History:
|
|
58
|
-
- RED: 4 test scenarios (root, nested, not found, symlinks)
|
|
59
|
-
- GREEN: Minimal upward search with .moai/config/config.yaml detection
|
|
60
|
-
- REFACTOR: Add CLAUDE.md fallback, max depth limit, absolute path return
|
|
62
|
+
Note:
|
|
63
|
+
For new code, prefer using path_utils.find_project_root() directly.
|
|
61
64
|
"""
|
|
65
|
+
# Use canonical implementation if available
|
|
66
|
+
if _canonical_find_project_root is not None:
|
|
67
|
+
path = Path(start_path).resolve() if start_path != "." else None
|
|
68
|
+
return _canonical_find_project_root(path)
|
|
69
|
+
|
|
70
|
+
# Fallback implementation if path_utils not available
|
|
62
71
|
current = Path(start_path).resolve()
|
|
63
72
|
max_depth = 10 # Prevent infinite loop
|
|
64
73
|
|