moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Loop Controller Module
|
|
2
|
+
"""Ralph-style autonomous feedback loop controller for MoAI-ADK.
|
|
3
|
+
|
|
4
|
+
This module provides the core loop controller functionality that enables
|
|
5
|
+
autonomous feedback loops with LSP diagnostics and AST-grep analysis.
|
|
6
|
+
|
|
7
|
+
Main components:
|
|
8
|
+
- LoopState: Data model for tracking loop execution state
|
|
9
|
+
- LoopStorage: Persistent storage for loop states
|
|
10
|
+
- FeedbackGenerator: Generate feedback from LSP and AST-grep results
|
|
11
|
+
- MoAILoopController: Main controller orchestrating the feedback loop
|
|
12
|
+
|
|
13
|
+
Usage:
|
|
14
|
+
from moai_adk.loop import MoAILoopController, LoopStorage
|
|
15
|
+
|
|
16
|
+
storage = LoopStorage(storage_dir=".moai/loop")
|
|
17
|
+
controller = MoAILoopController(storage=storage)
|
|
18
|
+
|
|
19
|
+
# Start a new feedback loop
|
|
20
|
+
state = controller.start_loop(promise="Fix all LSP errors")
|
|
21
|
+
|
|
22
|
+
# Run feedback iteration
|
|
23
|
+
result = await controller.run_feedback_loop(state)
|
|
24
|
+
|
|
25
|
+
# Check completion
|
|
26
|
+
completion = controller.check_completion(state)
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from moai_adk.loop.controller import MoAILoopController
|
|
30
|
+
from moai_adk.loop.feedback import FeedbackGenerator
|
|
31
|
+
from moai_adk.loop.state import (
|
|
32
|
+
ASTIssueSnapshot,
|
|
33
|
+
CompletionResult,
|
|
34
|
+
DiagnosticSnapshot,
|
|
35
|
+
FeedbackResult,
|
|
36
|
+
LoopState,
|
|
37
|
+
LoopStatus,
|
|
38
|
+
)
|
|
39
|
+
from moai_adk.loop.storage import LoopStorage
|
|
40
|
+
|
|
41
|
+
__all__ = [
|
|
42
|
+
# Controller
|
|
43
|
+
"MoAILoopController",
|
|
44
|
+
# State models
|
|
45
|
+
"LoopStatus",
|
|
46
|
+
"DiagnosticSnapshot",
|
|
47
|
+
"ASTIssueSnapshot",
|
|
48
|
+
"LoopState",
|
|
49
|
+
"CompletionResult",
|
|
50
|
+
"FeedbackResult",
|
|
51
|
+
# Supporting classes
|
|
52
|
+
"LoopStorage",
|
|
53
|
+
"FeedbackGenerator",
|
|
54
|
+
]
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
# Loop Controller
|
|
2
|
+
"""Ralph-style autonomous feedback loop controller.
|
|
3
|
+
|
|
4
|
+
Provides the main controller for orchestrating feedback loops that
|
|
5
|
+
integrate LSP diagnostics and AST-grep analysis to guide Claude
|
|
6
|
+
through iterative code improvement.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import uuid
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
|
|
14
|
+
from moai_adk.loop.feedback import FeedbackGenerator
|
|
15
|
+
from moai_adk.loop.state import (
|
|
16
|
+
ASTIssueSnapshot,
|
|
17
|
+
CompletionResult,
|
|
18
|
+
DiagnosticSnapshot,
|
|
19
|
+
FeedbackResult,
|
|
20
|
+
LoopState,
|
|
21
|
+
LoopStatus,
|
|
22
|
+
)
|
|
23
|
+
from moai_adk.loop.storage import LoopStorage
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class MoAILoopController:
|
|
27
|
+
"""Ralph-style feedback loop controller.
|
|
28
|
+
|
|
29
|
+
Orchestrates autonomous feedback loops that continuously gather
|
|
30
|
+
LSP diagnostics and AST-grep results, providing feedback to Claude
|
|
31
|
+
until the specified completion condition (promise) is met.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
storage: The storage backend for loop states.
|
|
35
|
+
feedback_generator: Generator for feedback text.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, storage: LoopStorage | None = None):
|
|
39
|
+
"""Initialize the loop controller.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
storage: Optional storage backend. If not provided, creates
|
|
43
|
+
a default storage in .moai/loop directory.
|
|
44
|
+
"""
|
|
45
|
+
self.storage = storage or LoopStorage()
|
|
46
|
+
self.feedback_generator = FeedbackGenerator()
|
|
47
|
+
|
|
48
|
+
def start_loop(
|
|
49
|
+
self,
|
|
50
|
+
promise: str,
|
|
51
|
+
max_iterations: int = 10,
|
|
52
|
+
) -> LoopState:
|
|
53
|
+
"""Start a new feedback loop.
|
|
54
|
+
|
|
55
|
+
Creates and persists a new loop state with the specified
|
|
56
|
+
completion condition and iteration limit.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
promise: The completion condition for the loop.
|
|
60
|
+
max_iterations: Maximum number of iterations allowed.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
The initial LoopState for the new loop.
|
|
64
|
+
"""
|
|
65
|
+
now = datetime.now(timezone.utc)
|
|
66
|
+
loop_id = f"loop-{uuid.uuid4().hex[:8]}"
|
|
67
|
+
|
|
68
|
+
state = LoopState(
|
|
69
|
+
loop_id=loop_id,
|
|
70
|
+
promise=promise,
|
|
71
|
+
current_iteration=0,
|
|
72
|
+
max_iterations=max_iterations,
|
|
73
|
+
status=LoopStatus.RUNNING,
|
|
74
|
+
created_at=now,
|
|
75
|
+
updated_at=now,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
self.storage.save_state(state)
|
|
79
|
+
return state
|
|
80
|
+
|
|
81
|
+
def check_completion(self, state: LoopState) -> CompletionResult:
|
|
82
|
+
"""Check if the loop's completion condition is met.
|
|
83
|
+
|
|
84
|
+
Analyzes the current state to determine if the promise
|
|
85
|
+
has been fulfilled (no remaining issues).
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
state: The current loop state to check.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
CompletionResult indicating completion status and progress.
|
|
92
|
+
"""
|
|
93
|
+
# Get the most recent snapshots
|
|
94
|
+
current_lsp_issues = 0
|
|
95
|
+
current_ast_issues = 0
|
|
96
|
+
|
|
97
|
+
if state.diagnostics_history:
|
|
98
|
+
latest_diag = state.diagnostics_history[-1]
|
|
99
|
+
current_lsp_issues = latest_diag.total_issues()
|
|
100
|
+
|
|
101
|
+
if state.ast_issues_history:
|
|
102
|
+
latest_ast = state.ast_issues_history[-1]
|
|
103
|
+
current_ast_issues = latest_ast.total_issues
|
|
104
|
+
|
|
105
|
+
total_issues = current_lsp_issues + current_ast_issues
|
|
106
|
+
|
|
107
|
+
# Calculate progress
|
|
108
|
+
initial_issues = self._get_initial_issue_count(state)
|
|
109
|
+
if initial_issues > 0:
|
|
110
|
+
progress = ((initial_issues - total_issues) / initial_issues) * 100
|
|
111
|
+
progress = max(0, min(100, progress))
|
|
112
|
+
else:
|
|
113
|
+
progress = 100.0 if total_issues == 0 else 0.0
|
|
114
|
+
|
|
115
|
+
# Check completion
|
|
116
|
+
if total_issues == 0:
|
|
117
|
+
return CompletionResult(
|
|
118
|
+
is_complete=True,
|
|
119
|
+
reason="All issues resolved. Promise fulfilled.",
|
|
120
|
+
remaining_issues=0,
|
|
121
|
+
progress_percentage=100.0,
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Not complete
|
|
125
|
+
reason = f"{total_issues} issues remaining ({current_lsp_issues} LSP, {current_ast_issues} AST)"
|
|
126
|
+
return CompletionResult(
|
|
127
|
+
is_complete=False,
|
|
128
|
+
reason=reason,
|
|
129
|
+
remaining_issues=total_issues,
|
|
130
|
+
progress_percentage=progress,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
async def run_feedback_loop(self, state: LoopState) -> FeedbackResult:
|
|
134
|
+
"""Execute a single feedback loop iteration.
|
|
135
|
+
|
|
136
|
+
Gathers current LSP diagnostics and AST-grep issues,
|
|
137
|
+
generates feedback, and updates the loop state.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
state: The current loop state.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
FeedbackResult containing the iteration results.
|
|
144
|
+
"""
|
|
145
|
+
now = datetime.now(timezone.utc)
|
|
146
|
+
|
|
147
|
+
# Get current diagnostics
|
|
148
|
+
lsp_snapshot = self._get_lsp_diagnostics()
|
|
149
|
+
ast_snapshot = self._get_ast_issues()
|
|
150
|
+
|
|
151
|
+
# Get previous snapshot for comparison
|
|
152
|
+
previous = None
|
|
153
|
+
if state.diagnostics_history and state.ast_issues_history:
|
|
154
|
+
previous = (state.diagnostics_history[-1], state.ast_issues_history[-1])
|
|
155
|
+
|
|
156
|
+
# Generate feedback
|
|
157
|
+
feedback_text = self.feedback_generator.generate_feedback(
|
|
158
|
+
lsp_snapshot,
|
|
159
|
+
ast_snapshot,
|
|
160
|
+
previous_snapshot=previous,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# Get priority issues
|
|
164
|
+
priority_issues = self.feedback_generator.prioritize_issues([], [])
|
|
165
|
+
|
|
166
|
+
# Create feedback result
|
|
167
|
+
result = FeedbackResult(
|
|
168
|
+
lsp_diagnostics=lsp_snapshot,
|
|
169
|
+
ast_issues=ast_snapshot,
|
|
170
|
+
feedback_text=feedback_text,
|
|
171
|
+
priority_issues=priority_issues,
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# Update state with new history
|
|
175
|
+
new_diagnostics_history = list(state.diagnostics_history) + [lsp_snapshot]
|
|
176
|
+
new_ast_history = list(state.ast_issues_history) + [ast_snapshot]
|
|
177
|
+
|
|
178
|
+
updated_state = LoopState(
|
|
179
|
+
loop_id=state.loop_id,
|
|
180
|
+
promise=state.promise,
|
|
181
|
+
current_iteration=state.current_iteration + 1,
|
|
182
|
+
max_iterations=state.max_iterations,
|
|
183
|
+
status=state.status,
|
|
184
|
+
created_at=state.created_at,
|
|
185
|
+
updated_at=now,
|
|
186
|
+
diagnostics_history=new_diagnostics_history,
|
|
187
|
+
ast_issues_history=new_ast_history,
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
self.storage.save_state(updated_state)
|
|
191
|
+
|
|
192
|
+
return result
|
|
193
|
+
|
|
194
|
+
def cancel_loop(self, loop_id: str) -> bool:
|
|
195
|
+
"""Cancel an active loop.
|
|
196
|
+
|
|
197
|
+
Marks the loop as cancelled if it exists and is still active.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
loop_id: The ID of the loop to cancel.
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
True if the loop was cancelled, False otherwise.
|
|
204
|
+
"""
|
|
205
|
+
state = self.storage.load_state(loop_id)
|
|
206
|
+
if state is None:
|
|
207
|
+
return False
|
|
208
|
+
|
|
209
|
+
if not state.is_active():
|
|
210
|
+
return False
|
|
211
|
+
|
|
212
|
+
now = datetime.now(timezone.utc)
|
|
213
|
+
cancelled_state = LoopState(
|
|
214
|
+
loop_id=state.loop_id,
|
|
215
|
+
promise=state.promise,
|
|
216
|
+
current_iteration=state.current_iteration,
|
|
217
|
+
max_iterations=state.max_iterations,
|
|
218
|
+
status=LoopStatus.CANCELLED,
|
|
219
|
+
created_at=state.created_at,
|
|
220
|
+
updated_at=now,
|
|
221
|
+
diagnostics_history=state.diagnostics_history,
|
|
222
|
+
ast_issues_history=state.ast_issues_history,
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
self.storage.save_state(cancelled_state)
|
|
226
|
+
return True
|
|
227
|
+
|
|
228
|
+
def get_active_loop(self) -> LoopState | None:
|
|
229
|
+
"""Get the currently active loop.
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
The active LoopState, or None if no loop is active.
|
|
233
|
+
"""
|
|
234
|
+
active_id = self.storage.get_active_loop_id()
|
|
235
|
+
if active_id is None:
|
|
236
|
+
return None
|
|
237
|
+
return self.storage.load_state(active_id)
|
|
238
|
+
|
|
239
|
+
def get_loop_status(self, loop_id: str) -> LoopState | None:
|
|
240
|
+
"""Get the status of a specific loop.
|
|
241
|
+
|
|
242
|
+
Args:
|
|
243
|
+
loop_id: The ID of the loop to query.
|
|
244
|
+
|
|
245
|
+
Returns:
|
|
246
|
+
The LoopState, or None if not found.
|
|
247
|
+
"""
|
|
248
|
+
return self.storage.load_state(loop_id)
|
|
249
|
+
|
|
250
|
+
def _get_initial_issue_count(self, state: LoopState) -> int:
|
|
251
|
+
"""Get the initial issue count from the first snapshots.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
state: The loop state to analyze.
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
The initial total issue count.
|
|
258
|
+
"""
|
|
259
|
+
initial_count = 0
|
|
260
|
+
|
|
261
|
+
if state.diagnostics_history:
|
|
262
|
+
initial_count += state.diagnostics_history[0].total_issues()
|
|
263
|
+
|
|
264
|
+
if state.ast_issues_history:
|
|
265
|
+
initial_count += state.ast_issues_history[0].total_issues
|
|
266
|
+
|
|
267
|
+
return initial_count
|
|
268
|
+
|
|
269
|
+
def _get_lsp_diagnostics(self) -> DiagnosticSnapshot:
|
|
270
|
+
"""Get current LSP diagnostics.
|
|
271
|
+
|
|
272
|
+
This method should be overridden or mocked in tests.
|
|
273
|
+
In production, it would integrate with the LSP client.
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
DiagnosticSnapshot of current issues.
|
|
277
|
+
"""
|
|
278
|
+
# Default implementation returns empty snapshot
|
|
279
|
+
# In production, this would call the LSP client
|
|
280
|
+
return DiagnosticSnapshot(
|
|
281
|
+
timestamp=datetime.now(timezone.utc),
|
|
282
|
+
error_count=0,
|
|
283
|
+
warning_count=0,
|
|
284
|
+
info_count=0,
|
|
285
|
+
files_affected=[],
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
def _get_ast_issues(self) -> ASTIssueSnapshot:
|
|
289
|
+
"""Get current AST-grep issues.
|
|
290
|
+
|
|
291
|
+
This method should be overridden or mocked in tests.
|
|
292
|
+
In production, it would integrate with the AST-grep analyzer.
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
ASTIssueSnapshot of current issues.
|
|
296
|
+
"""
|
|
297
|
+
# Default implementation returns empty snapshot
|
|
298
|
+
# In production, this would call the AST-grep analyzer
|
|
299
|
+
return ASTIssueSnapshot(
|
|
300
|
+
timestamp=datetime.now(timezone.utc),
|
|
301
|
+
total_issues=0,
|
|
302
|
+
by_severity={},
|
|
303
|
+
by_rule={},
|
|
304
|
+
files_affected=[],
|
|
305
|
+
)
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# Loop Feedback Generator
|
|
2
|
+
"""Feedback generation for Claude from LSP and AST-grep results.
|
|
3
|
+
|
|
4
|
+
Provides functionality to transform diagnostic and AST analysis results
|
|
5
|
+
into actionable feedback for Claude during feedback loop iterations.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from moai_adk.astgrep.models import ASTMatch
|
|
13
|
+
from moai_adk.loop.state import ASTIssueSnapshot, DiagnosticSnapshot
|
|
14
|
+
from moai_adk.lsp.models import Diagnostic, DiagnosticSeverity
|
|
15
|
+
|
|
16
|
+
# Security-related rule IDs that should be prioritized
|
|
17
|
+
SECURITY_RULES = frozenset(
|
|
18
|
+
{
|
|
19
|
+
"sql-injection",
|
|
20
|
+
"xss",
|
|
21
|
+
"command-injection",
|
|
22
|
+
"path-traversal",
|
|
23
|
+
"eval-usage",
|
|
24
|
+
"no-eval",
|
|
25
|
+
"hardcoded-secret",
|
|
26
|
+
"insecure-random",
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class FeedbackGenerator:
|
|
32
|
+
"""Generator for Claude feedback from LSP and AST-grep results.
|
|
33
|
+
|
|
34
|
+
Transforms diagnostic snapshots and AST issue snapshots into
|
|
35
|
+
human-readable feedback text and prioritized issue lists.
|
|
36
|
+
|
|
37
|
+
Attributes:
|
|
38
|
+
max_priority_issues: Maximum number of priority issues to return.
|
|
39
|
+
include_suggestions: Whether to include fix suggestions.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
max_priority_issues: int = 10,
|
|
45
|
+
include_suggestions: bool = True,
|
|
46
|
+
):
|
|
47
|
+
"""Initialize the feedback generator.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
max_priority_issues: Maximum number of priority issues to return.
|
|
51
|
+
include_suggestions: Whether to include fix suggestions.
|
|
52
|
+
"""
|
|
53
|
+
self.max_priority_issues = max_priority_issues
|
|
54
|
+
self.include_suggestions = include_suggestions
|
|
55
|
+
|
|
56
|
+
def generate_feedback(
|
|
57
|
+
self,
|
|
58
|
+
lsp_snapshot: DiagnosticSnapshot,
|
|
59
|
+
ast_snapshot: ASTIssueSnapshot,
|
|
60
|
+
previous_snapshot: tuple[DiagnosticSnapshot, ASTIssueSnapshot] | None = None,
|
|
61
|
+
) -> str:
|
|
62
|
+
"""Generate feedback text from LSP and AST snapshots.
|
|
63
|
+
|
|
64
|
+
Creates a human-readable summary of the current diagnostic state,
|
|
65
|
+
optionally comparing with a previous snapshot to show progress.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
lsp_snapshot: Current LSP diagnostic snapshot.
|
|
69
|
+
ast_snapshot: Current AST issue snapshot.
|
|
70
|
+
previous_snapshot: Optional previous snapshots for comparison.
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
Formatted feedback text for Claude.
|
|
74
|
+
"""
|
|
75
|
+
lines: list[str] = []
|
|
76
|
+
|
|
77
|
+
# Check if there are no issues
|
|
78
|
+
total_lsp = lsp_snapshot.total_issues()
|
|
79
|
+
total_ast = ast_snapshot.total_issues
|
|
80
|
+
|
|
81
|
+
if total_lsp == 0 and total_ast == 0:
|
|
82
|
+
lines.append("No issues found. Code is clean.")
|
|
83
|
+
return "\n".join(lines)
|
|
84
|
+
|
|
85
|
+
# LSP Diagnostics summary
|
|
86
|
+
lines.append("## LSP Diagnostics Summary")
|
|
87
|
+
lines.append(f"- Errors: {lsp_snapshot.error_count}")
|
|
88
|
+
lines.append(f"- Warnings: {lsp_snapshot.warning_count}")
|
|
89
|
+
lines.append(f"- Info: {lsp_snapshot.info_count}")
|
|
90
|
+
if lsp_snapshot.files_affected:
|
|
91
|
+
lines.append(f"- Files affected: {', '.join(lsp_snapshot.files_affected)}")
|
|
92
|
+
lines.append("")
|
|
93
|
+
|
|
94
|
+
# AST Issues summary
|
|
95
|
+
lines.append("## AST-grep Issues Summary")
|
|
96
|
+
lines.append(f"- Total issues: {ast_snapshot.total_issues}")
|
|
97
|
+
if ast_snapshot.by_severity:
|
|
98
|
+
severity_parts = [f"{count} {sev}" for sev, count in ast_snapshot.by_severity.items()]
|
|
99
|
+
lines.append(f"- By severity: {', '.join(severity_parts)}")
|
|
100
|
+
if ast_snapshot.by_rule:
|
|
101
|
+
rule_parts = [f"{rule}: {count}" for rule, count in ast_snapshot.by_rule.items()]
|
|
102
|
+
lines.append(f"- By rule: {', '.join(rule_parts)}")
|
|
103
|
+
if ast_snapshot.files_affected:
|
|
104
|
+
lines.append(f"- Files affected: {', '.join(ast_snapshot.files_affected)}")
|
|
105
|
+
lines.append("")
|
|
106
|
+
|
|
107
|
+
# Comparison with previous snapshot
|
|
108
|
+
if previous_snapshot is not None:
|
|
109
|
+
prev_lsp, prev_ast = previous_snapshot
|
|
110
|
+
lines.append("## Progress")
|
|
111
|
+
|
|
112
|
+
lsp_diff = prev_lsp.total_issues() - total_lsp
|
|
113
|
+
ast_diff = prev_ast.total_issues - total_ast
|
|
114
|
+
|
|
115
|
+
if lsp_diff > 0:
|
|
116
|
+
lines.append(f"- LSP issues reduced by {lsp_diff}")
|
|
117
|
+
elif lsp_diff < 0:
|
|
118
|
+
lines.append(f"- LSP issues increased by {-lsp_diff}")
|
|
119
|
+
else:
|
|
120
|
+
lines.append("- LSP issues unchanged")
|
|
121
|
+
|
|
122
|
+
if ast_diff > 0:
|
|
123
|
+
lines.append(f"- AST issues fixed: {ast_diff}")
|
|
124
|
+
elif ast_diff < 0:
|
|
125
|
+
lines.append(f"- AST issues increased by {-ast_diff}")
|
|
126
|
+
else:
|
|
127
|
+
lines.append("- AST issues unchanged")
|
|
128
|
+
|
|
129
|
+
total_improvement = lsp_diff + ast_diff
|
|
130
|
+
if total_improvement > 0:
|
|
131
|
+
lines.append(f"- Overall improvement: {total_improvement} issues fixed")
|
|
132
|
+
lines.append("")
|
|
133
|
+
|
|
134
|
+
# Priority guidance
|
|
135
|
+
if lsp_snapshot.error_count > 0 or ast_snapshot.by_severity.get("error", 0) > 0:
|
|
136
|
+
lines.append("## Priority")
|
|
137
|
+
lines.append("Focus on fixing errors first, then warnings.")
|
|
138
|
+
|
|
139
|
+
return "\n".join(lines)
|
|
140
|
+
|
|
141
|
+
def format_for_hook(self, feedback: str) -> dict[str, Any]:
|
|
142
|
+
"""Format feedback text for hook output.
|
|
143
|
+
|
|
144
|
+
Converts the feedback text into a structured dictionary format
|
|
145
|
+
suitable for Claude Code hook consumption.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
feedback: The feedback text to format.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Dictionary with feedback and metadata.
|
|
152
|
+
"""
|
|
153
|
+
return {
|
|
154
|
+
"type": "loop_feedback",
|
|
155
|
+
"source": "moai_loop_controller",
|
|
156
|
+
"feedback": feedback,
|
|
157
|
+
"text": feedback,
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
def prioritize_issues(
|
|
161
|
+
self,
|
|
162
|
+
diagnostics: list[Diagnostic],
|
|
163
|
+
ast_matches: list[ASTMatch],
|
|
164
|
+
) -> list[str]:
|
|
165
|
+
"""Prioritize and format issues for Claude.
|
|
166
|
+
|
|
167
|
+
Sorts issues by severity and type, with security issues first,
|
|
168
|
+
then errors, then warnings. Returns formatted issue strings.
|
|
169
|
+
|
|
170
|
+
Args:
|
|
171
|
+
diagnostics: List of LSP diagnostics.
|
|
172
|
+
ast_matches: List of AST-grep matches.
|
|
173
|
+
|
|
174
|
+
Returns:
|
|
175
|
+
List of formatted issue strings, sorted by priority.
|
|
176
|
+
"""
|
|
177
|
+
if not diagnostics and not ast_matches:
|
|
178
|
+
return []
|
|
179
|
+
|
|
180
|
+
priority_issues: list[tuple[int, str]] = []
|
|
181
|
+
|
|
182
|
+
# Process AST matches (security issues get highest priority)
|
|
183
|
+
for match in ast_matches:
|
|
184
|
+
is_security = match.rule_id.lower() in SECURITY_RULES
|
|
185
|
+
is_error = match.severity.lower() == "error"
|
|
186
|
+
|
|
187
|
+
# Priority: lower is higher priority
|
|
188
|
+
# Security errors: 0, Security warnings: 1, Regular errors: 2, Regular warnings: 3
|
|
189
|
+
if is_security and is_error:
|
|
190
|
+
priority = 0
|
|
191
|
+
elif is_security:
|
|
192
|
+
priority = 1
|
|
193
|
+
elif is_error:
|
|
194
|
+
priority = 2
|
|
195
|
+
else:
|
|
196
|
+
priority = 3
|
|
197
|
+
|
|
198
|
+
line_num = match.range.start.line + 1 # Convert to 1-based
|
|
199
|
+
issue_text = f"[{match.severity.upper()}] {match.message} at {match.file_path}:{line_num}"
|
|
200
|
+
if self.include_suggestions and match.suggested_fix:
|
|
201
|
+
issue_text += f" (Fix: {match.suggested_fix})"
|
|
202
|
+
|
|
203
|
+
priority_issues.append((priority, issue_text))
|
|
204
|
+
|
|
205
|
+
# Process LSP diagnostics
|
|
206
|
+
for diag in diagnostics:
|
|
207
|
+
is_error = diag.severity == DiagnosticSeverity.ERROR
|
|
208
|
+
is_warning = diag.severity == DiagnosticSeverity.WARNING
|
|
209
|
+
|
|
210
|
+
# Priority: errors: 2, warnings: 3, info/hint: 4
|
|
211
|
+
if is_error:
|
|
212
|
+
priority = 2
|
|
213
|
+
elif is_warning:
|
|
214
|
+
priority = 3
|
|
215
|
+
else:
|
|
216
|
+
priority = 4
|
|
217
|
+
|
|
218
|
+
line_num = diag.range.start.line + 1 # Convert to 1-based
|
|
219
|
+
severity_name = diag.severity.name
|
|
220
|
+
issue_text = f"[{severity_name}] {diag.message} at line {line_num}"
|
|
221
|
+
if diag.source:
|
|
222
|
+
issue_text = f"[{severity_name}] ({diag.source}) {diag.message} at line {line_num}"
|
|
223
|
+
|
|
224
|
+
priority_issues.append((priority, issue_text))
|
|
225
|
+
|
|
226
|
+
# Sort by priority (lower number = higher priority)
|
|
227
|
+
priority_issues.sort(key=lambda x: x[0])
|
|
228
|
+
|
|
229
|
+
# Extract just the issue texts, limited to max
|
|
230
|
+
return [issue_text for _, issue_text in priority_issues[: self.max_priority_issues]]
|