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
|
@@ -6,32 +6,121 @@ Provides detailed diagnostics for language-related issues.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import json
|
|
9
|
+
import logging
|
|
9
10
|
import sys
|
|
10
11
|
from pathlib import Path
|
|
11
|
-
from typing import Any, Dict
|
|
12
|
+
from typing import Any, Dict
|
|
12
13
|
|
|
14
|
+
# Configure logger for language validator (H4: structured logging)
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
13
16
|
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
try:
|
|
18
|
+
import yaml
|
|
19
|
+
|
|
20
|
+
YAML_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
YAML_AVAILABLE = False
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _load_yaml_file(file_path: Path) -> Dict[str, Any]:
|
|
26
|
+
"""Load a YAML file safely with fallback to empty dict.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
file_path: Path to the YAML file
|
|
16
30
|
|
|
17
31
|
Returns:
|
|
18
|
-
|
|
32
|
+
Parsed YAML content or empty dict on failure
|
|
19
33
|
"""
|
|
20
|
-
|
|
34
|
+
if not file_path.exists():
|
|
35
|
+
return {}
|
|
36
|
+
if not YAML_AVAILABLE:
|
|
37
|
+
return {}
|
|
38
|
+
try:
|
|
39
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
40
|
+
return yaml.safe_load(f) or {}
|
|
41
|
+
except Exception:
|
|
42
|
+
return {}
|
|
21
43
|
|
|
22
|
-
if not config_path.exists():
|
|
23
|
-
return {"error": "Configuration file not found"}
|
|
24
44
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
def _merge_configs(base: dict[str, Any], override: dict[str, Any]) -> Dict[str, Any]:
|
|
46
|
+
"""Recursively merge two configuration dictionaries.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
base: Base configuration dictionary
|
|
50
|
+
override: Override configuration dictionary
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Merged configuration dictionary
|
|
54
|
+
"""
|
|
55
|
+
result = base.copy()
|
|
56
|
+
for key, value in override.items():
|
|
57
|
+
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
|
|
58
|
+
result[key] = _merge_configs(result[key], value)
|
|
59
|
+
else:
|
|
60
|
+
result[key] = value
|
|
61
|
+
return result
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def load_config() -> Dict[str, Any]:
|
|
65
|
+
"""Load configuration from section YAML files with fallbacks.
|
|
66
|
+
|
|
67
|
+
Priority:
|
|
68
|
+
1. Section files (.moai/config/sections/*.yaml)
|
|
69
|
+
2. Main config.yaml
|
|
70
|
+
3. Legacy config.json
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Configuration dictionary or dict with 'error' key if not found
|
|
74
|
+
"""
|
|
75
|
+
config_dir = Path(".moai/config")
|
|
76
|
+
sections_dir = config_dir / "sections"
|
|
77
|
+
|
|
78
|
+
config: dict[str, Any] = {}
|
|
79
|
+
|
|
80
|
+
# Try section-based configuration first (new approach)
|
|
81
|
+
if sections_dir.exists() and sections_dir.is_dir():
|
|
82
|
+
section_files = [
|
|
83
|
+
("language.yaml", "language"),
|
|
84
|
+
("user.yaml", "user"),
|
|
85
|
+
("project.yaml", "project"),
|
|
86
|
+
("system.yaml", "system"),
|
|
87
|
+
("git-strategy.yaml", "git_strategy"),
|
|
88
|
+
("quality.yaml", "quality"),
|
|
89
|
+
]
|
|
90
|
+
for filename, _key in section_files:
|
|
91
|
+
section_path = sections_dir / filename
|
|
92
|
+
section_data = _load_yaml_file(section_path)
|
|
93
|
+
if section_data:
|
|
94
|
+
config = _merge_configs(config, section_data)
|
|
95
|
+
if config:
|
|
96
|
+
return config
|
|
97
|
+
|
|
98
|
+
# Fallback to main config.yaml
|
|
99
|
+
yaml_config_path = config_dir / "config.yaml"
|
|
100
|
+
if yaml_config_path.exists() and YAML_AVAILABLE:
|
|
101
|
+
try:
|
|
102
|
+
with open(yaml_config_path, "r", encoding="utf-8") as f:
|
|
103
|
+
config = yaml.safe_load(f) or {}
|
|
104
|
+
if config:
|
|
105
|
+
return config
|
|
106
|
+
except Exception:
|
|
107
|
+
pass
|
|
108
|
+
|
|
109
|
+
# Legacy fallback to config.json
|
|
110
|
+
json_config_path = config_dir / "config.json"
|
|
111
|
+
if json_config_path.exists():
|
|
112
|
+
try:
|
|
113
|
+
with open(json_config_path, "r", encoding="utf-8") as f:
|
|
114
|
+
return json.load(f)
|
|
115
|
+
except json.JSONDecodeError as e:
|
|
116
|
+
return {"error": f"JSON decode error: {e}"}
|
|
117
|
+
except Exception as e:
|
|
118
|
+
return {"error": f"File read error: {e}"}
|
|
119
|
+
|
|
120
|
+
return {"error": "Configuration file not found"}
|
|
32
121
|
|
|
33
122
|
|
|
34
|
-
def validate_language_config(config:
|
|
123
|
+
def validate_language_config(config: dict[str, Any]) -> Dict[str, Any]:
|
|
35
124
|
"""Validate language configuration
|
|
36
125
|
|
|
37
126
|
Args:
|
|
@@ -40,9 +129,9 @@ def validate_language_config(config: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
40
129
|
Returns:
|
|
41
130
|
Validation result with status and details
|
|
42
131
|
"""
|
|
43
|
-
warnings:
|
|
44
|
-
errors:
|
|
45
|
-
result:
|
|
132
|
+
warnings: list[str] = []
|
|
133
|
+
errors: list[str] = []
|
|
134
|
+
result: dict[str, Any] = {
|
|
46
135
|
"valid": True,
|
|
47
136
|
"warnings": warnings,
|
|
48
137
|
"errors": errors,
|
|
@@ -110,8 +199,8 @@ def validate_output_style_compatibility() -> Dict[str, Any]:
|
|
|
110
199
|
Returns:
|
|
111
200
|
Compatibility check results
|
|
112
201
|
"""
|
|
113
|
-
recommendations:
|
|
114
|
-
result:
|
|
202
|
+
recommendations: list[str] = []
|
|
203
|
+
result: dict[str, Any] = {
|
|
115
204
|
"r2d2_exists": False,
|
|
116
205
|
"language_support_present": False,
|
|
117
206
|
"config_reading_present": False,
|
|
@@ -137,7 +226,12 @@ def validate_output_style_compatibility() -> Dict[str, Any]:
|
|
|
137
226
|
]
|
|
138
227
|
|
|
139
228
|
result["language_support_present"] = any(keyword in content for keyword in language_keywords)
|
|
140
|
-
|
|
229
|
+
# Check for config reading (supports both YAML sections and legacy JSON)
|
|
230
|
+
result["config_reading_present"] = (
|
|
231
|
+
".moai/config/sections" in content
|
|
232
|
+
or ".moai/config/config.yaml" in content
|
|
233
|
+
or ".moai/config/config.json" in content
|
|
234
|
+
)
|
|
141
235
|
|
|
142
236
|
if not result["language_support_present"]:
|
|
143
237
|
recommendations.append("Add language support documentation to R2-D2 output style")
|
|
@@ -159,8 +253,8 @@ def validate_session_start_hook() -> Dict[str, Any]:
|
|
|
159
253
|
Returns:
|
|
160
254
|
Hook validation results
|
|
161
255
|
"""
|
|
162
|
-
recommendations:
|
|
163
|
-
result:
|
|
256
|
+
recommendations: list[str] = []
|
|
257
|
+
result: dict[str, Any] = {
|
|
164
258
|
"hook_exists": False,
|
|
165
259
|
"language_display_present": False,
|
|
166
260
|
"recommendations": recommendations,
|
|
@@ -294,22 +388,28 @@ def generate_validation_report() -> str:
|
|
|
294
388
|
def main() -> None:
|
|
295
389
|
"""Main entry point for language configuration validator"""
|
|
296
390
|
try:
|
|
391
|
+
logger.info("Starting language configuration validation")
|
|
297
392
|
report = generate_validation_report()
|
|
298
|
-
print(report)
|
|
393
|
+
print(report) # Keep print for CLI output
|
|
394
|
+
logger.info("Validation completed")
|
|
299
395
|
|
|
300
396
|
# Exit with appropriate code
|
|
301
397
|
config = load_config()
|
|
302
398
|
if "error" in config:
|
|
399
|
+
logger.error("Configuration error detected")
|
|
303
400
|
sys.exit(2) # Config error
|
|
304
401
|
else:
|
|
305
402
|
validation = validate_language_config(config)
|
|
306
403
|
if not validation["valid"]:
|
|
404
|
+
logger.warning("Language configuration validation failed")
|
|
307
405
|
sys.exit(1) # Config invalid
|
|
308
406
|
else:
|
|
407
|
+
logger.info("Language configuration is valid")
|
|
309
408
|
sys.exit(0) # Success
|
|
310
409
|
|
|
311
410
|
except Exception as e:
|
|
312
|
-
|
|
411
|
+
logger.error(f"Language validation error: {e}", exc_info=True)
|
|
412
|
+
print(f"❌ Language validation error: {e}") # Keep print for CLI error output
|
|
313
413
|
sys.exit(3)
|
|
314
414
|
|
|
315
415
|
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
#!/usr/bin/env python3
|
|
4
|
+
"""
|
|
5
|
+
Claude Code Statusline Integration
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Main entry point for MoAI-ADK statusline rendering in Claude Code.
|
|
9
|
+
Collects all necessary information from the project and renders it
|
|
10
|
+
in the specified format for display in the status bar.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import os
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Optional
|
|
18
|
+
|
|
19
|
+
from .alfred_detector import AlfredDetector
|
|
20
|
+
from .config import StatuslineConfig
|
|
21
|
+
from .git_collector import GitCollector
|
|
22
|
+
from .metrics_tracker import MetricsTracker
|
|
23
|
+
from .renderer import StatuslineData, StatuslineRenderer
|
|
24
|
+
from .update_checker import UpdateChecker
|
|
25
|
+
from .version_reader import VersionReader
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def read_session_context() -> dict:
|
|
29
|
+
"""
|
|
30
|
+
Read JSON context from stdin (sent by Claude Code).
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
Dictionary containing session information
|
|
34
|
+
"""
|
|
35
|
+
try:
|
|
36
|
+
# Handle Docker/non-interactive environments by checking TTY
|
|
37
|
+
input_data = sys.stdin.read() if not sys.stdin.isatty() else "{}"
|
|
38
|
+
if input_data:
|
|
39
|
+
try:
|
|
40
|
+
return json.loads(input_data)
|
|
41
|
+
except json.JSONDecodeError as e:
|
|
42
|
+
import logging
|
|
43
|
+
|
|
44
|
+
logging.error(f"Failed to parse JSON from stdin: {e}")
|
|
45
|
+
logging.debug(f"Input data: {input_data[:200]}")
|
|
46
|
+
return {}
|
|
47
|
+
return {}
|
|
48
|
+
except (EOFError, ValueError) as e:
|
|
49
|
+
import logging
|
|
50
|
+
|
|
51
|
+
logging.error(f"Error reading stdin: {e}")
|
|
52
|
+
return {}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def safe_collect_git_info() -> tuple[str, str]:
|
|
56
|
+
"""
|
|
57
|
+
Safely collect git information with fallback.
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Tuple of (branch_name, git_status_str)
|
|
61
|
+
"""
|
|
62
|
+
try:
|
|
63
|
+
collector = GitCollector()
|
|
64
|
+
git_info = collector.collect_git_info()
|
|
65
|
+
|
|
66
|
+
branch = git_info.branch or "unknown"
|
|
67
|
+
git_status = f"+{git_info.staged} M{git_info.modified} ?{git_info.untracked}"
|
|
68
|
+
|
|
69
|
+
return branch, git_status
|
|
70
|
+
except (OSError, AttributeError, RuntimeError):
|
|
71
|
+
# Git collector errors (file access, attribute, or runtime errors)
|
|
72
|
+
return "N/A", ""
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def safe_collect_duration() -> str:
|
|
76
|
+
"""
|
|
77
|
+
Safely collect session duration with fallback.
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
Formatted duration string
|
|
81
|
+
"""
|
|
82
|
+
try:
|
|
83
|
+
tracker = MetricsTracker()
|
|
84
|
+
return tracker.get_duration()
|
|
85
|
+
except (OSError, AttributeError, ValueError):
|
|
86
|
+
# Metrics tracker errors (file access, attribute, or value errors)
|
|
87
|
+
return "0m"
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def safe_collect_alfred_task() -> str:
|
|
91
|
+
"""
|
|
92
|
+
Safely collect active Alfred task with fallback.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Formatted task string
|
|
96
|
+
"""
|
|
97
|
+
try:
|
|
98
|
+
detector = AlfredDetector()
|
|
99
|
+
task = detector.detect_active_task()
|
|
100
|
+
|
|
101
|
+
if task.command:
|
|
102
|
+
stage_suffix = f"-{task.stage}" if task.stage else ""
|
|
103
|
+
return f"[{task.command.upper()}{stage_suffix}]"
|
|
104
|
+
return ""
|
|
105
|
+
except (OSError, AttributeError, RuntimeError):
|
|
106
|
+
# Alfred detector errors (file access, attribute, or runtime errors)
|
|
107
|
+
return ""
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def safe_collect_version() -> str:
|
|
111
|
+
"""
|
|
112
|
+
Safely collect MoAI-ADK version with fallback.
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Version string
|
|
116
|
+
"""
|
|
117
|
+
try:
|
|
118
|
+
reader = VersionReader()
|
|
119
|
+
version = reader.get_version()
|
|
120
|
+
return version or "unknown"
|
|
121
|
+
except (ImportError, AttributeError, OSError):
|
|
122
|
+
# Version reader errors (import, attribute, or file access errors)
|
|
123
|
+
return "unknown"
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# safe_collect_output_style function removed - no longer needed
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def safe_collect_memory() -> str:
|
|
130
|
+
"""
|
|
131
|
+
Safely collect memory usage with fallback.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Formatted memory usage string (e.g., "128MB")
|
|
135
|
+
"""
|
|
136
|
+
try:
|
|
137
|
+
from .memory_collector import MemoryCollector
|
|
138
|
+
|
|
139
|
+
collector = MemoryCollector()
|
|
140
|
+
return collector.get_display_string(mode="process")
|
|
141
|
+
except (ImportError, OSError, AttributeError, RuntimeError):
|
|
142
|
+
# Memory collector errors
|
|
143
|
+
return "N/A"
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def safe_check_update(current_version: str) -> tuple[bool, Optional[str]]:
|
|
147
|
+
"""
|
|
148
|
+
Safely check for updates with fallback.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
current_version: Current version string
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Tuple of (update_available, latest_version)
|
|
155
|
+
"""
|
|
156
|
+
try:
|
|
157
|
+
checker = UpdateChecker()
|
|
158
|
+
update_info = checker.check_for_update(current_version)
|
|
159
|
+
|
|
160
|
+
return update_info.available, update_info.latest_version
|
|
161
|
+
except (OSError, AttributeError, RuntimeError, ValueError):
|
|
162
|
+
# Update checker errors (file access, attribute, runtime, or value errors)
|
|
163
|
+
return False, None
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def format_token_count(tokens: int) -> str:
|
|
167
|
+
"""
|
|
168
|
+
Format token count for display (e.g., 15234 -> "15K").
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
tokens: Number of tokens
|
|
172
|
+
|
|
173
|
+
Returns:
|
|
174
|
+
Formatted string
|
|
175
|
+
"""
|
|
176
|
+
if tokens >= 1000:
|
|
177
|
+
return f"{tokens // 1000}K"
|
|
178
|
+
return str(tokens)
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def extract_context_window(session_context: dict) -> str:
|
|
182
|
+
"""
|
|
183
|
+
Extract and format context window usage from session context.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
session_context: Context passed from Claude Code via stdin
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
Formatted context window string (e.g., "15K/200K")
|
|
190
|
+
"""
|
|
191
|
+
context_info = session_context.get("context_window", {})
|
|
192
|
+
|
|
193
|
+
if not context_info:
|
|
194
|
+
return ""
|
|
195
|
+
|
|
196
|
+
# Get context window size
|
|
197
|
+
context_size = context_info.get("context_window_size", 0)
|
|
198
|
+
if not context_size:
|
|
199
|
+
return ""
|
|
200
|
+
|
|
201
|
+
# Get current usage
|
|
202
|
+
current_usage = context_info.get("current_usage", {})
|
|
203
|
+
if current_usage:
|
|
204
|
+
# Calculate total current tokens
|
|
205
|
+
input_tokens = current_usage.get("input_tokens", 0)
|
|
206
|
+
cache_creation = current_usage.get("cache_creation_input_tokens", 0)
|
|
207
|
+
cache_read = current_usage.get("cache_read_input_tokens", 0)
|
|
208
|
+
current_tokens = input_tokens + cache_creation + cache_read
|
|
209
|
+
else:
|
|
210
|
+
# Fallback to total tokens
|
|
211
|
+
current_tokens = context_info.get("total_input_tokens", 0)
|
|
212
|
+
|
|
213
|
+
if current_tokens > 0:
|
|
214
|
+
return f"{format_token_count(current_tokens)}/{format_token_count(context_size)}"
|
|
215
|
+
|
|
216
|
+
return ""
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def build_statusline_data(session_context: dict, mode: str = "compact") -> str:
|
|
220
|
+
"""
|
|
221
|
+
Build complete statusline string from all data sources.
|
|
222
|
+
|
|
223
|
+
Collects information from:
|
|
224
|
+
- Claude Code session context (via stdin)
|
|
225
|
+
- Git repository
|
|
226
|
+
- Session metrics
|
|
227
|
+
- Alfred workflow state
|
|
228
|
+
- MoAI-ADK version
|
|
229
|
+
- Update checker
|
|
230
|
+
- Output style
|
|
231
|
+
- Context window usage
|
|
232
|
+
|
|
233
|
+
Args:
|
|
234
|
+
session_context: Context passed from Claude Code via stdin
|
|
235
|
+
mode: Display mode (compact, extended, minimal)
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
Rendered statusline string
|
|
239
|
+
"""
|
|
240
|
+
try:
|
|
241
|
+
# Extract model from session context with Claude Code version
|
|
242
|
+
model_info = session_context.get("model", {})
|
|
243
|
+
model_name = model_info.get("display_name") or model_info.get("name") or "Unknown"
|
|
244
|
+
|
|
245
|
+
# Extract Claude Code version separately for new layout
|
|
246
|
+
claude_version = session_context.get("version", "")
|
|
247
|
+
model = model_name
|
|
248
|
+
|
|
249
|
+
# Extract directory
|
|
250
|
+
cwd = session_context.get("cwd", "")
|
|
251
|
+
if cwd:
|
|
252
|
+
directory = Path(cwd).name or Path(cwd).parent.name or "project"
|
|
253
|
+
else:
|
|
254
|
+
directory = "project"
|
|
255
|
+
|
|
256
|
+
# Extract output style from session context
|
|
257
|
+
output_style = session_context.get("output_style", {}).get("name", "")
|
|
258
|
+
|
|
259
|
+
# Extract context window usage
|
|
260
|
+
context_window = extract_context_window(session_context)
|
|
261
|
+
|
|
262
|
+
# Collect all information from local sources
|
|
263
|
+
branch, git_status = safe_collect_git_info()
|
|
264
|
+
duration = safe_collect_duration()
|
|
265
|
+
active_task = safe_collect_alfred_task()
|
|
266
|
+
version = safe_collect_version()
|
|
267
|
+
memory_usage = safe_collect_memory()
|
|
268
|
+
update_available, latest_version = safe_check_update(version)
|
|
269
|
+
|
|
270
|
+
# Build StatuslineData with dynamic fields
|
|
271
|
+
data = StatuslineData(
|
|
272
|
+
model=model,
|
|
273
|
+
claude_version=claude_version,
|
|
274
|
+
version=version,
|
|
275
|
+
memory_usage=memory_usage,
|
|
276
|
+
branch=branch,
|
|
277
|
+
git_status=git_status,
|
|
278
|
+
duration=duration,
|
|
279
|
+
directory=directory,
|
|
280
|
+
active_task=active_task,
|
|
281
|
+
output_style=output_style,
|
|
282
|
+
update_available=update_available,
|
|
283
|
+
latest_version=latest_version,
|
|
284
|
+
context_window=context_window,
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
# Render statusline with labeled sections
|
|
288
|
+
renderer = StatuslineRenderer()
|
|
289
|
+
statusline = renderer.render(data, mode=mode)
|
|
290
|
+
|
|
291
|
+
return statusline
|
|
292
|
+
|
|
293
|
+
except Exception as e:
|
|
294
|
+
# Graceful degradation on any error
|
|
295
|
+
import logging
|
|
296
|
+
|
|
297
|
+
logging.warning(f"Statusline rendering error: {e}")
|
|
298
|
+
return ""
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
def main():
|
|
302
|
+
"""
|
|
303
|
+
Main entry point for Claude Code statusline.
|
|
304
|
+
|
|
305
|
+
Reads JSON from stdin, processes all information,
|
|
306
|
+
and outputs the formatted statusline string.
|
|
307
|
+
"""
|
|
308
|
+
# Debug mode check
|
|
309
|
+
debug_mode = os.environ.get("MOAI_STATUSLINE_DEBUG") == "1"
|
|
310
|
+
|
|
311
|
+
# Read session context from Claude Code
|
|
312
|
+
session_context = read_session_context()
|
|
313
|
+
|
|
314
|
+
if debug_mode:
|
|
315
|
+
# Write debug info to stderr for troubleshooting
|
|
316
|
+
sys.stderr.write(f"[DEBUG] Received session_context: {json.dumps(session_context, indent=2)}\n")
|
|
317
|
+
sys.stderr.flush()
|
|
318
|
+
|
|
319
|
+
# Load configuration
|
|
320
|
+
config = StatuslineConfig()
|
|
321
|
+
|
|
322
|
+
# Determine display mode (priority: session context > environment > config > default)
|
|
323
|
+
mode = (
|
|
324
|
+
session_context.get("statusline", {}).get("mode")
|
|
325
|
+
or os.environ.get("MOAI_STATUSLINE_MODE")
|
|
326
|
+
or config.get("statusline.mode")
|
|
327
|
+
or "extended"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
# Build and output statusline
|
|
331
|
+
statusline = build_statusline_data(session_context, mode=mode)
|
|
332
|
+
if debug_mode:
|
|
333
|
+
sys.stderr.write(f"[DEBUG] Generated statusline: {statusline}\n")
|
|
334
|
+
sys.stderr.flush()
|
|
335
|
+
|
|
336
|
+
if statusline:
|
|
337
|
+
print(statusline, end="")
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
if __name__ == "__main__":
|
|
341
|
+
main()
|