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.

Files changed (417) hide show
  1. moai_adk/__init__.py +1 -2
  2. moai_adk/__main__.py +85 -2
  3. moai_adk/cli/__init__.py +0 -1
  4. moai_adk/cli/commands/__init__.py +0 -1
  5. moai_adk/cli/commands/analyze.py +127 -0
  6. moai_adk/cli/commands/backup.py +5 -3
  7. moai_adk/cli/commands/doctor.py +35 -11
  8. moai_adk/cli/commands/improve_user_experience.py +348 -0
  9. moai_adk/cli/commands/init.py +150 -23
  10. moai_adk/cli/commands/language.py +269 -0
  11. moai_adk/cli/commands/migrate.py +158 -0
  12. moai_adk/cli/commands/status.py +13 -12
  13. moai_adk/cli/commands/update.py +364 -60
  14. moai_adk/cli/commands/validate_links.py +118 -0
  15. moai_adk/cli/main.py +3 -2
  16. moai_adk/cli/prompts/init_prompts.py +79 -82
  17. moai_adk/core/__init__.py +0 -1
  18. moai_adk/core/analysis/__init__.py +9 -0
  19. moai_adk/core/analysis/session_analyzer.py +439 -0
  20. moai_adk/core/claude_integration.py +421 -0
  21. moai_adk/core/command_helpers.py +270 -0
  22. moai_adk/core/config/__init__.py +6 -0
  23. moai_adk/core/config/auto_spec_config.py +346 -0
  24. moai_adk/core/config/migration.py +133 -12
  25. moai_adk/core/context_manager.py +279 -0
  26. moai_adk/core/diagnostics/slash_commands.py +0 -1
  27. moai_adk/core/error_recovery_system.py +1289 -0
  28. moai_adk/core/git/__init__.py +0 -1
  29. moai_adk/core/git/branch.py +0 -1
  30. moai_adk/core/git/branch_manager.py +4 -4
  31. moai_adk/core/git/checkpoint.py +1 -5
  32. moai_adk/core/git/commit.py +0 -1
  33. moai_adk/core/git/event_detector.py +3 -5
  34. moai_adk/core/git/manager.py +0 -1
  35. moai_adk/core/hooks/post_tool_auto_spec_completion.py +925 -0
  36. moai_adk/core/integration/__init__.py +22 -0
  37. moai_adk/core/integration/engine.py +169 -0
  38. moai_adk/core/integration/integration_tester.py +225 -0
  39. moai_adk/core/integration/models.py +88 -0
  40. moai_adk/core/integration/utils.py +211 -0
  41. moai_adk/core/issue_creator.py +28 -18
  42. moai_adk/core/language_config.py +202 -0
  43. moai_adk/core/language_validator.py +556 -0
  44. moai_adk/core/mcp/setup.py +113 -0
  45. moai_adk/core/migration/__init__.py +18 -0
  46. moai_adk/core/migration/backup_manager.py +208 -0
  47. moai_adk/core/migration/file_migrator.py +218 -0
  48. moai_adk/core/migration/version_detector.py +143 -0
  49. moai_adk/core/migration/version_migrator.py +228 -0
  50. moai_adk/core/performance/__init__.py +6 -0
  51. moai_adk/core/performance/cache_system.py +318 -0
  52. moai_adk/core/performance/parallel_processor.py +116 -0
  53. moai_adk/core/project/__init__.py +0 -1
  54. moai_adk/core/project/backup_utils.py +2 -7
  55. moai_adk/core/project/checker.py +3 -3
  56. moai_adk/core/project/detector.py +20 -40
  57. moai_adk/core/project/initializer.py +42 -17
  58. moai_adk/core/project/phase_executor.py +415 -58
  59. moai_adk/core/project/validator.py +6 -25
  60. moai_adk/core/quality/__init__.py +1 -1
  61. moai_adk/core/quality/trust_checker.py +64 -110
  62. moai_adk/core/quality/validators/__init__.py +1 -1
  63. moai_adk/core/quality/validators/base_validator.py +1 -1
  64. moai_adk/core/rollback_manager.py +993 -0
  65. moai_adk/core/session_manager.py +667 -0
  66. moai_adk/core/spec/confidence_scoring.py +749 -0
  67. moai_adk/core/spec/ears_template_engine.py +1182 -0
  68. moai_adk/core/spec/quality_validator.py +721 -0
  69. moai_adk/core/spec_status_manager.py +488 -0
  70. moai_adk/core/template/__init__.py +0 -1
  71. moai_adk/core/template/backup.py +41 -1
  72. moai_adk/core/template/config.py +11 -12
  73. moai_adk/core/template/languages.py +0 -1
  74. moai_adk/core/template/merger.py +79 -22
  75. moai_adk/core/template/processor.py +614 -40
  76. moai_adk/core/template_engine.py +36 -27
  77. moai_adk/foundation/git/commit_templates.py +565 -0
  78. moai_adk/foundation/trust/trust_principles.py +725 -0
  79. moai_adk/foundation/trust/validation_checklist.py +1678 -0
  80. moai_adk/statusline/__init__.py +38 -0
  81. moai_adk/statusline/alfred_detector.py +107 -0
  82. moai_adk/statusline/config.py +364 -0
  83. moai_adk/statusline/enhanced_output_style_detector.py +364 -0
  84. moai_adk/statusline/git_collector.py +190 -0
  85. moai_adk/statusline/main.py +228 -0
  86. moai_adk/statusline/metrics_tracker.py +78 -0
  87. moai_adk/statusline/renderer.py +327 -0
  88. moai_adk/statusline/update_checker.py +135 -0
  89. moai_adk/statusline/version_reader.py +647 -0
  90. moai_adk/templates/.git-hooks/pre-commit +66 -0
  91. moai_adk/templates/.git-hooks/pre-push +116 -4
  92. moai_adk/templates/.github/workflows/moai-gitflow.yml +1 -7
  93. moai_adk/templates/.github/workflows/spec-issue-sync.yml +0 -1
  94. moai_adk/templates/.gitignore +44 -0
  95. moai_adk/templates/.mcp.json +22 -0
  96. moai_adk/templates/CLAUDE.md +450 -1071
  97. moai_adk/utils/__init__.py +0 -1
  98. moai_adk/utils/banner.py +0 -1
  99. moai_adk/utils/common.py +308 -0
  100. moai_adk/utils/link_validator.py +249 -0
  101. moai_adk/utils/logger.py +4 -9
  102. moai_adk/utils/safe_file_reader.py +210 -0
  103. moai_adk/utils/user_experience.py +531 -0
  104. moai_adk-0.25.4.dist-info/METADATA +2279 -0
  105. moai_adk-0.25.4.dist-info/RECORD +112 -0
  106. moai_adk/core/tags/__init__.py +0 -86
  107. moai_adk/core/tags/ci_validator.py +0 -463
  108. moai_adk/core/tags/cli.py +0 -283
  109. moai_adk/core/tags/generator.py +0 -109
  110. moai_adk/core/tags/inserter.py +0 -99
  111. moai_adk/core/tags/mapper.py +0 -126
  112. moai_adk/core/tags/parser.py +0 -76
  113. moai_adk/core/tags/pre_commit_validator.py +0 -393
  114. moai_adk/core/tags/reporter.py +0 -956
  115. moai_adk/core/tags/tags.py +0 -149
  116. moai_adk/core/tags/validator.py +0 -897
  117. moai_adk/templates/.claude/agents/alfred/backend-expert.md +0 -319
  118. moai_adk/templates/.claude/agents/alfred/cc-manager.md +0 -316
  119. moai_adk/templates/.claude/agents/alfred/debug-helper.md +0 -208
  120. moai_adk/templates/.claude/agents/alfred/devops-expert.md +0 -464
  121. moai_adk/templates/.claude/agents/alfred/doc-syncer.md +0 -214
  122. moai_adk/templates/.claude/agents/alfred/frontend-expert.md +0 -357
  123. moai_adk/templates/.claude/agents/alfred/git-manager.md +0 -406
  124. moai_adk/templates/.claude/agents/alfred/implementation-planner.md +0 -423
  125. moai_adk/templates/.claude/agents/alfred/project-manager.md +0 -312
  126. moai_adk/templates/.claude/agents/alfred/quality-gate.md +0 -343
  127. moai_adk/templates/.claude/agents/alfred/skill-factory.md +0 -865
  128. moai_adk/templates/.claude/agents/alfred/spec-builder.md +0 -426
  129. moai_adk/templates/.claude/agents/alfred/tag-agent.md +0 -361
  130. moai_adk/templates/.claude/agents/alfred/tdd-implementer.md +0 -428
  131. moai_adk/templates/.claude/agents/alfred/trust-checker.md +0 -375
  132. moai_adk/templates/.claude/agents/alfred/ui-ux-expert.md +0 -571
  133. moai_adk/templates/.claude/commands/alfred/0-project.md +0 -1854
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -880
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -793
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1084
  137. moai_adk/templates/.claude/commands/alfred/9-feedback.md +0 -149
  138. moai_adk/templates/.claude/hooks/alfred/core/project.py +0 -748
  139. moai_adk/templates/.claude/hooks/alfred/core/timeout.py +0 -136
  140. moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +0 -108
  141. moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +0 -198
  142. moai_adk/templates/.claude/hooks/alfred/handlers/__init__.py +0 -29
  143. moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +0 -94
  144. moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +0 -100
  145. moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +0 -94
  146. moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +0 -94
  147. moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +0 -170
  148. moai_adk/templates/.claude/hooks/alfred/shared/core/checkpoint.py +0 -271
  149. moai_adk/templates/.claude/hooks/alfred/shared/core/context.py +0 -67
  150. moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +0 -749
  151. moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +0 -230
  152. moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +0 -198
  153. moai_adk/templates/.claude/hooks/alfred/shared/handlers/__init__.py +0 -21
  154. moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +0 -154
  155. moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +0 -174
  156. moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +0 -87
  157. moai_adk/templates/.claude/hooks/alfred/shared/handlers/user.py +0 -61
  158. moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +0 -112
  159. moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +0 -1
  160. moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +0 -161
  161. moai_adk/templates/.claude/settings.json +0 -144
  162. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/SKILL.md +0 -70
  163. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/examples.md +0 -62
  164. moai_adk/templates/.claude/skills/moai-alfred-agent-guide/reference.md +0 -242
  165. moai_adk/templates/.claude/skills/moai-alfred-config-schema/SKILL.md +0 -56
  166. moai_adk/templates/.claude/skills/moai-alfred-config-schema/examples.md +0 -28
  167. moai_adk/templates/.claude/skills/moai-alfred-config-schema/reference.md +0 -444
  168. moai_adk/templates/.claude/skills/moai-alfred-context-budget/SKILL.md +0 -62
  169. moai_adk/templates/.claude/skills/moai-alfred-context-budget/examples.md +0 -28
  170. moai_adk/templates/.claude/skills/moai-alfred-context-budget/reference.md +0 -405
  171. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/SKILL.md +0 -51
  172. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/examples.md +0 -355
  173. moai_adk/templates/.claude/skills/moai-alfred-dev-guide/reference.md +0 -239
  174. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/SKILL.md +0 -113
  175. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/examples.md +0 -29
  176. moai_adk/templates/.claude/skills/moai-alfred-ears-authoring/reference.md +0 -28
  177. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/SKILL.md +0 -323
  178. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/examples.md +0 -286
  179. moai_adk/templates/.claude/skills/moai-alfred-expertise-detection/reference.md +0 -126
  180. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/SKILL.md +0 -122
  181. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/examples.md +0 -29
  182. moai_adk/templates/.claude/skills/moai-alfred-git-workflow/reference.md +0 -29
  183. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/SKILL.md +0 -74
  184. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/examples.md +0 -4
  185. moai_adk/templates/.claude/skills/moai-alfred-gitflow-policy/reference.md +0 -269
  186. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/SKILL.md +0 -237
  187. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/examples.md +0 -615
  188. moai_adk/templates/.claude/skills/moai-alfred-interactive-questions/reference.md +0 -653
  189. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/SKILL.md +0 -19
  190. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/examples.md +0 -4
  191. moai_adk/templates/.claude/skills/moai-alfred-issue-labels/reference.md +0 -150
  192. moai_adk/templates/.claude/skills/moai-alfred-language-detection/SKILL.md +0 -113
  193. moai_adk/templates/.claude/skills/moai-alfred-language-detection/examples.md +0 -29
  194. moai_adk/templates/.claude/skills/moai-alfred-language-detection/reference.md +0 -28
  195. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/SKILL.md +0 -198
  196. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/examples.md +0 -431
  197. moai_adk/templates/.claude/skills/moai-alfred-persona-roles/reference.md +0 -141
  198. moai_adk/templates/.claude/skills/moai-alfred-practices/SKILL.md +0 -89
  199. moai_adk/templates/.claude/skills/moai-alfred-practices/examples.md +0 -122
  200. moai_adk/templates/.claude/skills/moai-alfred-practices/reference.md +0 -369
  201. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/SKILL.md +0 -508
  202. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/examples.md +0 -481
  203. moai_adk/templates/.claude/skills/moai-alfred-proactive-suggestions/reference.md +0 -100
  204. moai_adk/templates/.claude/skills/moai-alfred-reporting/SKILL.md +0 -273
  205. moai_adk/templates/.claude/skills/moai-alfred-rules/SKILL.md +0 -77
  206. moai_adk/templates/.claude/skills/moai-alfred-rules/examples.md +0 -265
  207. moai_adk/templates/.claude/skills/moai-alfred-rules/reference.md +0 -539
  208. moai_adk/templates/.claude/skills/moai-alfred-session-state/SKILL.md +0 -19
  209. moai_adk/templates/.claude/skills/moai-alfred-session-state/examples.md +0 -4
  210. moai_adk/templates/.claude/skills/moai-alfred-session-state/reference.md +0 -84
  211. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/README.md +0 -137
  212. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/SKILL.md +0 -219
  213. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples/validate-spec.sh +0 -161
  214. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/examples.md +0 -541
  215. moai_adk/templates/.claude/skills/moai-alfred-spec-authoring/reference.md +0 -622
  216. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/SKILL.md +0 -115
  217. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/examples.md +0 -4
  218. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-extended/reference.md +0 -348
  219. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/SKILL.md +0 -113
  220. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/examples.md +0 -29
  221. moai_adk/templates/.claude/skills/moai-alfred-spec-metadata-validation/reference.md +0 -28
  222. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/SKILL.md +0 -113
  223. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/examples.md +0 -29
  224. moai_adk/templates/.claude/skills/moai-alfred-tag-scanning/reference.md +0 -28
  225. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/SKILL.md +0 -19
  226. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/examples.md +0 -4
  227. moai_adk/templates/.claude/skills/moai-alfred-todowrite-pattern/reference.md +0 -211
  228. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/SKILL.md +0 -113
  229. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/examples.md +0 -29
  230. moai_adk/templates/.claude/skills/moai-alfred-trust-validation/reference.md +0 -28
  231. moai_adk/templates/.claude/skills/moai-alfred-workflow/SKILL.md +0 -288
  232. moai_adk/templates/.claude/skills/moai-cc-agents/SKILL.md +0 -269
  233. moai_adk/templates/.claude/skills/moai-cc-agents/templates/agent-template.md +0 -32
  234. moai_adk/templates/.claude/skills/moai-cc-claude-md/SKILL.md +0 -298
  235. moai_adk/templates/.claude/skills/moai-cc-claude-md/templates/CLAUDE-template.md +0 -26
  236. moai_adk/templates/.claude/skills/moai-cc-commands/SKILL.md +0 -307
  237. moai_adk/templates/.claude/skills/moai-cc-commands/templates/command-template.md +0 -21
  238. moai_adk/templates/.claude/skills/moai-cc-hooks/SKILL.md +0 -252
  239. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/pre-bash-check.sh +0 -19
  240. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/preserve-permissions.sh +0 -19
  241. moai_adk/templates/.claude/skills/moai-cc-hooks/scripts/validate-bash-command.py +0 -24
  242. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/SKILL.md +0 -199
  243. moai_adk/templates/.claude/skills/moai-cc-mcp-plugins/templates/settings-mcp-template.json +0 -39
  244. moai_adk/templates/.claude/skills/moai-cc-memory/SKILL.md +0 -316
  245. moai_adk/templates/.claude/skills/moai-cc-memory/templates/session-summary-template.md +0 -18
  246. moai_adk/templates/.claude/skills/moai-cc-settings/SKILL.md +0 -263
  247. moai_adk/templates/.claude/skills/moai-cc-settings/templates/settings-complete-template.json +0 -30
  248. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/SKILL.md +0 -19
  249. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/examples.md +0 -4
  250. moai_adk/templates/.claude/skills/moai-cc-skill-descriptions/reference.md +0 -218
  251. moai_adk/templates/.claude/skills/moai-cc-skill-factory/CHECKLIST.md +0 -482
  252. moai_adk/templates/.claude/skills/moai-cc-skill-factory/EXAMPLES.md +0 -278
  253. moai_adk/templates/.claude/skills/moai-cc-skill-factory/INTERACTIVE-DISCOVERY.md +0 -524
  254. moai_adk/templates/.claude/skills/moai-cc-skill-factory/METADATA.md +0 -477
  255. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PARALLEL-ANALYSIS-REPORT.md +0 -429
  256. moai_adk/templates/.claude/skills/moai-cc-skill-factory/PYTHON-VERSION-MATRIX.md +0 -391
  257. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-FACTORY-WORKFLOW.md +0 -431
  258. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL-UPDATE-ADVISOR.md +0 -577
  259. moai_adk/templates/.claude/skills/moai-cc-skill-factory/SKILL.md +0 -271
  260. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STEP-BY-STEP-GUIDE.md +0 -466
  261. moai_adk/templates/.claude/skills/moai-cc-skill-factory/STRUCTURE.md +0 -583
  262. moai_adk/templates/.claude/skills/moai-cc-skill-factory/WEB-RESEARCH.md +0 -526
  263. moai_adk/templates/.claude/skills/moai-cc-skill-factory/reference.md +0 -465
  264. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/generate-structure.sh +0 -328
  265. moai_adk/templates/.claude/skills/moai-cc-skill-factory/scripts/validate-skill.sh +0 -312
  266. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/SKILL_TEMPLATE.md +0 -245
  267. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/examples-template.md +0 -285
  268. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/reference-template.md +0 -278
  269. moai_adk/templates/.claude/skills/moai-cc-skill-factory/templates/scripts-template.sh +0 -303
  270. moai_adk/templates/.claude/skills/moai-cc-skills/SKILL.md +0 -291
  271. moai_adk/templates/.claude/skills/moai-cc-skills/templates/SKILL-template.md +0 -15
  272. moai_adk/templates/.claude/skills/moai-design-systems/SKILL.md +0 -802
  273. moai_adk/templates/.claude/skills/moai-design-systems/examples.md +0 -1238
  274. moai_adk/templates/.claude/skills/moai-design-systems/reference.md +0 -673
  275. moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +0 -290
  276. moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +0 -1633
  277. moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +0 -660
  278. moai_adk/templates/.claude/skills/moai-domain-cli-tool/SKILL.md +0 -123
  279. moai_adk/templates/.claude/skills/moai-domain-cli-tool/examples.md +0 -29
  280. moai_adk/templates/.claude/skills/moai-domain-cli-tool/reference.md +0 -30
  281. moai_adk/templates/.claude/skills/moai-domain-data-science/SKILL.md +0 -123
  282. moai_adk/templates/.claude/skills/moai-domain-data-science/examples.md +0 -29
  283. moai_adk/templates/.claude/skills/moai-domain-data-science/reference.md +0 -30
  284. moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +0 -123
  285. moai_adk/templates/.claude/skills/moai-domain-database/examples.md +0 -29
  286. moai_adk/templates/.claude/skills/moai-domain-database/reference.md +0 -30
  287. moai_adk/templates/.claude/skills/moai-domain-devops/SKILL.md +0 -124
  288. moai_adk/templates/.claude/skills/moai-domain-devops/examples.md +0 -29
  289. moai_adk/templates/.claude/skills/moai-domain-devops/reference.md +0 -31
  290. moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +0 -128
  291. moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +0 -29
  292. moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +0 -31
  293. moai_adk/templates/.claude/skills/moai-domain-ml/SKILL.md +0 -123
  294. moai_adk/templates/.claude/skills/moai-domain-ml/examples.md +0 -29
  295. moai_adk/templates/.claude/skills/moai-domain-ml/reference.md +0 -30
  296. moai_adk/templates/.claude/skills/moai-domain-mobile-app/SKILL.md +0 -123
  297. moai_adk/templates/.claude/skills/moai-domain-mobile-app/examples.md +0 -29
  298. moai_adk/templates/.claude/skills/moai-domain-mobile-app/reference.md +0 -30
  299. moai_adk/templates/.claude/skills/moai-domain-security/SKILL.md +0 -123
  300. moai_adk/templates/.claude/skills/moai-domain-security/examples.md +0 -29
  301. moai_adk/templates/.claude/skills/moai-domain-security/reference.md +0 -30
  302. moai_adk/templates/.claude/skills/moai-domain-web-api/SKILL.md +0 -123
  303. moai_adk/templates/.claude/skills/moai-domain-web-api/examples.md +0 -29
  304. moai_adk/templates/.claude/skills/moai-domain-web-api/reference.md +0 -30
  305. moai_adk/templates/.claude/skills/moai-essentials-debug/SKILL.md +0 -303
  306. moai_adk/templates/.claude/skills/moai-essentials-debug/examples.md +0 -1064
  307. moai_adk/templates/.claude/skills/moai-essentials-debug/reference.md +0 -1047
  308. moai_adk/templates/.claude/skills/moai-essentials-perf/SKILL.md +0 -113
  309. moai_adk/templates/.claude/skills/moai-essentials-perf/examples.md +0 -29
  310. moai_adk/templates/.claude/skills/moai-essentials-perf/reference.md +0 -28
  311. moai_adk/templates/.claude/skills/moai-essentials-refactor/SKILL.md +0 -113
  312. moai_adk/templates/.claude/skills/moai-essentials-refactor/examples.md +0 -29
  313. moai_adk/templates/.claude/skills/moai-essentials-refactor/reference.md +0 -28
  314. moai_adk/templates/.claude/skills/moai-essentials-review/SKILL.md +0 -113
  315. moai_adk/templates/.claude/skills/moai-essentials-review/examples.md +0 -29
  316. moai_adk/templates/.claude/skills/moai-essentials-review/reference.md +0 -28
  317. moai_adk/templates/.claude/skills/moai-foundation-ears/SKILL.md +0 -116
  318. moai_adk/templates/.claude/skills/moai-foundation-ears/examples.md +0 -29
  319. moai_adk/templates/.claude/skills/moai-foundation-ears/reference.md +0 -28
  320. moai_adk/templates/.claude/skills/moai-foundation-git/SKILL.md +0 -122
  321. moai_adk/templates/.claude/skills/moai-foundation-git/examples.md +0 -29
  322. moai_adk/templates/.claude/skills/moai-foundation-git/reference.md +0 -29
  323. moai_adk/templates/.claude/skills/moai-foundation-langs/SKILL.md +0 -113
  324. moai_adk/templates/.claude/skills/moai-foundation-langs/examples.md +0 -29
  325. moai_adk/templates/.claude/skills/moai-foundation-langs/reference.md +0 -28
  326. moai_adk/templates/.claude/skills/moai-foundation-specs/SKILL.md +0 -113
  327. moai_adk/templates/.claude/skills/moai-foundation-specs/examples.md +0 -29
  328. moai_adk/templates/.claude/skills/moai-foundation-specs/reference.md +0 -28
  329. moai_adk/templates/.claude/skills/moai-foundation-tags/SKILL.md +0 -113
  330. moai_adk/templates/.claude/skills/moai-foundation-tags/examples.md +0 -29
  331. moai_adk/templates/.claude/skills/moai-foundation-tags/reference.md +0 -28
  332. moai_adk/templates/.claude/skills/moai-foundation-trust/SKILL.md +0 -307
  333. moai_adk/templates/.claude/skills/moai-foundation-trust/examples.md +0 -0
  334. moai_adk/templates/.claude/skills/moai-foundation-trust/reference.md +0 -1099
  335. moai_adk/templates/.claude/skills/moai-lang-c/SKILL.md +0 -124
  336. moai_adk/templates/.claude/skills/moai-lang-c/examples.md +0 -29
  337. moai_adk/templates/.claude/skills/moai-lang-c/reference.md +0 -31
  338. moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +0 -124
  339. moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +0 -29
  340. moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +0 -31
  341. moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +0 -123
  342. moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +0 -29
  343. moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +0 -30
  344. moai_adk/templates/.claude/skills/moai-lang-dart/SKILL.md +0 -123
  345. moai_adk/templates/.claude/skills/moai-lang-dart/examples.md +0 -29
  346. moai_adk/templates/.claude/skills/moai-lang-dart/reference.md +0 -30
  347. moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +0 -127
  348. moai_adk/templates/.claude/skills/moai-lang-go/examples.md +0 -29
  349. moai_adk/templates/.claude/skills/moai-lang-go/reference.md +0 -31
  350. moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +0 -126
  351. moai_adk/templates/.claude/skills/moai-lang-java/examples.md +0 -29
  352. moai_adk/templates/.claude/skills/moai-lang-java/reference.md +0 -31
  353. moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +0 -125
  354. moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +0 -29
  355. moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +0 -32
  356. moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +0 -124
  357. moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +0 -29
  358. moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +0 -31
  359. moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +0 -126
  360. moai_adk/templates/.claude/skills/moai-lang-php/examples.md +0 -29
  361. moai_adk/templates/.claude/skills/moai-lang-php/reference.md +0 -30
  362. moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +0 -433
  363. moai_adk/templates/.claude/skills/moai-lang-python/examples.md +0 -624
  364. moai_adk/templates/.claude/skills/moai-lang-python/reference.md +0 -316
  365. moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +0 -123
  366. moai_adk/templates/.claude/skills/moai-lang-r/examples.md +0 -29
  367. moai_adk/templates/.claude/skills/moai-lang-r/reference.md +0 -30
  368. moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +0 -124
  369. moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +0 -29
  370. moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +0 -31
  371. moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +0 -127
  372. moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +0 -29
  373. moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +0 -31
  374. moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +0 -125
  375. moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +0 -29
  376. moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +0 -30
  377. moai_adk/templates/.claude/skills/moai-lang-shell/SKILL.md +0 -123
  378. moai_adk/templates/.claude/skills/moai-lang-shell/examples.md +0 -29
  379. moai_adk/templates/.claude/skills/moai-lang-shell/reference.md +0 -30
  380. moai_adk/templates/.claude/skills/moai-lang-sql/SKILL.md +0 -124
  381. moai_adk/templates/.claude/skills/moai-lang-sql/examples.md +0 -29
  382. moai_adk/templates/.claude/skills/moai-lang-sql/reference.md +0 -31
  383. moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +0 -123
  384. moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +0 -29
  385. moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +0 -30
  386. moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +0 -133
  387. moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +0 -29
  388. moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +0 -34
  389. moai_adk/templates/.claude/skills/moai-project-documentation.md +0 -622
  390. moai_adk/templates/.github/workflows/c-tag-validation.yml +0 -11
  391. moai_adk/templates/.github/workflows/cpp-tag-validation.yml +0 -11
  392. moai_adk/templates/.github/workflows/csharp-tag-validation.yml +0 -11
  393. moai_adk/templates/.github/workflows/dart-tag-validation.yml +0 -11
  394. moai_adk/templates/.github/workflows/go-tag-validation.yml +0 -130
  395. moai_adk/templates/.github/workflows/java-tag-validation.yml +0 -11
  396. moai_adk/templates/.github/workflows/javascript-tag-validation.yml +0 -135
  397. moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +0 -11
  398. moai_adk/templates/.github/workflows/php-tag-validation.yml +0 -11
  399. moai_adk/templates/.github/workflows/python-tag-validation.yml +0 -118
  400. moai_adk/templates/.github/workflows/release.yml +0 -118
  401. moai_adk/templates/.github/workflows/ruby-tag-validation.yml +0 -11
  402. moai_adk/templates/.github/workflows/rust-tag-validation.yml +0 -11
  403. moai_adk/templates/.github/workflows/shell-tag-validation.yml +0 -11
  404. moai_adk/templates/.github/workflows/swift-tag-validation.yml +0 -11
  405. moai_adk/templates/.github/workflows/tag-report.yml +0 -269
  406. moai_adk/templates/.github/workflows/tag-validation.yml +0 -186
  407. moai_adk/templates/.github/workflows/typescript-tag-validation.yml +0 -154
  408. moai_adk/templates/.moai/config.json +0 -115
  409. moai_adk/templates/workflows/go-tag-validation.yml +0 -30
  410. moai_adk/templates/workflows/javascript-tag-validation.yml +0 -41
  411. moai_adk/templates/workflows/python-tag-validation.yml +0 -42
  412. moai_adk/templates/workflows/typescript-tag-validation.yml +0 -31
  413. moai_adk-0.15.1.dist-info/METADATA +0 -3094
  414. moai_adk-0.15.1.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.1.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {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
+ )