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/client.py
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
# MoAI LSP Client
|
|
2
|
+
"""LSP client interface for MoAI-ADK.
|
|
3
|
+
|
|
4
|
+
This module provides the main LSP client interface for getting diagnostics,
|
|
5
|
+
finding references, renaming symbols, and other LSP operations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
from moai_adk.lsp.models import (
|
|
14
|
+
Diagnostic,
|
|
15
|
+
DiagnosticSeverity,
|
|
16
|
+
HoverInfo,
|
|
17
|
+
Location,
|
|
18
|
+
Position,
|
|
19
|
+
Range,
|
|
20
|
+
TextEdit,
|
|
21
|
+
WorkspaceEdit,
|
|
22
|
+
)
|
|
23
|
+
from moai_adk.lsp.server_manager import LSPServerManager
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class LSPClientError(Exception):
|
|
27
|
+
"""Error raised by the LSP client."""
|
|
28
|
+
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class MoAILSPClient:
|
|
33
|
+
"""LSP client for MoAI-ADK.
|
|
34
|
+
|
|
35
|
+
Provides a high-level interface for LSP operations including:
|
|
36
|
+
- Getting diagnostics for files
|
|
37
|
+
- Finding references to symbols
|
|
38
|
+
- Renaming symbols across the project
|
|
39
|
+
- Getting hover information
|
|
40
|
+
|
|
41
|
+
Attributes:
|
|
42
|
+
project_root: The root directory of the project.
|
|
43
|
+
server_manager: Manager for LSP server processes.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, project_root: str | Path) -> None:
|
|
47
|
+
"""Initialize the LSP client.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
project_root: Path to the project root directory.
|
|
51
|
+
"""
|
|
52
|
+
self.project_root = Path(project_root)
|
|
53
|
+
self.server_manager = LSPServerManager()
|
|
54
|
+
self._load_config()
|
|
55
|
+
|
|
56
|
+
def _load_config(self) -> None:
|
|
57
|
+
"""Load LSP configuration from .lsp.json file."""
|
|
58
|
+
config_path = self.project_root / ".lsp.json"
|
|
59
|
+
if config_path.exists():
|
|
60
|
+
self.server_manager.load_config(config_path)
|
|
61
|
+
|
|
62
|
+
# ==========================================================================
|
|
63
|
+
# Public API
|
|
64
|
+
# ==========================================================================
|
|
65
|
+
|
|
66
|
+
async def get_diagnostics(self, file_path: str) -> list[Diagnostic]:
|
|
67
|
+
"""Get diagnostics for a file.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
file_path: Path to the file.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
List of Diagnostic objects.
|
|
74
|
+
"""
|
|
75
|
+
raw_diagnostics = await self._request_diagnostics(file_path)
|
|
76
|
+
return [self._parse_diagnostic(d) for d in raw_diagnostics]
|
|
77
|
+
|
|
78
|
+
async def find_references(self, file_path: str, position: Position) -> list[Location]:
|
|
79
|
+
"""Find all references to the symbol at position.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
file_path: Path to the file.
|
|
83
|
+
position: Position of the symbol.
|
|
84
|
+
|
|
85
|
+
Returns:
|
|
86
|
+
List of Location objects.
|
|
87
|
+
"""
|
|
88
|
+
raw_refs = await self._request_references(file_path, position)
|
|
89
|
+
return [self._parse_location(r) for r in raw_refs]
|
|
90
|
+
|
|
91
|
+
async def rename_symbol(self, file_path: str, position: Position, new_name: str) -> WorkspaceEdit:
|
|
92
|
+
"""Rename the symbol at position.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
file_path: Path to the file.
|
|
96
|
+
position: Position of the symbol.
|
|
97
|
+
new_name: New name for the symbol.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
WorkspaceEdit with all changes.
|
|
101
|
+
"""
|
|
102
|
+
raw_edit = await self._request_rename(file_path, position, new_name)
|
|
103
|
+
return self._parse_workspace_edit(raw_edit)
|
|
104
|
+
|
|
105
|
+
async def get_hover_info(self, file_path: str, position: Position) -> HoverInfo | None:
|
|
106
|
+
"""Get hover information for position.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
file_path: Path to the file.
|
|
110
|
+
position: Position to get hover info for.
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
HoverInfo or None if not available.
|
|
114
|
+
"""
|
|
115
|
+
raw_hover = await self._request_hover(file_path, position)
|
|
116
|
+
if raw_hover is None:
|
|
117
|
+
return None
|
|
118
|
+
return self._parse_hover_info(raw_hover)
|
|
119
|
+
|
|
120
|
+
def get_language_for_file(self, file_path: str) -> str | None:
|
|
121
|
+
"""Get the language for a file.
|
|
122
|
+
|
|
123
|
+
Args:
|
|
124
|
+
file_path: Path to the file.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Language identifier or None.
|
|
128
|
+
"""
|
|
129
|
+
return self.server_manager.get_language_for_file(file_path)
|
|
130
|
+
|
|
131
|
+
async def ensure_server_running(self, language: str) -> None:
|
|
132
|
+
"""Ensure an LSP server is running for a language.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
language: Language identifier.
|
|
136
|
+
"""
|
|
137
|
+
await self.server_manager.start_server(language)
|
|
138
|
+
|
|
139
|
+
async def cleanup(self) -> None:
|
|
140
|
+
"""Clean up by stopping all servers."""
|
|
141
|
+
await self.server_manager.stop_all_servers()
|
|
142
|
+
|
|
143
|
+
# ==========================================================================
|
|
144
|
+
# Internal request methods (to be overridden in tests or by subclasses)
|
|
145
|
+
# ==========================================================================
|
|
146
|
+
|
|
147
|
+
async def _request_diagnostics(self, file_path: str) -> list[dict[str, Any]]:
|
|
148
|
+
"""Request diagnostics from the LSP server.
|
|
149
|
+
|
|
150
|
+
Args:
|
|
151
|
+
file_path: Path to the file.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Raw diagnostic data from server.
|
|
155
|
+
"""
|
|
156
|
+
# This would normally communicate with the LSP server
|
|
157
|
+
# For now, return empty list (actual implementation in Phase 2+)
|
|
158
|
+
return []
|
|
159
|
+
|
|
160
|
+
async def _request_references(self, file_path: str, position: Position) -> list[dict[str, Any]]:
|
|
161
|
+
"""Request references from the LSP server.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
file_path: Path to the file.
|
|
165
|
+
position: Position of the symbol.
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
Raw reference data from server.
|
|
169
|
+
"""
|
|
170
|
+
return []
|
|
171
|
+
|
|
172
|
+
async def _request_rename(self, file_path: str, position: Position, new_name: str) -> dict[str, Any]:
|
|
173
|
+
"""Request rename from the LSP server.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
file_path: Path to the file.
|
|
177
|
+
position: Position of the symbol.
|
|
178
|
+
new_name: New name for the symbol.
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
Raw workspace edit data from server.
|
|
182
|
+
"""
|
|
183
|
+
return {"changes": {}}
|
|
184
|
+
|
|
185
|
+
async def _request_hover(self, file_path: str, position: Position) -> dict[str, Any] | None:
|
|
186
|
+
"""Request hover info from the LSP server.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
file_path: Path to the file.
|
|
190
|
+
position: Position to get hover info for.
|
|
191
|
+
|
|
192
|
+
Returns:
|
|
193
|
+
Raw hover data from server or None.
|
|
194
|
+
"""
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
# ==========================================================================
|
|
198
|
+
# Helper methods
|
|
199
|
+
# ==========================================================================
|
|
200
|
+
|
|
201
|
+
def _file_to_uri(self, file_path: str) -> str:
|
|
202
|
+
"""Convert a file path to a file:// URI.
|
|
203
|
+
|
|
204
|
+
Args:
|
|
205
|
+
file_path: Path to the file.
|
|
206
|
+
|
|
207
|
+
Returns:
|
|
208
|
+
File URI string.
|
|
209
|
+
"""
|
|
210
|
+
if not file_path.startswith("/"):
|
|
211
|
+
file_path = "/" + file_path
|
|
212
|
+
return f"file://{file_path}"
|
|
213
|
+
|
|
214
|
+
def _uri_to_file(self, uri: str) -> str:
|
|
215
|
+
"""Convert a file:// URI to a file path.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
uri: File URI string.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
File path string.
|
|
222
|
+
"""
|
|
223
|
+
if uri.startswith("file://"):
|
|
224
|
+
return uri[7:]
|
|
225
|
+
return uri
|
|
226
|
+
|
|
227
|
+
def _parse_diagnostic(self, raw: dict[str, Any]) -> Diagnostic:
|
|
228
|
+
"""Parse a Diagnostic from raw LSP data.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
raw: Raw diagnostic dictionary from LSP.
|
|
232
|
+
|
|
233
|
+
Returns:
|
|
234
|
+
Diagnostic instance.
|
|
235
|
+
"""
|
|
236
|
+
range_data = raw["range"]
|
|
237
|
+
return Diagnostic(
|
|
238
|
+
range=self._parse_range(range_data),
|
|
239
|
+
severity=DiagnosticSeverity(raw["severity"]),
|
|
240
|
+
code=raw.get("code"),
|
|
241
|
+
source=raw.get("source", ""),
|
|
242
|
+
message=raw["message"],
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
def _parse_location(self, raw: dict[str, Any]) -> Location:
|
|
246
|
+
"""Parse a Location from raw LSP data.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
raw: Raw location dictionary from LSP.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
Location instance.
|
|
253
|
+
"""
|
|
254
|
+
return Location(
|
|
255
|
+
uri=raw["uri"],
|
|
256
|
+
range=self._parse_range(raw["range"]),
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
def _parse_range(self, raw: dict[str, Any]) -> Range:
|
|
260
|
+
"""Parse a Range from raw LSP data.
|
|
261
|
+
|
|
262
|
+
Args:
|
|
263
|
+
raw: Raw range dictionary from LSP.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
Range instance.
|
|
267
|
+
"""
|
|
268
|
+
return Range(
|
|
269
|
+
start=Position(
|
|
270
|
+
line=raw["start"]["line"],
|
|
271
|
+
character=raw["start"]["character"],
|
|
272
|
+
),
|
|
273
|
+
end=Position(
|
|
274
|
+
line=raw["end"]["line"],
|
|
275
|
+
character=raw["end"]["character"],
|
|
276
|
+
),
|
|
277
|
+
)
|
|
278
|
+
|
|
279
|
+
def _parse_workspace_edit(self, raw: dict[str, Any]) -> WorkspaceEdit:
|
|
280
|
+
"""Parse a WorkspaceEdit from raw LSP data.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
raw: Raw workspace edit dictionary from LSP.
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
WorkspaceEdit instance.
|
|
287
|
+
"""
|
|
288
|
+
changes: dict[str, list[TextEdit]] = {}
|
|
289
|
+
|
|
290
|
+
raw_changes = raw.get("changes", {})
|
|
291
|
+
for uri, edits in raw_changes.items():
|
|
292
|
+
changes[uri] = [
|
|
293
|
+
TextEdit(
|
|
294
|
+
range=self._parse_range(edit["range"]),
|
|
295
|
+
new_text=edit["newText"],
|
|
296
|
+
)
|
|
297
|
+
for edit in edits
|
|
298
|
+
]
|
|
299
|
+
|
|
300
|
+
return WorkspaceEdit(changes=changes)
|
|
301
|
+
|
|
302
|
+
def _parse_hover_info(self, raw: dict[str, Any]) -> HoverInfo:
|
|
303
|
+
"""Parse HoverInfo from raw LSP data.
|
|
304
|
+
|
|
305
|
+
Args:
|
|
306
|
+
raw: Raw hover dictionary from LSP.
|
|
307
|
+
|
|
308
|
+
Returns:
|
|
309
|
+
HoverInfo instance.
|
|
310
|
+
"""
|
|
311
|
+
contents = raw.get("contents", "")
|
|
312
|
+
|
|
313
|
+
# Handle MarkupContent format
|
|
314
|
+
if isinstance(contents, dict):
|
|
315
|
+
contents = contents.get("value", "")
|
|
316
|
+
|
|
317
|
+
range_data = raw.get("range")
|
|
318
|
+
hover_range = self._parse_range(range_data) if range_data else None
|
|
319
|
+
|
|
320
|
+
return HoverInfo(contents=contents, range=hover_range)
|
moai_adk/lsp/models.py
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# LSP Data Models
|
|
2
|
+
"""LSP (Language Server Protocol) data models.
|
|
3
|
+
|
|
4
|
+
These dataclasses represent the core LSP types used for communication
|
|
5
|
+
between the client and language servers. All types follow the LSP 3.17
|
|
6
|
+
specification.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass, field
|
|
12
|
+
from enum import IntEnum
|
|
13
|
+
from typing import Union
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DiagnosticSeverity(IntEnum):
|
|
17
|
+
"""Severity level for diagnostics.
|
|
18
|
+
|
|
19
|
+
Values match LSP specification:
|
|
20
|
+
- ERROR = 1: Reports an error
|
|
21
|
+
- WARNING = 2: Reports a warning
|
|
22
|
+
- INFORMATION = 3: Reports an information
|
|
23
|
+
- HINT = 4: Reports a hint
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
ERROR = 1
|
|
27
|
+
WARNING = 2
|
|
28
|
+
INFORMATION = 3
|
|
29
|
+
HINT = 4
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass
|
|
33
|
+
class Position:
|
|
34
|
+
"""A position in a text document.
|
|
35
|
+
|
|
36
|
+
Position in a text document expressed as zero-based line and
|
|
37
|
+
zero-based character offset. A position is between two characters
|
|
38
|
+
like an 'insert' cursor in an editor.
|
|
39
|
+
|
|
40
|
+
Attributes:
|
|
41
|
+
line: Line position in a document (zero-based).
|
|
42
|
+
character: Character offset on a line in a document (zero-based).
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
line: int
|
|
46
|
+
character: int
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class Range:
|
|
51
|
+
"""A range in a text document.
|
|
52
|
+
|
|
53
|
+
A range in a text document expressed as start and end positions.
|
|
54
|
+
A range is comparable to a selection in an editor.
|
|
55
|
+
|
|
56
|
+
Attributes:
|
|
57
|
+
start: The range's start position (inclusive).
|
|
58
|
+
end: The range's end position (exclusive).
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
start: Position
|
|
62
|
+
end: Position
|
|
63
|
+
|
|
64
|
+
def contains(self, position: Position) -> bool:
|
|
65
|
+
"""Check if a position is within this range.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
position: The position to check.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
True if the position is within the range, False otherwise.
|
|
72
|
+
"""
|
|
73
|
+
# Check if position is on the same line for single-line ranges
|
|
74
|
+
if self.start.line == self.end.line:
|
|
75
|
+
return position.line == self.start.line and self.start.character <= position.character <= self.end.character
|
|
76
|
+
|
|
77
|
+
# Multi-line range check
|
|
78
|
+
if position.line < self.start.line or position.line > self.end.line:
|
|
79
|
+
return False
|
|
80
|
+
|
|
81
|
+
if position.line == self.start.line:
|
|
82
|
+
return position.character >= self.start.character
|
|
83
|
+
|
|
84
|
+
if position.line == self.end.line:
|
|
85
|
+
return position.character <= self.end.character
|
|
86
|
+
|
|
87
|
+
return True
|
|
88
|
+
|
|
89
|
+
def is_single_line(self) -> bool:
|
|
90
|
+
"""Check if the range spans only a single line.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
True if start and end are on the same line.
|
|
94
|
+
"""
|
|
95
|
+
return self.start.line == self.end.line
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@dataclass
|
|
99
|
+
class Location:
|
|
100
|
+
"""A location inside a resource.
|
|
101
|
+
|
|
102
|
+
Represents a location inside a resource, such as a line inside a
|
|
103
|
+
text file.
|
|
104
|
+
|
|
105
|
+
Attributes:
|
|
106
|
+
uri: The resource URI (e.g., file:///path/to/file.py).
|
|
107
|
+
range: The range within the resource.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
uri: str
|
|
111
|
+
range: Range
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
@dataclass
|
|
115
|
+
class Diagnostic:
|
|
116
|
+
"""A diagnostic representing an issue in source code.
|
|
117
|
+
|
|
118
|
+
Represents a diagnostic, such as a compiler error or warning.
|
|
119
|
+
Diagnostic objects are only valid in the scope of a resource.
|
|
120
|
+
|
|
121
|
+
Attributes:
|
|
122
|
+
range: The range at which the message applies.
|
|
123
|
+
severity: The diagnostic's severity.
|
|
124
|
+
code: The diagnostic's code (can be string, int, or None).
|
|
125
|
+
source: The diagnostic's source (e.g., 'pyright', 'mypy').
|
|
126
|
+
message: The diagnostic's message.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
range: Range
|
|
130
|
+
severity: DiagnosticSeverity
|
|
131
|
+
code: Union[str, int, None]
|
|
132
|
+
source: str
|
|
133
|
+
message: str
|
|
134
|
+
|
|
135
|
+
def is_error(self) -> bool:
|
|
136
|
+
"""Check if this diagnostic is an error.
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
True if severity is ERROR, False otherwise.
|
|
140
|
+
"""
|
|
141
|
+
return self.severity == DiagnosticSeverity.ERROR
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@dataclass
|
|
145
|
+
class TextDocumentIdentifier:
|
|
146
|
+
"""Identifies a text document using a URI.
|
|
147
|
+
|
|
148
|
+
Text documents are identified using a URI. On the protocol level,
|
|
149
|
+
URIs are passed as strings.
|
|
150
|
+
|
|
151
|
+
Attributes:
|
|
152
|
+
uri: The text document's URI (e.g., file:///path/to/file.py).
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
uri: str
|
|
156
|
+
|
|
157
|
+
@classmethod
|
|
158
|
+
def from_path(cls, file_path: str) -> TextDocumentIdentifier:
|
|
159
|
+
"""Create a TextDocumentIdentifier from a file path.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
file_path: The file path (absolute or relative).
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
A TextDocumentIdentifier with a file:// URI.
|
|
166
|
+
"""
|
|
167
|
+
# Ensure the path starts with /
|
|
168
|
+
if not file_path.startswith("/"):
|
|
169
|
+
file_path = "/" + file_path
|
|
170
|
+
return cls(uri=f"file://{file_path}")
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
@dataclass
|
|
174
|
+
class TextDocumentPositionParams:
|
|
175
|
+
"""Parameters for text document position requests.
|
|
176
|
+
|
|
177
|
+
A parameter literal used in requests to pass a text document
|
|
178
|
+
and a position inside that document.
|
|
179
|
+
|
|
180
|
+
Attributes:
|
|
181
|
+
text_document: The text document.
|
|
182
|
+
position: The position inside the text document.
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
text_document: TextDocumentIdentifier
|
|
186
|
+
position: Position
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@dataclass
|
|
190
|
+
class TextEdit:
|
|
191
|
+
"""A text edit applicable to a text document.
|
|
192
|
+
|
|
193
|
+
A textual edit applicable to a text document.
|
|
194
|
+
|
|
195
|
+
Attributes:
|
|
196
|
+
range: The range of the text document to be manipulated.
|
|
197
|
+
new_text: The string to be inserted. Empty for delete operations.
|
|
198
|
+
"""
|
|
199
|
+
|
|
200
|
+
range: Range
|
|
201
|
+
new_text: str
|
|
202
|
+
|
|
203
|
+
def is_delete(self) -> bool:
|
|
204
|
+
"""Check if this edit represents a deletion.
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
True if new_text is empty (deletion), False otherwise.
|
|
208
|
+
"""
|
|
209
|
+
return self.new_text == ""
|
|
210
|
+
|
|
211
|
+
def is_insert(self) -> bool:
|
|
212
|
+
"""Check if this edit represents an insertion.
|
|
213
|
+
|
|
214
|
+
An insertion is when the range is zero-width (start == end)
|
|
215
|
+
and new_text is non-empty.
|
|
216
|
+
|
|
217
|
+
Returns:
|
|
218
|
+
True if this is an insertion, False otherwise.
|
|
219
|
+
"""
|
|
220
|
+
return (
|
|
221
|
+
self.range.start.line == self.range.end.line
|
|
222
|
+
and self.range.start.character == self.range.end.character
|
|
223
|
+
and self.new_text != ""
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
@dataclass
|
|
228
|
+
class WorkspaceEdit:
|
|
229
|
+
"""A workspace edit represents changes to many resources.
|
|
230
|
+
|
|
231
|
+
A workspace edit represents changes to many resources managed
|
|
232
|
+
in the workspace. The edit should be applied atomically.
|
|
233
|
+
|
|
234
|
+
Attributes:
|
|
235
|
+
changes: Holds changes to existing resources, keyed by URI.
|
|
236
|
+
"""
|
|
237
|
+
|
|
238
|
+
changes: dict[str, list[TextEdit]] = field(default_factory=dict)
|
|
239
|
+
|
|
240
|
+
def file_count(self) -> int:
|
|
241
|
+
"""Get the number of files affected by this edit.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
The number of unique file URIs in the changes.
|
|
245
|
+
"""
|
|
246
|
+
return len(self.changes)
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
@dataclass
|
|
250
|
+
class HoverInfo:
|
|
251
|
+
"""Hover information for a symbol.
|
|
252
|
+
|
|
253
|
+
The result of a hover request.
|
|
254
|
+
|
|
255
|
+
Attributes:
|
|
256
|
+
contents: The hover's content (can be markdown).
|
|
257
|
+
range: Optional range for the symbol being hovered.
|
|
258
|
+
"""
|
|
259
|
+
|
|
260
|
+
contents: str
|
|
261
|
+
range: Range | None = None
|