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
moai_adk/lsp/protocol.py
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
# LSP Protocol Implementation
|
|
2
|
+
"""JSON-RPC 2.0 protocol implementation for LSP communication.
|
|
3
|
+
|
|
4
|
+
This module implements the JSON-RPC 2.0 protocol used by the Language Server
|
|
5
|
+
Protocol (LSP) for communication between client and server.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import json
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from typing import Any
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class ProtocolError(Exception):
|
|
17
|
+
"""Base exception for protocol errors."""
|
|
18
|
+
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ContentLengthError(ProtocolError):
|
|
23
|
+
"""Error raised when Content-Length is invalid or missing."""
|
|
24
|
+
|
|
25
|
+
pass
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass
|
|
29
|
+
class JsonRpcError:
|
|
30
|
+
"""JSON-RPC 2.0 error object.
|
|
31
|
+
|
|
32
|
+
Attributes:
|
|
33
|
+
code: Error code (integer).
|
|
34
|
+
message: Error message.
|
|
35
|
+
data: Optional additional error data.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# Standard JSON-RPC error codes
|
|
39
|
+
PARSE_ERROR = -32700
|
|
40
|
+
INVALID_REQUEST = -32600
|
|
41
|
+
METHOD_NOT_FOUND = -32601
|
|
42
|
+
INVALID_PARAMS = -32602
|
|
43
|
+
INTERNAL_ERROR = -32603
|
|
44
|
+
|
|
45
|
+
code: int
|
|
46
|
+
message: str
|
|
47
|
+
data: Any | None = None
|
|
48
|
+
|
|
49
|
+
def to_dict(self) -> dict[str, Any]:
|
|
50
|
+
"""Convert error to dictionary.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
Dictionary representation of the error.
|
|
54
|
+
"""
|
|
55
|
+
result = {"code": self.code, "message": self.message}
|
|
56
|
+
if self.data is not None:
|
|
57
|
+
result["data"] = self.data
|
|
58
|
+
return result
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, data: dict[str, Any]) -> JsonRpcError:
|
|
62
|
+
"""Create error from dictionary.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
data: Dictionary containing error fields.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
JsonRpcError instance.
|
|
69
|
+
"""
|
|
70
|
+
return cls(
|
|
71
|
+
code=data["code"],
|
|
72
|
+
message=data["message"],
|
|
73
|
+
data=data.get("data"),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class JsonRpcRequest:
|
|
79
|
+
"""JSON-RPC 2.0 request message.
|
|
80
|
+
|
|
81
|
+
A request message to describe a request between client and server.
|
|
82
|
+
|
|
83
|
+
Attributes:
|
|
84
|
+
id: The request id (used to match response).
|
|
85
|
+
method: The method to be invoked.
|
|
86
|
+
params: The method's params.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
id: int | str
|
|
90
|
+
method: str
|
|
91
|
+
params: dict[str, Any] | list[Any] | None = None
|
|
92
|
+
|
|
93
|
+
def to_json(self) -> str:
|
|
94
|
+
"""Serialize request to JSON string.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
JSON string representation.
|
|
98
|
+
"""
|
|
99
|
+
data: dict[str, Any] = {
|
|
100
|
+
"jsonrpc": "2.0",
|
|
101
|
+
"id": self.id,
|
|
102
|
+
"method": self.method,
|
|
103
|
+
}
|
|
104
|
+
if self.params is not None:
|
|
105
|
+
data["params"] = self.params
|
|
106
|
+
return json.dumps(data)
|
|
107
|
+
|
|
108
|
+
def to_dict(self) -> dict[str, Any]:
|
|
109
|
+
"""Convert to dictionary.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Dictionary representation.
|
|
113
|
+
"""
|
|
114
|
+
data: dict[str, Any] = {
|
|
115
|
+
"jsonrpc": "2.0",
|
|
116
|
+
"id": self.id,
|
|
117
|
+
"method": self.method,
|
|
118
|
+
}
|
|
119
|
+
if self.params is not None:
|
|
120
|
+
data["params"] = self.params
|
|
121
|
+
return data
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@dataclass
|
|
125
|
+
class JsonRpcNotification:
|
|
126
|
+
"""JSON-RPC 2.0 notification message.
|
|
127
|
+
|
|
128
|
+
A notification message has no id and expects no response.
|
|
129
|
+
|
|
130
|
+
Attributes:
|
|
131
|
+
method: The method to be invoked.
|
|
132
|
+
params: The method's params.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
method: str
|
|
136
|
+
params: dict[str, Any] | list[Any] | None = None
|
|
137
|
+
|
|
138
|
+
def to_json(self) -> str:
|
|
139
|
+
"""Serialize notification to JSON string.
|
|
140
|
+
|
|
141
|
+
Returns:
|
|
142
|
+
JSON string representation.
|
|
143
|
+
"""
|
|
144
|
+
data: dict[str, Any] = {
|
|
145
|
+
"jsonrpc": "2.0",
|
|
146
|
+
"method": self.method,
|
|
147
|
+
}
|
|
148
|
+
if self.params is not None:
|
|
149
|
+
data["params"] = self.params
|
|
150
|
+
return json.dumps(data)
|
|
151
|
+
|
|
152
|
+
def to_dict(self) -> dict[str, Any]:
|
|
153
|
+
"""Convert to dictionary.
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
Dictionary representation.
|
|
157
|
+
"""
|
|
158
|
+
data: dict[str, Any] = {
|
|
159
|
+
"jsonrpc": "2.0",
|
|
160
|
+
"method": self.method,
|
|
161
|
+
}
|
|
162
|
+
if self.params is not None:
|
|
163
|
+
data["params"] = self.params
|
|
164
|
+
return data
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
@dataclass
|
|
168
|
+
class JsonRpcResponse:
|
|
169
|
+
"""JSON-RPC 2.0 response message.
|
|
170
|
+
|
|
171
|
+
A response message sent as a result of a request.
|
|
172
|
+
|
|
173
|
+
Attributes:
|
|
174
|
+
id: The request id.
|
|
175
|
+
result: The result of a request (mutually exclusive with error).
|
|
176
|
+
error: The error in case of failure (mutually exclusive with result).
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
id: int | str
|
|
180
|
+
result: Any | None = None
|
|
181
|
+
error: JsonRpcError | None = None
|
|
182
|
+
|
|
183
|
+
def to_json(self) -> str:
|
|
184
|
+
"""Serialize response to JSON string.
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
JSON string representation.
|
|
188
|
+
"""
|
|
189
|
+
data: dict[str, Any] = {
|
|
190
|
+
"jsonrpc": "2.0",
|
|
191
|
+
"id": self.id,
|
|
192
|
+
}
|
|
193
|
+
if self.error is not None:
|
|
194
|
+
data["error"] = self.error.to_dict()
|
|
195
|
+
else:
|
|
196
|
+
data["result"] = self.result
|
|
197
|
+
return json.dumps(data)
|
|
198
|
+
|
|
199
|
+
@classmethod
|
|
200
|
+
def from_json(cls, data: str) -> JsonRpcResponse:
|
|
201
|
+
"""Parse response from JSON string.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
data: JSON string to parse.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
JsonRpcResponse instance.
|
|
208
|
+
"""
|
|
209
|
+
parsed = json.loads(data)
|
|
210
|
+
return cls.from_dict(parsed)
|
|
211
|
+
|
|
212
|
+
@classmethod
|
|
213
|
+
def from_dict(cls, data: dict[str, Any]) -> JsonRpcResponse:
|
|
214
|
+
"""Create response from dictionary.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
data: Dictionary containing response fields.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
JsonRpcResponse instance.
|
|
221
|
+
"""
|
|
222
|
+
error = None
|
|
223
|
+
if "error" in data:
|
|
224
|
+
error = JsonRpcError.from_dict(data["error"])
|
|
225
|
+
|
|
226
|
+
return cls(
|
|
227
|
+
id=data["id"],
|
|
228
|
+
result=data.get("result"),
|
|
229
|
+
error=error,
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class LSPProtocol:
|
|
234
|
+
"""LSP JSON-RPC 2.0 protocol handler.
|
|
235
|
+
|
|
236
|
+
Handles encoding and decoding of LSP messages using the JSON-RPC 2.0
|
|
237
|
+
protocol with Content-Length headers.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
def __init__(self) -> None:
|
|
241
|
+
"""Initialize the protocol handler."""
|
|
242
|
+
self._request_id: int = 0
|
|
243
|
+
self._pending_requests: dict[int | str, asyncio.Future[Any]] = {}
|
|
244
|
+
|
|
245
|
+
def generate_id(self) -> int:
|
|
246
|
+
"""Generate a unique request ID.
|
|
247
|
+
|
|
248
|
+
Returns:
|
|
249
|
+
Unique integer ID.
|
|
250
|
+
"""
|
|
251
|
+
self._request_id += 1
|
|
252
|
+
return self._request_id
|
|
253
|
+
|
|
254
|
+
def encode_message(self, message: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse) -> bytes:
|
|
255
|
+
"""Encode a message with Content-Length header.
|
|
256
|
+
|
|
257
|
+
Args:
|
|
258
|
+
message: The message to encode.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Encoded bytes with header and body.
|
|
262
|
+
"""
|
|
263
|
+
body = message.to_json().encode("utf-8")
|
|
264
|
+
header = f"Content-Length: {len(body)}\r\n\r\n".encode("utf-8")
|
|
265
|
+
return header + body
|
|
266
|
+
|
|
267
|
+
def decode_message(self, data: bytes) -> dict[str, Any]:
|
|
268
|
+
"""Decode a message from bytes.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
data: The raw bytes to decode.
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
Parsed JSON dictionary.
|
|
275
|
+
|
|
276
|
+
Raises:
|
|
277
|
+
ProtocolError: If the message format is invalid.
|
|
278
|
+
ContentLengthError: If Content-Length is invalid.
|
|
279
|
+
"""
|
|
280
|
+
# Split header and body
|
|
281
|
+
try:
|
|
282
|
+
header_end = data.index(b"\r\n\r\n")
|
|
283
|
+
except ValueError:
|
|
284
|
+
raise ProtocolError("Missing header separator")
|
|
285
|
+
|
|
286
|
+
header_bytes = data[:header_end]
|
|
287
|
+
body_bytes = data[header_end + 4 :]
|
|
288
|
+
|
|
289
|
+
# Parse Content-Length
|
|
290
|
+
content_length = None
|
|
291
|
+
for line in header_bytes.decode("utf-8").split("\r\n"):
|
|
292
|
+
if line.startswith("Content-Length:"):
|
|
293
|
+
try:
|
|
294
|
+
content_length = int(line.split(":")[1].strip())
|
|
295
|
+
except ValueError:
|
|
296
|
+
raise ContentLengthError(f"Invalid Content-Length value: {line}")
|
|
297
|
+
break
|
|
298
|
+
|
|
299
|
+
if content_length is None:
|
|
300
|
+
raise ProtocolError("Missing Content-Length header")
|
|
301
|
+
|
|
302
|
+
# Parse body
|
|
303
|
+
body_str = body_bytes[:content_length].decode("utf-8")
|
|
304
|
+
return json.loads(body_str)
|
|
305
|
+
|
|
306
|
+
async def read_message(self, reader: asyncio.StreamReader) -> dict[str, Any]:
|
|
307
|
+
"""Read a complete message from a stream.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
reader: The stream reader.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Parsed JSON dictionary.
|
|
314
|
+
|
|
315
|
+
Raises:
|
|
316
|
+
ProtocolError: If the message format is invalid.
|
|
317
|
+
ContentLengthError: If Content-Length is invalid.
|
|
318
|
+
"""
|
|
319
|
+
# Read headers until we find \r\n\r\n
|
|
320
|
+
headers = b""
|
|
321
|
+
while True:
|
|
322
|
+
line = await reader.readline()
|
|
323
|
+
if not line:
|
|
324
|
+
raise ProtocolError("Connection closed while reading headers")
|
|
325
|
+
headers += line
|
|
326
|
+
if headers.endswith(b"\r\n\r\n"):
|
|
327
|
+
break
|
|
328
|
+
|
|
329
|
+
# Parse Content-Length
|
|
330
|
+
content_length: int | None = None
|
|
331
|
+
headers_text: str = headers.decode("utf-8")
|
|
332
|
+
for header_line in headers_text.split("\r\n"):
|
|
333
|
+
if header_line.startswith("Content-Length:"):
|
|
334
|
+
try:
|
|
335
|
+
content_length = int(header_line.split(":")[1].strip())
|
|
336
|
+
except ValueError:
|
|
337
|
+
raise ContentLengthError(f"Invalid Content-Length: {header_line}")
|
|
338
|
+
break
|
|
339
|
+
|
|
340
|
+
if content_length is None:
|
|
341
|
+
raise ProtocolError("Missing Content-Length header")
|
|
342
|
+
|
|
343
|
+
# Read body
|
|
344
|
+
body = await reader.readexactly(content_length)
|
|
345
|
+
return json.loads(body.decode("utf-8"))
|
|
346
|
+
|
|
347
|
+
async def write_message(
|
|
348
|
+
self,
|
|
349
|
+
writer: Any, # asyncio.StreamWriter or mock
|
|
350
|
+
message: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse,
|
|
351
|
+
) -> None:
|
|
352
|
+
"""Write a message to a stream.
|
|
353
|
+
|
|
354
|
+
Args:
|
|
355
|
+
writer: The stream writer.
|
|
356
|
+
message: The message to write.
|
|
357
|
+
"""
|
|
358
|
+
encoded = self.encode_message(message)
|
|
359
|
+
writer.write(encoded)
|
|
360
|
+
await writer.drain()
|
|
361
|
+
|
|
362
|
+
def add_pending_request(self, request_id: int | str, future: asyncio.Future[Any]) -> None:
|
|
363
|
+
"""Add a pending request to track.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
request_id: The request ID.
|
|
367
|
+
future: The future to complete when response arrives.
|
|
368
|
+
"""
|
|
369
|
+
self._pending_requests[request_id] = future
|
|
370
|
+
|
|
371
|
+
def has_pending_request(self, request_id: int | str) -> bool:
|
|
372
|
+
"""Check if a request is pending.
|
|
373
|
+
|
|
374
|
+
Args:
|
|
375
|
+
request_id: The request ID to check.
|
|
376
|
+
|
|
377
|
+
Returns:
|
|
378
|
+
True if the request is pending.
|
|
379
|
+
"""
|
|
380
|
+
return request_id in self._pending_requests
|
|
381
|
+
|
|
382
|
+
def complete_request(self, request_id: int | str, result: Any) -> None:
|
|
383
|
+
"""Complete a pending request with a result.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
request_id: The request ID.
|
|
387
|
+
result: The result to set.
|
|
388
|
+
"""
|
|
389
|
+
if request_id in self._pending_requests:
|
|
390
|
+
future = self._pending_requests.pop(request_id)
|
|
391
|
+
if not future.done():
|
|
392
|
+
future.set_result(result)
|
|
393
|
+
|
|
394
|
+
def fail_request(self, request_id: int | str, error: JsonRpcError) -> None:
|
|
395
|
+
"""Fail a pending request with an error.
|
|
396
|
+
|
|
397
|
+
Args:
|
|
398
|
+
request_id: The request ID.
|
|
399
|
+
error: The error to set.
|
|
400
|
+
"""
|
|
401
|
+
if request_id in self._pending_requests:
|
|
402
|
+
future = self._pending_requests.pop(request_id)
|
|
403
|
+
if not future.done():
|
|
404
|
+
future.set_exception(Exception(error.message))
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# LSP Server Manager
|
|
2
|
+
"""LSP server lifecycle management.
|
|
3
|
+
|
|
4
|
+
This module manages the lifecycle of Language Server Protocol (LSP) servers,
|
|
5
|
+
including starting, stopping, and tracking servers for different languages.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import asyncio
|
|
11
|
+
import json
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ServerNotFoundError(Exception):
|
|
18
|
+
"""Error raised when a language server configuration is not found."""
|
|
19
|
+
|
|
20
|
+
pass
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ServerStartError(Exception):
|
|
24
|
+
"""Error raised when a language server fails to start."""
|
|
25
|
+
|
|
26
|
+
pass
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class LSPServerConfig:
|
|
31
|
+
"""Configuration for an LSP server.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
language: The language identifier (e.g., 'python', 'typescript').
|
|
35
|
+
command: The command to start the server.
|
|
36
|
+
args: Command-line arguments for the server.
|
|
37
|
+
extensions: Mapping of file extensions to language IDs.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
language: str
|
|
41
|
+
command: str
|
|
42
|
+
args: list[str]
|
|
43
|
+
extensions: dict[str, str]
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def from_dict(cls, language: str, data: dict[str, Any]) -> LSPServerConfig:
|
|
47
|
+
"""Create a config from a dictionary.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
language: The language identifier.
|
|
51
|
+
data: Dictionary containing command, args, and extensionToLanguage.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
LSPServerConfig instance.
|
|
55
|
+
"""
|
|
56
|
+
return cls(
|
|
57
|
+
language=language,
|
|
58
|
+
command=data["command"],
|
|
59
|
+
args=data.get("args", []),
|
|
60
|
+
extensions=data.get("extensionToLanguage", {}),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def get_full_command(self) -> list[str]:
|
|
64
|
+
"""Get the full command with arguments.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
List containing command and all arguments.
|
|
68
|
+
"""
|
|
69
|
+
return [self.command] + self.args
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
@dataclass
|
|
73
|
+
class LSPServer:
|
|
74
|
+
"""An LSP server instance.
|
|
75
|
+
|
|
76
|
+
Attributes:
|
|
77
|
+
config: The server configuration.
|
|
78
|
+
process: The subprocess running the server (None if not started).
|
|
79
|
+
"""
|
|
80
|
+
|
|
81
|
+
config: LSPServerConfig
|
|
82
|
+
process: asyncio.subprocess.Process | None = None
|
|
83
|
+
|
|
84
|
+
def is_running(self) -> bool:
|
|
85
|
+
"""Check if the server is currently running.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
True if the server process exists and hasn't exited.
|
|
89
|
+
"""
|
|
90
|
+
if self.process is None:
|
|
91
|
+
return False
|
|
92
|
+
return self.process.returncode is None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class LSPServerManager:
|
|
96
|
+
"""Manages LSP server lifecycles.
|
|
97
|
+
|
|
98
|
+
This class handles starting, stopping, and tracking LSP servers
|
|
99
|
+
for different programming languages. It loads configuration from
|
|
100
|
+
.lsp.json files and manages server processes.
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(self) -> None:
|
|
104
|
+
"""Initialize the server manager."""
|
|
105
|
+
self.configs: dict[str, LSPServerConfig] = {}
|
|
106
|
+
self.servers: dict[str, LSPServer] = {}
|
|
107
|
+
|
|
108
|
+
def load_config(self, config_path: Path) -> None:
|
|
109
|
+
"""Load server configurations from a .lsp.json file.
|
|
110
|
+
|
|
111
|
+
Args:
|
|
112
|
+
config_path: Path to the .lsp.json file.
|
|
113
|
+
"""
|
|
114
|
+
with open(config_path) as f:
|
|
115
|
+
data = json.load(f)
|
|
116
|
+
|
|
117
|
+
self._parse_config_data(data)
|
|
118
|
+
|
|
119
|
+
def load_config_from_string(self, json_content: str) -> None:
|
|
120
|
+
"""Load server configurations from a JSON string.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
json_content: JSON string containing the configuration.
|
|
124
|
+
"""
|
|
125
|
+
data = json.loads(json_content)
|
|
126
|
+
self._parse_config_data(data)
|
|
127
|
+
|
|
128
|
+
def _parse_config_data(self, data: dict[str, Any]) -> None:
|
|
129
|
+
"""Parse configuration data from a dictionary.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
data: Dictionary containing language configurations.
|
|
133
|
+
"""
|
|
134
|
+
# Skip special keys like $schema and _comment
|
|
135
|
+
skip_keys = {"$schema", "_comment"}
|
|
136
|
+
|
|
137
|
+
for language, config_data in data.items():
|
|
138
|
+
if language in skip_keys:
|
|
139
|
+
continue
|
|
140
|
+
|
|
141
|
+
# Skip if not a valid config dict
|
|
142
|
+
if not isinstance(config_data, dict):
|
|
143
|
+
continue
|
|
144
|
+
|
|
145
|
+
# Must have a command
|
|
146
|
+
if "command" not in config_data:
|
|
147
|
+
continue
|
|
148
|
+
|
|
149
|
+
self.configs[language] = LSPServerConfig.from_dict(language, config_data)
|
|
150
|
+
|
|
151
|
+
def get_language_for_file(self, file_path: str) -> str | None:
|
|
152
|
+
"""Get the language for a file based on its extension.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
file_path: Path to the file.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
Language identifier or None if not found.
|
|
159
|
+
"""
|
|
160
|
+
# Get file extension
|
|
161
|
+
path = Path(file_path)
|
|
162
|
+
ext = path.suffix.lower()
|
|
163
|
+
|
|
164
|
+
# Search through all configs to find matching extension
|
|
165
|
+
for language, config in self.configs.items():
|
|
166
|
+
if ext in config.extensions:
|
|
167
|
+
return language
|
|
168
|
+
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
def get_server(self, language: str) -> LSPServer | None:
|
|
172
|
+
"""Get a running server for a language.
|
|
173
|
+
|
|
174
|
+
Args:
|
|
175
|
+
language: The language identifier.
|
|
176
|
+
|
|
177
|
+
Returns:
|
|
178
|
+
The LSPServer instance or None if not running.
|
|
179
|
+
"""
|
|
180
|
+
return self.servers.get(language)
|
|
181
|
+
|
|
182
|
+
async def start_server(self, language: str) -> LSPServer:
|
|
183
|
+
"""Start an LSP server for a language.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
language: The language identifier.
|
|
187
|
+
|
|
188
|
+
Returns:
|
|
189
|
+
The started LSPServer instance.
|
|
190
|
+
|
|
191
|
+
Raises:
|
|
192
|
+
ServerNotFoundError: If no configuration exists for the language.
|
|
193
|
+
ServerStartError: If the server fails to start.
|
|
194
|
+
"""
|
|
195
|
+
# Check if server is already running
|
|
196
|
+
existing = self.servers.get(language)
|
|
197
|
+
if existing and existing.is_running():
|
|
198
|
+
return existing
|
|
199
|
+
|
|
200
|
+
# Get configuration
|
|
201
|
+
config = self.configs.get(language)
|
|
202
|
+
if config is None:
|
|
203
|
+
raise ServerNotFoundError(f"No configuration found for language: {language}")
|
|
204
|
+
|
|
205
|
+
# Start the process
|
|
206
|
+
try:
|
|
207
|
+
command = config.get_full_command()
|
|
208
|
+
process = await asyncio.create_subprocess_exec(
|
|
209
|
+
*command,
|
|
210
|
+
stdin=asyncio.subprocess.PIPE,
|
|
211
|
+
stdout=asyncio.subprocess.PIPE,
|
|
212
|
+
stderr=asyncio.subprocess.PIPE,
|
|
213
|
+
)
|
|
214
|
+
except Exception as e:
|
|
215
|
+
raise ServerStartError(f"Failed to start {language} server: {e}") from e
|
|
216
|
+
|
|
217
|
+
# Create and store server
|
|
218
|
+
server = LSPServer(config=config, process=process)
|
|
219
|
+
self.servers[language] = server
|
|
220
|
+
|
|
221
|
+
return server
|
|
222
|
+
|
|
223
|
+
async def stop_server(self, language: str) -> None:
|
|
224
|
+
"""Stop an LSP server for a language.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
language: The language identifier.
|
|
228
|
+
"""
|
|
229
|
+
server = self.servers.get(language)
|
|
230
|
+
if server is None:
|
|
231
|
+
return
|
|
232
|
+
|
|
233
|
+
if server.process is not None and server.is_running():
|
|
234
|
+
server.process.terminate()
|
|
235
|
+
try:
|
|
236
|
+
await asyncio.wait_for(server.process.wait(), timeout=5.0)
|
|
237
|
+
except asyncio.TimeoutError:
|
|
238
|
+
server.process.kill()
|
|
239
|
+
await server.process.wait()
|
|
240
|
+
|
|
241
|
+
# Remove from tracking
|
|
242
|
+
self.servers.pop(language, None)
|
|
243
|
+
|
|
244
|
+
async def stop_all_servers(self) -> None:
|
|
245
|
+
"""Stop all running LSP servers."""
|
|
246
|
+
languages = list(self.servers.keys())
|
|
247
|
+
for language in languages:
|
|
248
|
+
await self.stop_server(language)
|
|
@@ -101,7 +101,7 @@ class ConfigurationManager:
|
|
|
101
101
|
return config
|
|
102
102
|
|
|
103
103
|
def _parse_responses(self, responses: Dict[str, Any]) -> Dict[str, Any]:
|
|
104
|
-
"""Parse flat response dict into nested config structure"""
|
|
104
|
+
"""Parse flat or nested response dict into nested config structure"""
|
|
105
105
|
config: Dict[str, Any] = {
|
|
106
106
|
"user": {},
|
|
107
107
|
"language": {},
|
|
@@ -142,6 +142,13 @@ class ConfigurationManager:
|
|
|
142
142
|
if response_key in mapping:
|
|
143
143
|
path = mapping[response_key]
|
|
144
144
|
self._set_nested(config, path, response_value)
|
|
145
|
+
elif isinstance(response_value, dict):
|
|
146
|
+
# Handle nested input (e.g., {"user": {"name": "..."}, ...})
|
|
147
|
+
if response_key in config:
|
|
148
|
+
config[response_key] = response_value
|
|
149
|
+
else:
|
|
150
|
+
# Direct key assignment for unknown keys
|
|
151
|
+
config[response_key] = response_value
|
|
145
152
|
|
|
146
153
|
return config
|
|
147
154
|
|
moai_adk/py.typed
ADDED
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Ralph Engine Module
|
|
2
|
+
"""Ralph Engine - Intelligent code quality assurance system for MoAI-ADK.
|
|
3
|
+
|
|
4
|
+
This module provides the unified Ralph Engine that integrates:
|
|
5
|
+
1. LSP (Language Server Protocol) for real-time diagnostics
|
|
6
|
+
2. AST-grep for structural pattern matching and security scanning
|
|
7
|
+
3. Loop Controller for autonomous feedback loops
|
|
8
|
+
|
|
9
|
+
The Ralph Engine is the main entry point for intelligent code quality
|
|
10
|
+
operations, combining all three technologies into a cohesive system.
|
|
11
|
+
|
|
12
|
+
Main Components:
|
|
13
|
+
- RalphEngine: Main facade class integrating all components
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
from moai_adk.ralph import RalphEngine
|
|
17
|
+
|
|
18
|
+
engine = RalphEngine(project_root="/path/to/project")
|
|
19
|
+
|
|
20
|
+
# Diagnose a file (LSP + AST-grep combined)
|
|
21
|
+
result = await engine.diagnose_file("src/main.py")
|
|
22
|
+
|
|
23
|
+
# Start an autonomous feedback loop
|
|
24
|
+
state = engine.start_feedback_loop(promise="Fix all errors")
|
|
25
|
+
|
|
26
|
+
# Cancel the loop if needed
|
|
27
|
+
engine.cancel_loop(state.loop_id)
|
|
28
|
+
|
|
29
|
+
# Cleanup
|
|
30
|
+
await engine.shutdown()
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
from moai_adk.ralph.engine import RalphEngine
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"RalphEngine",
|
|
37
|
+
]
|