moai-adk 0.15.0__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 -392
  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 -1525
  134. moai_adk/templates/.claude/commands/alfred/1-plan.md +0 -802
  135. moai_adk/templates/.claude/commands/alfred/2-run.md +0 -709
  136. moai_adk/templates/.claude/commands/alfred/3-sync.md +0 -1009
  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.0.dist-info/METADATA +0 -3079
  414. moai_adk-0.15.0.dist-info/RECORD +0 -365
  415. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/WHEEL +0 -0
  416. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/entry_points.txt +0 -0
  417. {moai_adk-0.15.0.dist-info → moai_adk-0.25.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,667 @@
1
+ """
2
+ Session Manager for MoAI-ADK Agent Orchestration
3
+
4
+ Manages sub-agent session IDs and resume logic based on official Claude Code documentation.
5
+ Provides session tracking, result storage, and resume decision making.
6
+
7
+ Official Documentation Reference:
8
+ https://code.claude.com/docs/en/sub-agents
9
+
10
+ Key Principles:
11
+ - Sub-agents operate in isolated context windows
12
+ - No direct agent-to-agent communication
13
+ - Results flow through main conversation thread (Alfred)
14
+ - Resume preserves full conversation history
15
+ - Each execution gets unique agentId
16
+ """
17
+
18
+ import json
19
+ import logging
20
+ from datetime import datetime
21
+ from pathlib import Path
22
+ from typing import Any, Dict, List, Optional
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class SessionManager:
28
+ """
29
+ Manages sub-agent session IDs and resume logic.
30
+
31
+ Based on official Claude Code sub-agent pattern:
32
+ - Each agent execution gets unique agentId
33
+ - Resume parameter inherits full conversation history
34
+ - Session transcripts stored in agent-{agentId}.jsonl
35
+
36
+ Attributes:
37
+ _sessions: Mapping of agent_name to current agentId
38
+ _results: Storage of agent execution results (agentId → result data)
39
+ _chains: Workflow chains tracking (chain_name → [agentIds])
40
+ _session_file: Persistent storage location
41
+ _transcript_dir: Directory for conversation transcripts
42
+ """
43
+
44
+ def __init__(
45
+ self,
46
+ session_file: Optional[Path] = None,
47
+ transcript_dir: Optional[Path] = None,
48
+ ):
49
+ """
50
+ Initialize SessionManager.
51
+
52
+ Args:
53
+ session_file: Path to session storage JSON file
54
+ (default: .moai/memory/agent-sessions.json)
55
+ transcript_dir: Directory for agent transcripts
56
+ (default: .moai/logs/agent-transcripts/)
57
+ """
58
+ # Default paths
59
+ project_root = Path.cwd()
60
+ self._session_file = (
61
+ session_file or project_root / ".moai" / "memory" / "agent-sessions.json"
62
+ )
63
+ self._transcript_dir = (
64
+ transcript_dir or project_root / ".moai" / "logs" / "agent-transcripts"
65
+ )
66
+
67
+ # Ensure directories exist
68
+ self._session_file.parent.mkdir(parents=True, exist_ok=True)
69
+ self._transcript_dir.mkdir(parents=True, exist_ok=True)
70
+
71
+ # In-memory storage
72
+ self._sessions: Dict[str, str] = {} # agent_name → current agentId
73
+ self._results: Dict[str, Any] = {} # agentId → result data
74
+ self._chains: Dict[str, List[str]] = {} # chain_name → [agentIds]
75
+ self._metadata: Dict[str, Dict[str, Any]] = {} # agentId → metadata
76
+
77
+ # Load existing sessions
78
+ self._load_sessions()
79
+
80
+ def _load_sessions(self) -> None:
81
+ """Load session data from persistent storage."""
82
+ if self._session_file.exists():
83
+ try:
84
+ with open(self._session_file, "r", encoding="utf-8") as f:
85
+ data = json.load(f)
86
+ self._sessions = data.get("sessions", {})
87
+ self._chains = data.get("chains", {})
88
+ self._metadata = data.get("metadata", {})
89
+ logger.info(
90
+ f"Loaded {len(self._sessions)} sessions from {self._session_file}"
91
+ )
92
+ except json.JSONDecodeError as e:
93
+ logger.warning(f"Failed to load sessions: {e}")
94
+ self._sessions = {}
95
+ self._chains = {}
96
+ self._metadata = {}
97
+
98
+ def _save_sessions(self) -> None:
99
+ """Save session data to persistent storage."""
100
+ data = {
101
+ "sessions": self._sessions,
102
+ "chains": self._chains,
103
+ "metadata": self._metadata,
104
+ "last_updated": datetime.now().isoformat(),
105
+ }
106
+
107
+ try:
108
+ with open(self._session_file, "w", encoding="utf-8") as f:
109
+ json.dump(data, f, indent=2, ensure_ascii=False)
110
+ logger.debug(f"Saved sessions to {self._session_file}")
111
+ except IOError as e:
112
+ logger.error(f"Failed to save sessions: {e}")
113
+
114
+ def register_agent_result(
115
+ self,
116
+ agent_name: str,
117
+ agent_id: str,
118
+ result: Any,
119
+ chain_id: Optional[str] = None,
120
+ ) -> None:
121
+ """
122
+ Register agent execution result in main context.
123
+
124
+ This method implements the official pattern:
125
+ "Results flow through main conversation thread"
126
+
127
+ Args:
128
+ agent_name: Name of the agent (e.g., "tdd-implementer")
129
+ agent_id: Unique agentId returned from Task() execution
130
+ result: Result data from agent execution
131
+ chain_id: Optional workflow chain identifier (e.g., "SPEC-AUTH-001-implementation")
132
+ """
133
+ # Store agent ID mapping
134
+ self._sessions[agent_name] = agent_id
135
+
136
+ # Store result data
137
+ self._results[agent_id] = {
138
+ "agent_name": agent_name,
139
+ "result": result,
140
+ "timestamp": datetime.now().isoformat(),
141
+ "chain_id": chain_id,
142
+ }
143
+
144
+ # Track in workflow chain
145
+ if chain_id:
146
+ if chain_id not in self._chains:
147
+ self._chains[chain_id] = []
148
+ self._chains[chain_id].append(agent_id)
149
+
150
+ # Store metadata
151
+ self._metadata[agent_id] = {
152
+ "agent_name": agent_name,
153
+ "created_at": datetime.now().isoformat(),
154
+ "chain_id": chain_id,
155
+ "resume_count": 0,
156
+ }
157
+
158
+ # Persist to disk
159
+ self._save_sessions()
160
+
161
+ logger.info(
162
+ f"Registered agent result: {agent_name} (agentId: {agent_id[:8]}..., chain: {chain_id})"
163
+ )
164
+
165
+ def get_resume_id(
166
+ self,
167
+ agent_name: str,
168
+ chain_id: Optional[str] = None,
169
+ ) -> Optional[str]:
170
+ """
171
+ Get agentId to resume if continuing same work.
172
+
173
+ Official pattern:
174
+ - resume parameter preserves full conversation history
175
+ - Same agent can continue work with context
176
+
177
+ Args:
178
+ agent_name: Name of the agent to resume
179
+ chain_id: Optional workflow chain to resume
180
+
181
+ Returns:
182
+ agentId to resume, or None if should start new session
183
+ """
184
+ # Check if agent has previous session
185
+ if agent_name not in self._sessions:
186
+ logger.debug(f"No previous session for {agent_name}")
187
+ return None
188
+
189
+ agent_id = self._sessions[agent_name]
190
+
191
+ # Validate chain_id if provided
192
+ if chain_id:
193
+ metadata = self._metadata.get(agent_id, {})
194
+ if metadata.get("chain_id") != chain_id:
195
+ logger.debug(
196
+ f"Chain mismatch: {agent_name} was in {metadata.get('chain_id')}, "
197
+ f"requested {chain_id}"
198
+ )
199
+ return None
200
+
201
+ logger.info(f"Resume ID for {agent_name}: {agent_id[:8]}...")
202
+ return agent_id
203
+
204
+ def should_resume(
205
+ self,
206
+ agent_name: str,
207
+ current_task: str,
208
+ previous_task: Optional[str] = None,
209
+ ) -> bool:
210
+ """
211
+ Determine if resume or new invocation is appropriate.
212
+
213
+ Decision logic based on official best practices:
214
+ - Resume: Same agent, continuing previous task, context continuity needed
215
+ - New: Different agent, independent task, context switch
216
+
217
+ Args:
218
+ agent_name: Name of the agent
219
+ current_task: Description of current task
220
+ previous_task: Description of previous task (if any)
221
+
222
+ Returns:
223
+ True if should resume, False if should start new session
224
+ """
225
+ # No previous session → new
226
+ if agent_name not in self._sessions:
227
+ return False
228
+
229
+ # No previous task information → new
230
+ if not previous_task:
231
+ return False
232
+
233
+ # Check resume count (prevent infinite loops)
234
+ agent_id = self._sessions[agent_name]
235
+ metadata = self._metadata.get(agent_id, {})
236
+ resume_count = metadata.get("resume_count", 0)
237
+
238
+ if resume_count >= 5: # Max resume depth from config
239
+ logger.warning(
240
+ f"{agent_name} has been resumed {resume_count} times, starting new session"
241
+ )
242
+ return False
243
+
244
+ # Heuristic: Check if tasks are related
245
+ # (This can be enhanced with semantic similarity)
246
+ task_keywords_match = any(
247
+ keyword in current_task.lower()
248
+ for keyword in previous_task.lower().split()
249
+ if len(keyword) > 4
250
+ )
251
+
252
+ if task_keywords_match:
253
+ logger.info(f"Tasks appear related, resuming {agent_name}")
254
+ return True
255
+
256
+ logger.info(f"Tasks appear independent, starting new session for {agent_name}")
257
+ return False
258
+
259
+ def increment_resume_count(self, agent_id: str) -> None:
260
+ """
261
+ Increment resume count for an agent session.
262
+
263
+ Args:
264
+ agent_id: Agent session ID
265
+ """
266
+ if agent_id in self._metadata:
267
+ self._metadata[agent_id]["resume_count"] += 1
268
+ self._metadata[agent_id]["last_resumed_at"] = datetime.now().isoformat()
269
+ self._save_sessions()
270
+
271
+ def get_agent_result(self, agent_id: str) -> Optional[Any]:
272
+ """
273
+ Retrieve stored result for an agent execution.
274
+
275
+ Args:
276
+ agent_id: Agent session ID
277
+
278
+ Returns:
279
+ Stored result data, or None if not found
280
+ """
281
+ result_data = self._results.get(agent_id)
282
+ if result_data:
283
+ return result_data["result"]
284
+ return None
285
+
286
+ def get_chain_results(self, chain_id: str) -> List[Dict[str, Any]]:
287
+ """
288
+ Get all agent results in a workflow chain.
289
+
290
+ Args:
291
+ chain_id: Workflow chain identifier
292
+
293
+ Returns:
294
+ List of result dictionaries in execution order
295
+ """
296
+ if chain_id not in self._chains:
297
+ return []
298
+
299
+ agent_ids = self._chains[chain_id]
300
+ results = []
301
+
302
+ for agent_id in agent_ids:
303
+ if agent_id in self._results:
304
+ results.append(self._results[agent_id])
305
+
306
+ return results
307
+
308
+ def get_chain_summary(self, chain_id: str) -> Dict[str, Any]:
309
+ """
310
+ Get summary of a workflow chain.
311
+
312
+ Args:
313
+ chain_id: Workflow chain identifier
314
+
315
+ Returns:
316
+ Summary dictionary with agent names, timestamps, etc.
317
+ """
318
+ results = self.get_chain_results(chain_id)
319
+
320
+ if not results:
321
+ return {"chain_id": chain_id, "status": "not_found"}
322
+
323
+ return {
324
+ "chain_id": chain_id,
325
+ "agent_count": len(results),
326
+ "agents": [r["agent_name"] for r in results],
327
+ "started_at": results[0]["timestamp"] if results else None,
328
+ "completed_at": results[-1]["timestamp"] if results else None,
329
+ "status": "completed",
330
+ }
331
+
332
+ def clear_agent_session(self, agent_name: str) -> None:
333
+ """
334
+ Clear session data for a specific agent.
335
+
336
+ Use when you want to force a new session for an agent.
337
+
338
+ Args:
339
+ agent_name: Name of the agent
340
+ """
341
+ if agent_name in self._sessions:
342
+ agent_id = self._sessions[agent_name]
343
+ del self._sessions[agent_name]
344
+
345
+ if agent_id in self._results:
346
+ del self._results[agent_id]
347
+
348
+ if agent_id in self._metadata:
349
+ del self._metadata[agent_id]
350
+
351
+ self._save_sessions()
352
+ logger.info(f"Cleared session for {agent_name}")
353
+
354
+ def clear_chain(self, chain_id: str) -> None:
355
+ """
356
+ Clear all sessions in a workflow chain.
357
+
358
+ Args:
359
+ chain_id: Workflow chain identifier
360
+ """
361
+ if chain_id in self._chains:
362
+ agent_ids = self._chains[chain_id]
363
+
364
+ for agent_id in agent_ids:
365
+ if agent_id in self._results:
366
+ del self._results[agent_id]
367
+ if agent_id in self._metadata:
368
+ del self._metadata[agent_id]
369
+
370
+ del self._chains[chain_id]
371
+ self._save_sessions()
372
+ logger.info(f"Cleared chain: {chain_id}")
373
+
374
+ def get_all_sessions(self) -> Dict[str, Any]:
375
+ """
376
+ Get all active sessions.
377
+
378
+ Returns:
379
+ Dictionary with all session data
380
+ """
381
+ return {
382
+ "sessions": self._sessions,
383
+ "chains": list(self._chains.keys()),
384
+ "total_results": len(self._results),
385
+ }
386
+
387
+ def export_transcript(self, agent_id: str) -> Optional[Path]:
388
+ """
389
+ Get path to agent conversation transcript.
390
+
391
+ Official pattern:
392
+ - Transcripts stored in agent-{agentId}.jsonl
393
+ - Contains full conversation history
394
+
395
+ Args:
396
+ agent_id: Agent session ID
397
+
398
+ Returns:
399
+ Path to transcript file, or None if not found
400
+ """
401
+ transcript_file = self._transcript_dir / f"agent-{agent_id}.jsonl"
402
+
403
+ if transcript_file.exists():
404
+ return transcript_file
405
+
406
+ logger.warning(f"Transcript not found for agentId: {agent_id}")
407
+ return None
408
+
409
+ def create_chain(
410
+ self,
411
+ chain_id: str,
412
+ agent_sequence: List[str],
413
+ metadata: Optional[Dict[str, Any]] = None,
414
+ ) -> None:
415
+ """
416
+ Create a new workflow chain.
417
+
418
+ Args:
419
+ chain_id: Unique chain identifier (e.g., "SPEC-AUTH-001-implementation")
420
+ agent_sequence: Expected agent execution order
421
+ metadata: Optional metadata for the chain
422
+ """
423
+ self._chains[chain_id] = []
424
+
425
+ chain_metadata = {
426
+ "created_at": datetime.now().isoformat(),
427
+ "expected_sequence": agent_sequence,
428
+ "metadata": metadata or {},
429
+ }
430
+
431
+ # Store in a separate chains metadata file
432
+ chains_file = self._session_file.parent / "workflow-chains.json"
433
+
434
+ if chains_file.exists():
435
+ with open(chains_file, "r", encoding="utf-8") as f:
436
+ chains_data = json.load(f)
437
+ else:
438
+ chains_data = {}
439
+
440
+ chains_data[chain_id] = chain_metadata
441
+
442
+ with open(chains_file, "w", encoding="utf-8") as f:
443
+ json.dump(chains_data, f, indent=2, ensure_ascii=False)
444
+
445
+ logger.info(
446
+ f"Created workflow chain: {chain_id} with {len(agent_sequence)} agents"
447
+ )
448
+
449
+
450
+ # Global instance (singleton pattern)
451
+ _session_manager_instance: Optional[SessionManager] = None
452
+
453
+
454
+ def get_session_manager() -> SessionManager:
455
+ """
456
+ Get global SessionManager instance (singleton).
457
+
458
+ Returns:
459
+ SessionManager instance
460
+ """
461
+ global _session_manager_instance
462
+
463
+ if _session_manager_instance is None:
464
+ _session_manager_instance = SessionManager()
465
+
466
+ return _session_manager_instance
467
+
468
+
469
+ # Convenience functions for direct use
470
+
471
+
472
+ def register_agent(
473
+ agent_name: str,
474
+ agent_id: str,
475
+ result: Any,
476
+ chain_id: Optional[str] = None,
477
+ ) -> None:
478
+ """
479
+ Convenience function to register agent result.
480
+
481
+ Args:
482
+ agent_name: Name of the agent
483
+ agent_id: Unique agentId from Task() execution
484
+ result: Result data
485
+ chain_id: Optional workflow chain identifier
486
+ """
487
+ manager = get_session_manager()
488
+ manager.register_agent_result(agent_name, agent_id, result, chain_id)
489
+
490
+
491
+ def get_resume_id(agent_name: str, chain_id: Optional[str] = None) -> Optional[str]:
492
+ """
493
+ Convenience function to get resume ID.
494
+
495
+ Args:
496
+ agent_name: Name of the agent
497
+ chain_id: Optional workflow chain
498
+
499
+ Returns:
500
+ agentId to resume, or None
501
+ """
502
+ manager = get_session_manager()
503
+ return manager.get_resume_id(agent_name, chain_id)
504
+
505
+
506
+ def should_resume(
507
+ agent_name: str,
508
+ current_task: str,
509
+ previous_task: Optional[str] = None,
510
+ ) -> bool:
511
+ """
512
+ Convenience function to check if should resume.
513
+
514
+ Args:
515
+ agent_name: Name of the agent
516
+ current_task: Description of current task
517
+ previous_task: Description of previous task
518
+
519
+ Returns:
520
+ True if should resume
521
+ """
522
+ manager = get_session_manager()
523
+ return manager.should_resume(agent_name, current_task, previous_task)
524
+
525
+
526
+ # Example usage for documentation
527
+ if __name__ == "__main__":
528
+ """
529
+ Example usage of SessionManager.
530
+
531
+ This demonstrates the official Claude Code sub-agent patterns.
532
+ """
533
+
534
+ # Initialize manager
535
+ manager = SessionManager()
536
+
537
+ # Example 1: Linear Chain (spec-builder → implementation-planner)
538
+ print("=== Example 1: Linear Chain ===")
539
+
540
+ # Create workflow chain
541
+ manager.create_chain(
542
+ chain_id="SPEC-AUTH-001-planning",
543
+ agent_sequence=["spec-builder", "implementation-planner"],
544
+ metadata={"spec_id": "SPEC-AUTH-001", "feature": "User Authentication"},
545
+ )
546
+
547
+ # Simulate spec-builder execution
548
+ spec_result = {
549
+ "spec_id": "SPEC-AUTH-001",
550
+ "files_created": [".moai/specs/SPEC-AUTH-001/spec.md"],
551
+ "status": "success",
552
+ }
553
+
554
+ manager.register_agent_result(
555
+ agent_name="spec-builder",
556
+ agent_id="spec-abc123",
557
+ result=spec_result,
558
+ chain_id="SPEC-AUTH-001-planning",
559
+ )
560
+
561
+ # Simulate implementation-planner execution
562
+ plan_result = {
563
+ "dependencies": {"fastapi": ">=0.118.3"},
564
+ "status": "success",
565
+ }
566
+
567
+ manager.register_agent_result(
568
+ agent_name="implementation-planner",
569
+ agent_id="plan-def456",
570
+ result=plan_result,
571
+ chain_id="SPEC-AUTH-001-planning",
572
+ )
573
+
574
+ # Get chain summary
575
+ summary = manager.get_chain_summary("SPEC-AUTH-001-planning")
576
+ print(f"Chain summary: {json.dumps(summary, indent=2)}")
577
+
578
+ # Example 2: Resume Pattern (tdd-implementer continues work)
579
+ print("\n=== Example 2: Resume Pattern ===")
580
+
581
+ manager.create_chain(
582
+ chain_id="SPEC-AUTH-001-implementation",
583
+ agent_sequence=["tdd-implementer"],
584
+ )
585
+
586
+ # First execution: Implementation phase 1
587
+ implementation_001_result = {
588
+ "phase": "phase_1",
589
+ "tests_created": ["tests/test_registration.py"],
590
+ "code_created": ["src/auth/registration.py"],
591
+ "status": "success",
592
+ }
593
+
594
+ manager.register_agent_result(
595
+ agent_name="tdd-implementer",
596
+ agent_id="tdd-ghi789",
597
+ result=implementation_001_result,
598
+ chain_id="SPEC-AUTH-001-implementation",
599
+ )
600
+
601
+ # Get resume ID for continuing work
602
+ resume_id = manager.get_resume_id(
603
+ agent_name="tdd-implementer",
604
+ chain_id="SPEC-AUTH-001-implementation",
605
+ )
606
+
607
+ print(f"Resume ID for tdd-implementer: {resume_id}")
608
+
609
+ # Should resume? (continuing user auth flow)
610
+ should_resume_decision = manager.should_resume(
611
+ agent_name="tdd-implementer",
612
+ current_task="Implement user login endpoint",
613
+ previous_task="Implement user registration endpoint",
614
+ )
615
+
616
+ print(f"Should resume? {should_resume_decision}")
617
+
618
+ if should_resume_decision and resume_id:
619
+ print(f"✅ Resume with agentId: {resume_id}")
620
+ manager.increment_resume_count(resume_id)
621
+ else:
622
+ print("❌ Start new session")
623
+
624
+ # Example 3: Parallel Analysis
625
+ print("\n=== Example 3: Parallel Analysis ===")
626
+
627
+ manager.create_chain(
628
+ chain_id="SPEC-AUTH-001-review",
629
+ agent_sequence=["backend-expert", "security-expert", "frontend-expert"],
630
+ metadata={"review_type": "expert_consultation"},
631
+ )
632
+
633
+ # All experts run independently (no resume)
634
+ experts_results = {
635
+ "backend-expert": {
636
+ "recommendations": ["Use JWT for auth"],
637
+ "agent_id": "backend-jkl012",
638
+ },
639
+ "security-expert": {
640
+ "vulnerabilities": ["Rate limiting needed"],
641
+ "agent_id": "security-mno345",
642
+ },
643
+ "frontend-expert": {
644
+ "ui_concerns": ["Token refresh flow"],
645
+ "agent_id": "frontend-pqr678",
646
+ },
647
+ }
648
+
649
+ for expert_name, data in experts_results.items():
650
+ manager.register_agent_result(
651
+ agent_name=expert_name,
652
+ agent_id=data["agent_id"],
653
+ result={k: v for k, v in data.items() if k != "agent_id"},
654
+ chain_id="SPEC-AUTH-001-review",
655
+ )
656
+
657
+ # Get all review results
658
+ review_results = manager.get_chain_results("SPEC-AUTH-001-review")
659
+ print(f"Expert reviews: {len(review_results)} experts")
660
+
661
+ for result in review_results:
662
+ print(f" - {result['agent_name']}: {list(result['result'].keys())}")
663
+
664
+ # Get all sessions
665
+ print("\n=== All Sessions ===")
666
+ all_sessions = manager.get_all_sessions()
667
+ print(json.dumps(all_sessions, indent=2))