moai-adk 0.15.1__py3-none-any.whl → 0.25.4__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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +1 -2
- moai_adk/__main__.py +85 -2
- moai_adk/cli/__init__.py +0 -1
- moai_adk/cli/commands/__init__.py +0 -1
- moai_adk/cli/commands/analyze.py +127 -0
- moai_adk/cli/commands/backup.py +5 -3
- moai_adk/cli/commands/doctor.py +35 -11
- moai_adk/cli/commands/improve_user_experience.py +348 -0
- moai_adk/cli/commands/init.py +150 -23
- moai_adk/cli/commands/language.py +269 -0
- moai_adk/cli/commands/migrate.py +158 -0
- moai_adk/cli/commands/status.py +13 -12
- moai_adk/cli/commands/update.py +364 -60
- moai_adk/cli/commands/validate_links.py +118 -0
- moai_adk/cli/main.py +3 -2
- moai_adk/cli/prompts/init_prompts.py +79 -82
- moai_adk/core/__init__.py +0 -1
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +439 -0
- moai_adk/core/claude_integration.py +421 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/config/__init__.py +6 -0
- moai_adk/core/config/auto_spec_config.py +346 -0
- moai_adk/core/config/migration.py +133 -12
- moai_adk/core/context_manager.py +279 -0
- moai_adk/core/diagnostics/slash_commands.py +0 -1
- moai_adk/core/error_recovery_system.py +1289 -0
- moai_adk/core/git/__init__.py +0 -1
- moai_adk/core/git/branch.py +0 -1
- moai_adk/core/git/branch_manager.py +4 -4
- moai_adk/core/git/checkpoint.py +1 -5
- moai_adk/core/git/commit.py +0 -1
- moai_adk/core/git/event_detector.py +3 -5
- moai_adk/core/git/manager.py +0 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +169 -0
- moai_adk/core/integration/integration_tester.py +225 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +28 -18
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_validator.py +556 -0
- moai_adk/core/mcp/setup.py +113 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/backup_manager.py +208 -0
- moai_adk/core/migration/file_migrator.py +218 -0
- moai_adk/core/migration/version_detector.py +143 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +318 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/project/__init__.py +0 -1
- moai_adk/core/project/backup_utils.py +2 -7
- moai_adk/core/project/checker.py +3 -3
- moai_adk/core/project/detector.py +20 -40
- moai_adk/core/project/initializer.py +42 -17
- moai_adk/core/project/phase_executor.py +415 -58
- moai_adk/core/project/validator.py +6 -25
- moai_adk/core/quality/__init__.py +1 -1
- moai_adk/core/quality/trust_checker.py +64 -110
- moai_adk/core/quality/validators/__init__.py +1 -1
- moai_adk/core/quality/validators/base_validator.py +1 -1
- moai_adk/core/rollback_manager.py +993 -0
- moai_adk/core/session_manager.py +667 -0
- moai_adk/core/spec/confidence_scoring.py +749 -0
- moai_adk/core/spec/ears_template_engine.py +1182 -0
- moai_adk/core/spec/quality_validator.py +721 -0
- moai_adk/core/spec_status_manager.py +488 -0
- moai_adk/core/template/__init__.py +0 -1
- moai_adk/core/template/backup.py +41 -1
- moai_adk/core/template/config.py +11 -12
- moai_adk/core/template/languages.py +0 -1
- moai_adk/core/template/merger.py +79 -22
- moai_adk/core/template/processor.py +614 -40
- moai_adk/core/template_engine.py +36 -27
- moai_adk/foundation/git/commit_templates.py +565 -0
- moai_adk/foundation/trust/trust_principles.py +725 -0
- moai_adk/foundation/trust/validation_checklist.py +1678 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +107 -0
- moai_adk/statusline/config.py +364 -0
- moai_adk/statusline/enhanced_output_style_detector.py +364 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +228 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +327 -0
- moai_adk/statusline/update_checker.py +135 -0
- moai_adk/statusline/version_reader.py +647 -0
- moai_adk/templates/.git-hooks/pre-commit +66 -0
- moai_adk/templates/.git-hooks/pre-push +116 -4
- moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
- moai_adk/templates/.gitignore +44 -0
- moai_adk/templates/.mcp.json +22 -0
- moai_adk/templates/CLAUDE.md +450 -1071
- moai_adk/utils/__init__.py +0 -1
- moai_adk/utils/banner.py +0 -1
- moai_adk/utils/common.py +308 -0
- moai_adk/utils/link_validator.py +249 -0
- moai_adk/utils/logger.py +4 -9
- moai_adk/utils/safe_file_reader.py +210 -0
- moai_adk/utils/user_experience.py +531 -0
- moai_adk-0.25.4.dist-info/METADATA +2279 -0
- moai_adk-0.25.4.dist-info/RECORD +112 -0
- moai_adk/core/tags/__init__.py +0 -86
- moai_adk/core/tags/ci_validator.py +0 -463
- moai_adk/core/tags/cli.py +0 -283
- moai_adk/core/tags/generator.py +0 -109
- moai_adk/core/tags/inserter.py +0 -99
- moai_adk/core/tags/mapper.py +0 -126
- moai_adk/core/tags/parser.py +0 -76
- moai_adk/core/tags/pre_commit_validator.py +0 -393
- moai_adk/core/tags/reporter.py +0 -956
- moai_adk/core/tags/tags.py +0 -149
- moai_adk/core/tags/validator.py +0 -897
- moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
- moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
- moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
- moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
- moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
- moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
- moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
- moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
- moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
- moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
- moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
- moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
- moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
- moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
- moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
- moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
- moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
- moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
- moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
- moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
- moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
- moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
- moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
- moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
- moai_adk/templates/.claude/settings.json +0 -144
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
- moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
- moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
- moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
- moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
- moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
- moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
- moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
- moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
- moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
- moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
- moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
- moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
- moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
- moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
- moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
- moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
- moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
- moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
- moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
- moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
- moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
- moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
- moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
- moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
- moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
- moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
- moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
- moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
- moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
- moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
- moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
- moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
- moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
- moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
- moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
- moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
- moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
- moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
- moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
- moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
- moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
- moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
- moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
- moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
- moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
- moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
- moai_adk/templates/.github/workflows/release.yml +0 -118
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
- moai_adk/templates/.github/workflows/tag-report.yml +0 -269
- moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
- moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
- moai_adk/templates/.moai/config.json +0 -115
- moai_adk/templates/workflows/go-tag-validation.yml +0 -30
- moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
- moai_adk/templates/workflows/python-tag-validation.yml +0 -42
- moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
- moai_adk-0.15.1.dist-info/METADATA +0 -3094
- moai_adk-0.15.1.dist-info/RECORD +0 -365
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
"""
|
|
4
|
+
Enhanced Output Style Detector for Claude Code Statusline
|
|
5
|
+
|
|
6
|
+
This module provides real-time detection of Claude Code's current output style
|
|
7
|
+
by analyzing session context, environment variables, and behavioral indicators.
|
|
8
|
+
|
|
9
|
+
Key improvements:
|
|
10
|
+
1. Real-time session context analysis
|
|
11
|
+
2. Multiple detection methods with priority ordering
|
|
12
|
+
3. Behavioral pattern recognition
|
|
13
|
+
4. Robust error handling and graceful degradation
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import time
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Any, Dict, Optional
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OutputStyleDetector:
|
|
25
|
+
"""
|
|
26
|
+
Enhanced output style detector with multiple detection strategies.
|
|
27
|
+
|
|
28
|
+
Detection Priority:
|
|
29
|
+
1. Session context (most reliable)
|
|
30
|
+
2. Environment variables
|
|
31
|
+
3. Behavioral analysis
|
|
32
|
+
4. Settings file (fallback)
|
|
33
|
+
5. Heuristics (last resort)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
# Style mapping for consistent display format
|
|
37
|
+
STYLE_MAPPING = {
|
|
38
|
+
# Internal style names
|
|
39
|
+
"streaming": "R2-D2",
|
|
40
|
+
"explanatory": "Explanatory",
|
|
41
|
+
"concise": "Concise",
|
|
42
|
+
"detailed": "Detailed",
|
|
43
|
+
"yoda": "🧙 Yoda Master",
|
|
44
|
+
"yoda-master": "🧙 Yoda Master",
|
|
45
|
+
"tutorial": "🧙 Yoda Master",
|
|
46
|
+
|
|
47
|
+
# Display values with emojis
|
|
48
|
+
"🤖 R2-D2": "R2-D2",
|
|
49
|
+
"R2-D2": "R2-D2",
|
|
50
|
+
"🧙 Explanatory": "Explanatory",
|
|
51
|
+
"Explanatory": "Explanatory",
|
|
52
|
+
"🧙 Concise": "Concise",
|
|
53
|
+
"Concise": "Concise",
|
|
54
|
+
"🧙 Detailed": "Detailed",
|
|
55
|
+
"Detailed": "Detailed",
|
|
56
|
+
"🧙 Yoda Master": "🧙 Yoda Master",
|
|
57
|
+
"Yoda Master": "🧙 Yoda Master",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
def __init__(self):
|
|
61
|
+
self.cache = {}
|
|
62
|
+
self.cache_ttl = 5 # Cache for 5 seconds to balance performance and accuracy
|
|
63
|
+
|
|
64
|
+
def detect_from_session_context(self, session_data: Dict[str, Any]) -> Optional[str]:
|
|
65
|
+
"""
|
|
66
|
+
Detect output style from Claude Code session context.
|
|
67
|
+
|
|
68
|
+
This is the most reliable method as it uses real-time session data.
|
|
69
|
+
"""
|
|
70
|
+
try:
|
|
71
|
+
# Method 1: Check explicit outputStyle in session
|
|
72
|
+
if "outputStyle" in session_data:
|
|
73
|
+
style = session_data["outputStyle"]
|
|
74
|
+
if style:
|
|
75
|
+
return self._normalize_style(style)
|
|
76
|
+
|
|
77
|
+
# Method 2: Check model configuration for style indicators
|
|
78
|
+
model_info = session_data.get("model", {})
|
|
79
|
+
if isinstance(model_info, dict):
|
|
80
|
+
model_name = model_info.get("name", "").lower()
|
|
81
|
+
display_name = model_info.get("display_name", "").lower()
|
|
82
|
+
|
|
83
|
+
# Check for style indicators in model names
|
|
84
|
+
for text in [model_name, display_name]:
|
|
85
|
+
if "explanatory" in text:
|
|
86
|
+
return "Explanatory"
|
|
87
|
+
elif "yoda" in text or "tutorial" in text:
|
|
88
|
+
return "🧙 Yoda Master"
|
|
89
|
+
elif "concise" in text:
|
|
90
|
+
return "Concise"
|
|
91
|
+
elif "detailed" in text:
|
|
92
|
+
return "Detailed"
|
|
93
|
+
elif "streaming" in text or "r2d2" in text:
|
|
94
|
+
return "R2-D2"
|
|
95
|
+
|
|
96
|
+
# Method 3: Check conversation patterns
|
|
97
|
+
messages = session_data.get("messages", [])
|
|
98
|
+
if messages:
|
|
99
|
+
# Analyze recent message patterns for style indicators
|
|
100
|
+
recent_messages = messages[-3:] # Last 3 messages
|
|
101
|
+
return self._analyze_message_patterns(recent_messages)
|
|
102
|
+
|
|
103
|
+
except Exception as e:
|
|
104
|
+
# Log error but don't fail - continue to next detection method
|
|
105
|
+
print(f"Session context detection error: {e}", file=sys.stderr)
|
|
106
|
+
|
|
107
|
+
return None
|
|
108
|
+
|
|
109
|
+
def detect_from_environment(self) -> Optional[str]:
|
|
110
|
+
"""
|
|
111
|
+
Detect output style from environment variables.
|
|
112
|
+
"""
|
|
113
|
+
try:
|
|
114
|
+
# Check for explicit environment variable
|
|
115
|
+
if "CLAUDE_OUTPUT_STYLE" in os.environ:
|
|
116
|
+
env_style = os.environ["CLAUDE_OUTPUT_STYLE"]
|
|
117
|
+
if env_style:
|
|
118
|
+
return self._normalize_style(env_style)
|
|
119
|
+
|
|
120
|
+
# Check for Claude Code session indicators
|
|
121
|
+
if "CLAUDE_SESSION_ID" in os.environ:
|
|
122
|
+
# Could integrate with Claude Code session management
|
|
123
|
+
pass
|
|
124
|
+
|
|
125
|
+
# Check for process name or command line indicators
|
|
126
|
+
try:
|
|
127
|
+
# This could be enhanced with process inspection if needed
|
|
128
|
+
pass
|
|
129
|
+
except Exception:
|
|
130
|
+
pass
|
|
131
|
+
|
|
132
|
+
except Exception as e:
|
|
133
|
+
print(f"Environment detection error: {e}", file=sys.stderr)
|
|
134
|
+
|
|
135
|
+
return None
|
|
136
|
+
|
|
137
|
+
def detect_from_behavioral_analysis(self) -> Optional[str]:
|
|
138
|
+
"""
|
|
139
|
+
Analyze behavioral patterns to infer current output style.
|
|
140
|
+
|
|
141
|
+
This method uses heuristics based on file system state and recent activity.
|
|
142
|
+
"""
|
|
143
|
+
try:
|
|
144
|
+
cwd = Path.cwd()
|
|
145
|
+
|
|
146
|
+
# Check for active Yoda session indicators
|
|
147
|
+
moai_dir = cwd / ".moai"
|
|
148
|
+
if moai_dir.exists():
|
|
149
|
+
# Look for recent Yoda-related activity
|
|
150
|
+
yoda_files = list(moai_dir.rglob("*yoda*"))
|
|
151
|
+
if yoda_files:
|
|
152
|
+
# Check if any Yoda files are recently modified
|
|
153
|
+
recent_yoda = any(
|
|
154
|
+
f.stat().st_mtime > (time.time() - 300) # Last 5 minutes
|
|
155
|
+
for f in yoda_files
|
|
156
|
+
)
|
|
157
|
+
if recent_yoda:
|
|
158
|
+
return "🧙 Yoda Master"
|
|
159
|
+
|
|
160
|
+
# Check for extensive documentation (might indicate Explanatory mode)
|
|
161
|
+
docs_dir = cwd / "docs"
|
|
162
|
+
if docs_dir.exists():
|
|
163
|
+
md_files = list(docs_dir.rglob("*.md"))
|
|
164
|
+
if len(md_files) > 10: # Heuristic threshold
|
|
165
|
+
return "Explanatory"
|
|
166
|
+
|
|
167
|
+
# Check for TODO/task tracking patterns
|
|
168
|
+
todo_file = cwd / ".moai" / "current_session_todo.txt"
|
|
169
|
+
if todo_file.exists():
|
|
170
|
+
content = todo_file.read_text()
|
|
171
|
+
if "plan" in content.lower() or "phase" in content.lower():
|
|
172
|
+
return "Explanatory"
|
|
173
|
+
|
|
174
|
+
except Exception as e:
|
|
175
|
+
print(f"Behavioral analysis error: {e}", file=sys.stderr)
|
|
176
|
+
|
|
177
|
+
return None
|
|
178
|
+
|
|
179
|
+
def detect_from_settings(self) -> Optional[str]:
|
|
180
|
+
"""
|
|
181
|
+
Detect output style from settings.json file.
|
|
182
|
+
|
|
183
|
+
This is the least reliable method as it may not reflect current session.
|
|
184
|
+
"""
|
|
185
|
+
try:
|
|
186
|
+
settings_path = Path.cwd() / ".claude" / "settings.json"
|
|
187
|
+
if settings_path.exists():
|
|
188
|
+
with open(settings_path, "r", encoding="utf-8") as f:
|
|
189
|
+
settings = json.load(f)
|
|
190
|
+
output_style = settings.get("outputStyle", "")
|
|
191
|
+
|
|
192
|
+
if output_style:
|
|
193
|
+
return self._normalize_style(output_style)
|
|
194
|
+
|
|
195
|
+
except Exception as e:
|
|
196
|
+
print(f"Settings file detection error: {e}", file=sys.stderr)
|
|
197
|
+
|
|
198
|
+
return None
|
|
199
|
+
|
|
200
|
+
def _normalize_style(self, style: str) -> str:
|
|
201
|
+
"""
|
|
202
|
+
Normalize style name to consistent display format.
|
|
203
|
+
"""
|
|
204
|
+
if not style:
|
|
205
|
+
return "Unknown"
|
|
206
|
+
|
|
207
|
+
# Direct mapping lookup
|
|
208
|
+
if style in self.STYLE_MAPPING:
|
|
209
|
+
return self.STYLE_MAPPING[style]
|
|
210
|
+
|
|
211
|
+
# Case-insensitive lookup
|
|
212
|
+
style_lower = style.lower()
|
|
213
|
+
for key, value in self.STYLE_MAPPING.items():
|
|
214
|
+
if key.lower() == style_lower:
|
|
215
|
+
return value
|
|
216
|
+
|
|
217
|
+
# Pattern-based normalization
|
|
218
|
+
if "r2d2" in style_lower or "streaming" in style_lower:
|
|
219
|
+
return "R2-D2"
|
|
220
|
+
elif "yoda" in style_lower or "master" in style_lower:
|
|
221
|
+
return "🧙 Yoda Master"
|
|
222
|
+
elif "explanatory" in style_lower:
|
|
223
|
+
return "Explanatory"
|
|
224
|
+
elif "concise" in style_lower:
|
|
225
|
+
return "Concise"
|
|
226
|
+
elif "detailed" in style_lower:
|
|
227
|
+
return "Detailed"
|
|
228
|
+
|
|
229
|
+
# Extract from emoji-prefixed values
|
|
230
|
+
if "🤖" in style:
|
|
231
|
+
return "R2-D2"
|
|
232
|
+
elif "🧙" in style:
|
|
233
|
+
# Extract the part after emoji
|
|
234
|
+
parts = style.split("🧙", 1)
|
|
235
|
+
if len(parts) > 1:
|
|
236
|
+
extracted = parts[1].strip()
|
|
237
|
+
return self._normalize_style(extracted)
|
|
238
|
+
|
|
239
|
+
# Fallback: capitalize first letter
|
|
240
|
+
return style.title() if style else "Unknown"
|
|
241
|
+
|
|
242
|
+
def _analyze_message_patterns(self, messages: list) -> Optional[str]:
|
|
243
|
+
"""
|
|
244
|
+
Analyze recent message patterns for style indicators.
|
|
245
|
+
"""
|
|
246
|
+
try:
|
|
247
|
+
if not messages:
|
|
248
|
+
return None
|
|
249
|
+
|
|
250
|
+
# Look for style indicators in recent responses
|
|
251
|
+
full_text = " ".join(
|
|
252
|
+
msg.get("content", "")
|
|
253
|
+
for msg in messages[-3:]
|
|
254
|
+
if msg.get("role") == "assistant"
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
if not full_text:
|
|
258
|
+
return None
|
|
259
|
+
|
|
260
|
+
# Style heuristics based on response patterns
|
|
261
|
+
text_lower = full_text.lower()
|
|
262
|
+
|
|
263
|
+
# Yoda Master indicators
|
|
264
|
+
yoda_indicators = ["young padawan", "the force", "master", "wisdom", "patience"]
|
|
265
|
+
yoda_count = sum(1 for indicator in yoda_indicators if indicator in text_lower)
|
|
266
|
+
|
|
267
|
+
if yoda_count >= 2:
|
|
268
|
+
return "🧙 Yoda Master"
|
|
269
|
+
|
|
270
|
+
# Explanatory indicators
|
|
271
|
+
if len(full_text) > 2000: # Long responses
|
|
272
|
+
explanatory_count = sum(1 for phrase in
|
|
273
|
+
["let me explain", "here's how", "the reason is", "to understand"]
|
|
274
|
+
if phrase in text_lower
|
|
275
|
+
)
|
|
276
|
+
if explanatory_count >= 2:
|
|
277
|
+
return "Explanatory"
|
|
278
|
+
|
|
279
|
+
# Concise indicators
|
|
280
|
+
if len(full_text) < 500:
|
|
281
|
+
return "Concise"
|
|
282
|
+
|
|
283
|
+
# Default fallback
|
|
284
|
+
return "R2-D2"
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
print(f"Message pattern analysis error: {e}", file=sys.stderr)
|
|
288
|
+
return None
|
|
289
|
+
|
|
290
|
+
def get_output_style(self, session_context: Dict[str, Any] = None) -> str:
|
|
291
|
+
"""
|
|
292
|
+
Get the current output style using all available detection methods.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
session_context: Optional session context from Claude Code
|
|
296
|
+
|
|
297
|
+
Returns:
|
|
298
|
+
Normalized output style string
|
|
299
|
+
"""
|
|
300
|
+
# Use cache if available and fresh
|
|
301
|
+
cache_key = f"{id(session_context)}_{hash(str(session_context))}"
|
|
302
|
+
current_time = time.time()
|
|
303
|
+
|
|
304
|
+
if cache_key in self.cache:
|
|
305
|
+
cached_style, cached_time = self.cache[cache_key]
|
|
306
|
+
if current_time - cached_time < self.cache_ttl:
|
|
307
|
+
return cached_style
|
|
308
|
+
|
|
309
|
+
# Detection methods in priority order
|
|
310
|
+
detection_methods = [
|
|
311
|
+
("Session Context", lambda: self.detect_from_session_context(session_context or {})),
|
|
312
|
+
("Environment", self.detect_from_environment),
|
|
313
|
+
("Behavioral Analysis", self.detect_from_behavioral_analysis),
|
|
314
|
+
("Settings File", self.detect_from_settings),
|
|
315
|
+
]
|
|
316
|
+
|
|
317
|
+
for method_name, method_func in detection_methods:
|
|
318
|
+
try:
|
|
319
|
+
style = method_func()
|
|
320
|
+
if style and style != "Unknown":
|
|
321
|
+
# Cache the result
|
|
322
|
+
self.cache[cache_key] = (style, current_time)
|
|
323
|
+
return style
|
|
324
|
+
except Exception as e:
|
|
325
|
+
print(f"{method_name} detection failed: {e}", file=sys.stderr)
|
|
326
|
+
continue
|
|
327
|
+
|
|
328
|
+
# Default fallback
|
|
329
|
+
return "R2-D2"
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def safe_collect_output_style() -> str:
|
|
333
|
+
"""
|
|
334
|
+
Legacy compatibility function that maintains the original interface.
|
|
335
|
+
|
|
336
|
+
This function provides backward compatibility with the existing statusline
|
|
337
|
+
system while using the enhanced detection capabilities.
|
|
338
|
+
|
|
339
|
+
Returns:
|
|
340
|
+
Detected output style string
|
|
341
|
+
"""
|
|
342
|
+
try:
|
|
343
|
+
# Read session context from stdin if available
|
|
344
|
+
session_context = {}
|
|
345
|
+
try:
|
|
346
|
+
input_data = sys.stdin.read()
|
|
347
|
+
if input_data.strip():
|
|
348
|
+
session_context = json.loads(input_data)
|
|
349
|
+
except (json.JSONDecodeError, EOFError):
|
|
350
|
+
pass
|
|
351
|
+
|
|
352
|
+
# Use the enhanced detector
|
|
353
|
+
detector = OutputStyleDetector()
|
|
354
|
+
return detector.get_output_style(session_context)
|
|
355
|
+
|
|
356
|
+
except Exception as e:
|
|
357
|
+
print(f"Output style detection failed: {e}", file=sys.stderr)
|
|
358
|
+
return "R2-D2"
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
# For backward compatibility
|
|
362
|
+
if __name__ == "__main__":
|
|
363
|
+
# If run as a script, output the detected style
|
|
364
|
+
print(safe_collect_output_style())
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# type: ignore
|
|
2
|
+
"""
|
|
3
|
+
Git information collector for statusline
|
|
4
|
+
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import re
|
|
9
|
+
import subprocess
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from datetime import datetime, timedelta
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class GitInfo:
|
|
19
|
+
"""Git repository information"""
|
|
20
|
+
|
|
21
|
+
branch: str
|
|
22
|
+
staged: int
|
|
23
|
+
modified: int
|
|
24
|
+
untracked: int
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class GitCollector:
|
|
28
|
+
"""Collects git information from repository with 5-second caching"""
|
|
29
|
+
|
|
30
|
+
# Configuration constants
|
|
31
|
+
_CACHE_TTL_SECONDS = 5
|
|
32
|
+
_GIT_COMMAND_TIMEOUT = 2
|
|
33
|
+
|
|
34
|
+
# File status prefixes from git status --porcelain
|
|
35
|
+
_STATUS_ADDED = "A"
|
|
36
|
+
_STATUS_MODIFIED = "M"
|
|
37
|
+
_STATUS_UNTRACKED = "??"
|
|
38
|
+
|
|
39
|
+
def __init__(self):
|
|
40
|
+
"""Initialize git collector with cache"""
|
|
41
|
+
self._cache: Optional[GitInfo] = None
|
|
42
|
+
self._cache_time: Optional[datetime] = None
|
|
43
|
+
self._cache_ttl = timedelta(seconds=self._CACHE_TTL_SECONDS)
|
|
44
|
+
|
|
45
|
+
def collect_git_info(self) -> GitInfo:
|
|
46
|
+
"""
|
|
47
|
+
Collect git information from the repository
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
GitInfo containing branch name and change counts
|
|
51
|
+
"""
|
|
52
|
+
# Check cache validity first
|
|
53
|
+
if self._is_cache_valid():
|
|
54
|
+
return self._cache
|
|
55
|
+
|
|
56
|
+
# Run git command and parse output
|
|
57
|
+
git_info = self._fetch_git_info()
|
|
58
|
+
self._update_cache(git_info)
|
|
59
|
+
return git_info
|
|
60
|
+
|
|
61
|
+
def _fetch_git_info(self) -> GitInfo:
|
|
62
|
+
"""
|
|
63
|
+
Fetch git information from command
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
GitInfo from command or error defaults
|
|
67
|
+
"""
|
|
68
|
+
try:
|
|
69
|
+
result = subprocess.run(
|
|
70
|
+
["git", "status", "-b", "--porcelain"],
|
|
71
|
+
capture_output=True,
|
|
72
|
+
text=True,
|
|
73
|
+
timeout=self._GIT_COMMAND_TIMEOUT,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
if result.returncode != 0:
|
|
77
|
+
logger.debug(f"Git command failed: {result.stderr}")
|
|
78
|
+
return self._create_error_info()
|
|
79
|
+
|
|
80
|
+
return self._parse_git_output(result.stdout)
|
|
81
|
+
|
|
82
|
+
except subprocess.TimeoutExpired:
|
|
83
|
+
logger.warning("Git command timed out")
|
|
84
|
+
return self._create_error_info()
|
|
85
|
+
except Exception as e:
|
|
86
|
+
logger.debug(f"Error collecting git info: {e}")
|
|
87
|
+
return self._create_error_info()
|
|
88
|
+
|
|
89
|
+
def _is_cache_valid(self) -> bool:
|
|
90
|
+
"""Check if cache is still valid"""
|
|
91
|
+
if self._cache is None or self._cache_time is None:
|
|
92
|
+
return False
|
|
93
|
+
return datetime.now() - self._cache_time < self._cache_ttl
|
|
94
|
+
|
|
95
|
+
def _update_cache(self, git_info: GitInfo) -> None:
|
|
96
|
+
"""Update cache with new git info"""
|
|
97
|
+
self._cache = git_info
|
|
98
|
+
self._cache_time = datetime.now()
|
|
99
|
+
|
|
100
|
+
def _parse_git_output(self, output: str) -> GitInfo:
|
|
101
|
+
"""
|
|
102
|
+
Parse git status output into GitInfo
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
output: Output from 'git status -b --porcelain'
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
GitInfo with parsed data
|
|
109
|
+
"""
|
|
110
|
+
lines = output.strip().split("\n")
|
|
111
|
+
|
|
112
|
+
# Extract branch name from first line (## branch_name...)
|
|
113
|
+
branch = self._extract_branch(lines[0] if lines else "")
|
|
114
|
+
|
|
115
|
+
# Count file changes from remaining lines
|
|
116
|
+
staged, modified, untracked = self._count_changes(lines[1:])
|
|
117
|
+
|
|
118
|
+
return GitInfo(
|
|
119
|
+
branch=branch,
|
|
120
|
+
staged=staged,
|
|
121
|
+
modified=modified,
|
|
122
|
+
untracked=untracked,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
def _count_changes(self, lines: list) -> tuple[int, int, int]:
|
|
126
|
+
"""
|
|
127
|
+
Count staged, modified, and untracked files
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
lines: Lines from git status output (excluding header)
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Tuple of (staged_count, modified_count, untracked_count)
|
|
134
|
+
"""
|
|
135
|
+
staged = 0
|
|
136
|
+
modified = 0
|
|
137
|
+
untracked = 0
|
|
138
|
+
|
|
139
|
+
for line in lines:
|
|
140
|
+
if not line or len(line) < 2:
|
|
141
|
+
continue
|
|
142
|
+
|
|
143
|
+
status = line[:2]
|
|
144
|
+
|
|
145
|
+
# Check staged changes (first character)
|
|
146
|
+
if status[0] == self._STATUS_ADDED:
|
|
147
|
+
staged += 1
|
|
148
|
+
elif status[0] == self._STATUS_MODIFIED:
|
|
149
|
+
staged += 1
|
|
150
|
+
|
|
151
|
+
# Check unstaged/working directory changes (second character)
|
|
152
|
+
# Detects: M(modified), D(deleted), A(added), R(renamed), C(copied), T(type changed)
|
|
153
|
+
if len(status) > 1 and status[1] not in (" ", "."):
|
|
154
|
+
modified += 1
|
|
155
|
+
|
|
156
|
+
# Check untracked files
|
|
157
|
+
if status == self._STATUS_UNTRACKED:
|
|
158
|
+
untracked += 1
|
|
159
|
+
|
|
160
|
+
return staged, modified, untracked
|
|
161
|
+
|
|
162
|
+
@staticmethod
|
|
163
|
+
def _extract_branch(branch_line: str) -> str:
|
|
164
|
+
"""
|
|
165
|
+
Extract branch name from git status -b output
|
|
166
|
+
|
|
167
|
+
Format: ## branch_name...origin/branch_name
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
branch_line: First line from git status -b
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
Branch name or "unknown" if parsing fails
|
|
174
|
+
"""
|
|
175
|
+
if not branch_line.startswith("##"):
|
|
176
|
+
return "unknown"
|
|
177
|
+
|
|
178
|
+
# Use regex to extract branch name before first dot
|
|
179
|
+
match = re.match(r"##\s+([^\s\.]+)", branch_line)
|
|
180
|
+
return match.group(1) if match else "unknown"
|
|
181
|
+
|
|
182
|
+
@staticmethod
|
|
183
|
+
def _create_error_info() -> GitInfo:
|
|
184
|
+
"""Create error info with default values for graceful degradation"""
|
|
185
|
+
return GitInfo(
|
|
186
|
+
branch="unknown",
|
|
187
|
+
staged=0,
|
|
188
|
+
modified=0,
|
|
189
|
+
untracked=0,
|
|
190
|
+
)
|