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,721 @@
1
+ """Quality Validator for Auto-Generated SPECs."""
2
+
3
+ import logging
4
+ import re
5
+ import time
6
+ from typing import Any, Dict, List
7
+
8
+ from moai_adk.core.spec.confidence_scoring import ConfidenceScoringSystem
9
+
10
+ # Configure logging
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class QualityValidator:
15
+ """
16
+ Quality Validator for auto-generated SPEC documents.
17
+
18
+ This validator ensures that auto-generated SPECs meet quality standards,
19
+ follow EARS format, and are complete and accurate.
20
+ """
21
+
22
+ def __init__(self, config: Dict[str, Any] = None):
23
+ """Initialize the quality validator."""
24
+ self.config = config or {}
25
+ self.confidence_scorer = ConfidenceScoringSystem()
26
+
27
+ # Quality thresholds from config
28
+ self.min_ears_compliance = self.config.get("min_ears_compliance", 0.85)
29
+ self.min_confidence_score = self.config.get("min_confidence_score", 0.7)
30
+ self.min_content_length = self.config.get("min_content_length", 500)
31
+ self.max_review_suggestions = self.config.get("max_review_suggestions", 10)
32
+
33
+ # Quality metrics weights
34
+ self.quality_weights = self.config.get(
35
+ "quality_weights",
36
+ {
37
+ "ears_compliance": 0.3,
38
+ "content_completeness": 0.25,
39
+ "technical_accuracy": 0.2,
40
+ "clarity_score": 0.15,
41
+ "traceability": 0.1,
42
+ },
43
+ )
44
+
45
+ # Validation rules
46
+ self.validation_rules = {
47
+ "required_sections": [
48
+ "Overview",
49
+ "Environment",
50
+ "Assumptions",
51
+ "Requirements",
52
+ "Specifications",
53
+ "Traceability",
54
+ ],
55
+ "required_plan_sections": [
56
+ "Implementation Phases",
57
+ "Technical Approach",
58
+ "Success Criteria",
59
+ "Next Steps",
60
+ ],
61
+ "required_acceptance_sections": [
62
+ "Acceptance Criteria",
63
+ "Validation Process",
64
+ "Completion Criteria",
65
+ ],
66
+ "technical_keywords": [
67
+ "API",
68
+ "Database",
69
+ "Authentication",
70
+ "Security",
71
+ "Performance",
72
+ "Scalability",
73
+ "Testing",
74
+ ],
75
+ }
76
+
77
+ def validate_spec_quality(
78
+ self, spec_content: Dict[str, str], code_analysis: Dict[str, Any] = None
79
+ ) -> Dict[str, Any]:
80
+ """
81
+ Validate the quality of a generated SPEC.
82
+
83
+ Args:
84
+ spec_content: Dictionary with spec_md, plan_md, and acceptance_md
85
+ code_analysis: Original code analysis for reference
86
+
87
+ Returns:
88
+ Quality validation results with scores and recommendations
89
+ """
90
+ start_time = time.time()
91
+
92
+ logger.info("Starting SPEC quality validation")
93
+
94
+ # Initialize validation results
95
+ validation_result = {
96
+ "validation_time": 0.0,
97
+ "overall_score": 0.0,
98
+ "quality_grade": "F",
99
+ "passed_checks": [],
100
+ "failed_checks": [],
101
+ "recommendations": [],
102
+ "metrics": {},
103
+ "details": {},
104
+ }
105
+
106
+ try:
107
+ # Validate EARS format compliance
108
+ ears_result = self._validate_ears_format(spec_content["spec_md"])
109
+ validation_result["details"]["ears_compliance"] = ears_result
110
+
111
+ # Validate content completeness
112
+ completeness_result = self._validate_content_completeness(spec_content)
113
+ validation_result["details"]["content_completeness"] = completeness_result
114
+
115
+ # Validate technical accuracy
116
+ technical_result = self._validate_technical_accuracy(
117
+ spec_content, code_analysis
118
+ )
119
+ validation_result["details"]["technical_accuracy"] = technical_result
120
+
121
+ # Validate clarity and readability
122
+ clarity_result = self._validate_clarity(spec_content)
123
+ validation_result["details"]["clarity_score"] = clarity_result
124
+
125
+ # Validate traceability
126
+ traceability_result = self._validate_traceability(spec_content)
127
+ validation_result["details"]["traceability"] = traceability_result
128
+
129
+ # Calculate overall quality score
130
+ overall_score = self._calculate_overall_score(validation_result["details"])
131
+ validation_result["overall_score"] = overall_score
132
+
133
+ # Determine quality grade
134
+ validation_result["quality_grade"] = self._determine_quality_grade(
135
+ overall_score
136
+ )
137
+
138
+ # Check if SPEC meets minimum quality standards
139
+ meets_standards = self._check_quality_standards(validation_result)
140
+ validation_result["meets_minimum_standards"] = meets_standards
141
+
142
+ # Generate recommendations
143
+ recommendations = self._generate_recommendations(validation_result)
144
+ validation_result["recommendations"] = recommendations
145
+
146
+ # Compile check results
147
+ validation_result["passed_checks"] = self._compile_passed_checks(
148
+ validation_result["details"]
149
+ )
150
+ validation_result["failed_checks"] = self._compile_failed_checks(
151
+ validation_result["details"]
152
+ )
153
+
154
+ except Exception as e:
155
+ logger.error(f"Error during SPEC validation: {str(e)}")
156
+ validation_result["error"] = str(e)
157
+
158
+ # Set validation time
159
+ validation_result["validation_time"] = time.time() - start_time
160
+
161
+ logger.info(
162
+ f"SPEC quality validation completed in {validation_result['validation_time']:.2f}s"
163
+ )
164
+
165
+ return validation_result
166
+
167
+ def _validate_ears_format(self, spec_md: str) -> Dict[str, Any]:
168
+ """Validate EARS format compliance."""
169
+ logger.info("Validating EARS format compliance")
170
+
171
+ required_sections = self.validation_rules["required_sections"]
172
+ section_scores = {}
173
+ missing_sections = []
174
+
175
+ # Check each required section
176
+ for section in required_sections:
177
+ if section in spec_md:
178
+ section_scores[section] = 1.0
179
+ else:
180
+ section_scores[section] = 0.0
181
+ missing_sections.append(section)
182
+
183
+ # Calculate overall compliance
184
+ overall_compliance = sum(section_scores.values()) / len(required_sections)
185
+
186
+ # Check for META information
187
+
188
+ # Check for proper structure
189
+ has_proper_headings = self._check_heading_structure(spec_md)
190
+
191
+ return {
192
+ "overall_compliance": round(overall_compliance, 2),
193
+ "section_scores": section_scores,
194
+ "missing_sections": missing_sections,
195
+ "has_meta_info": has_meta,
196
+ "has_tags": has_tags,
197
+ "has_proper_structure": has_proper_headings,
198
+ "total_sections": len(required_sections),
199
+ "present_sections": sum(
200
+ 1 for score in section_scores.values() if score > 0
201
+ ),
202
+ }
203
+
204
+ def _validate_content_completeness(
205
+ self, spec_content: Dict[str, str]
206
+ ) -> Dict[str, Any]:
207
+ """Validate content completeness across all SPEC files."""
208
+ logger.info("Validating content completeness")
209
+
210
+ results = {
211
+ "spec_completeness": 0.0,
212
+ "plan_completeness": 0.0,
213
+ "acceptance_completeness": 0.0,
214
+ "overall_completeness": 0.0,
215
+ }
216
+
217
+ # Validate spec.md completeness
218
+ spec_md = spec_content.get("spec_md", "")
219
+ spec_completeness = self._assess_section_completeness(spec_md)
220
+ results["spec_completeness"] = spec_completeness
221
+
222
+ # Validate plan.md completeness
223
+ plan_md = spec_content.get("plan_md", "")
224
+ plan_completeness = self._assess_plan_completeness(plan_md)
225
+ results["plan_completeness"] = plan_completeness
226
+
227
+ # Validate acceptance.md completeness
228
+ acceptance_md = spec_content.get("acceptance_md", "")
229
+ acceptance_completeness = self._assess_acceptance_completeness(acceptance_md)
230
+ results["acceptance_completeness"] = acceptance_completeness
231
+
232
+ # Calculate overall completeness
233
+ overall_completeness = (
234
+ spec_completeness + plan_completeness + acceptance_completeness
235
+ ) / 3
236
+ results["overall_completeness"] = round(overall_completeness, 2)
237
+
238
+ return results
239
+
240
+ def _validate_technical_accuracy(
241
+ self, spec_content: Dict[str, str], code_analysis: Dict[str, Any] = None
242
+ ) -> Dict[str, Any]:
243
+ """Validate technical accuracy of the SPEC."""
244
+ logger.info("Validating technical accuracy")
245
+
246
+ spec_md = spec_content.get("spec_md", "")
247
+
248
+ # Check for technical keywords presence
249
+ technical_keywords = self.validation_rules["technical_keywords"]
250
+ keyword_presence = self._check_technical_keywords(spec_md, technical_keywords)
251
+
252
+ # Check consistency with code analysis
253
+ consistency_score = 1.0
254
+ if code_analysis:
255
+ consistency_score = self._check_code_consistency(spec_md, code_analysis)
256
+
257
+ # Check for technical specifications
258
+ has_technical_specs = self._check_technical_specifications(spec_md)
259
+
260
+ # Check for realistic estimates
261
+ has_realistic_estimates = self._check_realistic_estimates(spec_md)
262
+
263
+ return {
264
+ "keyword_presence": keyword_presence,
265
+ "code_consistency": consistency_score,
266
+ "has_technical_specs": has_technical_specs,
267
+ "has_realistic_estimates": has_realistic_estimates,
268
+ "overall_accuracy": round(
269
+ (
270
+ keyword_presence
271
+ + consistency_score
272
+ + (1.0 if has_technical_specs else 0.0)
273
+ + (1.0 if has_realistic_estimates else 0.0)
274
+ )
275
+ / 4,
276
+ 2,
277
+ ),
278
+ }
279
+
280
+ def _validate_clarity(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
281
+ """Validate clarity and readability of the SPEC."""
282
+ logger.info("Validating clarity and readability")
283
+
284
+ spec_md = spec_content.get("spec_md", "")
285
+
286
+ # Check for proper language use
287
+ language_quality = self._check_language_quality(spec_md)
288
+
289
+ # Check for clarity requirements
290
+ clarity_requirements = self._check_clarity_requirements(spec_md)
291
+
292
+ # Check for ambiguity
293
+ ambiguity_score = self._check_ambiguity(spec_md)
294
+
295
+ # Check for consistency
296
+ consistency_score = self._check_consistency(spec_md)
297
+
298
+ return {
299
+ "language_quality": language_quality,
300
+ "clarity_requirements": clarity_requirements,
301
+ "ambiguity_score": ambiguity_score,
302
+ "consistency_score": consistency_score,
303
+ "overall_clarity": round(
304
+ (
305
+ language_quality
306
+ + clarity_requirements
307
+ + (1.0 - ambiguity_score)
308
+ + consistency_score
309
+ )
310
+ / 4,
311
+ 2,
312
+ ),
313
+ }
314
+
315
+ def _validate_traceability(self, spec_content: Dict[str, str]) -> Dict[str, Any]:
316
+ """Validate traceability in the SPEC."""
317
+ logger.info("Validating traceability")
318
+
319
+ spec_md = spec_content.get("spec_md", "")
320
+
321
+ # Check for basic traceability elements
322
+ has_traceability = "@SPEC:" in spec_md or "Requirements:" in spec_md
323
+
324
+ return {
325
+ "has_traceability_elements": has_traceability,
326
+ "overall_traceability": 1.0 if has_traceability else 0.5,
327
+ }
328
+
329
+ def _calculate_overall_score(self, details: Dict[str, Any]) -> float:
330
+ """Calculate overall quality score."""
331
+ weights = self.quality_weights
332
+
333
+ overall_score = (
334
+ details["ears_compliance"]["overall_compliance"]
335
+ * weights["ears_compliance"]
336
+ + details["content_completeness"]["overall_completeness"]
337
+ * weights["content_completeness"]
338
+ + details["technical_accuracy"]["overall_accuracy"]
339
+ * weights["technical_accuracy"]
340
+ + details["clarity_score"]["overall_clarity"] * weights["clarity_score"]
341
+ + details["traceability"]["overall_traceability"] * weights["traceability"]
342
+ )
343
+
344
+ return round(overall_score, 2)
345
+
346
+ def _determine_quality_grade(self, score: float) -> str:
347
+ """Determine quality grade based on score."""
348
+ if score >= 0.9:
349
+ return "A"
350
+ elif score >= 0.8:
351
+ return "B"
352
+ elif score >= 0.7:
353
+ return "C"
354
+ elif score >= 0.6:
355
+ return "D"
356
+ else:
357
+ return "F"
358
+
359
+ def _check_quality_standards(self, validation_result: Dict[str, Any]) -> bool:
360
+ """Check if SPEC meets minimum quality standards."""
361
+ overall_score = validation_result["overall_score"]
362
+ ears_compliance = validation_result["details"]["ears_compliance"][
363
+ "overall_compliance"
364
+ ]
365
+
366
+ meets_overall = overall_score >= self.min_confidence_score
367
+ meets_ears = ears_compliance >= self.min_ears_compliance
368
+
369
+ return meets_overall and meets_ears
370
+
371
+ def _generate_recommendations(self, validation_result: Dict[str, Any]) -> List[str]:
372
+ """Generate improvement recommendations."""
373
+ recommendations = []
374
+ details = validation_result["details"]
375
+
376
+ # EARS compliance recommendations
377
+ if details["ears_compliance"]["overall_compliance"] < 1.0:
378
+ missing = details["ears_compliance"]["missing_sections"]
379
+ recommendations.append(
380
+ f"Add missing EARS sections: {', '.join(missing[:3])}"
381
+ )
382
+
383
+ # Content completeness recommendations
384
+ if details["content_completeness"]["overall_completeness"] < 0.8:
385
+ recommendations.append(
386
+ "Expand content sections with more detailed requirements"
387
+ )
388
+
389
+ # Technical accuracy recommendations
390
+ if details["technical_accuracy"]["overall_accuracy"] < 0.8:
391
+ recommendations.append("Add more technical specifications and details")
392
+
393
+ # Clarity recommendations
394
+ if details["clarity_score"]["overall_clarity"] < 0.7:
395
+ recommendations.append("Improve language clarity and reduce ambiguity")
396
+
397
+ # Traceability recommendations
398
+ if details["traceability"]["overall_traceability"] < 0.8:
399
+ recommendations.append("Add proper traceability tags and relationships")
400
+
401
+ # Limit recommendations
402
+ return recommendations[: self.max_review_suggestions]
403
+
404
+ def _compile_passed_checks(self, details: Dict[str, Any]) -> List[str]:
405
+ """Compile list of passed quality checks."""
406
+ passed = []
407
+
408
+ if details["ears_compliance"]["overall_compliance"] >= self.min_ears_compliance:
409
+ passed.append("EARS format compliance")
410
+
411
+ if details["content_completeness"]["overall_completeness"] >= 0.8:
412
+ passed.append("Content completeness")
413
+
414
+ if details["technical_accuracy"]["overall_accuracy"] >= 0.7:
415
+ passed.append("Technical accuracy")
416
+
417
+ if details["clarity_score"]["overall_clarity"] >= 0.7:
418
+ passed.append("Clarity and readability")
419
+
420
+ if details["traceability"]["overall_traceability"] >= 0.7:
421
+ passed.append("Traceability")
422
+
423
+ return passed
424
+
425
+ def _compile_failed_checks(self, details: Dict[str, Any]) -> List[str]:
426
+ """Compile list of failed quality checks."""
427
+ failed = []
428
+
429
+ if details["ears_compliance"]["overall_compliance"] < self.min_ears_compliance:
430
+ failed.append("EARS format compliance")
431
+
432
+ if details["content_completeness"]["overall_completeness"] < 0.8:
433
+ failed.append("Content completeness")
434
+
435
+ if details["technical_accuracy"]["overall_accuracy"] < 0.7:
436
+ failed.append("Technical accuracy")
437
+
438
+ if details["clarity_score"]["overall_clarity"] < 0.7:
439
+ failed.append("Clarity and readability")
440
+
441
+ if details["traceability"]["overall_traceability"] < 0.7:
442
+ failed.append("Traceability")
443
+
444
+ return failed
445
+
446
+ # Helper methods
447
+ def _check_heading_structure(self, spec_md: str) -> bool:
448
+ """Check if proper heading structure exists."""
449
+ # Look for proper markdown heading structure
450
+ heading_pattern = r"^#+\s+.*$"
451
+ headings = re.findall(heading_pattern, spec_md, re.MULTILINE)
452
+ return len(headings) >= 5 # At least 5 headings
453
+
454
+ def _assess_section_completeness(self, content: str) -> float:
455
+ """Assess completeness of a section."""
456
+ if len(content) < self.min_content_length:
457
+ return 0.0
458
+
459
+ # Check for key indicators of completeness
460
+ completeness_indicators = [
461
+ r"##\s+.*", # Subheadings
462
+ r"\*\*.*\*\*", # Bold text
463
+ r"-\s+.*", # Lists
464
+ r"`[^`]+`", # Code snippets
465
+ r"\d+\.", # Numbered lists
466
+ ]
467
+
468
+ score = 0.0
469
+ for indicator in completeness_indicators:
470
+ matches = re.findall(indicator, content)
471
+ if matches:
472
+ score += 0.2
473
+
474
+ return min(score, 1.0)
475
+
476
+ def _assess_plan_completeness(self, plan_content: str) -> float:
477
+ """Assess completeness of implementation plan."""
478
+ if not plan_content:
479
+ return 0.0
480
+
481
+ # Check for plan-specific elements
482
+ plan_indicators = [
483
+ r"Phase", # Phases
484
+ r"Priority", # Priorities
485
+ r"Task", # Tasks
486
+ r"\[\s*\]", # Checkboxes
487
+ r"Phase 1", # Phase indicators
488
+ ]
489
+
490
+ score = 0.0
491
+ for indicator in plan_indicators:
492
+ if re.search(indicator, plan_content):
493
+ score += 0.2
494
+
495
+ return min(score, 1.0)
496
+
497
+ def _assess_acceptance_criteria_completeness(
498
+ self, acceptance_content: str
499
+ ) -> float:
500
+ """Assess completeness of acceptance criteria."""
501
+ if not acceptance_content:
502
+ return 0.0
503
+
504
+ # Check for acceptance-specific elements
505
+ acceptance_indicators = [
506
+ r"Acceptance", # Acceptance
507
+ r"Criteria", # Criteria
508
+ r"Pass", # Pass
509
+ r"Fail", # Fail
510
+ r"Test", # Test
511
+ ]
512
+
513
+ score = 0.0
514
+ for indicator in acceptance_indicators:
515
+ if re.search(indicator, acceptance_content):
516
+ score += 0.2
517
+
518
+ return min(score, 1.0)
519
+
520
+ def _check_technical_keywords(self, spec_md: str, keywords: List[str]) -> float:
521
+ """Check for presence of technical keywords."""
522
+ found_keywords = []
523
+ for keyword in keywords:
524
+ if keyword in spec_md:
525
+ found_keywords.append(keyword)
526
+
527
+ return len(found_keywords) / len(keywords)
528
+
529
+ def _check_code_consistency(
530
+ self, spec_md: str, code_analysis: Dict[str, Any]
531
+ ) -> float:
532
+ """Check consistency between SPEC and code analysis."""
533
+ # Extract key elements from code analysis
534
+ classes = code_analysis.get("structure_info", {}).get("classes", [])
535
+ functions = code_analysis.get("structure_info", {}).get("functions", [])
536
+
537
+ # Check if these elements are mentioned in the SPEC
538
+ class_mentions = sum(1 for cls in classes if cls in spec_md)
539
+ function_mentions = sum(1 for func in functions if func in spec_md)
540
+
541
+ total_elements = len(classes) + len(functions)
542
+ if total_elements == 0:
543
+ return 1.0
544
+
545
+ consistency = (class_mentions + function_mentions) / total_elements
546
+ return min(consistency, 1.0)
547
+
548
+ def _check_technical_specifications(self, spec_md: str) -> bool:
549
+ """Check for presence of technical specifications."""
550
+ technical_patterns = [
551
+ r"API\s+Endpoint",
552
+ r"Database\s+Schema",
553
+ r"Authentication",
554
+ r"Performance\s+Requirement",
555
+ r"Security\s+Requirement",
556
+ r"Scalability\s+Plan",
557
+ r"Testing\s+Strategy",
558
+ ]
559
+
560
+ return any(re.search(pattern, spec_md) for pattern in technical_patterns)
561
+
562
+ def _check_realistic_estimates(self, spec_md: str) -> bool:
563
+ """Check for realistic time/effort estimates."""
564
+ # Look for realistic time estimates
565
+ time_patterns = [r"1-2\s*days", r"3-5\s*days", r"1-2\s*weeks", r"\d+\s*hours"]
566
+
567
+ return any(re.search(pattern, spec_md) for pattern in time_patterns)
568
+
569
+ def _check_language_quality(self, spec_md: str) -> float:
570
+ """Check language quality."""
571
+ # Simple language quality checks
572
+ sentences = spec_md.split(".")
573
+ avg_sentence_length = sum(len(s.split()) for s in sentences) / len(sentences)
574
+
575
+ # Optimal sentence length is around 15-20 words
576
+ if 15 <= avg_sentence_length <= 25:
577
+ return 1.0
578
+ elif 10 <= avg_sentence_length <= 30:
579
+ return 0.8
580
+ else:
581
+ return 0.5
582
+
583
+ def _check_clarity_requirements(self, spec_md: str) -> float:
584
+ """Check clarity requirements."""
585
+ clarity_indicators = [
586
+ r"Clear",
587
+ r"Specific",
588
+ r"Measurable",
589
+ r"Achievable",
590
+ r"Relevant",
591
+ ]
592
+
593
+ found_indicators = sum(
594
+ 1 for indicator in clarity_indicators if re.search(indicator, spec_md)
595
+ )
596
+
597
+ return min(found_indicators / len(clarity_indicators), 1.0)
598
+
599
+ def _check_ambiguity(self, spec_md: str) -> float:
600
+ """Check for ambiguous language."""
601
+ ambiguity_indicators = [
602
+ r"degree",
603
+ r"extent",
604
+ r"approximately",
605
+ r"about",
606
+ r"around",
607
+ ]
608
+
609
+ ambiguous_count = sum(
610
+ 1 for indicator in ambiguity_indicators if re.search(indicator, spec_md)
611
+ )
612
+
613
+ # Normalize by content length
614
+ content_length = len(spec_md.split())
615
+ ambiguity_ratio = ambiguous_count / max(content_length / 100, 1)
616
+
617
+ return min(ambiguity_ratio, 1.0)
618
+
619
+ def _check_consistency(self, spec_md: str) -> float:
620
+ """Check for consistency in terminology."""
621
+ # Check for consistent terminology
622
+ # This is a simplified check - in practice, you'd use more sophisticated NLP
623
+ sentences = spec_md.split(".")
624
+ if len(sentences) < 2:
625
+ return 1.0
626
+
627
+ # Simple consistency check: look for repeated terms
628
+ words = spec_md.lower().split()
629
+ unique_words = set(words)
630
+ consistency_ratio = len(unique_words) / len(words)
631
+
632
+ return consistency_ratio
633
+
634
+ def _check_traceability_tags(self, spec_md: str) -> bool:
635
+ """Check for traceability tags."""
636
+ return any(tag in spec_md for tag in traceability_tags)
637
+
638
+ def _check_tag_formatting(self, spec_md: str) -> float:
639
+ """Check proper tag formatting."""
640
+ # Look for properly formatted tags
641
+ tag_pattern = r"@[A-Z]+:[A-Za-z0-9\-]+"
642
+ matches = re.findall(tag_pattern, spec_md)
643
+
644
+ # Count total tags to check ratio
645
+ total_tags = len(re.findall(r"@[A-Z]+:", spec_md))
646
+
647
+ if total_tags == 0:
648
+ return 1.0
649
+
650
+ return len(matches) / total_tags
651
+
652
+ def _check_traceability_relationships(self, spec_md: str) -> float:
653
+ """Check traceability relationships."""
654
+ # Look for traceability indicators
655
+ traceability_indicators = [
656
+ r"←|→", # Arrows for relationships
657
+ r"Relationship",
658
+ r"Connect",
659
+ r"Trace",
660
+ ]
661
+
662
+ found_indicators = sum(
663
+ 1 for indicator in traceability_indicators if re.search(indicator, spec_md)
664
+ )
665
+
666
+ return min(found_indicators / len(traceability_indicators), 1.0)
667
+
668
+ def _assess_acceptance_completeness(self, acceptance_content: str) -> float:
669
+ """Assess completeness of acceptance criteria section."""
670
+ if not acceptance_content:
671
+ return 0.0
672
+
673
+ # Check for acceptance-specific elements
674
+ acceptance_indicators = [
675
+ r"Acceptance", # Acceptance
676
+ r"Criteria", # Criteria
677
+ r"Pass", # Pass
678
+ r"Fail", # Fail
679
+ r"Test", # Test
680
+ ]
681
+
682
+ score = 0.0
683
+ for indicator in acceptance_indicators:
684
+ if re.search(indicator, acceptance_content):
685
+ score += 0.2
686
+
687
+ return min(score, 1.0)
688
+
689
+ def generate_quality_report(self, validation_result: Dict[str, Any]) -> str:
690
+ """Generate a quality report string."""
691
+ report = f"""
692
+ # Quality Validation Report
693
+
694
+ ## Overall Quality Score: {validation_result['overall_score']:.2f}/1.0
695
+ ## Quality Grade: {validation_result['quality_grade']}
696
+ ## Validation Time: {validation_result['validation_time']:.2f}s
697
+
698
+ ## Summary
699
+ - Passed Checks: {len(validation_result['passed_checks'])}
700
+ - Failed Checks: {len(validation_result['failed_checks'])}
701
+ - Recommendations: {len(validation_result['recommendations'])}
702
+
703
+ ## Detailed Metrics
704
+ """
705
+
706
+ # Add detailed metrics
707
+ for metric_name, metric_value in validation_result["metrics"].items():
708
+ report += f"- {metric_name}: {metric_value:.2f}\n"
709
+
710
+ # Add recommendations
711
+ if validation_result["recommendations"]:
712
+ report += "\n## Recommendations\n"
713
+ for i, rec in enumerate(validation_result["recommendations"], 1):
714
+ report += f"{i}. {rec}\n"
715
+
716
+ # Add quality determination
717
+ meets_standards = validation_result.get("meets_minimum_standards", False)
718
+ status = "PASSED" if meets_standards else "FAILED"
719
+ report += f"\n## Quality Status: {status}\n"
720
+
721
+ return report